mirror of
https://github.com/ps5-linux/ps5-linux-loader.git
synced 2026-07-15 21:42:27 +00:00
add 6.50 support
This commit is contained in:
@@ -1,12 +1,20 @@
|
||||
#include "utils.h"
|
||||
|
||||
// 7.61 offsets
|
||||
#define HV_REENTER_HYPERCORE 0x0000000062806380
|
||||
#define HV_STACK_TABLE 0x000000006282E120
|
||||
#define HV_PML4 0x000000006282E1A0
|
||||
#define HV_ENTRY 0x000000006282E1B8
|
||||
#define HV_MAIN 0x0000000000000E20
|
||||
#define G_VM_TAB 0x0000000000027C80
|
||||
// 7.xx offsets
|
||||
#define HV_REENTER_HYPERCORE_07xx 0x0000000062806380ULL
|
||||
#define HV_STACK_TABLE_07xx 0x000000006282E120ULL
|
||||
#define HV_PML4_07xx 0x000000006282E1A0ULL
|
||||
#define HV_ENTRY_07xx 0x000000006282E1B8ULL
|
||||
#define HV_MAIN_07xx 0x0000000000000E20
|
||||
#define G_VM_TAB_07xx 0x0000000000027C80
|
||||
|
||||
// 6.50 offsets
|
||||
#define HV_REENTER_HYPERCORE_0650 0x0000000062806780ULL
|
||||
#define HV_STACK_TABLE_0650 0x000000006282D0C0ULL
|
||||
#define HV_PML4_0650 0x000000006282D140ULL
|
||||
#define HV_ENTRY_0650 0x000000006282D158ULL
|
||||
#define HV_MAIN_0650 0x0000000000000F10
|
||||
#define G_VM_TAB_0650 0x0000000000023C80
|
||||
|
||||
#define MSR_APICBASE 0x01b
|
||||
#define MSR_GSBASE 0xc0000101
|
||||
@@ -19,11 +27,13 @@
|
||||
#define NESTED_CTRL_NP_ENABLE 0x1
|
||||
|
||||
__attribute__((section(".entry_point"), naked)) uint32_t main(void) {
|
||||
uint64_t hv_pml4 = *(uint64_t *)HV_PML4;
|
||||
uint64_t hv_base = *(uint64_t *)HV_ENTRY - HV_MAIN;
|
||||
volatile int fw_version = 0x11AA11AA; // To be updated by loader
|
||||
|
||||
uint64_t hv_pml4 = *(uint64_t *) (fw_version==0x0650 ? HV_PML4_0650 : HV_PML4_07xx);
|
||||
uint64_t hv_base = fw_version==0x0650 ? (*(uint64_t *) HV_ENTRY_0650 - HV_MAIN_0650) : (*(uint64_t *) HV_ENTRY_07xx - HV_MAIN_07xx);
|
||||
|
||||
uintptr_t *g_vm_tab =
|
||||
(uintptr_t *)vtophys_custom(hv_base + G_VM_TAB, hv_pml4);
|
||||
(uintptr_t *)vtophys_custom(hv_base + (fw_version==0x0650 ? G_VM_TAB_0650 : G_VM_TAB_07xx), hv_pml4);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
uintptr_t vc = vtophys_custom(g_vm_tab[i], hv_pml4);
|
||||
uintptr_t vmcb = vtophys_custom(*(uintptr_t *)(vc + 0x08), hv_pml4);
|
||||
@@ -42,10 +52,10 @@ __attribute__((section(".entry_point"), naked)) uint32_t main(void) {
|
||||
wrmsr(MSR_APICBASE, DEFAULT_APIC_BASE | APICBASE_ENABLED | APICBASE_BSP);
|
||||
|
||||
// Restore gs base.
|
||||
wrmsr(MSR_GSBASE, ((uint64_t *)HV_STACK_TABLE)[0] + 0x1000);
|
||||
wrmsr(MSR_GSBASE, ((uint64_t *) (fw_version==0x0650 ? HV_STACK_TABLE_0650 : HV_STACK_TABLE_07xx) )[0] + 0x1000);
|
||||
|
||||
// Reenter hypercore.
|
||||
void (*hv_reenter_hypercore)(void) = (void *)HV_REENTER_HYPERCORE;
|
||||
void (*hv_reenter_hypercore)(void) = (void *) (fw_version==0x0650 ? HV_REENTER_HYPERCORE_0650 : HV_REENTER_HYPERCORE_07xx) ;
|
||||
hv_reenter_hypercore();
|
||||
while (1)
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user