hv_kernel_structs.h 1.5 KB

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