mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-31 06:48:22 -04:00
PRODINFO: Revamp blanking/write disallow policy. (#913)
* exo/fusee: hookup new prodinfo settings * fusee: new scheme doesn't need FLAGS_DEFAULT * fusee: fix c/p errors * ams.mitm: completely revamp prodinfo backup mechanism * ams.mitm: Implement revamped blanking/write policy * strat: make early boot more debuggable * exo: condense flag logic
This commit is contained in:
parent
6ac1ff6f24
commit
3bc2d79384
42 changed files with 1355 additions and 142 deletions
|
@ -24,6 +24,11 @@ NX_GENERATE_SERVICE_GUARD(amsBpc);
|
|||
Result _amsBpcInitialize(void) {
|
||||
Handle h;
|
||||
Result rc = svcConnectToNamedPort(&h, "bpc:ams"); /* TODO: ams:bpc */
|
||||
while (R_VALUE(rc) == KERNELRESULT(NotFound)) {
|
||||
svcSleepThread(50000000ul);
|
||||
rc = svcConnectToNamedPort(&h, "bpc:ams");
|
||||
}
|
||||
|
||||
if (R_SUCCEEDED(rc)) serviceCreate(&g_amsBpcSrv, h);
|
||||
return rc;
|
||||
}
|
||||
|
@ -44,3 +49,11 @@ Result amsBpcRebootToFatalError(void *ctx) {
|
|||
.buffers = { { ctx, 0x450 } },
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Result amsBpcSetInitialPayload(const void *src, size_t src_size) {
|
||||
return serviceDispatch(&g_amsBpcSrv, 65001,
|
||||
.buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcMapAlias },
|
||||
.buffers = { { src, src_size } },
|
||||
);
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ void amsBpcExit(void);
|
|||
Service *amsBpcGetServiceSession(void);
|
||||
|
||||
Result amsBpcRebootToFatalError(void *ctx);
|
||||
Result amsBpcSetInitialPayload(const void *src, size_t src_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -36,6 +36,14 @@ namespace ams {
|
|||
|
||||
extern ncm::ProgramId CurrentProgramId;
|
||||
|
||||
void InitializeForBoot() {
|
||||
R_ABORT_UNLESS(amsBpcInitialize());
|
||||
}
|
||||
|
||||
void SetInitialRebootPayload(const void *src, size_t src_size) {
|
||||
R_ABORT_UNLESS(amsBpcSetInitialPayload(src, src_size));
|
||||
}
|
||||
|
||||
void WEAK_SYMBOL ExceptionHandler(FatalErrorContext *ctx) {
|
||||
R_ABORT_UNLESS(amsBpcInitialize());
|
||||
R_ABORT_UNLESS(amsBpcRebootToFatalError(ctx));
|
||||
|
|
|
@ -51,19 +51,32 @@ namespace ams::exosphere {
|
|||
|
||||
namespace {
|
||||
|
||||
inline Result GetRcmBugPatched(bool *out) {
|
||||
u64 tmp = 0;
|
||||
R_TRY(spl::smc::ConvertResult(spl::smc::GetConfig(&tmp, 1, SplConfigItem_ExosphereHasRcmBugPatch)));
|
||||
*out = (tmp != 0);
|
||||
return ResultSuccess();
|
||||
inline u64 GetU64ConfigItem(spl::ConfigItem cfg) {
|
||||
u64 tmp;
|
||||
R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::GetConfig(std::addressof(tmp), 1, static_cast<::SplConfigItem>(cfg))));
|
||||
return tmp;
|
||||
}
|
||||
|
||||
inline bool GetBooleanConfigItem(spl::ConfigItem cfg) {
|
||||
return GetU64ConfigItem(cfg) != 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool IsRcmBugPatched() {
|
||||
bool rcm_bug_patched;
|
||||
R_ABORT_UNLESS(GetRcmBugPatched(&rcm_bug_patched));
|
||||
return rcm_bug_patched;
|
||||
return GetBooleanConfigItem(spl::ConfigItem::ExosphereHasRcmBugPatch);
|
||||
}
|
||||
|
||||
bool ShouldBlankProdInfo() {
|
||||
return GetBooleanConfigItem(spl::ConfigItem::ExosphereBlankProdInfo);
|
||||
}
|
||||
|
||||
bool ShouldAllowWritesToProdInfo() {
|
||||
return GetBooleanConfigItem(spl::ConfigItem::ExosphereAllowCalWrites);
|
||||
}
|
||||
|
||||
u64 GetDeviceId() {
|
||||
return GetU64ConfigItem(spl::ConfigItem::DeviceId);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -78,4 +78,15 @@ namespace ams::spl {
|
|||
}
|
||||
}
|
||||
|
||||
Result GenerateAesKek(AccessKey *access_key, const void *key_source, size_t key_source_size, u32 generation, u32 option) {
|
||||
AMS_ASSERT(key_source_size == sizeof(KeySource));
|
||||
return splCryptoGenerateAesKek(key_source, generation, option, static_cast<void *>(access_key));
|
||||
}
|
||||
|
||||
Result GenerateAesKey(void *dst, size_t dst_size, const AccessKey &access_key, const void *key_source, size_t key_source_size) {
|
||||
AMS_ASSERT(dst_size == crypto::AesEncryptor128::KeySize);
|
||||
AMS_ASSERT(key_source_size == sizeof(KeySource));
|
||||
return splCryptoGenerateAesKey(std::addressof(access_key), key_source, dst);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue