29
29
30
30
#include <stdint.h>
31
31
#include <stdlib.h>
32
+ #include <errno.h>
32
33
#include <Hypervisor/hv.h>
33
34
#include <Hypervisor/hv_vmx.h>
34
35
#include <xhyve/support/misc.h>
35
36
#include <xhyve/vmm/vmm_mem.h>
36
37
#include <sys/mman.h>
38
+ #include <sys/types.h>
39
+ #include <sys/sysctl.h>
40
+
41
+ /* According to the mono project
42
+ https://github.com/mono/mono/commit/a502768b3a24f4251de6a48ba78a27c898968e63
43
+ using MAP_JIT causes problems with older macOS versions so we should use it
44
+ on Mojave or later. */
45
+
46
+ static int mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_JIT ;
47
+
48
+ #define OSRELEASE "kern.osrelease"
49
+ #define OSRELEASE_MOJAVE 18
50
+
51
+ static long
52
+ vmm_get_kern_osrelease ()
53
+ {
54
+ char * s ;
55
+ size_t len ;
56
+ long v ;
57
+ if (sysctlbyname (OSRELEASE , NULL , & len , NULL , 0 )) {
58
+ xhyve_abort ("vmm_get_kern_osrelease failed to query sysctl kern.osrelease\n" );
59
+ }
60
+ s = malloc (len );
61
+ if (!s ) {
62
+ xhyve_abort ("vmm_get_kern_osrelease failed to allocate memory for kern.osrelease\n" );
63
+ }
64
+ if (sysctlbyname (OSRELEASE , s , & len , NULL , 0 )){
65
+ xhyve_abort ("vmm_get_kern_osrelease failed to query sysctl kern.osrelease\n" );
66
+ }
67
+ v = strtol (s , NULL , 10 );
68
+ if ((v == 0 ) && (errno != 0 )) {
69
+ xhyve_abort ("vmm_get_kern_osrelease failed to parse sysctl kern.osrelease value\n" );
70
+ }
71
+ return v ;
72
+ }
73
+
37
74
int
38
75
vmm_mem_init (void )
39
76
{
77
+ if (vmm_get_kern_osrelease () < OSRELEASE_MOJAVE ) {
78
+ fprintf (stderr , "Detected macOS older than Mojave, cannot use MAP_JIT\n" );
79
+ mmap_flags &= ~MAP_JIT ;
80
+ }
40
81
return (0 );
41
82
}
42
83
@@ -46,7 +87,7 @@ vmm_mem_alloc(uint64_t gpa, size_t size)
46
87
{
47
88
void * object ;
48
89
49
- object = mmap (0 , size , PROT_READ |PROT_WRITE |PROT_EXEC , MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
90
+ object = mmap (0 , size , PROT_READ |PROT_WRITE |PROT_EXEC , mmap_flags , -1 , 0 );
50
91
if (object == MAP_FAILED ) {
51
92
xhyve_abort ("vmm_mem_alloc failed in mmap\n" );
52
93
}
0 commit comments