1
0
Fork 0
mirror of https://github.com/Atmosphere-NX/Atmosphere.git synced 2024-12-24 03:06:17 +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,
.buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcMapAlias },
.buffers = { { src, src_size } },

View file

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

View file

@ -41,7 +41,7 @@ namespace ams {
}
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) {

View file

@ -97,7 +97,7 @@ namespace ams::mitm::bpc {
DoRebootToPayload(ctx);
}
void SetInitialRebootPayload(const void *payload, size_t payload_size) {
void SetRebootPayload(const void *payload, size_t payload_size) {
/* Clear payload buffer */
std::memset(g_reboot_payload, 0xCC, sizeof(g_reboot_payload));
@ -107,9 +107,8 @@ namespace ams::mitm::bpc {
/* Copy in payload. */
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;
}
Result LoadRebootPayload() {

View file

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

View file

@ -29,13 +29,15 @@ namespace ams::mitm::bpc {
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) {
g_set_initial_payload = true;
/* Set the initial reboot payload. */
bpc::SetInitialRebootPayload(payload.GetPointer(), payload.GetSize());
/* Start the initialization process. */
::ams::mitm::StartInitialize();
}

View file

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