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:
parent
3e6031b8f4
commit
85cd2c97a0
7 changed files with 16 additions and 15 deletions
|
@ -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 } },
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue