Browse Source

hv: actually the whole file is wrong for XNU 20.6

osy 2 years ago
parent
commit
c694e42468
5 changed files with 32 additions and 127 deletions
  1. 5 5
      hv.c
  2. 15 23
      hv_kernel_structs.h
  3. 10 10
      hv_kernel_structs_xnu_20.h
  4. 0 87
      hv_kernel_structs_xnu_20_6.h
  5. 2 2
      hv_kernel_structs_xnu_21.h

+ 5 - 5
hv.c

@@ -105,10 +105,10 @@ static hv_return_t _hv_vcpu_config_get_feature_regs(
   feature_regs->ctr_el0 = MODIFY_FLAGS_CTR_EL0(ACCESS(caps, ctr_el0));
   feature_regs->dczid_el0 = MODIFY_FLAGS_DCZID_EL0(ACCESS(caps, dczid_el0));
   feature_regs->clidr_el1 = MODIFY_FLAGS_CLIDR_EL1(ACCESS(caps, clidr_el1));
-  if (get_xnu_version() >= HV_VERSION_XNU_21_6) {
-    static_assert(sizeof(feature_regs->ccsidr_el1_inst) == sizeof(caps->v216.ccsidr_el1_inst), "ccsidr_el1_inst size");
+  if (get_xnu_version() >= HV_VERSION_XNU_21) {
+    static_assert(sizeof(feature_regs->ccsidr_el1_inst) == sizeof(caps->v21.ccsidr_el1_inst), "ccsidr_el1_inst size");
     memcpy(feature_regs->ccsidr_el1_inst, ACCESS(caps, ccsidr_el1_inst), sizeof(feature_regs->ccsidr_el1_inst));
-    static_assert(sizeof(feature_regs->ccsidr_el1_data_or_unified) == sizeof(caps->v216.ccsidr_el1_data_or_unified), "ccsidr_el1_data_or_unified size");
+    static_assert(sizeof(feature_regs->ccsidr_el1_data_or_unified) == sizeof(caps->v21.ccsidr_el1_data_or_unified), "ccsidr_el1_data_or_unified size");
     memcpy(feature_regs->ccsidr_el1_data_or_unified, ACCESS(caps, ccsidr_el1_data_or_unified), sizeof(feature_regs->ccsidr_el1_data_or_unified));
   }
   return 0;
@@ -439,13 +439,13 @@ hv_return_t hv_vcpu_set_simd_fp_reg(hv_vcpu_t vcpu, hv_simd_fp_reg_t reg,
 static bool find_sys_reg(hv_sys_reg_t sys_reg, uint64_t* offset, uint64_t* sync_mask) {
   uint64_t o = 0;
   uint64_t f = 0;
-  if (get_xnu_version() >= HV_VERSION_XNU_20_4 && get_xnu_version() <= HV_VERSION_XNU_20_6) {
+  if (get_xnu_version() == HV_VERSION_XNU_20) {
     switch (sys_reg) {
 #include "sysreg_offsets_xnu_20.h"
       default:
         return false;
     }
-  } else if (get_xnu_version() == HV_VERSION_XNU_21_6) {
+  } else if (get_xnu_version() == HV_VERSION_XNU_21) {
     switch (sys_reg) {
 #include "sysreg_offsets_xnu_21.h"
       default:

+ 15 - 23
hv_kernel_structs.h

@@ -1,43 +1,36 @@
 #pragma once
 
-#include "hv_kernel_structs_xnu_20_4.h"
-#include "hv_kernel_structs_xnu_20_6.h"
-#include "hv_kernel_structs_xnu_21_6.h"
+#include "hv_kernel_structs_xnu_20.h"
+#include "hv_kernel_structs_xnu_21.h"
 
 typedef union {
-  arm_guest_rw_context_20_4_t v204;
-  arm_guest_rw_context_20_6_t v206;
-  arm_guest_rw_context_21_t v216;
+  arm_guest_rw_context_20_t v20;
+  arm_guest_rw_context_21_t v21;
 } arm_guest_rw_context_t;
 
 typedef union {
-  arm_guest_ro_context_20_4_t v204;
-  arm_guest_ro_context_20_6_t v206;
-  arm_guest_ro_context_21_t v216;
+  arm_guest_ro_context_20_t v20;
+  arm_guest_ro_context_21_t v21;
   uint64_t ver;
 } arm_guest_ro_context_t;
 
 typedef union {
-  arm_guest_context_20_4_t v204;
-  arm_guest_context_20_6_t v206;
-  arm_guest_context_21_t v216;
+  arm_guest_context_20_t v20;
+  arm_guest_context_21_t v21;
 } arm_guest_context_t;
 
 typedef union {
-  hv_capabilities_20_t v204;
-  hv_capabilities_20_t v206;
-  hv_capabilities_21_t v216;
+  hv_capabilities_20_t v20;
+  hv_capabilities_21_t v21;
 } hv_capabilities_t;
 
 static int _get_xnu_version(void) {
   if (__builtin_available(iOS 16, macOS 13, watchOS 9, tvOS 16, bridgeOS 7, *)) {
     return 0; // not yet supported
   } else if (__builtin_available(iOS 15, macOS 12, watchOS 8, tvOS 15, bridgeOS 6, *)) {
-    return HV_VERSION_XNU_21_6;
-  } else if (__builtin_available(iOS 14.7, macOS 11.5, watchOS 7.6, tvOS 14.7, bridgeOS 5.5, *)) {
-    return HV_VERSION_XNU_20_6;
+    return HV_VERSION_XNU_21;
   } else if (__builtin_available(iOS 14, macOS 11, watchOS 7, tvOS 14, bridgeOS 5, *)) {
-    return HV_VERSION_XNU_20_4;
+    return HV_VERSION_XNU_20;
   } else {
     return 0; // not yet supported
   }
@@ -53,11 +46,10 @@ static inline int get_xnu_version(void) {
 
 static inline uint64_t get_expected_magic(void) {
   switch (get_xnu_version()) {
-    case HV_VERSION_XNU_20_4: return HV_XNU_20_4_MAGIC;
-    case HV_VERSION_XNU_20_6: return HV_XNU_20_6_MAGIC;
-    case HV_VERSION_XNU_21_6: return HV_XNU_21_6_MAGIC;
+    case HV_VERSION_XNU_20: return HV_XNU_20_MAGIC;
+    case HV_VERSION_XNU_21: return HV_XNU_21_MAGIC;
     default: return 0;
   }
 }
 
-#define ACCESS(s, f) (*(get_xnu_version() == HV_VERSION_XNU_21_6 ? &(s)->v216.f : (get_xnu_version() == HV_VERSION_XNU_20_6 ? &(s)->v206.f : (get_xnu_version() == HV_VERSION_XNU_20_4 ? &(s)->v204.f : NULL)))) 
+#define ACCESS(s, f) (*(get_xnu_version() == HV_VERSION_XNU_21 ? &(s)->v21.f : (get_xnu_version() == HV_VERSION_XNU_20 ? &(s)->v20.f : NULL))) 

+ 10 - 10
hv_kernel_structs_xnu_20_4.h → hv_kernel_structs_xnu_20.h

@@ -64,7 +64,7 @@ typedef struct {
   uint64_t apsts_el1;
   uint64_t host_debug;
   uint64_t state_used;
-} arm_guest_controls_20_4_t;
+} arm_guest_controls_20_t;
 
 typedef struct {
   struct {
@@ -281,7 +281,7 @@ typedef union {
     arm_guest_shared_sysregs_20_t shared_sysregs;
     arm_guest_banked_sysregs_20_t banked_sysregs;
     arm_guest_dbgregs_20_t dbgregs;
-    volatile arm_guest_controls_20_4_t controls;
+    volatile arm_guest_controls_20_t controls;
     volatile uint64_t state_dirty;
     uint64_t guest_tick_count;
     arm_guest_extregs_20_t extregs;
@@ -289,7 +289,7 @@ typedef union {
     apple_vncr_context_20_t avncr;
   };
   uint8_t page[16384];
-} arm_guest_rw_context_20_4_t;
+} arm_guest_rw_context_20_t;
 
 typedef struct {
   uint32_t vmexit_reason;
@@ -303,12 +303,12 @@ typedef union {
   struct {
     uint64_t ver;
     arm_guest_vmexit_20_t exit;
-    arm_guest_controls_20_4_t controls;
+    arm_guest_controls_20_t controls;
     uint64_t state_valid;
     uint64_t state_dirty;
   };
   uint8_t page[16384];
-} arm_guest_ro_context_20_4_t;
+} arm_guest_ro_context_20_t;
 
 typedef struct {
   uint64_t cptr_el2;
@@ -328,10 +328,10 @@ typedef struct {
 } arm_host_context_20_t;
 
 typedef struct {
-  arm_guest_rw_context_20_4_t rw;
-  arm_guest_ro_context_20_4_t ro;
+  arm_guest_rw_context_20_t rw;
+  arm_guest_ro_context_20_t ro;
   arm_host_context_20_t priv;
-} arm_guest_context_20_4_t;
+} arm_guest_context_20_t;
 
 typedef struct {
   uint64_t api;
@@ -369,5 +369,5 @@ typedef struct {
   uint64_t id_aa64pfr1_el1;
 } hv_capabilities_20_t;
 
-#define HV_XNU_20_4_MAGIC (0x2068797000000009)
-#define HV_VERSION_XNU_20_4 (204)
+#define HV_XNU_20_MAGIC (0x2068797000000009)
+#define HV_VERSION_XNU_20 (20)

+ 0 - 87
hv_kernel_structs_xnu_20_6.h

@@ -1,87 +0,0 @@
-#pragma once
-#include <Hypervisor/Hypervisor.h>
-
-// Headers extracted from
-// Kernel_Debug_Kit_11.6.5_build_20G527.dmg
-
-// type lookup hv_vcpu_t
-// type lookup arm_guest_context_t
-
-#import "hv_kernel_structs_xnu_20_4.h"
-
-typedef struct {
-  uint64_t hcr_el2;
-  uint64_t hacr_el2;
-  uint64_t cptr_el2;
-  uint64_t mdcr_el2;
-  uint64_t vmpidr_el2;
-  uint64_t vpidr_el2;
-  uint64_t virtual_timer_offset;
-  uint64_t ich_hcr_el2;
-  uint64_t hfgrtr_el2;
-  uint64_t hfgwtr_el2;
-  uint64_t hfgitr_el2;
-  uint64_t hdfgrtr_el2;
-  uint64_t hdfgwtr_el2;
-  uint64_t timer;
-  uint64_t vmkeyhi_el2;
-  uint64_t vmkeylo_el2;
-  uint64_t apsts_el1;
-  uint64_t host_debug;
-} arm_guest_controls_20_6_t;
-
-typedef union {
-  struct {
-    union {
-      // arm_context_t guest_context;
-      struct {
-        uint64_t res1[1];
-        struct {
-          uint64_t x[29];
-          uint64_t fp;
-          uint64_t lr;
-          uint64_t sp;
-          uint64_t pc;
-          uint32_t cpsr;
-          uint32_t pad;
-        } regs;
-        uint64_t res2[4];
-        struct {
-          __uint128_t q[32];
-          uint32_t fpsr;
-          uint32_t fpcr;
-        } neon;
-      };
-    };
-    arm_guest_shared_sysregs_20_t shared_sysregs;
-    arm_guest_banked_sysregs_20_t banked_sysregs;
-    arm_guest_dbgregs_20_t dbgregs;
-    volatile arm_guest_controls_20_6_t controls;
-    volatile uint64_t state_dirty;
-    uint64_t guest_tick_count;
-    arm_guest_extregs_20_t extregs;
-    arm_vncr_context_20_t vncr;
-    apple_vncr_context_20_t avncr;
-  };
-  uint8_t page[16384];
-} arm_guest_rw_context_20_6_t;
-
-typedef union {
-  struct {
-    uint64_t ver;
-    arm_guest_vmexit_20_t exit;
-    arm_guest_controls_20_6_t controls;
-    uint64_t state_valid;
-    uint64_t state_dirty;
-  };
-  uint8_t page[16384];
-} arm_guest_ro_context_20_6_t;
-
-typedef struct {
-  arm_guest_rw_context_20_6_t rw;
-  arm_guest_ro_context_20_6_t ro;
-  arm_host_context_20_t priv;
-} arm_guest_context_20_6_t;
-
-#define HV_XNU_20_6_MAGIC (HV_XNU_20_4_MAGIC)
-#define HV_VERSION_XNU_20_6 (206)

+ 2 - 2
hv_kernel_structs_xnu_21_6.h → hv_kernel_structs_xnu_21.h

@@ -398,5 +398,5 @@ typedef struct {
     uint64_t ipa_bits_16k;
 } hv_capabilities_21_t;
 
-#define HV_XNU_21_6_MAGIC (0x206879700000000e)
-#define HV_VERSION_XNU_21_6 (216)
+#define HV_XNU_21_MAGIC (0x206879700000000e)
+#define HV_VERSION_XNU_21 (21)