Files
Mateico 39818a69e8 format
2026-07-01 09:55:05 +02:00

72 lines
2.3 KiB
C

#include "utils.h"
// 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
#define DEFAULT_APIC_BASE 0xfee00000
#define APICBASE_ENABLED 0x00000800
#define APICBASE_BSP 0x00000100
#define NESTED_CTRL_NP_ENABLE 0x1
__attribute__((section(".entry_point"), naked)) uint32_t main(void) {
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 + (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);
if (i == 0) {
// Restore guest_apic_base.
*(uint64_t *)(vc + 0xe8) =
DEFAULT_APIC_BASE | APICBASE_ENABLED | APICBASE_BSP;
}
// Disable nested paging.
*(uint64_t *)(vmcb + 0x90) &= ~NESTED_CTRL_NP_ENABLE;
}
// Restore host apic base.
wrmsr(MSR_APICBASE, DEFAULT_APIC_BASE | APICBASE_ENABLED | APICBASE_BSP);
// Restore gs base.
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 *)(fw_version == 0x0650 ? HV_REENTER_HYPERCORE_0650
: HV_REENTER_HYPERCORE_07xx);
hv_reenter_hypercore();
while (1)
;
}