mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 12:21:18 +00:00
boot2: move to separate process
This commit is contained in:
parent
535e49a38d
commit
6abd756e0c
14 changed files with 427 additions and 31 deletions
2
Makefile
2
Makefile
|
@ -50,6 +50,7 @@ dist: all
|
||||||
mkdir atmosphere-$(AMSVER)/atmosphere
|
mkdir atmosphere-$(AMSVER)/atmosphere
|
||||||
mkdir atmosphere-$(AMSVER)/sept
|
mkdir atmosphere-$(AMSVER)/sept
|
||||||
mkdir atmosphere-$(AMSVER)/switch
|
mkdir atmosphere-$(AMSVER)/switch
|
||||||
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000008
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/010000000000000D
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/010000000000000D
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032
|
||||||
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000034
|
mkdir -p atmosphere-$(AMSVER)/atmosphere/titles/0100000000000034
|
||||||
|
@ -69,6 +70,7 @@ dist: all
|
||||||
cp common/defaults/system_settings.ini atmosphere-$(AMSVER)/atmosphere/system_settings.ini
|
cp common/defaults/system_settings.ini atmosphere-$(AMSVER)/atmosphere/system_settings.ini
|
||||||
cp -r common/defaults/kip_patches atmosphere-$(AMSVER)/atmosphere/kip_patches
|
cp -r common/defaults/kip_patches atmosphere-$(AMSVER)/atmosphere/kip_patches
|
||||||
cp -r common/defaults/hbl_html atmosphere-$(AMSVER)/atmosphere/hbl_html
|
cp -r common/defaults/hbl_html atmosphere-$(AMSVER)/atmosphere/hbl_html
|
||||||
|
cp stratosphere/boot2/boot2.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000008/exefs.nsp
|
||||||
cp stratosphere/dmnt/dmnt.nsp atmosphere-$(AMSVER)/atmosphere/titles/010000000000000D/exefs.nsp
|
cp stratosphere/dmnt/dmnt.nsp atmosphere-$(AMSVER)/atmosphere/titles/010000000000000D/exefs.nsp
|
||||||
cp stratosphere/eclct.stub/eclct.stub.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032/exefs.nsp
|
cp stratosphere/eclct.stub/eclct.stub.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000032/exefs.nsp
|
||||||
cp stratosphere/fatal/fatal.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000034/exefs.nsp
|
cp stratosphere/fatal/fatal.nsp atmosphere-$(AMSVER)/atmosphere/titles/0100000000000034/exefs.nsp
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
MODULES := loader pm sm boot ams_mitm spl eclct.stub ro creport fatal dmnt
|
MODULES := loader pm sm boot ams_mitm spl eclct.stub ro creport fatal dmnt boot2
|
||||||
|
|
||||||
SUBFOLDERS := libstratosphere $(MODULES)
|
SUBFOLDERS := libstratosphere $(MODULES)
|
||||||
|
|
||||||
|
|
166
stratosphere/boot2/Makefile
Normal file
166
stratosphere/boot2/Makefile
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
.SUFFIXES:
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEVKITPRO)),)
|
||||||
|
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>/devkitpro")
|
||||||
|
endif
|
||||||
|
|
||||||
|
TOPDIR ?= $(CURDIR)
|
||||||
|
include $(DEVKITPRO)/libnx/switch_rules
|
||||||
|
|
||||||
|
AMSBRANCH := $(shell git symbolic-ref --short HEAD)
|
||||||
|
AMSREV := $(AMSBRANCH)-$(shell git rev-parse --short HEAD)
|
||||||
|
|
||||||
|
ifneq (, $(strip $(shell git status --porcelain 2>/dev/null)))
|
||||||
|
AMSREV := $(AMSREV)-dirty
|
||||||
|
endif
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# TARGET is the name of the output
|
||||||
|
# BUILD is the directory where object files & intermediate files will be placed
|
||||||
|
# SOURCES is a list of directories containing source code
|
||||||
|
# DATA is a list of directories containing data files
|
||||||
|
# INCLUDES is a list of directories containing header files
|
||||||
|
# EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm".
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
TARGET := $(notdir $(CURDIR))
|
||||||
|
BUILD := build
|
||||||
|
SOURCES := source
|
||||||
|
DATA := data
|
||||||
|
INCLUDES := include ../../common/include
|
||||||
|
EXEFS_SRC := exefs_src
|
||||||
|
|
||||||
|
DEFINES := -DDISABLE_IPC -DATMOSPHERE_GIT_BRANCH=\"$(AMSBRANCH)\" -DATMOSPHERE_GIT_REV=\"$(AMSREV)\" -DINI_MAX_LINE=768
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# options for code generation
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE
|
||||||
|
|
||||||
|
CFLAGS := -g -Wall -O2 -ffunction-sections \
|
||||||
|
$(ARCH) $(DEFINES)
|
||||||
|
|
||||||
|
CFLAGS += $(INCLUDE) -D__SWITCH__
|
||||||
|
|
||||||
|
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
|
||||||
|
|
||||||
|
ASFLAGS := -g $(ARCH)
|
||||||
|
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||||
|
|
||||||
|
LIBS := -lstratosphere -lnx
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# list of directories containing libraries, this must be the top level containing
|
||||||
|
# include and lib
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
LIBDIRS := $(PORTLIBS) $(LIBNX) $(CURDIR)/../libstratosphere
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# no real need to edit anything past this point unless you need to add additional
|
||||||
|
# rules for different file extensions
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||||
|
export TOPDIR := $(CURDIR)
|
||||||
|
|
||||||
|
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||||
|
|
||||||
|
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||||
|
|
||||||
|
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||||
|
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||||
|
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||||
|
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# use CXX for linking C++ projects, CC for standard C
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifeq ($(strip $(CPPFILES)),)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
export LD := $(CC)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
else
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
export LD := $(CXX)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
endif
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export OFILES := $(addsuffix .o,$(BINFILES)) \
|
||||||
|
$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
|
||||||
|
|
||||||
|
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||||
|
-I$(CURDIR)/$(BUILD)
|
||||||
|
|
||||||
|
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
|
||||||
|
|
||||||
|
export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC)
|
||||||
|
|
||||||
|
ifeq ($(strip $(CONFIG_JSON)),)
|
||||||
|
jsons := $(wildcard *.json)
|
||||||
|
ifneq (,$(findstring $(TARGET).json,$(jsons)))
|
||||||
|
export APP_JSON := $(TOPDIR)/$(TARGET).json
|
||||||
|
else
|
||||||
|
ifneq (,$(findstring config.json,$(jsons)))
|
||||||
|
export APP_JSON := $(TOPDIR)/config.json
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
export APP_JSON := $(TOPDIR)/$(CONFIG_JSON)
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: $(BUILD) clean all
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
all: $(BUILD)
|
||||||
|
|
||||||
|
$(BUILD):
|
||||||
|
@[ -d $@ ] || mkdir -p $@
|
||||||
|
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
clean:
|
||||||
|
@echo clean ...
|
||||||
|
@rm -fr $(BUILD) $(TARGET).nsp $(TARGET).npdm $(TARGET).nso $(TARGET).elf
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
else
|
||||||
|
.PHONY: all
|
||||||
|
|
||||||
|
DEPENDS := $(OFILES:.o=.d)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# main targets
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
all : $(OUTPUT).nsp
|
||||||
|
|
||||||
|
ifeq ($(strip $(APP_JSON)),)
|
||||||
|
$(OUTPUT).nsp : $(OUTPUT).nso
|
||||||
|
else
|
||||||
|
$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(OUTPUT).nso : $(OUTPUT).elf
|
||||||
|
|
||||||
|
$(OUTPUT).elf : $(OFILES)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# you need a rule like this for each extension you use as binary data
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
%.bin.o : %.bin
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
@echo $(notdir $<)
|
||||||
|
@$(bin2o)
|
||||||
|
|
||||||
|
-include $(DEPENDS)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
endif
|
||||||
|
#---------------------------------------------------------------------------------------
|
93
stratosphere/boot2/boot2.json
Normal file
93
stratosphere/boot2/boot2.json
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
{
|
||||||
|
"name": "boot2",
|
||||||
|
"title_id": "0x0100000000000008",
|
||||||
|
"title_id_range_min": "0x0100000000000008",
|
||||||
|
"title_id_range_max": "0x0100000000000008",
|
||||||
|
"main_thread_stack_size": "0x00004000",
|
||||||
|
"main_thread_priority": 48,
|
||||||
|
"default_cpu_id": 3,
|
||||||
|
"process_category": 0,
|
||||||
|
"is_retail": true,
|
||||||
|
"pool_partition": 2,
|
||||||
|
"is_64_bit": true,
|
||||||
|
"address_space_type": 1,
|
||||||
|
"filesystem_access": {
|
||||||
|
"permissions": "0xFFFFFFFFFFFFFFFF"
|
||||||
|
},
|
||||||
|
"service_host": [],
|
||||||
|
"service_access": ["fsp-srv", "gpio", "htc", "lr", "pm:bm", "pm:shell", "pm:info", "set:sys"],
|
||||||
|
"kernel_capabilities": [
|
||||||
|
{
|
||||||
|
"type": "kernel_flags",
|
||||||
|
"value": {
|
||||||
|
"highest_thread_priority": 63,
|
||||||
|
"lowest_thread_priority": 24,
|
||||||
|
"lowest_cpu_id": 3,
|
||||||
|
"highest_cpu_id": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "syscalls",
|
||||||
|
"value": {
|
||||||
|
"svcSetHeapSize": "0x01",
|
||||||
|
"svcSetMemoryPermission": "0x02",
|
||||||
|
"svcSetMemoryAttribute": "0x03",
|
||||||
|
"svcMapMemory": "0x04",
|
||||||
|
"svcUnmapMemory": "0x05",
|
||||||
|
"svcQueryMemory": "0x06",
|
||||||
|
"svcExitProcess": "0x07",
|
||||||
|
"svcCreateThread": "0x08",
|
||||||
|
"svcStartThread": "0x09",
|
||||||
|
"svcExitThread": "0x0a",
|
||||||
|
"svcSleepThread": "0x0b",
|
||||||
|
"svcGetThreadPriority": "0x0c",
|
||||||
|
"svcSetThreadPriority": "0x0d",
|
||||||
|
"svcGetThreadCoreMask": "0x0e",
|
||||||
|
"svcSetThreadCoreMask": "0x0f",
|
||||||
|
"svcGetCurrentProcessorNumber": "0x10",
|
||||||
|
"svcSignalEvent": "0x11",
|
||||||
|
"svcClearEvent": "0x12",
|
||||||
|
"svcMapSharedMemory": "0x13",
|
||||||
|
"svcUnmapSharedMemory": "0x14",
|
||||||
|
"svcCreateTransferMemory": "0x15",
|
||||||
|
"svcCloseHandle": "0x16",
|
||||||
|
"svcResetSignal": "0x17",
|
||||||
|
"svcWaitSynchronization": "0x18",
|
||||||
|
"svcCancelSynchronization": "0x19",
|
||||||
|
"svcArbitrateLock": "0x1a",
|
||||||
|
"svcArbitrateUnlock": "0x1b",
|
||||||
|
"svcWaitProcessWideKeyAtomic": "0x1c",
|
||||||
|
"svcSignalProcessWideKey": "0x1d",
|
||||||
|
"svcGetSystemTick": "0x1e",
|
||||||
|
"svcConnectToNamedPort": "0x1f",
|
||||||
|
"svcSendSyncRequestLight": "0x20",
|
||||||
|
"svcSendSyncRequest": "0x21",
|
||||||
|
"svcSendSyncRequestWithUserBuffer": "0x22",
|
||||||
|
"svcSendAsyncRequestWithUserBuffer": "0x23",
|
||||||
|
"svcGetProcessId": "0x24",
|
||||||
|
"svcGetThreadId": "0x25",
|
||||||
|
"svcBreak": "0x26",
|
||||||
|
"svcOutputDebugString": "0x27",
|
||||||
|
"svcReturnFromException": "0x28",
|
||||||
|
"svcGetInfo": "0x29",
|
||||||
|
"svcWaitForAddress": "0x34",
|
||||||
|
"svcSignalToAddress": "0x35",
|
||||||
|
"svcCreateSession": "0x40",
|
||||||
|
"svcAcceptSession": "0x41",
|
||||||
|
"svcReplyAndReceiveLight": "0x42",
|
||||||
|
"svcReplyAndReceive": "0x43",
|
||||||
|
"svcReplyAndReceiveWithUserBuffer": "0x44",
|
||||||
|
"svcCreateEvent": "0x45",
|
||||||
|
"svcGetSystemInfo": "0x6f",
|
||||||
|
"svcCallSecureMonitor": "0x7f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "min_kernel_version",
|
||||||
|
"value": "0x0030"
|
||||||
|
}, {
|
||||||
|
"type": "handle_table_size",
|
||||||
|
"value": 128
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
97
stratosphere/boot2/source/boot2_main.cpp
Normal file
97
stratosphere/boot2/source/boot2_main.cpp
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2019 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <switch.h>
|
||||||
|
#include <atmosphere.h>
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
#include <stratosphere/boot2.hpp>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
extern u32 __start__;
|
||||||
|
|
||||||
|
u32 __nx_applet_type = AppletType_None;
|
||||||
|
u32 __nx_fs_num_sessions = 1;
|
||||||
|
u32 __nx_fsdev_direntry_cache_size = 1;
|
||||||
|
|
||||||
|
#define INNER_HEAP_SIZE 0x2000
|
||||||
|
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
|
||||||
|
char nx_inner_heap[INNER_HEAP_SIZE];
|
||||||
|
|
||||||
|
void __libnx_initheap(void);
|
||||||
|
void __appInit(void);
|
||||||
|
void __appExit(void);
|
||||||
|
|
||||||
|
/* Exception handling. */
|
||||||
|
alignas(16) u8 __nx_exception_stack[0x1000];
|
||||||
|
u64 __nx_exception_stack_size = sizeof(__nx_exception_stack);
|
||||||
|
void __libnx_exception_handler(ThreadExceptionDump *ctx);
|
||||||
|
void __libstratosphere_exception_handler(AtmosphereFatalErrorContext *ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
sts::ncm::TitleId __stratosphere_title_id = sts::ncm::TitleId::Boot2;
|
||||||
|
|
||||||
|
void __libnx_exception_handler(ThreadExceptionDump *ctx) {
|
||||||
|
StratosphereCrashHandler(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void __libnx_initheap(void) {
|
||||||
|
void* addr = nx_inner_heap;
|
||||||
|
size_t size = nx_inner_heap_size;
|
||||||
|
|
||||||
|
/* Newlib */
|
||||||
|
extern char* fake_heap_start;
|
||||||
|
extern char* fake_heap_end;
|
||||||
|
|
||||||
|
fake_heap_start = (char*)addr;
|
||||||
|
fake_heap_end = (char*)addr + size;
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace sts;
|
||||||
|
|
||||||
|
void __appInit(void) {
|
||||||
|
hos::SetVersionForLibnx();
|
||||||
|
|
||||||
|
/* Initialize services we need. */
|
||||||
|
DoWithSmSession([&]() {
|
||||||
|
R_ASSERT(fsInitialize());
|
||||||
|
R_ASSERT(pmbmInitialize());
|
||||||
|
R_ASSERT(pminfoInitialize());
|
||||||
|
R_ASSERT(pmshellInitialize());
|
||||||
|
R_ASSERT(setsysInitialize());
|
||||||
|
R_ASSERT(gpioInitialize());
|
||||||
|
});
|
||||||
|
|
||||||
|
R_ASSERT(fsdevMountSdmc());
|
||||||
|
|
||||||
|
CheckAtmosphereVersion(CURRENT_ATMOSPHERE_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __appExit(void) {
|
||||||
|
fsdevUnmountAll();
|
||||||
|
gpioExit();
|
||||||
|
setsysExit();
|
||||||
|
pmshellExit();
|
||||||
|
pminfoExit();
|
||||||
|
pmbmExit();
|
||||||
|
fsExit();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
boot2::LaunchPostSdCardBootPrograms();
|
||||||
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ include $(DEVKITPRO)/libnx/switch_rules
|
||||||
# INCLUDES is a list of directories containing header files
|
# INCLUDES is a list of directories containing header files
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
TARGET := $(notdir $(CURDIR))
|
TARGET := $(notdir $(CURDIR))
|
||||||
SOURCES := source source/ams source/os source/os/impl source/sf source/sf/cmif source/sf/hipc source/spl source/spl/smc source/updater source/patcher source/map source/rnd source/util source/sm source/cfg source/pm source/hid source/ldr source/kvdb
|
SOURCES := source source/ams source/os source/os/impl source/sf source/sf/cmif source/sf/hipc source/spl source/spl/smc source/updater source/patcher source/map source/rnd source/util source/sm source/cfg source/pm source/hid source/ldr source/kvdb source/boot2
|
||||||
DATA := data
|
DATA := data
|
||||||
INCLUDES := include
|
INCLUDES := include
|
||||||
|
|
||||||
|
|
20
stratosphere/libstratosphere/include/stratosphere/boot2.hpp
Normal file
20
stratosphere/libstratosphere/include/stratosphere/boot2.hpp
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2019 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <switch.h>
|
||||||
|
|
||||||
|
#include "boot2/boot2_api.hpp"
|
|
@ -21,6 +21,11 @@
|
||||||
namespace sts::boot2 {
|
namespace sts::boot2 {
|
||||||
|
|
||||||
/* Boot2 API. */
|
/* Boot2 API. */
|
||||||
void LaunchBootPrograms();
|
|
||||||
|
/* Normally invoked by PM. */
|
||||||
|
void LaunchPreSdCardBootProgramsAndBoot2();
|
||||||
|
|
||||||
|
/* Normally invoked by boot2. */
|
||||||
|
void LaunchPostSdCardBootPrograms();
|
||||||
|
|
||||||
}
|
}
|
|
@ -26,6 +26,8 @@ namespace sts::cfg {
|
||||||
void GetInitialProcessRange(os::ProcessId *out_min, os::ProcessId *out_max);
|
void GetInitialProcessRange(os::ProcessId *out_min, os::ProcessId *out_max);
|
||||||
|
|
||||||
/* SD card configuration. */
|
/* SD card configuration. */
|
||||||
|
bool IsSdCardRequiredServicesReady();
|
||||||
|
void WaitSdCardRequiredServicesReady();
|
||||||
bool IsSdCardInitialized();
|
bool IsSdCardInitialized();
|
||||||
void WaitSdCardInitialized();
|
void WaitSdCardInitialized();
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <stratosphere/cfg.hpp>
|
#include <stratosphere/cfg.hpp>
|
||||||
#include <stratosphere/ldr.hpp>
|
#include <stratosphere/ldr.hpp>
|
||||||
#include <stratosphere/pm.hpp>
|
#include <stratosphere/pm.hpp>
|
||||||
#include "boot2_api.hpp"
|
#include <stratosphere/boot2.hpp>
|
||||||
|
|
||||||
namespace sts::boot2 {
|
namespace sts::boot2 {
|
||||||
|
|
||||||
|
@ -183,9 +183,6 @@ namespace sts::boot2 {
|
||||||
bool IsMaintenanceMode() {
|
bool IsMaintenanceMode() {
|
||||||
/* Contact set:sys, retrieve boot!force_maintenance. */
|
/* Contact set:sys, retrieve boot!force_maintenance. */
|
||||||
{
|
{
|
||||||
auto set_sys_holder = sm::ScopedServiceHolder<setsysInitialize, setsysExit>();
|
|
||||||
R_ASSERT(set_sys_holder.GetResult());
|
|
||||||
|
|
||||||
u8 force_maintenance = 1;
|
u8 force_maintenance = 1;
|
||||||
u64 size_out;
|
u64 size_out;
|
||||||
setsysGetSettingsItemValue("boot", "force_maintenance", &force_maintenance, sizeof(force_maintenance), &size_out);
|
setsysGetSettingsItemValue("boot", "force_maintenance", &force_maintenance, sizeof(force_maintenance), &size_out);
|
||||||
|
@ -196,9 +193,6 @@ namespace sts::boot2 {
|
||||||
|
|
||||||
/* Contact GPIO, read plus/minus buttons. */
|
/* Contact GPIO, read plus/minus buttons. */
|
||||||
{
|
{
|
||||||
auto gpio_holder = sm::ScopedServiceHolder<gpioInitialize, gpioExit>();
|
|
||||||
R_ASSERT(gpio_holder.GetResult());
|
|
||||||
|
|
||||||
return GetGpioPadLow(GpioPadName_ButtonVolUp) && GetGpioPadLow(GpioPadName_ButtonVolDown);
|
return GetGpioPadLow(GpioPadName_ButtonVolUp) && GetGpioPadLow(GpioPadName_ButtonVolDown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -306,16 +300,18 @@ namespace sts::boot2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Boot2 API. */
|
/* Boot2 API. */
|
||||||
void LaunchBootPrograms() {
|
|
||||||
|
void LaunchPreSdCardBootProgramsAndBoot2() {
|
||||||
|
/* This code is normally run by PM. */
|
||||||
|
|
||||||
/* Wait until fs.mitm has installed itself. We want this to happen as early as possible. */
|
/* Wait until fs.mitm has installed itself. We want this to happen as early as possible. */
|
||||||
R_ASSERT(sm::mitm::WaitMitm(sm::ServiceName::Encode("fsp-srv")));
|
R_ASSERT(sm::mitm::WaitMitm(sm::ServiceName::Encode("fsp-srv")));
|
||||||
|
|
||||||
/* Launch programs required to mount the SD card. */
|
/* Launch programs required to mount the SD card. */
|
||||||
LaunchList(PreSdCardLaunchPrograms, NumPreSdCardLaunchPrograms);
|
LaunchList(PreSdCardLaunchPrograms, NumPreSdCardLaunchPrograms);
|
||||||
|
|
||||||
/* At this point, the SD card can be mounted. */
|
/* Wait for the SD card required services to be ready. */
|
||||||
cfg::WaitSdCardInitialized();
|
cfg::WaitSdCardRequiredServicesReady();
|
||||||
R_ASSERT(fsdevMountSdmc());
|
|
||||||
|
|
||||||
/* Wait for other atmosphere mitm modules to initialize. */
|
/* Wait for other atmosphere mitm modules to initialize. */
|
||||||
R_ASSERT(sm::mitm::WaitMitm(sm::ServiceName::Encode("set:sys")));
|
R_ASSERT(sm::mitm::WaitMitm(sm::ServiceName::Encode("set:sys")));
|
||||||
|
@ -325,6 +321,13 @@ namespace sts::boot2 {
|
||||||
R_ASSERT(sm::mitm::WaitMitm(sm::ServiceName::Encode("bpc:c")));
|
R_ASSERT(sm::mitm::WaitMitm(sm::ServiceName::Encode("bpc:c")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Launch Atmosphere boot2, using FsStorageId_None to force SD card boot. */
|
||||||
|
LaunchTitle(nullptr, ncm::TitleLocation::Make(ncm::TitleId::Boot2, ncm::StorageId::None), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LaunchPostSdCardBootPrograms() {
|
||||||
|
/* This code is normally run by boot2. */
|
||||||
|
|
||||||
/* Find out whether we are maintenance mode. */
|
/* Find out whether we are maintenance mode. */
|
||||||
const bool maintenance = IsMaintenanceMode();
|
const bool maintenance = IsMaintenanceMode();
|
||||||
if (maintenance) {
|
if (maintenance) {
|
||||||
|
@ -350,9 +353,6 @@ namespace sts::boot2 {
|
||||||
|
|
||||||
/* Launch user programs off of the SD. */
|
/* Launch user programs off of the SD. */
|
||||||
LaunchFlaggedProgramsOnSdCard();
|
LaunchFlaggedProgramsOnSdCard();
|
||||||
|
|
||||||
/* We no longer need the SD card. */
|
|
||||||
fsdevUnmountAll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -38,7 +38,7 @@ namespace sts::cfg {
|
||||||
FsFileSystem g_sd_card_filesystem = {};
|
FsFileSystem g_sd_card_filesystem = {};
|
||||||
|
|
||||||
/* SD card helpers. */
|
/* SD card helpers. */
|
||||||
Result TryInitializeSdCard() {
|
Result CheckSdCardServicesReady() {
|
||||||
for (size_t i = 0; i < NumRequiredServicesForSdCardAccess; i++) {
|
for (size_t i = 0; i < NumRequiredServicesForSdCardAccess; i++) {
|
||||||
bool service_present = false;
|
bool service_present = false;
|
||||||
R_TRY(sm::HasService(&service_present, RequiredServicesForSdCardAccess[i]));
|
R_TRY(sm::HasService(&service_present, RequiredServicesForSdCardAccess[i]));
|
||||||
|
@ -47,15 +47,24 @@ namespace sts::cfg {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ResultSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WaitSdCardServicesReadyImpl() {
|
||||||
|
for (size_t i = 0; i < NumRequiredServicesForSdCardAccess; i++) {
|
||||||
|
R_ASSERT(sm::WaitService(RequiredServicesForSdCardAccess[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Result TryInitializeSdCard() {
|
||||||
|
R_TRY(CheckSdCardServicesReady());
|
||||||
R_ASSERT(fsMountSdcard(&g_sd_card_filesystem));
|
R_ASSERT(fsMountSdcard(&g_sd_card_filesystem));
|
||||||
g_sd_card_initialized = true;
|
g_sd_card_initialized = true;
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializeSdCard() {
|
void InitializeSdCard() {
|
||||||
for (size_t i = 0; i < NumRequiredServicesForSdCardAccess; i++) {
|
WaitSdCardServicesReadyImpl();
|
||||||
R_ASSERT(sm::WaitService(RequiredServicesForSdCardAccess[i]));
|
|
||||||
}
|
|
||||||
R_ASSERT(fsMountSdcard(&g_sd_card_filesystem));
|
R_ASSERT(fsMountSdcard(&g_sd_card_filesystem));
|
||||||
g_sd_card_initialized = true;
|
g_sd_card_initialized = true;
|
||||||
}
|
}
|
||||||
|
@ -63,6 +72,14 @@ namespace sts::cfg {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SD card utilities. */
|
/* SD card utilities. */
|
||||||
|
bool IsSdCardRequiredServicesReady() {
|
||||||
|
return R_SUCCEEDED(CheckSdCardServicesReady());
|
||||||
|
}
|
||||||
|
|
||||||
|
void WaitSdCardRequiredServicesReady() {
|
||||||
|
WaitSdCardServicesReadyImpl();
|
||||||
|
}
|
||||||
|
|
||||||
bool IsSdCardInitialized() {
|
bool IsSdCardInitialized() {
|
||||||
std::scoped_lock lk(g_sd_card_lock);
|
std::scoped_lock lk(g_sd_card_lock);
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ endif
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
TARGET := $(notdir $(CURDIR))
|
TARGET := $(notdir $(CURDIR))
|
||||||
BUILD := build
|
BUILD := build
|
||||||
SOURCES := source source/impl source/boot2
|
SOURCES := source source/impl
|
||||||
DATA := data
|
DATA := data
|
||||||
INCLUDES := include ../../common/include
|
INCLUDES := include ../../common/include
|
||||||
EXEFS_SRC := exefs_src
|
EXEFS_SRC := exefs_src
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <stratosphere/boot2.hpp>
|
||||||
#include <stratosphere/spl.hpp>
|
#include <stratosphere/spl.hpp>
|
||||||
#include <stratosphere/ldr/ldr_pm_api.hpp>
|
#include <stratosphere/ldr/ldr_pm_api.hpp>
|
||||||
#include <stratosphere/sm/sm_manager_api.hpp>
|
#include <stratosphere/sm/sm_manager_api.hpp>
|
||||||
|
@ -24,8 +25,6 @@
|
||||||
|
|
||||||
#include "pm_process_info.hpp"
|
#include "pm_process_info.hpp"
|
||||||
|
|
||||||
#include "../boot2/boot2_api.hpp"
|
|
||||||
|
|
||||||
namespace sts::pm::impl {
|
namespace sts::pm::impl {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -732,7 +731,7 @@ namespace sts::pm::impl {
|
||||||
Result NotifyBootFinished() {
|
Result NotifyBootFinished() {
|
||||||
static bool g_has_boot_finished = false;
|
static bool g_has_boot_finished = false;
|
||||||
if (!g_has_boot_finished) {
|
if (!g_has_boot_finished) {
|
||||||
boot2::LaunchBootPrograms();
|
boot2::LaunchPreSdCardBootProgramsAndBoot2();
|
||||||
g_has_boot_finished = true;
|
g_has_boot_finished = true;
|
||||||
g_boot_finished_event.Signal();
|
g_boot_finished_event.Signal();
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,10 +35,8 @@ extern "C" {
|
||||||
extern u32 __start__;
|
extern u32 __start__;
|
||||||
|
|
||||||
u32 __nx_applet_type = AppletType_None;
|
u32 __nx_applet_type = AppletType_None;
|
||||||
u32 __nx_fs_num_sessions = 1;
|
|
||||||
u32 __nx_fsdev_direntry_cache_size = 1;
|
|
||||||
|
|
||||||
#define INNER_HEAP_SIZE 0x4000
|
#define INNER_HEAP_SIZE 0x2000
|
||||||
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
|
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
|
||||||
char nx_inner_heap[INNER_HEAP_SIZE];
|
char nx_inner_heap[INNER_HEAP_SIZE];
|
||||||
|
|
||||||
|
@ -150,7 +148,6 @@ void __appInit(void) {
|
||||||
R_ASSERT(lrInitialize());
|
R_ASSERT(lrInitialize());
|
||||||
R_ASSERT(ldrPmInitialize());
|
R_ASSERT(ldrPmInitialize());
|
||||||
R_ASSERT(splInitialize());
|
R_ASSERT(splInitialize());
|
||||||
R_ASSERT(fsInitialize());
|
|
||||||
});
|
});
|
||||||
|
|
||||||
CheckAtmosphereVersion(CURRENT_ATMOSPHERE_VERSION);
|
CheckAtmosphereVersion(CURRENT_ATMOSPHERE_VERSION);
|
||||||
|
@ -158,8 +155,6 @@ void __appInit(void) {
|
||||||
|
|
||||||
void __appExit(void) {
|
void __appExit(void) {
|
||||||
/* Cleanup services. */
|
/* Cleanup services. */
|
||||||
fsdevUnmountAll();
|
|
||||||
fsExit();
|
|
||||||
splExit();
|
splExit();
|
||||||
ldrPmExit();
|
ldrPmExit();
|
||||||
lrExit();
|
lrExit();
|
||||||
|
|
Loading…
Reference in a new issue