hv_kernel_structs.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #pragma once
  2. #include "hv_kernel_structs_xnu_20_4.h"
  3. #include "hv_kernel_structs_xnu_20_6.h"
  4. #include "hv_kernel_structs_xnu_21_6.h"
  5. typedef union {
  6. arm_guest_rw_context_20_4_t v204;
  7. arm_guest_rw_context_20_6_t v206;
  8. arm_guest_rw_context_21_t v216;
  9. } arm_guest_rw_context_t;
  10. typedef union {
  11. arm_guest_ro_context_20_4_t v204;
  12. arm_guest_ro_context_20_6_t v206;
  13. arm_guest_ro_context_21_t v216;
  14. uint64_t ver;
  15. } arm_guest_ro_context_t;
  16. typedef union {
  17. arm_guest_context_20_4_t v204;
  18. arm_guest_context_20_6_t v206;
  19. arm_guest_context_21_t v216;
  20. } arm_guest_context_t;
  21. typedef union {
  22. hv_capabilities_20_t v204;
  23. hv_capabilities_20_t v206;
  24. hv_capabilities_21_t v216;
  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 0; // not yet supported
  29. } else if (__builtin_available(iOS 15, macOS 12, watchOS 8, tvOS 15, bridgeOS 6, *)) {
  30. return HV_VERSION_XNU_21_6;
  31. } else if (__builtin_available(iOS 14.7, macOS 11.5, watchOS 7.6, tvOS 14.7, bridgeOS 5.5, *)) {
  32. return HV_VERSION_XNU_20_6;
  33. } else if (__builtin_available(iOS 14, macOS 11, watchOS 7, tvOS 14, bridgeOS 5, *)) {
  34. return HV_VERSION_XNU_20_4;
  35. } else {
  36. return 0; // not yet supported
  37. }
  38. }
  39. static inline int get_xnu_version(void) {
  40. static int version = -1;
  41. if (__builtin_expect(version < 0, 0)) {
  42. version = _get_xnu_version();
  43. }
  44. return version;
  45. }
  46. static inline uint64_t get_expected_magic(void) {
  47. switch (get_xnu_version()) {
  48. case HV_VERSION_XNU_20_4: return HV_XNU_20_4_MAGIC;
  49. case HV_VERSION_XNU_20_6: return HV_XNU_20_6_MAGIC;
  50. case HV_VERSION_XNU_21_6: return HV_XNU_21_6_MAGIC;
  51. default: return 0;
  52. }
  53. }
  54. #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))))