fusee: fix buildsystem, rename secondary -> package3

This commit is contained in:
Michael Scire 2021-09-05 15:45:40 -07:00 committed by SciresM
parent b7521465ee
commit 045f9b2f15
16 changed files with 246 additions and 139 deletions

2
.gitignore vendored
View file

@ -95,4 +95,6 @@ dkms.conf
**/build_nintendo_nx_x64 **/build_nintendo_nx_x64
**/build_nintendo_nx_x86 **/build_nintendo_nx_x86
package3
stratosphere/test/ stratosphere/test/

View file

@ -16,6 +16,26 @@ endif
COMPONENTS := fusee stratosphere mesosphere exosphere thermosphere troposphere libraries COMPONENTS := fusee stratosphere mesosphere exosphere thermosphere troposphere libraries
all: $(COMPONENTS) all: $(COMPONENTS)
$(eval MAJORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
| tr -s [:blank:] \
| cut -d' ' -f3))
$(eval MINORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MINOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
| tr -s [:blank:] \
| cut -d' ' -f3))
$(eval MICROVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MICRO\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
| tr -s [:blank:] \
| cut -d' ' -f3))
$(eval S_MAJORVER = $(shell grep 'define ATMOSPHERE_SUPPORTED_HOS_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
| tr -s [:blank:] \
| cut -d' ' -f3))
$(eval S_MINORVER = $(shell grep 'define ATMOSPHERE_SUPPORTED_HOS_VERSION_MINOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
| tr -s [:blank:] \
| cut -d' ' -f3))
$(eval S_MICROVER = $(shell grep 'define ATMOSPHERE_SUPPORTED_HOS_VERSION_MICRO\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
| tr -s [:blank:] \
| cut -d' ' -f3))
@python fusee/build_package3.py $(CURDIR) release $(AMSHASH) $(MAJORVER) $(MINORVER) $(MICROVER) 0 $(S_MAJORVER) $(S_MINORVER) $(S_MICROVER) 0
@echo "Built package3!"
thermosphere: thermosphere:
$(MAKE) -C thermosphere all $(MAKE) -C thermosphere all
@ -64,9 +84,9 @@ dist-no-debug: all
mkdir -p atmosphere-$(AMSVER)/atmosphere/config mkdir -p atmosphere-$(AMSVER)/atmosphere/config
mkdir -p atmosphere-$(AMSVER)/atmosphere/flags mkdir -p atmosphere-$(AMSVER)/atmosphere/flags
touch atmosphere-$(AMSVER)/atmosphere/flags/clean_stratosphere_for_0.19.0.flag touch atmosphere-$(AMSVER)/atmosphere/flags/clean_stratosphere_for_0.19.0.flag
cp fusee/fusee-primary/fusee-primary.bin atmosphere-$(AMSVER)/atmosphere/reboot_payload.bin cp fusee/fusee.bin atmosphere-$(AMSVER)/atmosphere/reboot_payload.bin
cp fusee/fusee-secondary/fusee-secondary-experimental.bin atmosphere-$(AMSVER)/atmosphere/fusee-secondary.bin cp fusee/package3 atmosphere-$(AMSVER)/atmosphere/package3
cp config_templates/BCT.ini atmosphere-$(AMSVER)/atmosphere/config_templates/BCT.ini cp config_templates/stratosphere.ini atmosphere-$(AMSVER)/atmosphere/config_templates/stratosphere.ini
cp config_templates/override_config.ini atmosphere-$(AMSVER)/atmosphere/config_templates/override_config.ini cp config_templates/override_config.ini atmosphere-$(AMSVER)/atmosphere/config_templates/override_config.ini
cp config_templates/system_settings.ini atmosphere-$(AMSVER)/atmosphere/config_templates/system_settings.ini cp config_templates/system_settings.ini atmosphere-$(AMSVER)/atmosphere/config_templates/system_settings.ini
cp config_templates/exosphere.ini atmosphere-$(AMSVER)/atmosphere/config_templates/exosphere.ini cp config_templates/exosphere.ini atmosphere-$(AMSVER)/atmosphere/config_templates/exosphere.ini
@ -96,13 +116,10 @@ dist-no-debug: all
cp troposphere/reboot_to_payload/reboot_to_payload.nro atmosphere-$(AMSVER)/switch/reboot_to_payload.nro cp troposphere/reboot_to_payload/reboot_to_payload.nro atmosphere-$(AMSVER)/switch/reboot_to_payload.nro
cp troposphere/daybreak/daybreak.nro atmosphere-$(AMSVER)/switch/daybreak.nro cp troposphere/daybreak/daybreak.nro atmosphere-$(AMSVER)/switch/daybreak.nro
cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER).zip ./*; cd ../; cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER).zip ./*; cd ../;
cp fusee/fusee-secondary/fusee-secondary.bin atmosphere-$(AMSVER)/atmosphere/fusee-secondary.bin rm -rf atmosphere-$(AMSVER)
cd atmosphere-$(AMSVER); zip -r ../atmosphere-$(AMSVER)-WITHOUT_MESOSPHERE.zip ./*; cd ../;
rm -r atmosphere-$(AMSVER)
mkdir out mkdir out
mv atmosphere-$(AMSVER).zip out/atmosphere-$(AMSVER).zip mv atmosphere-$(AMSVER).zip out/atmosphere-$(AMSVER).zip
mv atmosphere-$(AMSVER)-WITHOUT_MESOSPHERE.zip out/atmosphere-$(AMSVER)-WITHOUT_MESOSPHERE.zip cp fusee/fusee.bin out/fusee.bin
cp fusee/fusee-primary/fusee-primary.bin out/fusee-primary.bin
dist: dist-no-debug dist: dist-no-debug
$(eval MAJORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \ $(eval MAJORVER = $(shell grep 'define ATMOSPHERE_RELEASE_VERSION_MAJOR\b' libraries/libvapours/include/vapours/ams/ams_api_version.h \
@ -117,8 +134,8 @@ dist: dist-no-debug
$(eval AMSVER = $(MAJORVER).$(MINORVER).$(MICROVER)-$(AMSREV)) $(eval AMSVER = $(MAJORVER).$(MINORVER).$(MICROVER)-$(AMSREV))
rm -rf atmosphere-$(AMSVER)-debug rm -rf atmosphere-$(AMSVER)-debug
mkdir atmosphere-$(AMSVER)-debug mkdir atmosphere-$(AMSVER)-debug
cp fusee/fusee-primary/fusee-primary.elf atmosphere-$(AMSVER)-debug/fusee-primary.elf cp fusee/loader_stub/loader_stub.elf atmosphere-$(AMSVER)-debug/fusee-loader-stub.elf
cp fusee/fusee-secondary/fusee-secondary-experimental.elf atmosphere-$(AMSVER)-debug/fusee-secondary.elf cp fusee/program/program.elf atmosphere-$(AMSVER)-debug/fusee-program.elf
cp exosphere/loader_stub/loader_stub.elf atmosphere-$(AMSVER)-debug/exosphere-loader-stub.elf cp exosphere/loader_stub/loader_stub.elf atmosphere-$(AMSVER)-debug/exosphere-loader-stub.elf
cp exosphere/program/program.elf atmosphere-$(AMSVER)-debug/exosphere-program.elf cp exosphere/program/program.elf atmosphere-$(AMSVER)-debug/exosphere-program.elf
cp exosphere/warmboot/warmboot.elf atmosphere-$(AMSVER)-debug/exosphere-warmboot.elf cp exosphere/warmboot/warmboot.elf atmosphere-$(AMSVER)-debug/exosphere-warmboot.elf

44
fusee/Makefile Normal file
View file

@ -0,0 +1,44 @@
ATMOSPHERE_BUILD_CONFIGS :=
all: release
define ATMOSPHERE_ADD_TARGET
ATMOSPHERE_BUILD_CONFIGS += $(strip $1)
$(strip $1): fusee$(strip $2).bin
fusee$(strip $2).bin: loader_stub/loader_stub$(strip $2).bin
@cp loader_stub/loader_stub$(strip $2).bin fusee$(strip $2).bin
@echo "Built fusee$(strip $2).bin..."
check_program_$(strip $1):
@$$(MAKE) -C program $(strip $1)
loader_stub/loader_stub$(strip $2).bin: check_program_$(strip $1)
@$$(MAKE) -C loader_stub $(strip $1)
clean-$(strip $1): clean-program-$(strip $1) clean-loader_stub-$(strip $1)
@rm -rf fusee$(strip $2).bin
clean-program-$(strip $1):
@$$(MAKE) -C program clean-$(strip $1)
clean-loader_stub-$(strip $1):
@$$(MAKE) -C loader_stub clean-$(strip $1)
endef
$(eval $(call ATMOSPHERE_ADD_TARGET, release, ))
$(eval $(call ATMOSPHERE_ADD_TARGET, debug, _debug))
$(eval $(call ATMOSPHERE_ADD_TARGET, audit, _audit))
clean: clean-program clean-loader_stub
@rm -rf fusee*.bin package3*
clean-program:
@$(MAKE) -C program clean
clean-loader_stub:
@$(MAKE) -C loader_stub clean
.PHONY: all clean clean-program clean-loader_stub $(foreach config,$(ATMOSPHERE_BUILD_CONFIGS),check_program_$(config) check_warmboot_$(strip $1) clean-$(config) clean-program-$(config) clean-loader_stub-$(config) clean-warmboot-$(config))

View file

@ -1,5 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
import sys, lz4, hashlib import sys, lz4, hashlib, os
from struct import unpack as up, pack as pk from struct import unpack as up, pack as pk
def lz4_compress(data): def lz4_compress(data):
@ -22,15 +22,15 @@ def get_overlay(program, i):
KIP_NAMES = ['Loader', 'NCM', 'ProcessManager', 'sm', 'boot', 'spl', 'ams_mitm'] KIP_NAMES = ['Loader', 'NCM', 'ProcessManager', 'sm', 'boot', 'spl', 'ams_mitm']
def get_kips(): def get_kips(ams_dir):
emummc = read_file('../../../../emummc/emummc_unpacked.kip') emummc = read_file(os.path.join(ams_dir, 'emummc/emummc_unpacked.kip'))
loader = read_file('../../../../stratosphere/loader/loader.kip') loader = read_file(os.path.join(ams_dir, 'stratosphere/loader/loader.kip'))
ncm = read_file('../../../../stratosphere/ncm/ncm.kip') ncm = read_file(os.path.join(ams_dir, 'stratosphere/ncm/ncm.kip'))
pm = read_file('../../../../stratosphere/pm/pm.kip') pm = read_file(os.path.join(ams_dir, 'stratosphere/pm/pm.kip'))
sm = read_file('../../../../stratosphere/sm/sm.kip') sm = read_file(os.path.join(ams_dir, 'stratosphere/sm/sm.kip'))
boot = read_file('../../../../stratosphere/boot/boot.kip') boot = read_file(os.path.join(ams_dir, 'stratosphere/boot/boot.kip'))
spl = read_file('../../../../stratosphere/spl/spl.kip') spl = read_file(os.path.join(ams_dir, 'stratosphere/spl/spl.kip'))
ams_mitm = read_file('../../../../stratosphere/ams_mitm/ams_mitm.kip') ams_mitm = read_file(os.path.join(ams_dir, 'stratosphere/ams_mitm/ams_mitm.kip'))
return (emummc, { return (emummc, {
'Loader' : loader, 'Loader' : loader,
'NCM' : ncm, 'NCM' : ncm,
@ -49,7 +49,7 @@ def write_kip_meta(f, kip, ofs):
# Write hash # Write hash
f.write(hashlib.sha256(kip).digest()) f.write(hashlib.sha256(kip).digest())
def write_header(f, all_kips, meso_size): def write_header(f, all_kips, meso_size, git_revision, major, minor, micro, relstep, s_major, s_minor, s_micro, s_relstep):
# Unpack kips # Unpack kips
emummc, kips = all_kips emummc, kips = all_kips
# Write reserved0 (previously entrypoint) as infinite loop instruction. # Write reserved0 (previously entrypoint) as infinite loop instruction.
@ -75,11 +75,11 @@ def write_header(f, all_kips, meso_size):
# Write num_content_headers; # Write num_content_headers;
f.write(pk('<I', 8 + len(KIP_NAMES))) f.write(pk('<I', 8 + len(KIP_NAMES)))
# Write supported_hos_version; # Write supported_hos_version;
f.write(pk('<I', 0xCCCCCCCC)) # TODO f.write(pk('<BBBB', s_relstep, s_micro, s_minor, s_major)) # TODO
# Write release_version; # Write release_version;
f.write(pk('<I', 0xCCCCCCCC)) # TODO f.write(pk('<BBBB', relstep, micro, minor, major)) # TODO
# Write git_revision; # Write git_revision;
f.write(pk('<I', 0xCCCCCCCC)) # TODO f.write(pk('<I', git_revision)) # TODO
# Write content metas # Write content metas
f.write(pk('<IIBBBBI16s', 0x000800, 0x001800, 2, 0, 0, 0, 0xCCCCCCCC, 'warmboot')) f.write(pk('<IIBBBBI16s', 0x000800, 0x001800, 2, 0, 0, 0, 0xCCCCCCCC, 'warmboot'))
f.write(pk('<IIBBBBI16s', 0x002000, 0x002000, 12, 0, 0, 0, 0xCCCCCCCC, 'tsec_keygen')) f.write(pk('<IIBBBBI16s', 0x002000, 0x002000, 12, 0, 0, 0, 0xCCCCCCCC, 'tsec_keygen'))
@ -134,51 +134,63 @@ def write_kips(f, all_kips):
f.write(b'\xCC' * (0x300000 - tot)) f.write(b'\xCC' * (0x300000 - tot))
def main(argc, argv): def main(argc, argv):
if argc == 2: if argc != 12:
target = argv[1] print('Usage: %s ams_dir target revision major minor micro relstep s_major s_minor s_micro s_relstep' % argv[0])
if len(target) == 0:
target = ''
elif argc == 1:
target = ''
else:
print('Usage: %s target' % argv[0])
return 1 return 1
all_kips = get_kips() # Parse arguments
with open('../../program%s.bin' % target, 'rb') as f: ams_dir = argv[1]
data = f.read() target = '' if argv[2] == 'release' else ('_%s' % argv[2])
erista_mtc = get_overlay(data, 1) revision = int(argv[3], 16)
mariko_mtc = get_overlay(data, 2) major = int(argv[4])
minor = int(argv[5])
micro = int(argv[6])
relstep = int(argv[7])
s_major = int(argv[8])
s_minor = int(argv[9])
s_micro = int(argv[10])
s_relstep = int(argv[11])
# Read/parse fusee
fusee_program = read_file(os.path.join(ams_dir, 'fusee/program/program%s.bin' % target))
fusee_bin = read_file(os.path.join(ams_dir, 'fusee/fusee%s.bin' % target))
erista_mtc = get_overlay(fusee_program, 1)
mariko_mtc = get_overlay(fusee_program, 2)
erista_hsh = hashlib.sha256(erista_mtc[:-4]).digest()[:4] erista_hsh = hashlib.sha256(erista_mtc[:-4]).digest()[:4]
mariko_hsh = hashlib.sha256(mariko_mtc[:-4]).digest()[:4] mariko_hsh = hashlib.sha256(mariko_mtc[:-4]).digest()[:4]
fusee_program = lz4_compress(data[:0x2B000 - 8] + erista_hsh + mariko_hsh + get_overlay(data, 0)[:0x11000]) # Read other files
mesosphere = read_file('../../../../mesosphere/mesosphere%s.bin' % target) exosphere = read_file(os.path.join(ams_dir, 'exosphere/exosphere%s.bin' % target))
with open('../../program%s.lz4' % target, 'wb') as f: warmboot = read_file(os.path.join(ams_dir, 'exosphere/warmboot%s.bin' % target))
f.write(fusee_program) mariko_fatal = read_file(os.path.join(ams_dir, 'exosphere/mariko_fatal%s.bin' % target))
with open('../../fusee-boogaloo%s.bin' % target, 'wb') as f: rebootstub = read_file(os.path.join(ams_dir, 'exosphere/program/rebootstub/rebootstub%s.bin' % target))
mesosphere = read_file(os.path.join(ams_dir, 'mesosphere/mesosphere%s.bin' % target))
all_kips = get_kips(ams_dir)
tsec_keygen = read_file(os.path.join(ams_dir, 'fusee/program/tsec_keygen/tsec_keygen.bin'))
splash_bin = read_file(os.path.join(ams_dir, 'fusee/program/splash_screen/splash_screen.bin'))
assert len(splash_bin) == 0x3C0000
with open(os.path.join(ams_dir, 'fusee/package3%s' % target), 'wb') as f:
# Write header # Write header
write_header(f, all_kips, len(mesosphere)) write_header(f, all_kips, len(mesosphere), revision, major, minor, micro, relstep, s_major, s_minor, s_micro, s_relstep)
# Write warmboot # Write warmboot
f.write(pad(read_file('../../../../exosphere/warmboot%s.bin' % target), 0x1800)) f.write(pad(warmboot, 0x1800))
# Write TSEC Keygen # Write TSEC Keygen
f.write(pad(read_file('../../tsec_keygen/tsec_keygen.bin'), 0x2000)) f.write(pad(tsec_keygen, 0x2000))
# Write Mariko Fatal # Write Mariko Fatal
f.write(pad(read_file('../../../../exosphere/mariko_fatal%s.bin' % target), 0x1C000)) f.write(pad(mariko_fatal, 0x1C000))
# Write Erista MTC # Write Erista MTC
f.write(erista_mtc[:-4] + erista_hsh) f.write(erista_mtc[:-4] + erista_hsh)
# Write Mariko MTC # Write Mariko MTC
f.write(mariko_mtc[:-4] + mariko_hsh) f.write(mariko_mtc[:-4] + mariko_hsh)
# Write exosphere # Write exosphere
f.write(pad(read_file('../../../../exosphere/exosphere%s.bin' % target), 0xE000)) f.write(pad(exosphere, 0xE000))
# Write mesosphere # Write mesosphere
f.write(pad(read_file('../../../../mesosphere/mesosphere%s.bin' % target), 0xAA000)) f.write(pad(mesosphere, 0xAA000))
# Write kips # Write kips
write_kips(f, all_kips) write_kips(f, all_kips)
# Write Splash Screen # Write Splash Screen
f.write(pad(read_file('../../splash_screen/splash_screen.bin'), 0x3C0000)) f.write(splash_bin)
# Write fusee # Write fusee
f.write(pad(fusee_program, 0x20000)) f.write(pad(fusee_bin, 0x20000))
# Write rebootstub # Write rebootstub
f.write(pad(read_file('../../../../exosphere/program/rebootstub/rebootstub%s.bin' % target), 0x1000)) f.write(pad(rebootstub, 0x1000))
# Pad to 8 MB # Pad to 8 MB
f.write(b'\xCC' * (0x800000 - 0x7E1000)) f.write(b'\xCC' * (0x800000 - 0x7E1000))

View file

@ -111,7 +111,7 @@ DEPENDS := $(OFILES:.o=.d)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
$(OUTPUT).lz4 : $(OUTPUT).bin $(OUTPUT).lz4 : $(OUTPUT).bin
@python $(TOPDIR)/split_bin.py "$(ATMOSPHERE_BUILD_TARGET)" @python $(TOPDIR)/lz4_compress.py $(OUTPUT).bin $(OUTPUT).lz4
@echo built ... $(notdir $@) @echo built ... $(notdir $@)
$(OUTPUT).bin : $(OUTPUT).elf $(OUTPUT).bin : $(OUTPUT).elf

View file

@ -0,0 +1,35 @@
#!/usr/bin/env python
import sys, lz4, hashlib
from struct import unpack as up, pack as pk
def lz4_compress(data):
try:
import lz4.block as block
except ImportError:
block = lz4.LZ4_compress
return block.compress(data, 'high_compression', store_size=False)
def read_file(fn):
with open(fn, 'rb') as f:
return f.read()
def get_overlay(program, i):
return program[0x2B000 + 0x14000 * i:0x2B000 + 0x14000 * (i+1)]
def main(argc, argv):
if argc != 3:
print('Usage: %s in out' % argv[0])
return 1
data = read_file(argv[1])
erista_mtc = get_overlay(data, 1)
mariko_mtc = get_overlay(data, 2)
erista_hsh = hashlib.sha256(erista_mtc[:-4]).digest()[:4]
mariko_hsh = hashlib.sha256(mariko_mtc[:-4]).digest()[:4]
fusee_program = lz4_compress(data[:0x2B000 - 8] + erista_hsh + mariko_hsh + get_overlay(data, 0)[:0x11000])
with open(argv[2], 'wb') as f:
f.write(fusee_program)
return 0
if __name__ == '__main__':
sys.exit(main(len(sys.argv), sys.argv))

View file

@ -19,11 +19,11 @@
namespace ams::nxboot { namespace ams::nxboot {
constexpr inline const size_t SecondaryArchiveSize = 8_MB; constexpr inline const size_t ExternalPackageSize = 8_MB;
constexpr inline const size_t InitialProcessStorageSizeMax = 3_MB / 8; constexpr inline const size_t InitialProcessStorageSizeMax = 3_MB / 8;
struct SecondaryArchiveContentMeta { struct ExternalPackageContentMeta {
u32 offset; u32 offset;
u32 size; u32 size;
u8 type; u8 type;
@ -31,17 +31,17 @@ namespace ams::nxboot {
u32 pad; u32 pad;
char name[0x10]; char name[0x10];
}; };
static_assert(sizeof(SecondaryArchiveContentMeta) == 0x20); static_assert(sizeof(ExternalPackageContentMeta) == 0x20);
struct SecondaryArchiveKipMeta { struct ExternalPackageKipMeta {
u64 program_id; u64 program_id;
u32 offset; u32 offset;
u32 size; u32 size;
se::Sha256Hash hash; se::Sha256Hash hash;
}; };
static_assert(sizeof(SecondaryArchiveKipMeta) == 0x30); static_assert(sizeof(ExternalPackageKipMeta) == 0x30);
struct SecondaryArchiveHeader { struct ExternalPackageHeader {
static constexpr u32 Magic = util::FourCC<'F','S','S','0'>::Code; static constexpr u32 Magic = util::FourCC<'F','S','S','0'>::Code;
u32 reserved0; /* Previously entrypoint. */ u32 reserved0; /* Previously entrypoint. */
@ -58,15 +58,15 @@ namespace ams::nxboot {
u32 supported_hos_version; u32 supported_hos_version;
u32 release_version; u32 release_version;
u32 git_revision; u32 git_revision;
SecondaryArchiveContentMeta content_metas[(0x400 - 0x40) / sizeof(SecondaryArchiveContentMeta)]; ExternalPackageContentMeta content_metas[(0x400 - 0x40) / sizeof(ExternalPackageContentMeta)];
SecondaryArchiveKipMeta emummc_meta; ExternalPackageKipMeta emummc_meta;
SecondaryArchiveKipMeta kip_metas[8]; ExternalPackageKipMeta kip_metas[8];
u8 reserved3[0x800 - (0x400 + 9 * sizeof(SecondaryArchiveKipMeta))]; u8 reserved3[0x800 - (0x400 + 9 * sizeof(ExternalPackageKipMeta))];
}; };
static_assert(sizeof(SecondaryArchiveHeader) == 0x800); static_assert(sizeof(ExternalPackageHeader) == 0x800);
struct SecondaryArchive { struct ExternalPackage {
SecondaryArchiveHeader header; /* 0x000000-0x000800 */ ExternalPackageHeader header; /* 0x000000-0x000800 */
u8 warmboot[0x1800]; /* 0x000800-0x002000 */ u8 warmboot[0x1800]; /* 0x000800-0x002000 */
u8 tsec_keygen[0x2000]; /* 0x002000-0x004000 */ u8 tsec_keygen[0x2000]; /* 0x002000-0x004000 */
u8 mariko_fatal[0x1C000]; /* 0x004000-0x020000 */ u8 mariko_fatal[0x1C000]; /* 0x004000-0x020000 */
@ -80,8 +80,8 @@ namespace ams::nxboot {
u8 reboot_stub[0x1000]; /* 0x7E0000-0x7E1000 */ u8 reboot_stub[0x1000]; /* 0x7E0000-0x7E1000 */
u8 reserved[0x1F000]; /* 0x7E1000-0x800000 */ u8 reserved[0x1F000]; /* 0x7E1000-0x800000 */
}; };
static_assert(sizeof(SecondaryArchive) == SecondaryArchiveSize); static_assert(sizeof(ExternalPackage) == ExternalPackageSize);
ALWAYS_INLINE const SecondaryArchive &GetSecondaryArchive() { return *reinterpret_cast<const SecondaryArchive *>(0xC0000000); } ALWAYS_INLINE const ExternalPackage &GetExternalPackage() { return *reinterpret_cast<const ExternalPackage *>(0xC0000000); }
} }

View file

@ -22,7 +22,7 @@
#include "fusee_overlay_manager.hpp" #include "fusee_overlay_manager.hpp"
#include "fusee_sd_card.hpp" #include "fusee_sd_card.hpp"
#include "fusee_fatal.hpp" #include "fusee_fatal.hpp"
#include "fusee_secondary_archive.hpp" #include "fusee_external_package.hpp"
#include "fusee_setup_horizon.hpp" #include "fusee_setup_horizon.hpp"
#include "fusee_secmon_sync.hpp" #include "fusee_secmon_sync.hpp"
@ -30,41 +30,40 @@ namespace ams::nxboot {
namespace { namespace {
/* TODO: Change to fusee-secondary.bin when development is done. */ constexpr const char ExternalPackageFilePath[] = "sdmc:/atmosphere/package3";
constexpr const char SecondaryArchiveFilePath[] = "sdmc:/atmosphere/fusee-boogaloo.bin";
constinit fs::FileHandle g_archive_file; constinit fs::FileHandle g_package_file;
void OpenSecondaryArchive() { void OpenExternalPackage() {
Result result; Result result;
/* Open fusee-secondary. */ /* Open external package. */
if (R_FAILED((result = fs::OpenFile(std::addressof(g_archive_file), SecondaryArchiveFilePath, fs::OpenMode_Read)))) { if (R_FAILED((result = fs::OpenFile(std::addressof(g_package_file), ExternalPackageFilePath, fs::OpenMode_Read)))) {
ShowFatalError("Failed to open %s!\n", SecondaryArchiveFilePath); ShowFatalError("Failed to open %s!\n", ExternalPackageFilePath);
} }
/* Get file size. */ /* Get file size. */
s64 file_size; s64 file_size;
if (R_FAILED((result = fs::GetFileSize(std::addressof(file_size), g_archive_file)))) { if (R_FAILED((result = fs::GetFileSize(std::addressof(file_size), g_package_file)))) {
ShowFatalError("Failed to get fusee-secondary size: 0x%08" PRIx32 "\n", result.GetValue()); ShowFatalError("Failed to get package3 size: 0x%08" PRIx32 "\n", result.GetValue());
} }
/* Check file size. */ /* Check file size. */
if (static_cast<size_t>(file_size) != SecondaryArchiveSize) { if (static_cast<size_t>(file_size) != ExternalPackageSize) {
ShowFatalError("fusee-secondary seems corrupted (size 0x%zx != 0x%zx)", static_cast<size_t>(file_size), SecondaryArchiveSize); ShowFatalError("package3 seems corrupted (size 0x%zx != 0x%zx)", static_cast<size_t>(file_size), ExternalPackageSize);
} }
} }
void ReadFullSecondaryArchive() { void ReadFullExternalPackage() {
Result result; Result result;
if (R_FAILED((result = fs::ReadFile(g_archive_file, 0, const_cast<void *>(static_cast<const void *>(std::addressof(GetSecondaryArchive()))), SecondaryArchiveSize)))) { if (R_FAILED((result = fs::ReadFile(g_package_file, 0, const_cast<void *>(static_cast<const void *>(std::addressof(GetExternalPackage()))), ExternalPackageSize)))) {
ShowFatalError("Failed to read %s!\n", SecondaryArchiveFilePath); ShowFatalError("Failed to read %s!\n", ExternalPackageFilePath);
} }
} }
void CloseSecondaryArchive() { void CloseExternalPackage() {
fs::CloseFile(g_archive_file); fs::CloseFile(g_package_file);
} }
} }
@ -98,17 +97,17 @@ namespace ams::nxboot {
/* If we have a fatal error, save and display it. */ /* If we have a fatal error, save and display it. */
SaveAndShowFatalError(); SaveAndShowFatalError();
/* Open the secondary archive. */ /* Open the external package. */
OpenSecondaryArchive(); OpenExternalPackage();
/* Load the memory training overlay. */ /* Load the memory training overlay. */
LoadOverlay(g_archive_file, OverlayId_MemoryTraining); LoadOverlay(g_package_file, OverlayId_MemoryTraining);
/* Do memory training. */ /* Do memory training. */
DoMemoryTraining(); DoMemoryTraining();
/* Read the rest of the archive file. */ /* Read the rest of the archive file. */
ReadFullSecondaryArchive(); ReadFullExternalPackage();
/* Save the memory training overlay. */ /* Save the memory training overlay. */
SaveMemoryTrainingOverlay(); SaveMemoryTrainingOverlay();
@ -117,8 +116,8 @@ namespace ams::nxboot {
InitializeDisplay(); InitializeDisplay();
ShowDisplay(); ShowDisplay();
/* Close the secondary archive. */ /* Close the external package. */
CloseSecondaryArchive(); CloseExternalPackage();
/* Perform rest of the boot process. */ /* Perform rest of the boot process. */
SetupAndStartHorizon(); SetupAndStartHorizon();

View file

@ -15,7 +15,6 @@
*/ */
#include <exosphere.hpp> #include <exosphere.hpp>
#include "fusee_malloc.hpp" #include "fusee_malloc.hpp"
#include "fusee_secondary_archive.hpp"
#include "fusee_fatal.hpp" #include "fusee_fatal.hpp"
namespace ams::nxboot { namespace ams::nxboot {

View file

@ -15,7 +15,7 @@
*/ */
#include <exosphere.hpp> #include <exosphere.hpp>
#include "fusee_overlay_manager.hpp" #include "fusee_overlay_manager.hpp"
#include "fusee_secondary_archive.hpp" #include "fusee_external_package.hpp"
#include "fusee_fatal.hpp" #include "fusee_fatal.hpp"
namespace ams::nxboot { namespace ams::nxboot {
@ -33,13 +33,13 @@ namespace ams::nxboot {
u32 verif_hash; u32 verif_hash;
u32 store_hash; u32 store_hash;
if (fuse::GetSocType() == fuse::SocType_Erista) { if (fuse::GetSocType() == fuse::SocType_Erista) {
result = fs::ReadFile(archive_file, __builtin_offsetof(SecondaryArchive, ovl_mtc_erista), GetOverlayDestination(), sizeof(SecondaryArchive{}.ovl_mtc_erista)); result = fs::ReadFile(archive_file, __builtin_offsetof(ExternalPackage, ovl_mtc_erista), GetOverlayDestination(), sizeof(ExternalPackage{}.ovl_mtc_erista));
verif_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[-2]; verif_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[-2];
store_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[(sizeof(SecondaryArchive{}.ovl_mtc_erista) / sizeof(u32)) - 1]; store_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[(sizeof(ExternalPackage{}.ovl_mtc_erista) / sizeof(u32)) - 1];
} else /* if (fuse::GetSocType() == fuse::SocType_Mariko) */ { } else /* if (fuse::GetSocType() == fuse::SocType_Mariko) */ {
result = fs::ReadFile(archive_file, __builtin_offsetof(SecondaryArchive, ovl_mtc_mariko), GetOverlayDestination(), sizeof(SecondaryArchive{}.ovl_mtc_mariko)); result = fs::ReadFile(archive_file, __builtin_offsetof(ExternalPackage, ovl_mtc_mariko), GetOverlayDestination(), sizeof(ExternalPackage{}.ovl_mtc_mariko));
verif_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[-1]; verif_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[-1];
store_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[(sizeof(SecondaryArchive{}.ovl_mtc_mariko) / sizeof(u32)) - 1]; store_hash = reinterpret_cast<const u32 *>(GetOverlayDestination())[(sizeof(ExternalPackage{}.ovl_mtc_mariko) / sizeof(u32)) - 1];
} }
if (R_FAILED(result)) { if (R_FAILED(result)) {
@ -64,19 +64,19 @@ namespace ams::nxboot {
void SaveMemoryTrainingOverlay() { void SaveMemoryTrainingOverlay() {
if (fuse::GetSocType() == fuse::SocType_Erista) { if (fuse::GetSocType() == fuse::SocType_Erista) {
/* NOTE: Erista does not do memory clock restoration. */ /* NOTE: Erista does not do memory clock restoration. */
/* std::memcpy(const_cast<u8 *>(GetSecondaryArchive().ovl_mtc_erista), GetOverlayDestination(), sizeof(SecondaryArchive{}.ovl_mtc_erista)); */ /* std::memcpy(const_cast<u8 *>(GetExternalPackage().ovl_mtc_erista), GetOverlayDestination(), sizeof(ExternalPackage{}.ovl_mtc_erista)); */
} else /* if (fuse::GetSocType() == fuse::SocType_Mariko) */ { } else /* if (fuse::GetSocType() == fuse::SocType_Mariko) */ {
std::memcpy(const_cast<u8 *>(GetSecondaryArchive().ovl_mtc_mariko), GetOverlayDestination(), sizeof(SecondaryArchive{}.ovl_mtc_mariko) - 0x2000); std::memcpy(const_cast<u8 *>(GetExternalPackage().ovl_mtc_mariko), GetOverlayDestination(), sizeof(ExternalPackage{}.ovl_mtc_mariko) - 0x2000);
} }
} }
void RestoreMemoryTrainingOverlay() { void RestoreMemoryTrainingOverlay() {
if (fuse::GetSocType() == fuse::SocType_Erista) { if (fuse::GetSocType() == fuse::SocType_Erista) {
/* NOTE: Erista does not do memory clock restoration. */ /* NOTE: Erista does not do memory clock restoration. */
/* std::memcpy(GetOverlayDestination(), GetSecondaryArchive().ovl_mtc_erista, sizeof(SecondaryArchive{}.ovl_mtc_erista)); */ /* std::memcpy(GetOverlayDestination(), GetExternalPackage().ovl_mtc_erista, sizeof(ExternalPackage{}.ovl_mtc_erista)); */
} else /* if (fuse::GetSocType() == fuse::SocType_Mariko) */ { } else /* if (fuse::GetSocType() == fuse::SocType_Mariko) */ {
std::memcpy(g_secmon_debug_storage, secmon::MemoryRegionPhysicalIramSecureMonitorDebug.GetPointer<void>(), sizeof(g_secmon_debug_storage)); std::memcpy(g_secmon_debug_storage, secmon::MemoryRegionPhysicalIramSecureMonitorDebug.GetPointer<void>(), sizeof(g_secmon_debug_storage));
std::memcpy(GetOverlayDestination(), GetSecondaryArchive().ovl_mtc_mariko, sizeof(SecondaryArchive{}.ovl_mtc_mariko) - 0x2000); std::memcpy(GetOverlayDestination(), GetExternalPackage().ovl_mtc_mariko, sizeof(ExternalPackage{}.ovl_mtc_mariko) - 0x2000);
} }
} }

View file

@ -16,7 +16,7 @@
#include <exosphere.hpp> #include <exosphere.hpp>
#include <exosphere/secmon/secmon_monitor_context.hpp> #include <exosphere/secmon/secmon_monitor_context.hpp>
#include "fusee_key_derivation.hpp" #include "fusee_key_derivation.hpp"
#include "fusee_secondary_archive.hpp" #include "fusee_external_package.hpp"
#include "fusee_setup_horizon.hpp" #include "fusee_setup_horizon.hpp"
#include "fusee_ini.hpp" #include "fusee_ini.hpp"
#include "fusee_emummc.hpp" #include "fusee_emummc.hpp"
@ -44,7 +44,7 @@ namespace ams::nxboot {
if (soc_type == fuse::SocType_Erista) { if (soc_type == fuse::SocType_Erista) {
clkrst::SetBpmpClockRate(clkrst::BpmpClockRate_408MHz); clkrst::SetBpmpClockRate(clkrst::BpmpClockRate_408MHz);
if (!tsec::RunTsecFirmware(GetSecondaryArchive().tsec_keygen, sizeof(GetSecondaryArchive().tsec_keygen))) { if (!tsec::RunTsecFirmware(GetExternalPackage().tsec_keygen, sizeof(GetExternalPackage().tsec_keygen))) {
ShowFatalError("Failed to run tsec_keygen firmware!\n"); ShowFatalError("Failed to run tsec_keygen firmware!\n");
} }
@ -428,10 +428,10 @@ namespace ams::nxboot {
void LoadWarmbootFirmware(fuse::SocType soc_type, ams::TargetFirmware target_firmware, const u8 *package1) { void LoadWarmbootFirmware(fuse::SocType soc_type, ams::TargetFirmware target_firmware, const u8 *package1) {
u8 *warmboot_dst = secmon::MemoryRegionPhysicalIramWarmbootBin.GetPointer<u8>(); u8 *warmboot_dst = secmon::MemoryRegionPhysicalIramWarmbootBin.GetPointer<u8>();
size_t warmboot_size = std::min(sizeof(GetSecondaryArchive().warmboot), secmon::MemoryRegionPhysicalIramWarmbootBin.GetSize()); size_t warmboot_size = std::min(sizeof(GetExternalPackage().warmboot), secmon::MemoryRegionPhysicalIramWarmbootBin.GetSize());
if (soc_type == fuse::SocType_Erista) { if (soc_type == fuse::SocType_Erista) {
/* Copy the ams warmboot binary. */ /* Copy the ams warmboot binary. */
std::memcpy(warmboot_dst, GetSecondaryArchive().warmboot, warmboot_size); std::memcpy(warmboot_dst, GetExternalPackage().warmboot, warmboot_size);
/* Set the rsa modulus. */ /* Set the rsa modulus. */
if (fuse::GetHardwareState() == fuse::HardwareState_Production) { if (fuse::GetHardwareState() == fuse::HardwareState_Production) {
@ -694,7 +694,7 @@ namespace ams::nxboot {
/* Get the size. */ /* Get the size. */
s64 size; s64 size;
if (R_FAILED((result = fs::GetFileSize(std::addressof(size), exo_file))) || size > sizeof(GetSecondaryArchive().exosphere)) { if (R_FAILED((result = fs::GetFileSize(std::addressof(size), exo_file))) || size > sizeof(GetExternalPackage().exosphere)) {
ShowFatalError("Invalid SD exosphere size: 0x%08" PRIx32 ", %" PRIx64 "!\n", result.GetValue(), static_cast<u64>(size)); ShowFatalError("Invalid SD exosphere size: 0x%08" PRIx32 ", %" PRIx64 "!\n", result.GetValue(), static_cast<u64>(size));
} }
@ -706,7 +706,7 @@ namespace ams::nxboot {
} }
if (!use_sd_exo) { if (!use_sd_exo) {
std::memcpy(exosphere_dst, GetSecondaryArchive().exosphere, sizeof(GetSecondaryArchive().exosphere)); std::memcpy(exosphere_dst, GetExternalPackage().exosphere, sizeof(GetExternalPackage().exosphere));
} }
/* Copy mariko fatal. */ /* Copy mariko fatal. */
@ -726,7 +726,7 @@ namespace ams::nxboot {
/* Get the size. */ /* Get the size. */
s64 size; s64 size;
if (R_FAILED((result = fs::GetFileSize(std::addressof(size), mariko_program_file))) || size > sizeof(GetSecondaryArchive().mariko_fatal)) { if (R_FAILED((result = fs::GetFileSize(std::addressof(size), mariko_program_file))) || size > sizeof(GetExternalPackage().mariko_fatal)) {
ShowFatalError("Invalid SD mariko_fatal size: 0x%08" PRIx32 ", %" PRIx64 "!\n", result.GetValue(), static_cast<u64>(size)); ShowFatalError("Invalid SD mariko_fatal size: 0x%08" PRIx32 ", %" PRIx64 "!\n", result.GetValue(), static_cast<u64>(size));
} }
@ -736,12 +736,12 @@ namespace ams::nxboot {
} }
/* Clear the remainder. */ /* Clear the remainder. */
std::memset(mariko_fatal_dst + size, 0, sizeof(GetSecondaryArchive().mariko_fatal) - size); std::memset(mariko_fatal_dst + size, 0, sizeof(GetExternalPackage().mariko_fatal) - size);
} }
} }
if (!use_sd_mariko_fatal) { if (!use_sd_mariko_fatal) {
std::memcpy(mariko_fatal_dst, GetSecondaryArchive().mariko_fatal, sizeof(GetSecondaryArchive().mariko_fatal)); std::memcpy(mariko_fatal_dst, GetExternalPackage().mariko_fatal, sizeof(GetExternalPackage().mariko_fatal));
} }
} }

View file

@ -17,7 +17,7 @@
#include "fusee_stratosphere.hpp" #include "fusee_stratosphere.hpp"
#include "fusee_fatal.hpp" #include "fusee_fatal.hpp"
#include "fusee_malloc.hpp" #include "fusee_malloc.hpp"
#include "fusee_secondary_archive.hpp" #include "fusee_external_package.hpp"
#include "fs/fusee_fs_api.hpp" #include "fs/fusee_fs_api.hpp"
namespace ams::nxboot { namespace ams::nxboot {
@ -726,11 +726,11 @@ namespace ams::nxboot {
/* Add the stratosphere kips. */ /* Add the stratosphere kips. */
{ {
const auto &secondary_archive = GetSecondaryArchive(); const auto &external_package = GetExternalPackage();
for (u32 i = 0; i < secondary_archive.header.num_kips; ++i) { for (u32 i = 0; i < external_package.header.num_kips; ++i) {
const auto &meta = secondary_archive.header.kip_metas[i]; const auto &meta = external_package.header.kip_metas[i];
AddInitialProcess(reinterpret_cast<const InitialProcessHeader *>(secondary_archive.kips + meta.offset), std::addressof(meta.hash)); AddInitialProcess(reinterpret_cast<const InitialProcessHeader *>(external_package.kips + meta.offset), std::addressof(meta.hash));
} }
} }
@ -893,8 +893,8 @@ namespace ams::nxboot {
} }
void RebuildPackage2(ams::TargetFirmware target_firmware, bool emummc_enabled) { void RebuildPackage2(ams::TargetFirmware target_firmware, bool emummc_enabled) {
/* Get the secondary archive. */ /* Get the external package. */
const auto &secondary_archive = GetSecondaryArchive(); const auto &external_package = GetExternalPackage();
/* Clear package2 header. */ /* Clear package2 header. */
auto *package2 = secmon::MemoryRegionDramPackage2.GetPointer<pkg2::Package2Header>(); auto *package2 = secmon::MemoryRegionDramPackage2.GetPointer<pkg2::Package2Header>();
@ -918,8 +918,8 @@ namespace ams::nxboot {
if (void *sd_meso = ReadFile(std::addressof(meso_size), "sdmc:/atmosphere/mesosphere.bin"); sd_meso != nullptr) { if (void *sd_meso = ReadFile(std::addressof(meso_size), "sdmc:/atmosphere/mesosphere.bin"); sd_meso != nullptr) {
std::memcpy(payload_data, sd_meso, meso_size); std::memcpy(payload_data, sd_meso, meso_size);
} else { } else {
meso_size = secondary_archive.header.meso_size; meso_size = external_package.header.meso_size;
std::memcpy(payload_data, secondary_archive.mesosphere, meso_size); std::memcpy(payload_data, external_package.mesosphere, meso_size);
} }
/* Read emummc, if needed. */ /* Read emummc, if needed. */
@ -928,8 +928,8 @@ namespace ams::nxboot {
if (emummc_enabled) { if (emummc_enabled) {
emummc = static_cast<const InitialProcessHeader *>(ReadFile(std::addressof(emummc_size), "sdmc:/atmosphere/emummc.kip")); emummc = static_cast<const InitialProcessHeader *>(ReadFile(std::addressof(emummc_size), "sdmc:/atmosphere/emummc.kip"));
if (emummc == nullptr) { if (emummc == nullptr) {
emummc = reinterpret_cast<const InitialProcessHeader *>(secondary_archive.kips + secondary_archive.header.emummc_meta.offset); emummc = reinterpret_cast<const InitialProcessHeader *>(external_package.kips + external_package.header.emummc_meta.offset);
emummc_size = secondary_archive.header.emummc_meta.size; emummc_size = external_package.header.emummc_meta.size;
} }
} }

View file

@ -64,9 +64,9 @@ namespace ams::mitm {
/* Emummc file protection. */ /* Emummc file protection. */
FsFile g_emummc_file; FsFile g_emummc_file;
/* Maintain exclusive access to the fusee-secondary archive. */ /* Maintain exclusive access to the fusee external package. */
FsFile g_stratosphere_file; FsFile g_stratosphere_file;
FsFile g_secondary_file; FsFile g_package3_file;
constexpr inline bool IsHexadecimal(const char *str) { constexpr inline bool IsHexadecimal(const char *str) {
while (*str) { while (*str) {
@ -134,12 +134,12 @@ namespace ams::mitm {
/* NOTE: g_bis_key_file is intentionally not closed here. This prevents any other process from opening it. */ /* NOTE: g_bis_key_file is intentionally not closed here. This prevents any other process from opening it. */
} }
/* Open a reference to the fusee-secondary archive. */ /* Open a reference to the fusee external package. */
/* As upcoming/current atmosphere releases will contain more than one zip which users much choose between, */ /* As upcoming/current atmosphere releases may contain more than one zip which users much choose between, */
/* maintaining an open reference prevents cleanly the issue of "automatic" updaters selecting the incorrect */ /* maintaining an open reference prevents cleanly the issue of "automatic" updaters selecting the incorrect */
/* zip, and encourages good updating hygiene -- atmosphere should not be updated on SD while HOS is alive. */ /* zip, and encourages good updating hygiene -- atmosphere should not be updated on SD while HOS is alive. */
{ {
R_ABORT_UNLESS(mitm::fs::OpenSdFile(std::addressof(g_secondary_file), "/atmosphere/fusee-secondary.bin", ams::fs::OpenMode_Read)); R_ABORT_UNLESS(mitm::fs::OpenSdFile(std::addressof(g_package3_file), "/atmosphere/package3", ams::fs::OpenMode_Read));
R_ABORT_UNLESS(mitm::fs::OpenSdFile(std::addressof(g_stratosphere_file), "/atmosphere/stratosphere.romfs", ams::fs::OpenMode_Read)); R_ABORT_UNLESS(mitm::fs::OpenSdFile(std::addressof(g_stratosphere_file), "/atmosphere/stratosphere.romfs", ams::fs::OpenMode_Read));
} }
} }

View file

@ -14,7 +14,7 @@ export OUTPUT := $(CURDIR)/$(TARGET)
export TOPDIR := $(CURDIR) export TOPDIR := $(CURDIR)
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
$(foreach dir,$(DATA),$(CURDIR)/$(dir)) $(TOPDIR)/../../fusee/fusee-primary $(foreach dir,$(DATA),$(CURDIR)/$(dir)) $(TOPDIR)/../../fusee
export DEPSDIR := $(CURDIR)/$(BUILD) export DEPSDIR := $(CURDIR)/$(BUILD)
@ -22,7 +22,7 @@ CFILES := $(call FIND_SOURCE_FILES,$(SOURCES),c)
CPPFILES := $(call FIND_SOURCE_FILES,$(SOURCES),cpp) CPPFILES := $(call FIND_SOURCE_FILES,$(SOURCES),cpp)
SFILES := $(call FIND_SOURCE_FILES,$(SOURCES),s) SFILES := $(call FIND_SOURCE_FILES,$(SOURCES),s)
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) fusee-primary.bin BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) fusee.bin
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# use CXX for linking C++ projects, CC for standard C # use CXX for linking C++ projects, CC for standard C
@ -68,7 +68,7 @@ endif
all: $(BUILD) all: $(BUILD)
check_fusee: check_fusee:
@$(MAKE) -C $(TOPDIR)/../../fusee/fusee-primary all @$(MAKE) -C $(TOPDIR)/../../fusee release
$(BUILD): check_fusee $(BUILD): check_fusee
@[ -d $@ ] || mkdir -p $@ @[ -d $@ ] || mkdir -p $@
@ -77,7 +77,7 @@ $(BUILD): check_fusee
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
clean: clean:
@echo clean ... @echo clean ...
@$(MAKE) -C $(TOPDIR)/../../fusee/fusee-primary clean @$(MAKE) -C $(TOPDIR)/../../fusee clean
@rm -fr $(BUILD) $(TARGET).kip $(TARGET).elf @rm -fr $(BUILD) $(TARGET).kip $(TARGET).elf
@ -96,12 +96,12 @@ $(OUTPUT).kip : $(OUTPUT).elf
$(OUTPUT).elf : $(OFILES) $(OUTPUT).elf : $(OFILES)
boot_power_utils.o: fusee-primary.bin.o boot_power_utils.o: fusee.bin.o
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# you need a rule like this for each extension you use as binary data # you need a rule like this for each extension you use as binary data
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
fusee-primary.bin.o: fusee-primary.bin fusee.bin.o: fusee.bin
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
@echo $(notdir $<) @echo $(notdir $<)
@$(bin2o) @$(bin2o)

View file

@ -16,7 +16,7 @@
#include <stratosphere.hpp> #include <stratosphere.hpp>
#include "boot_power_utils.hpp" #include "boot_power_utils.hpp"
#include "boot_pmic_driver.hpp" #include "boot_pmic_driver.hpp"
#include "fusee-primary_bin.h" #include "fusee_bin.h"
namespace ams::boot { namespace ams::boot {
@ -48,8 +48,8 @@ namespace ams::boot {
ClearIram(); ClearIram();
/* Copy in payload. */ /* Copy in payload. */
for (size_t ofs = 0; ofs < fusee_primary_bin_size; ofs += sizeof(g_work_page)) { for (size_t ofs = 0; ofs < fusee_bin_size; ofs += sizeof(g_work_page)) {
std::memcpy(g_work_page, &fusee_primary_bin[ofs], std::min(static_cast<size_t>(fusee_primary_bin_size - ofs), sizeof(g_work_page))); std::memcpy(g_work_page, &fusee_bin[ofs], std::min(static_cast<size_t>(fusee_bin_size - ofs), sizeof(g_work_page)));
exosphere::CopyToIram(IramPayloadBase + ofs, g_work_page, sizeof(g_work_page)); exosphere::CopyToIram(IramPayloadBase + ofs, g_work_page, sizeof(g_work_page));
} }
@ -61,8 +61,8 @@ namespace ams::boot {
ClearIram(); ClearIram();
/* Copy in payload. */ /* Copy in payload. */
for (size_t ofs = 0; ofs < fusee_primary_bin_size; ofs += sizeof(g_work_page)) { for (size_t ofs = 0; ofs < fusee_bin_size; ofs += sizeof(g_work_page)) {
std::memcpy(g_work_page, &fusee_primary_bin[ofs], std::min(static_cast<size_t>(fusee_primary_bin_size - ofs), sizeof(g_work_page))); std::memcpy(g_work_page, &fusee_bin[ofs], std::min(static_cast<size_t>(fusee_bin_size - ofs), sizeof(g_work_page)));
exosphere::CopyToIram(IramPayloadBase + ofs, g_work_page, sizeof(g_work_page)); exosphere::CopyToIram(IramPayloadBase + ofs, g_work_page, sizeof(g_work_page));
} }
@ -93,7 +93,7 @@ namespace ams::boot {
} }
void SetInitialRebootPayload() { void SetInitialRebootPayload() {
::ams::SetInitialRebootPayload(fusee_primary_bin, fusee_primary_bin_size); ::ams::SetInitialRebootPayload(fusee_bin, fusee_bin_size);
} }
void RebootForFatalError(ams::FatalErrorContext *ctx) { void RebootForFatalError(ams::FatalErrorContext *ctx) {

View file

@ -271,8 +271,7 @@ namespace ams::pm::resource {
/* Adjust memory limits for atmosphere. */ /* Adjust memory limits for atmosphere. */
/* We take memory away from applet normally, but away from application on < 3.0.0 to avoid a rare hang on boot. */ /* We take memory away from applet normally, but away from application on < 3.0.0 to avoid a rare hang on boot. */
/* NOTE: On Version 5.0.0+, we cannot set the pools so simply. We must instead modify the kernel, which we do */ /* NOTE: On Version 5.0.0+, we cannot set the pools so simply. We must instead rely on mesosphere support. */
/* via patches in fusee-secondary. */
const size_t extra_memory_size = hos_version == hos::Version_5_0_0 ? ExtraSystemMemorySizeAtmosphere500 : ExtraSystemMemorySizeAtmosphere; const size_t extra_memory_size = hos_version == hos::Version_5_0_0 ? ExtraSystemMemorySizeAtmosphere500 : ExtraSystemMemorySizeAtmosphere;
const auto src_group = hos_version >= hos::Version_3_0_0 ? ResourceLimitGroup_Applet : ResourceLimitGroup_Application; const auto src_group = hos_version >= hos::Version_3_0_0 ? ResourceLimitGroup_Applet : ResourceLimitGroup_Application;
for (size_t i = 0; i < spl::MemoryArrangement_Count; i++) { for (size_t i = 0; i < spl::MemoryArrangement_Count; i++) {