hv_kernel_structs.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #pragma once
  2. #include "hv_kernel_structs_xnu_20.h"
  3. #include "hv_kernel_structs_xnu_21.h"
  4. #include "hv_kernel_structs_xnu_22.h"
  5. typedef union {
  6. arm_guest_rw_context_20_t v20;
  7. arm_guest_rw_context_21_t v21;
  8. arm_guest_rw_context_22_t v22;
  9. } arm_guest_rw_context_t;
  10. typedef union {
  11. arm_guest_ro_context_20_t v20;
  12. arm_guest_ro_context_21_t v21;
  13. arm_guest_ro_context_22_t v22;
  14. uint64_t ver;
  15. } arm_guest_ro_context_t;
  16. typedef union {
  17. arm_guest_context_20_t v20;
  18. arm_guest_context_21_t v21;
  19. arm_guest_context_22_t v22;
  20. } arm_guest_context_t;
  21. typedef union {
  22. hv_capabilities_20_t v20;
  23. hv_capabilities_21_t v21;
  24. hv_capabilities_22_t v22;
  25. } hv_capabilities_t;
  26. static int _get_xnu_version(void) {
  27. if (__builtin_available(iOS 16, macOS 13, watchOS 9, tvOS 16, bridgeOS 7, *)) {
  28. return HV_VERSION_XNU_22;
  29. } else if (__builtin_available(iOS 15, macOS 12, watchOS 8, tvOS 15, bridgeOS 6, *)) {
  30. return HV_VERSION_XNU_21;
  31. } else if (__builtin_available(iOS 14, macOS 11, watchOS 7, tvOS 14, bridgeOS 5, *)) {
  32. return HV_VERSION_XNU_20;
  33. } else {
  34. return 0; // not yet supported
  35. }
  36. }
  37. static inline int get_xnu_version(void) {
  38. static int version = -1;
  39. if (__builtin_expect(version < 0, 0)) {
  40. version = _get_xnu_version();
  41. }
  42. return version;
  43. }
  44. static inline uint64_t get_expected_magic(void) {
  45. switch (get_xnu_version()) {
  46. case HV_VERSION_XNU_20: return HV_XNU_20_MAGIC;
  47. case HV_VERSION_XNU_21: return HV_XNU_21_MAGIC;
  48. case HV_VERSION_XNU_22: return HV_XNU_22_MAGIC;
  49. default: return 0;
  50. }
  51. }
  52. #define ACCESS(s, f) (*(get_xnu_version() == HV_VERSION_XNU_21 ? &(s)->v21.f : (get_xnu_version() == HV_VERSION_XNU_20 ? &(s)->v20.f : (get_xnu_version() == HV_VERSION_XNU_22 ? &(s)->v22.f : NULL))))