1
0
Fork 0
mirror of https://github.com/Atmosphere-NX/Atmosphere.git synced 2024-11-26 13:52:21 +00:00

ams:bpc: allow programatically setting reboot payload

This commit is contained in:
Michael Scire 2020-05-04 23:29:44 -07:00
parent 3e6031b8f4
commit 85cd2c97a0
7 changed files with 16 additions and 15 deletions

View file

@ -51,7 +51,7 @@ Result amsBpcRebootToFatalError(void *ctx) {
} }
Result amsBpcSetInitialPayload(const void *src, size_t src_size) { Result amsBpcSetRebootPayload(const void *src, size_t src_size) {
return serviceDispatch(&g_amsBpcSrv, 65001, return serviceDispatch(&g_amsBpcSrv, 65001,
.buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcMapAlias }, .buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcMapAlias },
.buffers = { { src, src_size } }, .buffers = { { src, src_size } },

View file

@ -28,7 +28,7 @@ void amsBpcExit(void);
Service *amsBpcGetServiceSession(void); Service *amsBpcGetServiceSession(void);
Result amsBpcRebootToFatalError(void *ctx); Result amsBpcRebootToFatalError(void *ctx);
Result amsBpcSetInitialPayload(const void *src, size_t src_size); Result amsBpcSetRebootPayload(const void *src, size_t src_size);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -41,7 +41,7 @@ namespace ams {
} }
void SetInitialRebootPayload(const void *src, size_t src_size) { void SetInitialRebootPayload(const void *src, size_t src_size) {
R_ABORT_UNLESS(amsBpcSetInitialPayload(src, src_size)); R_ABORT_UNLESS(amsBpcSetRebootPayload(src, src_size));
} }
void WEAK_SYMBOL ExceptionHandler(FatalErrorContext *ctx) { void WEAK_SYMBOL ExceptionHandler(FatalErrorContext *ctx) {

View file

@ -97,7 +97,7 @@ namespace ams::mitm::bpc {
DoRebootToPayload(ctx); DoRebootToPayload(ctx);
} }
void SetInitialRebootPayload(const void *payload, size_t payload_size) { void SetRebootPayload(const void *payload, size_t payload_size) {
/* Clear payload buffer */ /* Clear payload buffer */
std::memset(g_reboot_payload, 0xCC, sizeof(g_reboot_payload)); std::memset(g_reboot_payload, 0xCC, sizeof(g_reboot_payload));
@ -107,9 +107,8 @@ namespace ams::mitm::bpc {
/* Copy in payload. */ /* Copy in payload. */
std::memcpy(g_reboot_payload, payload, payload_size); std::memcpy(g_reboot_payload, payload, payload_size);
/* NOTE: Preferred reboot type will be parsed from settings later on. */ /* NOTE: Preferred reboot type may be overrwritten when parsed from settings during boot. */
g_reboot_type = RebootType::ToPayload; g_reboot_type = RebootType::ToPayload;
} }
Result LoadRebootPayload() { Result LoadRebootPayload() {

View file

@ -24,7 +24,7 @@ namespace ams::mitm::bpc {
void ShutdownSystem(); void ShutdownSystem();
/* Atmosphere power utilities. */ /* Atmosphere power utilities. */
void SetInitialRebootPayload(const void *payload, size_t payload_size); void SetRebootPayload(const void *payload, size_t payload_size);
Result LoadRebootPayload(); Result LoadRebootPayload();
Result DetectPreferredRebootFunctionality(); Result DetectPreferredRebootFunctionality();
void RebootForFatalError(const ams::FatalErrorContext *ctx); void RebootForFatalError(const ams::FatalErrorContext *ctx);

View file

@ -29,13 +29,15 @@ namespace ams::mitm::bpc {
bpc::RebootForFatalError(&ctx); bpc::RebootForFatalError(&ctx);
} }
void AtmosphereService::SetInitialRebootPayload(const ams::sf::InBuffer &payload) { void AtmosphereService::SetRebootPayload(const ams::sf::InBuffer &payload) {
/* Set the reboot payload. */
bpc::SetRebootPayload(payload.GetPointer(), payload.GetSize());
/* If this is being called for the first time (by boot sysmodule), */
/* Then we should kick off the rest of init. */
if (!g_set_initial_payload) { if (!g_set_initial_payload) {
g_set_initial_payload = true; g_set_initial_payload = true;
/* Set the initial reboot payload. */
bpc::SetInitialRebootPayload(payload.GetPointer(), payload.GetSize());
/* Start the initialization process. */ /* Start the initialization process. */
::ams::mitm::StartInitialize(); ::ams::mitm::StartInitialize();
} }

View file

@ -22,16 +22,16 @@ namespace ams::mitm::bpc {
class AtmosphereService final : public sf::IServiceObject { class AtmosphereService final : public sf::IServiceObject {
private: private:
enum class CommandId { enum class CommandId {
RebootToFatalError = 65000, RebootToFatalError = 65000,
SetInitialRebootPayload = 65001, SetRebootPayload = 65001,
}; };
private: private:
void RebootToFatalError(const ams::FatalErrorContext &ctx); void RebootToFatalError(const ams::FatalErrorContext &ctx);
void SetInitialRebootPayload(const ams::sf::InBuffer &payload); void SetRebootPayload(const ams::sf::InBuffer &payload);
public: public:
DEFINE_SERVICE_DISPATCH_TABLE { DEFINE_SERVICE_DISPATCH_TABLE {
MAKE_SERVICE_COMMAND_META(RebootToFatalError), MAKE_SERVICE_COMMAND_META(RebootToFatalError),
MAKE_SERVICE_COMMAND_META(SetInitialRebootPayload), MAKE_SERVICE_COMMAND_META(SetRebootPayload),
}; };
}; };