mirror of
https://github.com/ps5-linux/ps5-linux-loader.git
synced 2026-07-16 01:50:40 +00:00
cleaning + notifications + autosleep
This commit is contained in:
@@ -91,7 +91,7 @@ long find_and_get_size_of_file(const char *filename, char *found_path) {
|
||||
snprintf(full_path, sizeof(full_path), "%s%s", file_paths[i], filename);
|
||||
|
||||
if (stat(full_path, &st) == 0) {
|
||||
printf("File '%s' found in '%s'\n", filename, file_paths[i]);
|
||||
notify("File '%s' found in '%s'\n", filename, file_paths[i]);
|
||||
strcpy(found_path, full_path);
|
||||
return st.st_size;
|
||||
}
|
||||
@@ -111,7 +111,7 @@ static int find_and_read_file(const char *filename, void *buf, size_t bufsize) {
|
||||
snprintf(full_path, sizeof(full_path), "%s%s", file_paths[i], filename);
|
||||
|
||||
if (stat(full_path, &st) == 0) {
|
||||
printf("File '%s' found in '%s'\n", filename, file_paths[i]);
|
||||
notify("File '%s' found in '%s'\n", filename, file_paths[i]);
|
||||
return read_file(full_path, buf, bufsize);
|
||||
}
|
||||
}
|
||||
@@ -139,9 +139,6 @@ static void trim_newline(char *s) {
|
||||
}
|
||||
|
||||
int fetch_linux(struct linux_info *info) {
|
||||
uintptr_t self_pmap = getpmap(kernel_get_proc(getpid()));
|
||||
uintptr_t self_pml4 = kread64(self_pmap + 0x20);
|
||||
|
||||
uintptr_t syscore_pmap = getpmap(kernel_get_proc(MINI_SYSCORE_PID));
|
||||
uintptr_t syscore_pml4 = kread64(syscore_pmap + 0x20);
|
||||
|
||||
@@ -150,7 +147,7 @@ int fetch_linux(struct linux_info *info) {
|
||||
|
||||
size_t bzimage_size = find_and_get_size_of_file("bzImage", bzimage_path);
|
||||
if (bzimage_size < 0) {
|
||||
printf("File bzImage not found at default paths - Aborting\n");
|
||||
notify("File bzImage not found at default paths - Aborting\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -158,20 +155,20 @@ int fetch_linux(struct linux_info *info) {
|
||||
mmap(NULL, ALIGN_UP(bzimage_size, 0x1000), PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||
if (bzimage == MAP_FAILED) {
|
||||
printf("[-] Error could not allocate bzimage.\n");
|
||||
notify("[-] Error could not allocate bzimage.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
bzimage_size =
|
||||
read_file(bzimage_path, bzimage, ALIGN_UP(bzimage_size, 0x1000));
|
||||
if (bzimage_size < 0) {
|
||||
printf("Something went wrong while reading bzImage - Aborting\n");
|
||||
notify("Something went wrong while reading bzImage - Aborting\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
size_t initrd_size = find_and_get_size_of_file("initrd.img", initrd_path);
|
||||
if (bzimage_size < 0) {
|
||||
printf("File bzImage not found at default paths - Aborting\n");
|
||||
notify("File bzImage not found at default paths - Aborting\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -179,13 +176,13 @@ int fetch_linux(struct linux_info *info) {
|
||||
mmap(NULL, ALIGN_UP(initrd_size, 0x1000), PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||
if (initrd == MAP_FAILED) {
|
||||
printf("[-] Error could not allocate initrd.\n");
|
||||
notify("[-] Error could not allocate initrd.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
initrd_size = read_file(initrd_path, initrd, ALIGN_UP(initrd_size, 0x1000));
|
||||
if (initrd_size < 0) {
|
||||
printf("Something went wrong while reading initrd - Aborting\n");
|
||||
notify("Something went wrong while reading initrd - Aborting\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,29 +10,32 @@
|
||||
int main(void) {
|
||||
|
||||
if (setup_env()) {
|
||||
printf("Something went wrong while initiating.\nPlease make sure your fw "
|
||||
notify("Something went wrong while initiating.\nPlease make sure your fw "
|
||||
"is supported.");
|
||||
return -1;
|
||||
}
|
||||
if (hv_defeat()) {
|
||||
printf("Something went wrong while defeating Hypervisor.\nPlease make sure "
|
||||
notify("Something went wrong while defeating Hypervisor.\nPlease make sure "
|
||||
"your fw is supported.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fetch_linux(&linux_i)) {
|
||||
printf("Something went wrong while installing linux files.\n");
|
||||
notify("Something went wrong while installing linux files.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (prepare_resume()) {
|
||||
printf("Something went wrong while preparing resume.\n");
|
||||
notify("Something went wrong while preparing resume.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Everything done. Go to rest mode, wait for the orange light to stop "
|
||||
notify("Finished preparation. Going to rest mode in 5 seconds.\nPlease wait for the orange light to stop "
|
||||
"blinking and then wakeup to Linux :)\n");
|
||||
|
||||
sleep(5);
|
||||
enter_rest_mode();
|
||||
|
||||
while (1) {
|
||||
sleep(30);
|
||||
}
|
||||
@@ -41,7 +44,7 @@ int main(void) {
|
||||
}
|
||||
|
||||
int setup_env(void) {
|
||||
printf("Welcome to ps5-linux-loader. We'll defeat HV and prepare the system "
|
||||
notify("Welcome to ps5-linux-loader. We'll defeat HV and prepare the system "
|
||||
"to boot Linux on sleep resume.\n");
|
||||
if (set_offsets())
|
||||
return -1;
|
||||
@@ -145,7 +148,7 @@ int prepare_resume(void) {
|
||||
}
|
||||
}
|
||||
if (offset == -1) {
|
||||
printf("Could not find offset of args_ptr address - Aborting\n");
|
||||
notify("Could not find offset of args_ptr address - Aborting\n");
|
||||
}
|
||||
kwrite64(dest_text + offset, dest_data);
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
offset_list off_0300 = {
|
||||
.PMAP_STORE = 0x3D8E218,
|
||||
.HV_BSS_OFF = 0x16000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -35,7 +34,6 @@ offset_list off_0300 = {
|
||||
|
||||
offset_list off_0310 = {
|
||||
.PMAP_STORE = 0x3D8E218,
|
||||
.HV_BSS_OFF = 0x16000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -68,7 +66,6 @@ offset_list off_0310 = {
|
||||
|
||||
offset_list off_0320 = {
|
||||
.PMAP_STORE = 0x3D8E218,
|
||||
.HV_BSS_OFF = 0x16000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -101,7 +98,6 @@ offset_list off_0320 = {
|
||||
|
||||
offset_list off_0321 = {
|
||||
.PMAP_STORE = 0x3D8E218,
|
||||
.HV_BSS_OFF = 0x16000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -134,7 +130,6 @@ offset_list off_0321 = {
|
||||
|
||||
offset_list off_0400 = {
|
||||
.PMAP_STORE = 0x3E57A78,
|
||||
.HV_BSS_OFF = 0x14000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -167,7 +162,6 @@ offset_list off_0400 = {
|
||||
|
||||
offset_list off_0402 = {
|
||||
.PMAP_STORE = 0x3E57A78,
|
||||
.HV_BSS_OFF = 0x14000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -200,7 +194,6 @@ offset_list off_0402 = {
|
||||
|
||||
offset_list off_0403 = {
|
||||
.PMAP_STORE = 0x3E57A78,
|
||||
.HV_BSS_OFF = 0x14000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -233,7 +226,6 @@ offset_list off_0403 = {
|
||||
|
||||
offset_list off_0450 = {
|
||||
.PMAP_STORE = 0x3E57A78,
|
||||
.HV_BSS_OFF = 0x14000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
@@ -266,7 +258,6 @@ offset_list off_0450 = {
|
||||
|
||||
offset_list off_0451 = {
|
||||
.PMAP_STORE = 0x3E57A78,
|
||||
.HV_BSS_OFF = 0x14000,
|
||||
.HV_VCPU_ARRAY_OFF = 0x5D0,
|
||||
.HV_VCPU_STRIDE = 0x320,
|
||||
.HV_VCPU_VMCB_PTR = 0x08,
|
||||
|
||||
@@ -99,7 +99,6 @@ uint64_t va_to_pa_custom(uint64_t va, uint64_t cr3_custom) {
|
||||
int shift = 39 - (level * 9);
|
||||
uint64_t idx = (va >> shift) & 0x1FF;
|
||||
uint64_t entry;
|
||||
uint64_t entry_va = dmap + PAGE_PA(table_phys) + idx * 8;
|
||||
|
||||
kread(dmap + PAGE_PA(table_phys) + idx * 8, &entry, sizeof(entry));
|
||||
|
||||
@@ -216,4 +215,36 @@ int pin_to_first_available_core(void) {
|
||||
void unpin(void) {
|
||||
uint64_t m[2] = {0xFFFF, 0};
|
||||
cpuset_setaffinity(3, 1, -1, 0x10, (const cpuset_t *)m);
|
||||
}
|
||||
|
||||
void notify(const char *fmt, ...) {
|
||||
static char buffer[2048];
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
vsnprintf(buffer, sizeof(buffer), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
notify_internal(buffer);
|
||||
printf(buffer);
|
||||
}
|
||||
|
||||
void notify_internal(uint8_t *msg) {
|
||||
struct {
|
||||
char pad[45];
|
||||
char msg[3075];
|
||||
} req;
|
||||
bzero(&req, sizeof(req));
|
||||
uint64_t len =
|
||||
strlen(msg) < (sizeof(req.msg) - 1) ? strlen(msg) : (sizeof(req.msg) - 1);
|
||||
memcpy(req.msg, msg, len);
|
||||
sceKernelSendNotificationRequest(0, &req, sizeof(req), 0);
|
||||
}
|
||||
|
||||
void enter_rest_mode(void) {
|
||||
void *event = NULL;
|
||||
sceKernelOpenEventFlag(&event, "SceSystemStateMgrStatus");
|
||||
sceKernelNotifySystemSuspendStart();
|
||||
sceKernelSetEventFlag(event, 0x400);
|
||||
sceKernelCloseEventFlag(&event);
|
||||
}
|
||||
Reference in New Issue
Block a user