mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-27 16:02:37 +00:00
system service: deliver initial AppContent entitlement updates through shared queue
This commit is contained in:
1 parent
210d4dcd99
commit
62643c3424
4 files changed
+88
-1
No files matched your search
@@ -46,6 +46,8 @@ void InitLibKernel_1_Apr(Loader::SymbolDatabase *symbols);
|
||||
namespace Libs {
|
||||
void InitLibKernel_1(Loader::SymbolDatabase *symbols);
|
||||
void InitSysmodule_1(Loader::SymbolDatabase *symbols);
|
||||
void InitSystemService_1(Loader::SymbolDatabase *symbols);
|
||||
void InitAppContent_1(Loader::SymbolDatabase *symbols);
|
||||
}
|
||||
|
||||
namespace Libs::LibAmpr {
|
||||
@@ -204,6 +206,56 @@ void TestSysmoduleReferences() {
|
||||
"internal and public module operations share load state");
|
||||
}
|
||||
|
||||
void TestSystemServiceEntitlementEvents() {
|
||||
Loader::SymbolDatabase symbols;
|
||||
Libs::InitSystemService_1(&symbols);
|
||||
Libs::InitAppContent_1(&symbols);
|
||||
const auto resolve = [&](const char* nid, const char* library, const char* module) {
|
||||
const auto* symbol = symbols.Find(
|
||||
{nid, library, 1, module, 1, 1, Loader::SymbolType::Func});
|
||||
Check(symbol != nullptr, "entitlement event export resolves");
|
||||
return symbol->vaddr;
|
||||
};
|
||||
const auto initialize = reinterpret_cast<int (KYTY_SYSV_ABI *)(const void*, void*)>(
|
||||
resolve("R9lA82OraNs", "AppContent", "AppContentUtil"));
|
||||
struct Status {
|
||||
int32_t event_num;
|
||||
bool overlay, background, vr;
|
||||
uint8_t reserved[127];
|
||||
};
|
||||
struct Event {
|
||||
int32_t type;
|
||||
uint8_t data[8192];
|
||||
};
|
||||
static_assert(sizeof(Status) == 136 && sizeof(Event) == 8196);
|
||||
const auto get_status = reinterpret_cast<int (KYTY_SYSV_ABI *)(Status*)>(
|
||||
resolve("rPo6tV8D9bM", "SystemService", "SystemService"));
|
||||
const auto receive = reinterpret_cast<int (KYTY_SYSV_ABI *)(Event*)>(
|
||||
resolve("656LMQSrg6U", "SystemService", "SystemService"));
|
||||
Status status {};
|
||||
Event event {};
|
||||
Check(get_status(&status) == OK && status.event_num == 0,
|
||||
"SystemService starts without pending events");
|
||||
std::array<uint8_t, 32> init {};
|
||||
std::array<uint8_t, 40> boot {};
|
||||
Check(initialize(init.data(), boot.data()) == OK,
|
||||
"AppContent initialization generates an entitlement notification");
|
||||
Check(get_status(&status) == OK && status.event_num == 1 &&
|
||||
get_status(&status) == OK && status.event_num == 1,
|
||||
"status queries preserve pending notifications");
|
||||
Check(receive(nullptr) == Libs::SystemService::SYSTEM_SERVICE_ERROR_PARAMETER &&
|
||||
get_status(&status) == OK && status.event_num == 1,
|
||||
"invalid event output does not consume a notification");
|
||||
std::memset(&event, 0xff, sizeof(event));
|
||||
Check(receive(&event) == OK && event.type == 0x10000003 &&
|
||||
std::all_of(std::begin(event.data), std::end(event.data),
|
||||
[](uint8_t byte) { return byte == 0; }) &&
|
||||
get_status(&status) == OK && status.event_num == 0,
|
||||
"receive delivers the entitlement event with cleared payload exactly once");
|
||||
Check(receive(&event) == Libs::SystemService::SYSTEM_SERVICE_ERROR_NO_EVENT,
|
||||
"empty event queue reports NO_EVENT");
|
||||
}
|
||||
|
||||
void TestSaveOpenVisibility() {
|
||||
constexpr char Path[] = "/savedata0/visible-save.dat";
|
||||
constexpr char Payload[] = "saved progress";
|
||||
@@ -1573,6 +1625,7 @@ int main(int, char**) {
|
||||
TempDirectory temporary;
|
||||
FileSystem::Initialize();
|
||||
TestSysmoduleReferences();
|
||||
TestSystemServiceEntitlementEvents();
|
||||
TestRandomDevices();
|
||||
TestFileDescriptorFlags();
|
||||
CheckMountRoot(temporary.Path());
|
||||
|
||||
Reference in new issue
Block a user