View | Details | Raw Unified | Return to bug 230460 | Differences between
and this patch

Collapse All | Expand All

(-)emulators/virtualbox-ose/Makefile (-1 / +2 lines)
Lines 304-310 Link Here
304
	    ${WRKSRC}/configure
304
	    ${WRKSRC}/configure
305
.if empty(ICONV_LIB)
305
.if empty(ICONV_LIB)
306
	@${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.kmk \
306
	@${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.kmk \
307
	    ${WRKSRC}/src/VBox/Runtime/Makefile.kmk
307
	    ${WRKSRC}/src/VBox/Runtime/Makefile.kmk \
308
	    ${WRKSRC}/src/VBox/RDP/client-1.8.3/Makefile.kmk
308
	@${ECHO} 'VBOX_ICONV_DEFS = LIBICONV_PLUG' >> ${WRKSRC}/LocalConfig.kmk
309
	@${ECHO} 'VBOX_ICONV_DEFS = LIBICONV_PLUG' >> ${WRKSRC}/LocalConfig.kmk
309
.endif
310
.endif
310
	@${REINPLACE_CMD} -e 's|/usr/local/lib/virtualbox|${VBOX_DIR}|' \
311
	@${REINPLACE_CMD} -e 's|/usr/local/lib/virtualbox|${VBOX_DIR}|' \
(-)emulators/virtualbox-ose/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c (-6 / +188 lines)
Lines 5-11 Link Here
5
Submitted by:	Landon J Fuller <landonf at plausible.coop>
5
Submitted by:	Landon J Fuller <landonf at plausible.coop>
6
--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig	2016-01-19 19:18:38 UTC
6
--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig	2016-01-19 19:18:38 UTC
7
+++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
7
+++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
8
@@ -51,6 +51,7 @@
8
@@ -52,6 +52,7 @@
9
 #include <net/if_dl.h>
9
 #include <net/if_dl.h>
10
 #include <net/if_types.h>
10
 #include <net/if_types.h>
11
 #include <net/ethernet.h>
11
 #include <net/ethernet.h>
Lines 13-19 Link Here
13
 
13
 
14
 #include <netgraph/ng_message.h>
14
 #include <netgraph/ng_message.h>
15
 #include <netgraph/netgraph.h>
15
 #include <netgraph/netgraph.h>
16
@@ -369,7 +370,11 @@ static int ng_vboxnetflt_rcvdata(hook_p 
16
@@ -73,6 +74,7 @@
17
 
18
 #define VBOXNETFLT_OS_SPECFIC 1
19
 #include "../VBoxNetFltInternal.h"
20
+#include "freebsd/the-freebsd-kernel.h"
21
 
22
 static int vboxnetflt_modevent(struct module *, int, void *);
23
 static ng_constructor_t    ng_vboxnetflt_constructor;
24
@@ -370,7 +372,11 @@ static int ng_vboxnetflt_rcvdata(hook_p
17
         mtx_lock_spin(&pThis->u.s.inq.ifq_mtx);
25
         mtx_lock_spin(&pThis->u.s.inq.ifq_mtx);
18
         _IF_ENQUEUE(&pThis->u.s.inq, m);
26
         _IF_ENQUEUE(&pThis->u.s.inq, m);
19
         mtx_unlock_spin(&pThis->u.s.inq.ifq_mtx);
27
         mtx_unlock_spin(&pThis->u.s.inq.ifq_mtx);
Lines 25-31 Link Here
25
     }
33
     }
26
     /*
34
     /*
27
      * Handle mbufs on the outgoing hook, frames going to the interface
35
      * Handle mbufs on the outgoing hook, frames going to the interface
28
@@ -387,7 +392,11 @@ static int ng_vboxnetflt_rcvdata(hook_p 
36
@@ -388,7 +394,11 @@ static int ng_vboxnetflt_rcvdata(hook_p
29
         mtx_lock_spin(&pThis->u.s.outq.ifq_mtx);
37
         mtx_lock_spin(&pThis->u.s.outq.ifq_mtx);
30
         _IF_ENQUEUE(&pThis->u.s.outq, m);
38
         _IF_ENQUEUE(&pThis->u.s.outq, m);
31
         mtx_unlock_spin(&pThis->u.s.outq.ifq_mtx);
39
         mtx_unlock_spin(&pThis->u.s.outq.ifq_mtx);
Lines 37-43 Link Here
37
     }
45
     }
38
     else
46
     else
39
     {
47
     {
40
@@ -427,6 +436,8 @@ static void vboxNetFltFreeBSDinput(void 
48
@@ -428,6 +438,8 @@ static void vboxNetFltFreeBSDinput(void
41
     struct ifnet *ifp = pThis->u.s.ifp;
49
     struct ifnet *ifp = pThis->u.s.ifp;
42
     unsigned int cSegs = 0;
50
     unsigned int cSegs = 0;
43
     bool fDropIt = false, fActive;
51
     bool fDropIt = false, fActive;
Lines 46-52 Link Here
46
     PINTNETSG pSG;
54
     PINTNETSG pSG;
47
 
55
 
48
     VBOXCURVNET_SET(ifp->if_vnet);
56
     VBOXCURVNET_SET(ifp->if_vnet);
49
@@ -439,6 +450,19 @@ static void vboxNetFltFreeBSDinput(void 
57
@@ -440,6 +452,19 @@ static void vboxNetFltFreeBSDinput(void
50
         if (m == NULL)
58
         if (m == NULL)
51
             break;
59
             break;
52
 
60
 
Lines 66-72 Link Here
66
         for (m0 = m; m0 != NULL; m0 = m0->m_next)
74
         for (m0 = m; m0 != NULL; m0 = m0->m_next)
67
             if (m0->m_len > 0)
75
             if (m0->m_len > 0)
68
                 cSegs++;
76
                 cSegs++;
69
@@ -453,6 +477,27 @@ static void vboxNetFltFreeBSDinput(void 
77
@@ -454,6 +479,27 @@ static void vboxNetFltFreeBSDinput(void
70
         vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0);
78
         vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0);
71
         fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE);
79
         fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE);
72
         RTMemTmpFree(pSG);
80
         RTMemTmpFree(pSG);
Lines 94-96 Link Here
94
         if (fDropIt)
102
         if (fDropIt)
95
             m_freem(m);
103
             m_freem(m);
96
         else
104
         else
105
@@ -513,6 +559,7 @@ static void vboxNetFltFreeBSDoutput(void
106
  */
107
 int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst)
108
 {
109
+    IPRT_FREEBSD_SAVE_EFL_AC();
110
     NOREF(pvIfData);
111
 
112
     void (*input_f)(struct ifnet *, struct mbuf *);
113
@@ -529,10 +576,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS
114
     {
115
         m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG);
116
         if (m == NULL)
117
+        {
118
+            IPRT_FREEBSD_RESTORE_EFL_AC();
119
             return VERR_NO_MEMORY;
120
+        }
121
         m = m_pullup(m, ETHER_HDR_LEN);
122
         if (m == NULL)
123
+        {
124
+            IPRT_FREEBSD_RESTORE_EFL_AC();
125
             return VERR_NO_MEMORY;
126
+        }
127
 
128
         m->m_flags |= M_PKTHDR;
129
         ether_output_frame(ifp, m);
130
@@ -542,10 +595,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS
131
     {
132
         m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG);
133
         if (m == NULL)
134
+        {
135
+            IPRT_FREEBSD_RESTORE_EFL_AC();
136
             return VERR_NO_MEMORY;
137
+        }
138
         m = m_pullup(m, ETHER_HDR_LEN);
139
         if (m == NULL)
140
+        {
141
+            IPRT_FREEBSD_RESTORE_EFL_AC();
142
             return VERR_NO_MEMORY;
143
+        }
144
         /*
145
          * Delivering packets to the host will be captured by the
146
          * input hook. Tag the packet with a mbuf tag so that we
147
@@ -556,6 +615,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS
148
         if (mtag == NULL)
149
         {
150
             m_freem(m);
151
+            IPRT_FREEBSD_RESTORE_EFL_AC();
152
             return VERR_NO_MEMORY;
153
         }
154
 
155
@@ -566,6 +626,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS
156
         ifp->if_input(ifp, m);
157
     }
158
     VBOXCURVNET_RESTORE();
159
+    IPRT_FREEBSD_RESTORE_EFL_AC();
160
     return VINF_SUCCESS;
161
 }
162
 
163
@@ -578,6 +639,7 @@ static bool vboxNetFltFreeBsdIsPromiscuo
164
 
165
 int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
166
 {
167
+    IPRT_FREEBSD_SAVE_EFL_AC();
168
     char nam[NG_NODESIZ];
169
     struct ifnet *ifp;
170
     node_p node;
171
@@ -586,7 +648,10 @@ int vboxNetFltOsInitInstance(PVBOXNETFLT
172
     NOREF(pvContext);
173
     ifp = ifunit(pThis->szName);
174
     if (ifp == NULL)
175
+    {
176
+        IPRT_FREEBSD_RESTORE_EFL_AC();
177
         return VERR_INTNET_FLT_IF_NOT_FOUND;
178
+    }
179
 
180
     /* Create a new netgraph node for this instance */
181
     if (ng_make_node_common(&ng_vboxnetflt_typestruct, &node) != 0)
182
@@ -630,12 +695,14 @@ int vboxNetFltOsInitInstance(PVBOXNETFLT
183
         vboxNetFltRelease(pThis, true /*fBusy*/);
184
     }
185
     VBOXCURVNET_RESTORE();
186
+    IPRT_FREEBSD_RESTORE_EFL_AC();
187
 
188
     return VINF_SUCCESS;
189
 }
190
 
191
 bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis)
192
 {
193
+    IPRT_FREEBSD_SAVE_EFL_AC();
194
     struct ifnet *ifp, *ifp0;
195
 
196
     ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *);
197
@@ -652,6 +719,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
198
         pThis->u.s.node = NULL;
199
     }
200
     VBOXCURVNET_RESTORE();
201
+    IPRT_FREEBSD_RESTORE_EFL_AC();
202
 
203
     if (ifp0 != NULL)
204
     {
205
@@ -664,6 +732,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
206
 
207
 void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
208
 {
209
+    IPRT_FREEBSD_SAVE_EFL_AC();
210
 
211
     taskqueue_drain(taskqueue_fast, &pThis->u.s.tskin);
212
     taskqueue_drain(taskqueue_fast, &pThis->u.s.tskout);
213
@@ -676,6 +745,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNET
214
         ng_rmnode_self(pThis->u.s.node);
215
     VBOXCURVNET_RESTORE();
216
     pThis->u.s.node = NULL;
217
+    IPRT_FREEBSD_RESTORE_EFL_AC();
218
 }
219
 
220
 int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis)
221
@@ -689,6 +759,7 @@ int vboxNetFltOsPreInitInstance(PVBOXNET
222
 
223
 void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
224
 {
225
+    IPRT_FREEBSD_SAVE_EFL_AC();
226
     struct ifnet *ifp;
227
     struct ifreq ifreq;
228
     int error;
229
@@ -722,7 +793,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
230
         NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT,
231
             sizeof(struct ngm_connect), M_NOWAIT);
232
         if (msg == NULL)
233
+        {
234
+            IPRT_FREEBSD_RESTORE_EFL_AC();
235
             return;
236
+        }
237
         con = (struct ngm_connect *)msg->data;
238
         snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", ifp->if_xname);
239
         strlcpy(con->ourhook, "lower", NG_HOOKSIZ);
240
@@ -736,7 +810,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
241
         NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT,
242
             sizeof(struct ngm_connect), M_NOWAIT);
243
         if (msg == NULL)
244
+        {
245
+            IPRT_FREEBSD_RESTORE_EFL_AC();
246
             return;
247
+        }
248
         con = (struct ngm_connect *)msg->data;
249
         snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:",
250
             ifp->if_xname);
251
@@ -759,7 +836,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
252
         NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK,
253
             sizeof(struct ngm_rmhook), M_NOWAIT);
254
         if (msg == NULL)
255
+        {
256
+            IPRT_FREEBSD_RESTORE_EFL_AC();
257
             return;
258
+        }
259
         rm = (struct ngm_rmhook *)msg->data;
260
         strlcpy(rm->ourhook, "input", NG_HOOKSIZ);
261
         NG_SEND_MSG_PATH(error, node, msg, path, 0);
262
@@ -770,12 +850,16 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
263
         NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK,
264
             sizeof(struct ngm_rmhook), M_NOWAIT);
265
         if (msg == NULL)
266
+        {
267
+            IPRT_FREEBSD_RESTORE_EFL_AC();
268
             return;
269
+        }
270
         rm = (struct ngm_rmhook *)msg->data;
271
         strlcpy(rm->ourhook, "output", NG_HOOKSIZ);
272
         NG_SEND_MSG_PATH(error, node, msg, path, 0);
273
     }
274
     VBOXCURVNET_RESTORE();
275
+    IPRT_FREEBSD_RESTORE_EFL_AC();
276
 }
277
 
278
 int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis)
(-)emulators/virtualbox-ose/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-files_vboxnetflt (+10 lines)
Line 0 Link Here
1
--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/files_vboxnetflt.orig	2018-08-14 14:44:23.000000000 +0300
2
+++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/files_vboxnetflt
3
@@ -61,6 +61,7 @@ VBOX_VBOXNETFLT_SOURCES=" \
4
     ${PATH_ROOT}/include/iprt/uni.h=>include/iprt/uni.h \
5
     ${PATH_ROOT}/include/iprt/utf16.h=>include/iprt/utf16.h \
6
     ${PATH_ROOT}/include/iprt/uuid.h=>include/iprt/uuid.h \
7
+    ${PATH_ROOT}/include/iprt/x86.h=>include/iprt/x86.h \
8
     ${PATH_ROOT}/include/iprt/nocrt/limits.h=>include/iprt/nocrt/limits.h \
9
     ${PATH_ROOT}/include/VBox/cdefs.h=>include/VBox/cdefs.h \
10
     ${PATH_ROOT}/include/VBox/err.h=>include/VBox/err.h \
(-)emulators/virtualbox-ose/files/patch-src_VBox_HostDrivers_Support_freebsd_SUPDrv-freebsd.c (-1 / +206 lines)
Lines 1-7 Link Here
1
--- src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c.orig	2016-07-18 11:56:20 UTC
1
--- src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c.orig	2016-07-18 11:56:20 UTC
2
+++ src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
2
+++ src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
3
@@ -541,8 +541,7 @@ bool VBOXCALL  supdrvOSGetForcedAsyncTsc
3
@@ -44,8 +44,14 @@
4
 #include <sys/fcntl.h>
5
 #include <sys/conf.h>
6
 #include <sys/uio.h>
7
+#if __FreeBSD_version >= 1200076
8
+#include <machine/cpufunc.h>
9
+#include <machine/md_var.h>
10
+#include <machine/specialreg.h>
11
+#endif
4
 
12
 
13
 #include "../SUPDrvInternal.h"
14
+#include "freebsd/the-freebsd-kernel.h"
15
 #include <VBox/version.h>
16
 #include <iprt/initterm.h>
17
 #include <iprt/string.h>
18
@@ -57,6 +63,7 @@
19
 #include <iprt/alloc.h>
20
 #include <iprt/err.h>
21
 #include <iprt/asm.h>
22
+#include <iprt/x86.h>
23
 
24
 #ifdef VBOX_WITH_HARDENING
25
 # define VBOXDRV_PERM 0600
26
@@ -76,7 +83,9 @@ static d_open_t     VBoxDrvFreeBSDOpenUs
27
 static d_open_t     VBoxDrvFreeBSDOpenSys;
28
 static void         vboxdrvFreeBSDDtr(void *pvData);
29
 static d_ioctl_t    VBoxDrvFreeBSDIOCtl;
30
+static d_ioctl_t    VBoxDrvFreeBSDIOCtlSMAP;
31
 static int          VBoxDrvFreeBSDIOCtlSlow(PSUPDRVSESSION pSession, u_long ulCmd, caddr_t pvData, struct thread *pTd);
32
+static bool         VBoxDrvFreeBSDCpuHasSMAP(void);
33
 
34
 
35
 /*********************************************************************************************************************************
36
@@ -182,6 +191,13 @@ static int VBoxDrvFreeBSDLoad(void)
37
         rc = supdrvInitDevExt(&g_VBoxDrvFreeBSDDevExt, sizeof(SUPDRVSESSION));
38
         if (RT_SUCCESS(rc))
39
         {
40
+            if (VBoxDrvFreeBSDCpuHasSMAP())
41
+            {
42
+                LogRel(("disabling SMAP for VBoxDrvFreeBSDIOCtl\n"));
43
+                g_VBoxDrvFreeBSDChrDevSwSys.d_ioctl = VBoxDrvFreeBSDIOCtlSMAP;
44
+                g_VBoxDrvFreeBSDChrDevSwUsr.d_ioctl = VBoxDrvFreeBSDIOCtlSMAP;
45
+            }
46
+
47
             /*
48
              * Configure character devices. Add symbolic links for compatibility.
49
              */
50
@@ -311,6 +327,20 @@ static int VBoxDrvFreeBSDIOCtl(struct cd
51
     PSUPDRVSESSION pSession;
52
     devfs_get_cdevpriv((void **)&pSession);
53
 
54
+#if 1 || defined (VBOX_WITH_EFLAGS_AC_SET_IN_VBOXDRV)
55
+    /*
56
+     * Refuse all I/O control calls if we've ever detected EFLAGS.AC being cleared.
57
+     *
58
+     * This isn't a problem, as there is absolutely nothing in the kernel context that
59
+     * depend on user context triggering cleanups.  That would be pretty wild, right?
60
+     */
61
+    if (RT_UNLIKELY(g_VBoxDrvFreeBSDDevExt.cBadContextCalls > 0))
62
+    {
63
+        SUPR0Printf("VBoxDrvFreBSDIOCtl: EFLAGS.AC=0 detected %u times, refusing all I/O controls!\n", g_VBoxDrvFreeBSDDevExt.cBadContextCalls);
64
+        return ESPIPE;
65
+    }
66
+#endif
67
+
68
     /*
69
      * Deal with the fast ioctl path first.
70
      */
71
@@ -325,6 +355,45 @@ static int VBoxDrvFreeBSDIOCtl(struct cd
72
 
73
 
74
 /**
75
+ * Alternative Device I/O Control entry point on hosts with SMAP support.
76
+ *
77
+ * @returns depends...
78
+ * @param   pDev        The device.
79
+ * @param   ulCmd       The command.
80
+ * @param   pvData      Pointer to the data.
81
+ * @param   fFile       The file descriptor flags.
82
+ * @param   pTd         The calling thread.
83
+ */
84
+static int VBoxDrvFreeBSDIOCtlSMAP(struct cdev *pDev, u_long ulCmd, caddr_t pvData, int fFile, struct thread *pTd)
85
+{
86
+    /*
87
+     * Allow VBox R0 code to touch R3 memory. Setting the AC bit disables the
88
+     * SMAP check.
89
+     */
90
+    RTCCUINTREG fSavedEfl = ASMAddFlags(X86_EFL_AC);
91
+
92
+    int rc = VBoxDrvFreeBSDIOCtl(pDev, ulCmd, pvData, fFile, pTd);
93
+
94
+#if 1 || defined(VBOX_STRICT) || defined(VBOX_WITH_EFLAGS_AC_SET_IN_VBOXDRV)
95
+    /*
96
+     * Before we restore AC and the rest of EFLAGS, check if the IOCtl handler code
97
+     * accidentially modified it or some other important flag.
98
+     */
99
+    if (RT_UNLIKELY(   (ASMGetFlags() & (X86_EFL_AC | X86_EFL_IF | X86_EFL_DF | X86_EFL_IOPL))
100
+                    != ((fSavedEfl    & (X86_EFL_AC | X86_EFL_IF | X86_EFL_DF | X86_EFL_IOPL)) | X86_EFL_AC) ))
101
+    {
102
+        char szTmp[48];
103
+        RTStrPrintf(szTmp, sizeof(szTmp), "ulCmd=%#x: %#x->%#x!", ulCmd, (uint32_t)fSavedEfl, (uint32_t)ASMGetFlags());
104
+        supdrvBadContext(&g_VBoxDrvFreeBSDDevExt, "SUPDrv-freebsd.c",  __LINE__, szTmp);
105
+    }
106
+#endif
107
+
108
+    ASMSetFlags(fSavedEfl);
109
+    return rc;
110
+}
111
+
112
+
113
+/**
114
  * Deal with the 'slow' I/O control requests.
115
  *
116
  * @returns 0 on success, appropriate errno on failure.
117
@@ -373,11 +442,10 @@ static int VBoxDrvFreeBSDIOCtlSlow(PSUPD
118
          */
119
         SUPREQHDR Hdr;
120
         pvUser = *(void **)pvData;
121
-        int rc = copyin(pvUser, &Hdr, sizeof(Hdr));
122
-        if (RT_UNLIKELY(rc))
123
+        if (RT_FAILURE(RTR0MemUserCopyFrom(&Hdr, pvUser, sizeof(Hdr))))
124
         {
125
-            OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: copyin(%p,Hdr,) -> %#x; ulCmd=%#lx\n", pvUser, rc, ulCmd));
126
-            return rc;
127
+            OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: copyin(%p,Hdr,); ulCmd=%#lx\n", pvUser, ulCmd));
128
+            return EFAULT;
129
         }
130
         if (RT_UNLIKELY((Hdr.fFlags & SUPREQHDR_FLAGS_MAGIC_MASK) != SUPREQHDR_FLAGS_MAGIC))
131
         {
132
@@ -402,13 +470,12 @@ static int VBoxDrvFreeBSDIOCtlSlow(PSUPD
133
             OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: failed to allocate buffer of %d bytes; ulCmd=%#lx\n", cbReq, ulCmd));
134
             return ENOMEM;
135
         }
136
-        rc = copyin(pvUser, pHdr, Hdr.cbIn);
137
-        if (RT_UNLIKELY(rc))
138
+        if (RT_FAILURE(RTR0MemUserCopyFrom(pHdr, pvUser, Hdr.cbIn)))
139
         {
140
-            OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: copyin(%p,%p,%#x) -> %#x; ulCmd=%#lx\n",
141
-                        pvUser, pHdr, Hdr.cbIn, rc, ulCmd));
142
+            OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: copyin(%p,%p,%#x); ulCmd=%#lx\n",
143
+                        pvUser, pHdr, Hdr.cbIn, ulCmd));
144
             RTMemTmpFree(pHdr);
145
-            return rc;
146
+            return EFAULT;
147
         }
148
         if (Hdr.cbIn < cbReq)
149
             RT_BZERO((uint8_t *)pHdr + Hdr.cbIn, cbReq - Hdr.cbIn);
150
@@ -436,9 +503,8 @@ static int VBoxDrvFreeBSDIOCtlSlow(PSUPD
151
                 OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: too much output! %#x > %#x; uCmd=%#lx!\n", cbOut, cbReq, ulCmd));
152
                 cbOut = cbReq;
153
             }
154
-            rc = copyout(pHdr, pvUser, cbOut);
155
-            if (RT_UNLIKELY(rc))
156
-                OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: copyout(%p,%p,%#x) -> %d; uCmd=%#lx!\n", pHdr, pvUser, cbOut, rc, ulCmd));
157
+            if (RT_FAILURE(RTR0MemUserCopyTo(pvUser, pHdr, cbOut)))
158
+                OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: copyout(%p,%p,%#x); uCmd=%#lx!\n", pHdr, pvUser, cbOut, ulCmd));
159
 
160
             Log(("VBoxDrvFreeBSDIOCtlSlow: returns %d / %d ulCmd=%lx\n", 0, pHdr->rc, ulCmd));
161
 
162
@@ -541,8 +607,7 @@ bool VBOXCALL  supdrvOSGetForcedAsyncTsc
163
 
5
 bool VBOXCALL  supdrvOSAreCpusOfflinedOnSuspend(void)
164
 bool VBOXCALL  supdrvOSAreCpusOfflinedOnSuspend(void)
6
 {
165
 {
7
-    /** @todo verify this. */
166
-    /** @todo verify this. */
Lines 10-12 Link Here
10
 }
169
 }
11
 
170
 
12
 
171
 
172
@@ -616,11 +681,25 @@ int VBOXCALL    supdrvOSMsrProberModify(
173
 #endif /* SUPDRV_WITH_MSR_PROBER */
174
 
175
 
176
+/**
177
+ * Check if the CPU has SMAP support.
178
+ */
179
+static bool VBoxDrvFreeBSDCpuHasSMAP(void)
180
+{
181
+#if __FreeBSD_version >= 1200076
182
+    if ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0)
183
+        return true;
184
+#endif
185
+    return false;
186
+}
187
+
188
+
189
 SUPR0DECL(int) SUPR0Printf(const char *pszFormat, ...)
190
 {
191
     va_list va;
192
     char szMsg[256];
193
     int cch;
194
+    IPRT_FREEBSD_SAVE_EFL_AC();
195
 
196
     va_start(va, pszFormat);
197
     cch = RTStrPrintfV(szMsg, sizeof(szMsg), pszFormat, va);
198
@@ -628,12 +707,18 @@ SUPR0DECL(int) SUPR0Printf(const char *p
199
 
200
     printf("%s", szMsg);
201
 
202
+    IPRT_FREEBSD_RESTORE_EFL_AC();
203
     return cch;
204
 }
205
 
206
 
207
 SUPR0DECL(uint32_t) SUPR0GetKernelFeatures(void)
208
 {
209
-    return 0;
210
+    uint32_t fFlags = 0;
211
+    if (g_VBoxDrvFreeBSDChrDevSwSys.d_ioctl == VBoxDrvFreeBSDIOCtlSMAP)
212
+        fFlags |= SUPKERNELFEATURES_SMAP;
213
+    else
214
+        Assert(!(ASMGetCR4() & X86_CR4_SMAP));
215
+    return fFlags;
216
 }
217
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_alloc-r0drv-freebsd.c (+73 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c.orig	2018-08-16 22:42:27.111647000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c	2018-08-16 23:06:30.088724000 +0300
3
@@ -54,6 +54,7 @@ MALLOC_DEFINE(M_IPRTCONT, "iprtcont", "I
4
 
5
 DECLHIDDEN(int) rtR0MemAllocEx(size_t cb, uint32_t fFlags, PRTMEMHDR *ppHdr)
6
 {
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
     size_t      cbAllocated = cb;
9
     PRTMEMHDR   pHdr        = NULL;
10
 
11
@@ -76,8 +77,10 @@ DECLHIDDEN(int) rtR0MemAllocEx(size_t cb
12
         cbAllocated = RT_ALIGN_Z(cb + sizeof(*pHdr), PAGE_SIZE);
13
 
14
         pVmObject = vm_object_allocate(OBJT_DEFAULT, cbAllocated >> PAGE_SHIFT);
15
-        if (!pVmObject)
16
+        if (!pVmObject) {
17
+            IPRT_FREEBSD_RESTORE_EFL_AC();
18
             return VERR_NO_EXEC_MEMORY;
19
+        }
20
 
21
         /* Addr contains a start address vm_map_find will start searching for suitable space at. */
22
 #if __FreeBSD_version >= 1000055
23
@@ -114,6 +117,8 @@ DECLHIDDEN(int) rtR0MemAllocEx(size_t cb
24
                                  fFlags & RTMEMHDR_FLAG_ZEROED ? M_NOWAIT | M_ZERO : M_NOWAIT);
25
     }
26
 
27
+    IPRT_FREEBSD_RESTORE_EFL_AC();
28
+
29
     if (RT_UNLIKELY(!pHdr))
30
         return VERR_NO_MEMORY;
31
 
32
@@ -129,6 +134,8 @@ DECLHIDDEN(int) rtR0MemAllocEx(size_t cb
33
 
34
 DECLHIDDEN(void) rtR0MemFree(PRTMEMHDR pHdr)
35
 {
36
+    IPRT_FREEBSD_SAVE_EFL_AC();
37
+
38
     pHdr->u32Magic += 1;
39
 
40
 #ifdef RT_ARCH_AMD64
41
@@ -141,11 +148,14 @@ DECLHIDDEN(void) rtR0MemFree(PRTMEMHDR p
42
     else
43
 #endif
44
         free(pHdr, M_IPRTHEAP);
45
+
46
+    IPRT_FREEBSD_RESTORE_EFL_AC();
47
 }
48
 
49
 
50
 RTR0DECL(void *) RTMemContAlloc(PRTCCPHYS pPhys, size_t cb)
51
 {
52
+    IPRT_FREEBSD_SAVE_EFL_AC();
53
     void *pv;
54
 
55
     /*
56
@@ -170,6 +180,7 @@ RTR0DECL(void *) RTMemContAlloc(PRTCCPHY
57
         *pPhys = vtophys(pv);
58
         Assert(!(*pPhys & PAGE_OFFSET_MASK));
59
     }
60
+    IPRT_FREEBSD_RESTORE_EFL_AC();
61
     return pv;
62
 }
63
 
64
@@ -179,7 +190,9 @@ RTR0DECL(void) RTMemContFree(void *pv, s
65
     if (pv)
66
     {
67
         AssertMsg(!((uintptr_t)pv & PAGE_OFFSET_MASK), ("pv=%p\n", pv));
68
+        IPRT_FREEBSD_SAVE_EFL_AC();
69
         contigfree(pv, cb, M_IPRTCONT);
70
+        IPRT_FREEBSD_RESTORE_EFL_AC();
71
     }
72
 }
73
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_assert-r0drv-freebsd.c (+29 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/assert-r0drv-freebsd.c.orig	2018-08-16 23:08:58.643749000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/assert-r0drv-freebsd.c	2018-08-16 23:10:07.793512000 +0300
3
@@ -44,15 +44,18 @@
4
 
5
 DECLHIDDEN(void) rtR0AssertNativeMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction)
6
 {
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
     printf("\r\n!!Assertion Failed!!\r\n"
9
            "Expression: %s\r\n"
10
            "Location  : %s(%d) %s\r\n",
11
            pszExpr, pszFile, uLine, pszFunction);
12
+    IPRT_FREEBSD_RESTORE_EFL_AC();
13
 }
14
 
15
 
16
 DECLHIDDEN(void) rtR0AssertNativeMsg2V(bool fInitial, const char *pszFormat, va_list va)
17
 {
18
+    IPRT_FREEBSD_SAVE_EFL_AC();
19
     char szMsg[256];
20
 
21
     RTStrPrintfV(szMsg, sizeof(szMsg) - 1, pszFormat, va);
22
@@ -60,6 +63,7 @@ DECLHIDDEN(void) rtR0AssertNativeMsg2V(b
23
     printf("%s", szMsg);
24
 
25
     NOREF(fInitial);
26
+    IPRT_FREEBSD_RESTORE_EFL_AC();
27
 }
28
 
29
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_memobj-r0drv-freebsd.c (-9 / +305 lines)
Lines 1-7 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig	2017-04-28 15:04:48 UTC
1
--- src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c.orig	2017-04-28 15:04:48 UTC
2
+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
2
+++ src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
3
@@ -121,16 +121,15 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR
3
@@ -105,6 +105,7 @@ static vm_map_t rtR0MemObjFreeBSDGetMap(
4
 
4
 
5
 DECLHIDDEN(int) rtR0MemObjNativeFree(RTR0MEMOBJ pMem)
6
 {
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
     PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)pMem;
9
     int rc;
10
 
11
@@ -121,16 +122,15 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR
12
 
5
         case RTR0MEMOBJTYPE_LOCK:
13
         case RTR0MEMOBJTYPE_LOCK:
6
         {
14
         {
7
-            vm_map_t pMap = kernel_map;
15
-            vm_map_t pMap = kernel_map;
Lines 22-28 Link Here
22
             break;
30
             break;
23
         }
31
         }
24
 
32
 
25
@@ -224,18 +223,23 @@ static vm_page_t rtR0MemObjFreeBSDContig
33
@@ -194,6 +194,7 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR
34
             return VERR_INTERNAL_ERROR;
35
     }
36
 
37
+    IPRT_FREEBSD_RESTORE_EFL_AC();
38
     return VINF_SUCCESS;
39
 }
40
 
41
@@ -224,18 +225,23 @@ static vm_page_t rtR0MemObjFreeBSDContig
26
 #else
42
 #else
27
         VM_OBJECT_UNLOCK(pObject);
43
         VM_OBJECT_UNLOCK(pObject);
28
 #endif
44
 #endif
Lines 51-57 Link Here
51
             break;
67
             break;
52
         vm_contig_grow_cache(cTries, 0, VmPhysAddrHigh);
68
         vm_contig_grow_cache(cTries, 0, VmPhysAddrHigh);
53
         cTries++;
69
         cTries++;
54
@@ -243,11 +247,8 @@ static vm_page_t rtR0MemObjFreeBSDContig
70
@@ -243,11 +249,8 @@ static vm_page_t rtR0MemObjFreeBSDContig
55
 
71
 
56
     if (!pPages)
72
     if (!pPages)
57
         return pPages;
73
         return pPages;
Lines 64-70 Link Here
64
     for (vm_pindex_t iPage = 0; iPage < cPages; iPage++)
80
     for (vm_pindex_t iPage = 0; iPage < cPages; iPage++)
65
     {
81
     {
66
         vm_page_t pPage = pPages + iPage;
82
         vm_page_t pPage = pPages + iPage;
67
@@ -259,13 +260,9 @@ static vm_page_t rtR0MemObjFreeBSDContig
83
@@ -259,13 +262,9 @@ static vm_page_t rtR0MemObjFreeBSDContig
68
             atomic_add_int(&cnt.v_wire_count, 1);
84
             atomic_add_int(&cnt.v_wire_count, 1);
69
         }
85
         }
70
     }
86
     }
Lines 78-84 Link Here
78
 }
94
 }
79
 
95
 
80
 static int rtR0MemObjFreeBSDPhysAllocHelper(vm_object_t pObject, u_long cPages,
96
 static int rtR0MemObjFreeBSDPhysAllocHelper(vm_object_t pObject, u_long cPages,
81
@@ -292,16 +289,17 @@ static int rtR0MemObjFreeBSDPhysAllocHel
97
@@ -292,16 +291,17 @@ static int rtR0MemObjFreeBSDPhysAllocHel
82
 #else
98
 #else
83
             VM_OBJECT_LOCK(pObject);
99
             VM_OBJECT_LOCK(pObject);
84
 #endif
100
 #endif
Lines 98-107 Link Here
98
                 vm_page_unlock_queues();
114
                 vm_page_unlock_queues();
99
 #endif
115
 #endif
100
             }
116
             }
101
@@ -519,14 +517,19 @@ static int rtR0MemObjNativeLockInMap(PPR
117
@@ -364,58 +364,77 @@ static int rtR0MemObjFreeBSDAllocHelper(
118
 }
119
 DECLHIDDEN(int) rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
120
 {
121
+    IPRT_FREEBSD_SAVE_EFL_AC();
122
     PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
123
                                                                        RTR0MEMOBJTYPE_PAGE, NULL, cb);
102
     if (!pMemFreeBSD)
124
     if (!pMemFreeBSD)
125
+    {
126
+        IPRT_FREEBSD_RESTORE_EFL_AC();
103
         return VERR_NO_MEMORY;
127
         return VERR_NO_MEMORY;
128
+    }
104
 
129
 
130
     int rc = rtR0MemObjFreeBSDAllocHelper(pMemFreeBSD, fExecutable, ~(vm_paddr_t)0, false, VERR_NO_MEMORY);
131
     if (RT_FAILURE(rc))
132
     {
133
         rtR0MemObjDelete(&pMemFreeBSD->Core);
134
+        IPRT_FREEBSD_RESTORE_EFL_AC();
135
         return rc;
136
     }
137
 
138
     *ppMem = &pMemFreeBSD->Core;
139
+    IPRT_FREEBSD_RESTORE_EFL_AC();
140
     return rc;
141
 }
142
 
143
 
144
 DECLHIDDEN(int) rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
145
 {
146
+    IPRT_FREEBSD_SAVE_EFL_AC();
147
     PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
148
                                                                        RTR0MEMOBJTYPE_LOW, NULL, cb);
149
     if (!pMemFreeBSD)
150
+    {
151
+        IPRT_FREEBSD_RESTORE_EFL_AC();
152
         return VERR_NO_MEMORY;
153
+    }
154
 
155
     int rc = rtR0MemObjFreeBSDAllocHelper(pMemFreeBSD, fExecutable, _4G - 1, false, VERR_NO_LOW_MEMORY);
156
     if (RT_FAILURE(rc))
157
     {
158
         rtR0MemObjDelete(&pMemFreeBSD->Core);
159
+        IPRT_FREEBSD_RESTORE_EFL_AC();
160
         return rc;
161
     }
162
 
163
     *ppMem = &pMemFreeBSD->Core;
164
+    IPRT_FREEBSD_RESTORE_EFL_AC();
165
     return rc;
166
 }
167
 
168
 
169
 DECLHIDDEN(int) rtR0MemObjNativeAllocCont(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)
170
 {
171
+    IPRT_FREEBSD_SAVE_EFL_AC();
172
+
173
     PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
174
                                                                        RTR0MEMOBJTYPE_CONT, NULL, cb);
175
     if (!pMemFreeBSD)
176
+    {
177
+        IPRT_FREEBSD_RESTORE_EFL_AC();
178
         return VERR_NO_MEMORY;
179
+    }
180
 
181
     int rc = rtR0MemObjFreeBSDAllocHelper(pMemFreeBSD, fExecutable, _4G - 1, true, VERR_NO_CONT_MEMORY);
182
     if (RT_FAILURE(rc))
183
     {
184
         rtR0MemObjDelete(&pMemFreeBSD->Core);
185
+        IPRT_FREEBSD_RESTORE_EFL_AC();
186
         return rc;
187
     }
188
 
189
     pMemFreeBSD->Core.u.Cont.Phys = vtophys(pMemFreeBSD->Core.pv);
190
     *ppMem = &pMemFreeBSD->Core;
191
+    IPRT_FREEBSD_RESTORE_EFL_AC();
192
     return rc;
193
 }
194
 
195
@@ -425,6 +444,7 @@ static int rtR0MemObjFreeBSDAllocPhysPag
196
                                            RTHCPHYS PhysHighest, size_t uAlignment,
197
                                            bool fContiguous, int rcNoMem)
198
 {
199
+    IPRT_FREEBSD_SAVE_EFL_AC();
200
     uint32_t   cPages = atop(cb);
201
     vm_paddr_t VmPhysAddrHigh;
202
 
203
@@ -432,7 +452,10 @@ static int rtR0MemObjFreeBSDAllocPhysPag
204
     PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD),
205
                                                                        enmType, NULL, cb);
206
     if (!pMemFreeBSD)
207
+    {
208
+        IPRT_FREEBSD_RESTORE_EFL_AC();
209
         return VERR_NO_MEMORY;
210
+    }
211
 
212
     pMemFreeBSD->pObject = vm_object_allocate(OBJT_PHYS, atop(cb));
213
 
214
@@ -470,6 +493,7 @@ static int rtR0MemObjFreeBSDAllocPhysPag
215
         rtR0MemObjDelete(&pMemFreeBSD->Core);
216
     }
217
 
218
+    IPRT_FREEBSD_RESTORE_EFL_AC();
219
     return rc;
220
 }
221
 
222
@@ -489,17 +513,22 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocPhy
223
 DECLHIDDEN(int) rtR0MemObjNativeEnterPhys(PPRTR0MEMOBJINTERNAL ppMem, RTHCPHYS Phys, size_t cb, uint32_t uCachePolicy)
224
 {
225
     AssertReturn(uCachePolicy == RTMEM_CACHE_POLICY_DONT_CARE, VERR_NOT_SUPPORTED);
226
+    IPRT_FREEBSD_SAVE_EFL_AC();
227
 
228
     /* create the object. */
229
     PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD), RTR0MEMOBJTYPE_PHYS, NULL, cb);
230
     if (!pMemFreeBSD)
231
+    {
232
+        IPRT_FREEBSD_RESTORE_EFL_AC();
233
         return VERR_NO_MEMORY;
234
+    }
235
 
236
     /* there is no allocation here, it needs to be mapped somewhere first. */
237
     pMemFreeBSD->Core.u.Phys.fAllocated = false;
238
     pMemFreeBSD->Core.u.Phys.PhysBase = Phys;
239
     pMemFreeBSD->Core.u.Phys.uCachePolicy = uCachePolicy;
240
     *ppMem = &pMemFreeBSD->Core;
241
+    IPRT_FREEBSD_RESTORE_EFL_AC();
242
     return VINF_SUCCESS;
243
 }
244
 
245
@@ -511,6 +540,7 @@ static int rtR0MemObjNativeLockInMap(PPR
246
                                      vm_offset_t AddrStart, size_t cb, uint32_t fAccess,
247
                                      RTR0PROCESS R0Process, int fFlags)
248
 {
249
+    IPRT_FREEBSD_SAVE_EFL_AC();
250
     int rc;
251
     NOREF(fAccess);
252
 
253
@@ -519,21 +549,28 @@ static int rtR0MemObjNativeLockInMap(PPR
254
     if (!pMemFreeBSD)
255
         return VERR_NO_MEMORY;
256
 
105
-    /*
257
-    /*
106
-     * We could've used vslock here, but we don't wish to be subject to
258
-     * We could've used vslock here, but we don't wish to be subject to
107
-     * resource usage restrictions, so we'll call vm_map_wire directly.
259
-     * resource usage restrictions, so we'll call vm_map_wire directly.
Lines 126-132 Link Here
126
     if (rc == KERN_SUCCESS)
278
     if (rc == KERN_SUCCESS)
127
     {
279
     {
128
         pMemFreeBSD->Core.u.Lock.R0Process = R0Process;
280
         pMemFreeBSD->Core.u.Lock.R0Process = R0Process;
129
@@ -751,7 +754,12 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
281
         *ppMem = &pMemFreeBSD->Core;
282
+        IPRT_FREEBSD_RESTORE_EFL_AC();
283
         return VINF_SUCCESS;
284
     }
285
     rtR0MemObjDelete(&pMemFreeBSD->Core);
286
+    IPRT_FREEBSD_RESTORE_EFL_AC();
287
     return VERR_NO_MEMORY;/** @todo fix mach -> vbox error conversion for freebsd. */
288
 }
289
 
290
@@ -569,6 +606,7 @@ DECLHIDDEN(int) rtR0MemObjNativeLockKern
291
  */
292
 static int rtR0MemObjNativeReserveInMap(PPRTR0MEMOBJINTERNAL ppMem, void *pvFixed, size_t cb, size_t uAlignment, RTR0PROCESS R0Process, vm_map_t pMap)
293
 {
294
+    IPRT_FREEBSD_SAVE_EFL_AC();
295
     int rc;
296
 
297
     /*
298
@@ -626,11 +664,13 @@ static int rtR0MemObjNativeReserveInMap(
299
         pMemFreeBSD->Core.pv = (void *)MapAddress;
300
         pMemFreeBSD->Core.u.ResVirt.R0Process = R0Process;
301
         *ppMem = &pMemFreeBSD->Core;
302
+        IPRT_FREEBSD_RESTORE_EFL_AC();
303
         return VINF_SUCCESS;
304
     }
305
 
306
     rc = VERR_NO_MEMORY; /** @todo fix translation (borrow from darwin) */
307
     rtR0MemObjDelete(&pMemFreeBSD->Core);
308
+    IPRT_FREEBSD_RESTORE_EFL_AC();
309
     return rc;
310
 
311
 }
312
@@ -652,6 +692,8 @@ DECLHIDDEN(int) rtR0MemObjNativeReserveU
313
 DECLHIDDEN(int) rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment,
314
                                           unsigned fProt, size_t offSub, size_t cbSub)
315
 {
316
+    IPRT_FREEBSD_SAVE_EFL_AC();
317
+
318
 //  AssertMsgReturn(!offSub && !cbSub, ("%#x %#x\n", offSub, cbSub), VERR_NOT_SUPPORTED);
319
     AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED);
320
 
321
@@ -707,6 +749,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapKerne
322
             Assert((vm_offset_t)pMemFreeBSD->Core.pv == Addr);
323
             pMemFreeBSD->Core.u.Mapping.R0Process = NIL_RTR0PROCESS;
324
             *ppMem = &pMemFreeBSD->Core;
325
+            IPRT_FREEBSD_RESTORE_EFL_AC();
326
             return VINF_SUCCESS;
327
         }
328
         rc = vm_map_remove(kernel_map, Addr, Addr + cbSub);
329
@@ -715,6 +758,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapKerne
330
     else
331
         vm_object_deallocate(pMemToMapFreeBSD->pObject);
332
 
333
+    IPRT_FREEBSD_RESTORE_EFL_AC();
334
     return VERR_NO_MEMORY;
335
 }
336
 
337
@@ -722,6 +766,8 @@ DECLHIDDEN(int) rtR0MemObjNativeMapKerne
338
 DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, RTR3PTR R3PtrFixed, size_t uAlignment,
339
                                         unsigned fProt, RTR0PROCESS R0Process)
340
 {
341
+    IPRT_FREEBSD_SAVE_EFL_AC();
342
+
343
     /*
344
      * Check for unsupported stuff.
345
      */
346
@@ -751,7 +797,12 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
130
     {
347
     {
131
         /** @todo is this needed?. */
348
         /** @todo is this needed?. */
132
         PROC_LOCK(pProc);
349
         PROC_LOCK(pProc);
Lines 140-147 Link Here
140
         PROC_UNLOCK(pProc);
357
         PROC_UNLOCK(pProc);
141
     }
358
     }
142
     else
359
     else
143
@@ -850,11 +858,15 @@ DECLHIDDEN(RTHCPHYS) rtR0MemObjNativeGet
360
@@ -793,6 +844,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
361
             Assert((vm_offset_t)pMemFreeBSD->Core.pv == AddrR3);
362
             pMemFreeBSD->Core.u.Mapping.R0Process = R0Process;
363
             *ppMem = &pMemFreeBSD->Core;
364
+            IPRT_FREEBSD_RESTORE_EFL_AC();
365
             return VINF_SUCCESS;
366
         }
144
 
367
 
368
@@ -802,19 +854,25 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(
369
     else
370
         vm_object_deallocate(pMemToMapFreeBSD->pObject);
371
 
372
+    IPRT_FREEBSD_RESTORE_EFL_AC();
373
     return VERR_NO_MEMORY;
374
 }
375
 
376
 
377
 DECLHIDDEN(int) rtR0MemObjNativeProtect(PRTR0MEMOBJINTERNAL pMem, size_t offSub, size_t cbSub, uint32_t fProt)
378
 {
379
+    IPRT_FREEBSD_SAVE_EFL_AC();
380
+
381
     vm_prot_t          ProtectionFlags = 0;
382
     vm_offset_t        AddrStart       = (uintptr_t)pMem->pv + offSub;
383
     vm_offset_t        AddrEnd         = AddrStart + cbSub;
384
     vm_map_t           pVmMap          = rtR0MemObjFreeBSDGetMap(pMem);
385
 
386
     if (!pVmMap)
387
+    {
388
+        IPRT_FREEBSD_RESTORE_EFL_AC();
389
         return VERR_NOT_SUPPORTED;
390
+    }
391
 
392
     if ((fProt & RTMEM_PROT_NONE) == RTMEM_PROT_NONE)
393
         ProtectionFlags = VM_PROT_NONE;
394
@@ -826,6 +884,7 @@ DECLHIDDEN(int) rtR0MemObjNativeProtect(
395
         ProtectionFlags |= VM_PROT_EXECUTE;
396
 
397
     int krc = vm_map_protect(pVmMap, AddrStart, AddrEnd, ProtectionFlags, FALSE);
398
+    IPRT_FREEBSD_RESTORE_EFL_AC();
399
     if (krc == KERN_SUCCESS)
400
         return VINF_SUCCESS;
401
 
402
@@ -850,11 +909,19 @@ DECLHIDDEN(RTHCPHYS) rtR0MemObjNativeGet
403
 
145
             vm_offset_t pb = (vm_offset_t)pMemFreeBSD->Core.pv + ptoa(iPage);
404
             vm_offset_t pb = (vm_offset_t)pMemFreeBSD->Core.pv + ptoa(iPage);
146
 
405
 
147
-            struct proc    *pProc     = (struct proc *)pMemFreeBSD->Core.u.Lock.R0Process;
406
-            struct proc    *pProc     = (struct proc *)pMemFreeBSD->Core.u.Lock.R0Process;
Lines 149-162 Link Here
149
-            pmap_t pPhysicalMap       = vm_map_pmap(pProcMap);
408
-            pmap_t pPhysicalMap       = vm_map_pmap(pProcMap);
150
+            if (pMemFreeBSD->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
409
+            if (pMemFreeBSD->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
151
+            {
410
+            {
411
+                RTHCPHYS addr;
412
+                IPRT_FREEBSD_SAVE_EFL_AC();
152
+                struct proc    *pProc     = (struct proc *)pMemFreeBSD->Core.u.Lock.R0Process;
413
+                struct proc    *pProc     = (struct proc *)pMemFreeBSD->Core.u.Lock.R0Process;
153
+                struct vm_map  *pProcMap  = &pProc->p_vmspace->vm_map;
414
+                struct vm_map  *pProcMap  = &pProc->p_vmspace->vm_map;
154
+                pmap_t pPhysicalMap       = vm_map_pmap(pProcMap);
415
+                pmap_t pPhysicalMap       = vm_map_pmap(pProcMap);
155
 
416
 
156
-            return pmap_extract(pPhysicalMap, pb);
417
-            return pmap_extract(pPhysicalMap, pb);
157
+                return pmap_extract(pPhysicalMap, pb);
418
+                addr =  pmap_extract(pPhysicalMap, pb);
419
+                IPRT_FREEBSD_RESTORE_EFL_AC();
420
+                return addr;
158
+            }
421
+            }
159
+            return vtophys(pb);
422
+            return vtophys(pb);
160
         }
423
         }
161
 
424
 
162
         case RTR0MEMOBJTYPE_MAPPING:
425
         case RTR0MEMOBJTYPE_MAPPING:
426
@@ -863,11 +930,15 @@ DECLHIDDEN(RTHCPHYS) rtR0MemObjNativeGet
427
 
428
             if (pMemFreeBSD->Core.u.Mapping.R0Process != NIL_RTR0PROCESS)
429
             {
430
+                RTHCPHYS addr;
431
+                IPRT_FREEBSD_SAVE_EFL_AC();
432
                 struct proc    *pProc     = (struct proc *)pMemFreeBSD->Core.u.Mapping.R0Process;
433
                 struct vm_map  *pProcMap  = &pProc->p_vmspace->vm_map;
434
                 pmap_t pPhysicalMap       = vm_map_pmap(pProcMap);
435
 
436
-                return pmap_extract(pPhysicalMap, pb);
437
+                addr =  pmap_extract(pPhysicalMap, pb);
438
+                IPRT_FREEBSD_RESTORE_EFL_AC();
439
+                return addr;
440
             }
441
             return vtophys(pb);
442
         }
443
@@ -877,6 +948,7 @@ DECLHIDDEN(RTHCPHYS) rtR0MemObjNativeGet
444
         case RTR0MEMOBJTYPE_PHYS_NC:
445
         {
446
             RTHCPHYS addr;
447
+            IPRT_FREEBSD_SAVE_EFL_AC();
448
 #if __FreeBSD_version >= 1000030
449
             VM_OBJECT_WLOCK(pMemFreeBSD->pObject);
450
 #else
451
@@ -888,6 +960,7 @@ DECLHIDDEN(RTHCPHYS) rtR0MemObjNativeGet
452
 #else
453
             VM_OBJECT_UNLOCK(pMemFreeBSD->pObject);
454
 #endif
455
+            IPRT_FREEBSD_RESTORE_EFL_AC();
456
             return addr;
457
         }
458
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_memuserkernel-r0drv-freebsd.c (+22 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/memuserkernel-r0drv-freebsd.c.orig	2018-08-16 23:27:30.130196000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/memuserkernel-r0drv-freebsd.c	2018-08-16 23:28:53.760584000 +0300
3
@@ -36,7 +36,9 @@
4
 
5
 RTR0DECL(int) RTR0MemUserCopyFrom(void *pvDst, RTR3PTR R3PtrSrc, size_t cb)
6
 {
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
     int rc = copyin((const void *)R3PtrSrc, pvDst, cb);
9
+    IPRT_FREEBSD_RESTORE_EFL_AC();
10
     if (RT_LIKELY(rc == 0))
11
         return VINF_SUCCESS;
12
     return VERR_ACCESS_DENIED;
13
@@ -45,7 +47,9 @@ RTR0DECL(int) RTR0MemUserCopyFrom(void *
14
 
15
 RTR0DECL(int) RTR0MemUserCopyTo(RTR3PTR R3PtrDst, void const *pvSrc, size_t cb)
16
 {
17
+    IPRT_FREEBSD_SAVE_EFL_AC();
18
     int rc = copyout(pvSrc, (void *)R3PtrDst, cb);
19
+    IPRT_FREEBSD_RESTORE_EFL_AC();
20
     if (RT_LIKELY(rc == 0))
21
         return VINF_SUCCESS;
22
     return VERR_ACCESS_DENIED;
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_mp-r0drv-freebsd.c (-6 / +54 lines)
Lines 16-31 Link Here
16
 
16
 
17
 RTDECL(RTCPUID) RTMpCpuId(void)
17
 RTDECL(RTCPUID) RTMpCpuId(void)
18
 {
18
 {
19
@@ -155,7 +164,7 @@ RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnW
19
@@ -143,7 +152,9 @@ RTDECL(RTCPUID) RTMpGetOnlineCount(void)
20
 static void rtmpOnAllFreeBSDWrapper(void *pvArg)
21
 {
22
     PRTMPARGS pArgs = (PRTMPARGS)pvArg;
23
+    IPRT_FREEBSD_SAVE_EFL_AC();
24
     pArgs->pfnWorker(curcpu, pArgs->pvUser1, pArgs->pvUser2);
25
+    IPRT_FREEBSD_RESTORE_EFL_AC();
26
 }
27
 
28
 
29
@@ -155,7 +166,9 @@ RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnW
20
     Args.pvUser2 = pvUser2;
30
     Args.pvUser2 = pvUser2;
21
     Args.idCpu = NIL_RTCPUID;
31
     Args.idCpu = NIL_RTCPUID;
22
     Args.cHits = 0;
32
     Args.cHits = 0;
23
-    smp_rendezvous(NULL, rtmpOnAllFreeBSDWrapper, smp_no_rendevous_barrier, &Args);
33
-    smp_rendezvous(NULL, rtmpOnAllFreeBSDWrapper, smp_no_rendevous_barrier, &Args);
34
+    IPRT_FREEBSD_SAVE_EFL_AC();
24
+    smp_rendezvous(NULL, rtmpOnAllFreeBSDWrapper, smp_no_rendezvous_barrier, &Args);
35
+    smp_rendezvous(NULL, rtmpOnAllFreeBSDWrapper, smp_no_rendezvous_barrier, &Args);
36
+    IPRT_FREEBSD_RESTORE_EFL_AC();
25
     return VINF_SUCCESS;
37
     return VINF_SUCCESS;
26
 }
38
 }
27
 
39
 
28
@@ -180,10 +189,8 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER p
40
@@ -171,7 +184,11 @@ static void rtmpOnOthersFreeBSDWrapper(v
41
     PRTMPARGS pArgs = (PRTMPARGS)pvArg;
42
     RTCPUID idCpu = curcpu;
43
     if (pArgs->idCpu != idCpu)
44
+    {
45
+        IPRT_FREEBSD_SAVE_EFL_AC();
46
         pArgs->pfnWorker(idCpu, pArgs->pvUser1, pArgs->pvUser2);
47
+        IPRT_FREEBSD_RESTORE_EFL_AC();
48
+    }
49
 }
50
 
51
 
52
@@ -180,10 +197,8 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER p
29
     /* Will panic if no rendezvousing cpus, so check up front. */
53
     /* Will panic if no rendezvousing cpus, so check up front. */
30
     if (RTMpGetOnlineCount() > 1)
54
     if (RTMpGetOnlineCount() > 1)
31
     {
55
     {
Lines 38-46 Link Here
38
 #endif
62
 #endif
39
         RTMPARGS    Args;
63
         RTMPARGS    Args;
40
 
64
 
41
@@ -193,13 +200,9 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER p
65
@@ -192,17 +207,15 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER p
66
         Args.pvUser2 = pvUser2;
42
         Args.idCpu = RTMpCpuId();
67
         Args.idCpu = RTMpCpuId();
43
         Args.cHits = 0;
68
         Args.cHits = 0;
69
+        IPRT_FREEBSD_SAVE_EFL_AC();
44
 #if __FreeBSD_version >= 700000
70
 #if __FreeBSD_version >= 700000
45
-# if __FreeBSD_version >= 900000
71
-# if __FreeBSD_version >= 900000
46
-    Mask = all_cpus;
72
-    Mask = all_cpus;
Lines 55-62 Link Here
55
 #else
81
 #else
56
         smp_rendezvous(NULL, rtmpOnOthersFreeBSDWrapper, NULL, &Args);
82
         smp_rendezvous(NULL, rtmpOnOthersFreeBSDWrapper, NULL, &Args);
57
 #endif
83
 #endif
58
@@ -228,10 +231,8 @@ static void rtmpOnSpecificFreeBSDWrapper
84
+        IPRT_FREEBSD_RESTORE_EFL_AC();
85
     }
86
     return VINF_SUCCESS;
87
 }
88
@@ -220,18 +233,18 @@ static void rtmpOnSpecificFreeBSDWrapper
89
     RTCPUID     idCpu = curcpu;
90
     if (pArgs->idCpu == idCpu)
91
     {
92
+        IPRT_FREEBSD_SAVE_EFL_AC();
93
         pArgs->pfnWorker(idCpu, pArgs->pvUser1, pArgs->pvUser2);
94
         ASMAtomicIncU32(&pArgs->cHits);
95
+        IPRT_FREEBSD_RESTORE_EFL_AC();
96
     }
97
 }
59
 
98
 
99
 
60
 RTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
100
 RTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
61
 {
101
 {
62
-#if __FreeBSD_version >= 900000
102
-#if __FreeBSD_version >= 900000
Lines 68-76 Link Here
68
 #endif
108
 #endif
69
     RTMPARGS    Args;
109
     RTMPARGS    Args;
70
 
110
 
71
@@ -245,12 +246,8 @@ RTDECL(int) RTMpOnSpecific(RTCPUID idCpu
111
@@ -244,16 +257,14 @@ RTDECL(int) RTMpOnSpecific(RTCPUID idCpu
112
     Args.pvUser2 = pvUser2;
72
     Args.idCpu = idCpu;
113
     Args.idCpu = idCpu;
73
     Args.cHits = 0;
114
     Args.cHits = 0;
115
+    IPRT_FREEBSD_SAVE_EFL_AC();
74
 #if __FreeBSD_version >= 700000
116
 #if __FreeBSD_version >= 700000
75
-# if __FreeBSD_version >= 900000
117
-# if __FreeBSD_version >= 900000
76
-    CPU_SETOF(idCpu, &Mask);
118
-    CPU_SETOF(idCpu, &Mask);
Lines 83-89 Link Here
83
 #else
125
 #else
84
     smp_rendezvous(NULL, rtmpOnSpecificFreeBSDWrapper, NULL, &Args);
126
     smp_rendezvous(NULL, rtmpOnSpecificFreeBSDWrapper, NULL, &Args);
85
 #endif
127
 #endif
86
@@ -273,22 +270,14 @@ static void rtmpFreeBSDPokeCallback(void
128
+    IPRT_FREEBSD_RESTORE_EFL_AC();
129
     return Args.cHits == 1
130
          ? VINF_SUCCESS
131
          : VERR_CPU_NOT_FOUND;
132
@@ -273,22 +284,16 @@ static void rtmpFreeBSDPokeCallback(void
87
 
133
 
88
 RTDECL(int) RTMpPokeCpu(RTCPUID idCpu)
134
 RTDECL(int) RTMpPokeCpu(RTCPUID idCpu)
89
 {
135
 {
Lines 104-111 Link Here
104
-    Mask = (cpumask_t)1 << idCpu;
150
-    Mask = (cpumask_t)1 << idCpu;
105
-# endif
151
-# endif
106
-    smp_rendezvous_cpus(Mask, NULL, rtmpFreeBSDPokeCallback, smp_no_rendevous_barrier, NULL);
152
-    smp_rendezvous_cpus(Mask, NULL, rtmpFreeBSDPokeCallback, smp_no_rendevous_barrier, NULL);
153
+    IPRT_FREEBSD_SAVE_EFL_AC();
107
+    CPU_SETOF(idCpu, &Cpus);
154
+    CPU_SETOF(idCpu, &Cpus);
108
+    smp_rendezvous_cpus(Cpus, NULL, rtmpFreeBSDPokeCallback, smp_no_rendezvous_barrier, NULL);
155
+    smp_rendezvous_cpus(Cpus, NULL, rtmpFreeBSDPokeCallback, smp_no_rendezvous_barrier, NULL);
156
+    IPRT_FREEBSD_RESTORE_EFL_AC();
109
 
157
 
110
     return VINF_SUCCESS;
158
     return VINF_SUCCESS;
111
 }
159
 }
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_semevent-r0drv-freebsd.c (+53 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/semevent-r0drv-freebsd.c.orig	2018-08-16 23:44:51.462498000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/semevent-r0drv-freebsd.c	2018-08-17 00:06:18.378481000 +0300
3
@@ -77,7 +77,9 @@ RTDECL(int)  RTSemEventCreateEx(PRTSEMEV
4
     Assert(!(fFlags & RTSEMEVENT_FLAGS_BOOTSTRAP_HACK) || (fFlags & RTSEMEVENT_FLAGS_NO_LOCK_VAL));
5
     AssertPtrReturn(phEventSem, VERR_INVALID_POINTER);
6
 
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
     PRTSEMEVENTINTERNAL pThis = (PRTSEMEVENTINTERNAL)RTMemAllocZ(sizeof(*pThis));
9
+    IPRT_FREEBSD_RESTORE_EFL_AC();
10
     if (!pThis)
11
         return VERR_NO_MEMORY;
12
 
13
@@ -128,10 +130,12 @@ RTDECL(int)  RTSemEventDestroy(RTSEMEVEN
14
     /*
15
      * Invalidate it and signal the object just in case.
16
      */
17
+    IPRT_FREEBSD_SAVE_EFL_AC();
18
     ASMAtomicWriteU32(&pThis->u32Magic, ~RTSEMEVENT_MAGIC);
19
     ASMAtomicWriteU32(&pThis->fState, 0);
20
     rtR0SemBsdBroadcast(pThis);
21
     rtR0SemEventBsdRelease(pThis);
22
+    IPRT_FREEBSD_RESTORE_EFL_AC();
23
     return VINF_SUCCESS;
24
 }
25
 
26
@@ -149,9 +153,11 @@ RTDECL(int)  RTSemEventSignal(RTSEMEVENT
27
     /*
28
      * Signal the event object.
29
      */
30
+    IPRT_FREEBSD_SAVE_EFL_AC();
31
     ASMAtomicWriteU32(&pThis->fState, 1);
32
     rtR0SemBsdSignal(pThis);
33
     rtR0SemEventBsdRelease(pThis);
34
+    IPRT_FREEBSD_RESTORE_EFL_AC();
35
     return VINF_SUCCESS;
36
 }
37
 
38
@@ -175,6 +181,7 @@ static int rtR0SemEventWait(PRTSEMEVENTI
39
     AssertPtrReturn(pThis, VERR_INVALID_PARAMETER);
40
     AssertMsgReturn(pThis->u32Magic == RTSEMEVENT_MAGIC, ("%p u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_PARAMETER);
41
     AssertReturn(RTSEMWAIT_FLAGS_ARE_VALID(fFlags), VERR_INVALID_PARAMETER);
42
+    IPRT_FREEBSD_SAVE_EFL_AC();
43
     rtR0SemEventBsdRetain(pThis);
44
 
45
     /*
46
@@ -224,6 +231,7 @@ static int rtR0SemEventWait(PRTSEMEVENTI
47
     }
48
 
49
     rtR0SemEventBsdRelease(pThis);
50
+    IPRT_FREEBSD_RESTORE_EFL_AC();
51
     return rc;
52
 }
53
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_semeventmulti-r0drv-freebsd.c (+73 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/semeventmulti-r0drv-freebsd.c.orig	2018-08-17 00:08:33.005477000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/semeventmulti-r0drv-freebsd.c	2018-08-17 00:13:55.160411000 +0300
3
@@ -96,7 +96,9 @@ RTDECL(int)  RTSemEventMultiCreateEx(PRT
4
     PRTSEMEVENTMULTIINTERNAL pThis;
5
 
6
     AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER);
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
     pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pThis));
9
+    IPRT_FREEBSD_RESTORE_EFL_AC();
10
     if (pThis)
11
     {
12
         pThis->u32Magic     = RTSEMEVENTMULTI_MAGIC;
13
@@ -152,10 +154,12 @@ RTDECL(int)  RTSemEventMultiDestroy(RTSE
14
     /*
15
      * Invalidate it and signal the object just in case.
16
      */
17
+    IPRT_FREEBSD_SAVE_EFL_AC();
18
     ASMAtomicWriteU32(&pThis->u32Magic, ~RTSEMEVENTMULTI_MAGIC);
19
     ASMAtomicAndU32(&pThis->fStateAndGen, RTSEMEVENTMULTIBSD_GEN_MASK);
20
     rtR0SemBsdBroadcast(pThis);
21
     rtR0SemEventMultiBsdRelease(pThis);
22
+    IPRT_FREEBSD_RESTORE_EFL_AC();
23
     return VINF_SUCCESS;
24
 }
25
 
26
@@ -164,6 +168,7 @@ RTDECL(int)  RTSemEventMultiSignal(RTSEM
27
 {
28
     uint32_t fNew;
29
     uint32_t fOld;
30
+    IPRT_FREEBSD_SAVE_EFL_AC();
31
 
32
     /*
33
      * Validate input.
34
@@ -190,12 +195,15 @@ RTDECL(int)  RTSemEventMultiSignal(RTSEM
35
 
36
     rtR0SemBsdBroadcast(pThis);
37
     rtR0SemEventMultiBsdRelease(pThis);
38
+    IPRT_FREEBSD_RESTORE_EFL_AC();
39
     return VINF_SUCCESS;
40
 }
41
 
42
 
43
 RTDECL(int)  RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem)
44
 {
45
+    IPRT_FREEBSD_SAVE_EFL_AC();
46
+
47
     /*
48
      * Validate input.
49
      */
50
@@ -212,6 +220,7 @@ RTDECL(int)  RTSemEventMultiReset(RTSEME
51
     ASMAtomicAndU32(&pThis->fStateAndGen, ~RTSEMEVENTMULTIBSD_STATE_MASK);
52
 
53
     rtR0SemEventMultiBsdRelease(pThis);
54
+    IPRT_FREEBSD_RESTORE_EFL_AC();
55
     return VINF_SUCCESS;
56
 }
57
 
58
@@ -228,6 +237,7 @@ RTDECL(int)  RTSemEventMultiReset(RTSEME
59
 static int rtR0SemEventMultiBsdWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t fFlags, uint64_t uTimeout,
60
                                     PCRTLOCKVALSRCPOS pSrcPos)
61
 {
62
+    IPRT_FREEBSD_SAVE_EFL_AC();
63
     uint32_t    fOrgStateAndGen;
64
     int         rc;
65
 
66
@@ -287,6 +297,7 @@ static int rtR0SemEventMultiBsdWait(PRTS
67
     }
68
 
69
     rtR0SemEventMultiBsdRelease(pThis);
70
+    IPRT_FREEBSD_RESTORE_EFL_AC();
71
     return rc;
72
 }
73
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_semfastmutex-r0drv-freebsd.c (+59 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/semfastmutex-r0drv-freebsd.c.orig	2018-08-17 00:15:44.462286000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/semfastmutex-r0drv-freebsd.c	2018-08-17 00:27:21.107375000 +0300
3
@@ -62,6 +62,7 @@ RTDECL(int)  RTSemFastMutexCreate(PRTSEM
4
 {
5
     AssertCompile(sizeof(RTSEMFASTMUTEXINTERNAL) > sizeof(void *));
6
     AssertPtrReturn(phFastMtx, VERR_INVALID_POINTER);
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
 
9
     PRTSEMFASTMUTEXINTERNAL pThis = (PRTSEMFASTMUTEXINTERNAL)RTMemAllocZ(sizeof(*pThis));
10
     if (pThis)
11
@@ -70,8 +71,10 @@ RTDECL(int)  RTSemFastMutexCreate(PRTSEM
12
         sx_init_flags(&pThis->SxLock, "IPRT Fast Mutex Semaphore", SX_DUPOK);
13
 
14
         *phFastMtx = pThis;
15
+        IPRT_FREEBSD_RESTORE_EFL_AC();
16
         return VINF_SUCCESS;
17
     }
18
+    IPRT_FREEBSD_RESTORE_EFL_AC();
19
     return VERR_NO_MEMORY;
20
 }
21
 
22
@@ -83,11 +86,13 @@ RTDECL(int)  RTSemFastMutexDestroy(RTSEM
23
         return VINF_SUCCESS;
24
     AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
25
     AssertMsgReturn(pThis->u32Magic == RTSEMFASTMUTEX_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE);
26
+    IPRT_FREEBSD_SAVE_EFL_AC();
27
 
28
     ASMAtomicWriteU32(&pThis->u32Magic, RTSEMFASTMUTEX_MAGIC_DEAD);
29
     sx_destroy(&pThis->SxLock);
30
     RTMemFree(pThis);
31
 
32
+    IPRT_FREEBSD_RESTORE_EFL_AC();
33
     return VINF_SUCCESS;
34
 }
35
 
36
@@ -97,8 +102,11 @@ RTDECL(int)  RTSemFastMutexRequest(RTSEM
37
     PRTSEMFASTMUTEXINTERNAL pThis = hFastMtx;
38
     AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
39
     AssertMsgReturn(pThis->u32Magic == RTSEMFASTMUTEX_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE);
40
+    IPRT_FREEBSD_SAVE_EFL_AC();
41
 
42
     sx_xlock(&pThis->SxLock);
43
+
44
+    IPRT_FREEBSD_RESTORE_EFL_AC();
45
     return VINF_SUCCESS;
46
 }
47
 
48
@@ -108,8 +116,11 @@ RTDECL(int)  RTSemFastMutexRelease(RTSEM
49
     PRTSEMFASTMUTEXINTERNAL pThis = hFastMtx;
50
     AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
51
     AssertMsgReturn(pThis->u32Magic == RTSEMFASTMUTEX_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE);
52
+    IPRT_FREEBSD_SAVE_EFL_AC();
53
 
54
     sx_xunlock(&pThis->SxLock);
55
+
56
+    IPRT_FREEBSD_RESTORE_EFL_AC();
57
     return VINF_SUCCESS;
58
 }
59
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_semmutex-r0drv-freebsd.c (+80 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/semmutex-r0drv-freebsd.c.orig	2018-08-17 00:29:32.778170000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/semmutex-r0drv-freebsd.c	2018-08-17 00:41:35.793266000 +0300
3
@@ -62,6 +62,7 @@ RTDECL(int)  RTSemMutexCreate(PRTSEMMUTE
4
 {
5
     AssertCompile(sizeof(RTSEMMUTEXINTERNAL) > sizeof(void *));
6
     AssertPtrReturn(phMutexSem, VERR_INVALID_POINTER);
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
 
9
     PRTSEMMUTEXINTERNAL pThis = (PRTSEMMUTEXINTERNAL)RTMemAllocZ(sizeof(*pThis));
10
     if (pThis)
11
@@ -70,8 +71,10 @@ RTDECL(int)  RTSemMutexCreate(PRTSEMMUTE
12
         sx_init_flags(&pThis->SxLock, "IPRT Mutex Semaphore", SX_RECURSE);
13
 
14
         *phMutexSem = pThis;
15
+        IPRT_FREEBSD_RESTORE_EFL_AC();
16
         return VINF_SUCCESS;
17
     }
18
+    IPRT_FREEBSD_RESTORE_EFL_AC();
19
     return VERR_NO_MEMORY;
20
 }
21
 
22
@@ -83,12 +86,14 @@ RTDECL(int)  RTSemMutexDestroy(RTSEMMUTE
23
         return VINF_SUCCESS;
24
     AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
25
     AssertMsgReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE);
26
+    IPRT_FREEBSD_SAVE_EFL_AC();
27
 
28
     AssertReturn(ASMAtomicCmpXchgU32(&pThis->u32Magic, RTSEMMUTEX_MAGIC_DEAD, RTSEMMUTEX_MAGIC), VERR_INVALID_HANDLE);
29
 
30
     sx_destroy(&pThis->SxLock);
31
     RTMemFree(pThis);
32
 
33
+    IPRT_FREEBSD_RESTORE_EFL_AC();
34
     return VINF_SUCCESS;
35
 }
36
 
37
@@ -99,6 +104,7 @@ RTDECL(int)  RTSemMutexRequest(RTSEMMUTE
38
     int                 rc;
39
     AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
40
     AssertMsgReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE);
41
+    IPRT_FREEBSD_SAVE_EFL_AC();
42
 
43
     if (cMillies == RT_INDEFINITE_WAIT)
44
     {
45
@@ -133,6 +139,7 @@ RTDECL(int)  RTSemMutexRequest(RTSEMMUTE
46
         } while (RTTimeSystemMilliTS() - StartTS < cMillies);
47
     }
48
 
49
+    IPRT_FREEBSD_RESTORE_EFL_ONLY_AC();
50
     return VINF_SUCCESS;
51
 }
52
 
53
@@ -149,6 +156,7 @@ RTDECL(int)  RTSemMutexRequestNoResume(R
54
     int                 rc;
55
     AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
56
     AssertMsgReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE);
57
+    IPRT_FREEBSD_SAVE_EFL_AC();
58
 
59
     if (cMillies == RT_INDEFINITE_WAIT)
60
     {
61
@@ -186,6 +194,7 @@ RTDECL(int)  RTSemMutexRequestNoResume(R
62
         } while (RTTimeSystemMilliTS() - StartTS < cMillies);
63
     }
64
 
65
+    IPRT_FREEBSD_RESTORE_EFL_ONLY_AC();
66
     return VINF_SUCCESS;
67
 }
68
 
69
@@ -201,8 +210,11 @@ RTDECL(int)  RTSemMutexRelease(RTSEMMUTE
70
     PRTSEMMUTEXINTERNAL pThis = hMutexSem;
71
     AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
72
     AssertMsgReturn(pThis->u32Magic == RTSEMMUTEX_MAGIC, ("%p: u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE);
73
+    IPRT_FREEBSD_SAVE_EFL_AC();
74
 
75
     sx_xunlock(&pThis->SxLock);
76
+
77
+    IPRT_FREEBSD_RESTORE_EFL_ONLY_AC();
78
     return VINF_SUCCESS;
79
 }
80
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_spinlock-r0drv-freebsd.c (+30 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/spinlock-r0drv-freebsd.c.orig	2018-08-16 22:09:55.113751000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/spinlock-r0drv-freebsd.c	2018-08-16 22:38:13.352898000 +0300
3
@@ -82,7 +82,9 @@ RTDECL(int)  RTSpinlockCreate(PRTSPINLOC
4
      * Allocate.
5
      */
6
     AssertCompile(sizeof(RTSPINLOCKINTERNAL) > sizeof(void *));
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
     PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)RTMemAllocZ(sizeof(*pThis));
9
+    IPRT_FREEBSD_RESTORE_EFL_AC();
10
     if (!pThis)
11
         return VERR_NO_MEMORY;
12
 
13
@@ -116,7 +118,9 @@ RTDECL(int)  RTSpinlockDestroy(RTSPINLOC
14
      * Make the lock invalid and release the memory.
15
      */
16
     ASMAtomicIncU32(&pThis->u32Magic);
17
+    IPRT_FREEBSD_SAVE_EFL_AC();
18
     RTMemFree(pThis);
19
+    IPRT_FREEBSD_RESTORE_EFL_AC();
20
     return VINF_SUCCESS;
21
 }
22
 
23
@@ -142,6 +146,7 @@ RTDECL(void) RTSpinlockAcquire(RTSPINLOC
24
                 {
25
                     RT_ASSERT_PREEMPT_CPUID_SPIN_ACQUIRED(pThis);
26
                     pThis->fIntSaved = fIntSaved;
27
+                    IPRT_FREEBSD_RESTORE_EFL_ONLY_AC_EX(fIntSaved);
28
                     return;
29
                 }
30
                 if (--c <= 0)
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_the-freebsd-kernel.h (+14 lines)
Lines 16-18 Link Here
16
 #include <sys/resourcevar.h>
16
 #include <sys/resourcevar.h>
17
 #include <machine/cpu.h>
17
 #include <machine/cpu.h>
18
 
18
 
19
@@ -117,3 +117,13 @@
20
 #endif
21
 
22
 #endif
23
+
24
+/** 
25
+ * Macros for preserving EFLAGS.AC (despair / paranoid)
26
+ */
27
+#include <iprt/asm-amd64-x86.h>
28
+#include <iprt/x86.h>
29
+#define IPRT_FREEBSD_SAVE_EFL_AC()                       RTCCUINTREG const fSavedEfl = ASMGetFlags()
30
+#define IPRT_FREEBSD_RESTORE_EFL_AC()                    ASMSetFlags(fSavedEfl)
31
+#define IPRT_FREEBSD_RESTORE_EFL_ONLY_AC()               ASMChangeFlags(~X86_EFL_AC, fSavedEfl & X86_EFL_AC)
32
+#define IPRT_FREEBSD_RESTORE_EFL_ONLY_AC_EX(a_fSavedEfl) ASMChangeFlags(~X86_EFL_AC, (a_fSavedEfl) & X86_EFL_AC)
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_thread-r0drv-freebsd.c (-2 / +39 lines)
Lines 8-14 Link Here
8
 
8
 
9
     /*
9
     /*
10
      * 0 ms sleep -> yield.
10
      * 0 ms sleep -> yield.
11
@@ -65,6 +64,21 @@ static int rtR0ThreadFbsdSleepCommon(RTM
11
@@ -60,11 +59,28 @@ static int rtR0ThreadFbsdSleepCommon(RTM
12
         return VINF_SUCCESS;
13
     }
14
 
15
+    IPRT_FREEBSD_SAVE_EFL_AC();
16
+
17
     /*
18
      * Translate milliseconds into ticks and go to sleep.
12
      */
19
      */
13
     if (cMillies != RT_INDEFINITE_WAIT)
20
     if (cMillies != RT_INDEFINITE_WAIT)
14
     {
21
     {
Lines 30-36 Link Here
30
         if (hz == 1000)
37
         if (hz == 1000)
31
             cTicks = cMillies;
38
             cTicks = cMillies;
32
         else if (hz == 100)
39
         else if (hz == 100)
33
@@ -76,14 +90,23 @@ static int rtR0ThreadFbsdSleepCommon(RTM
40
@@ -76,14 +92,24 @@ static int rtR0ThreadFbsdSleepCommon(RTM
34
             if (cTicks != cTicks64)
41
             if (cTicks != cTicks64)
35
                 cTicks = INT_MAX;
42
                 cTicks = INT_MAX;
36
         }
43
         }
Lines 57-62 Link Here
57
+                    "iprts0",           /* max 6 chars */
64
+                    "iprts0",           /* max 6 chars */
58
+                    0);
65
+                    0);
59
+    }
66
+    }
67
+    IPRT_FREEBSD_RESTORE_EFL_AC();
60
     switch (rc)
68
     switch (rc)
61
     {
69
     {
62
         case 0:
70
         case 0:
71
@@ -114,11 +140,13 @@ RTDECL(int) RTThreadSleepNoLog(RTMSINTER
72
 
73
 RTDECL(bool) RTThreadYield(void)
74
 {
75
+    IPRT_FREEBSD_SAVE_EFL_AC();
76
 #if __FreeBSD_version >= 900032
77
     kern_yield(curthread->td_user_pri);
78
 #else
79
     uio_yield();
80
 #endif
81
+    IPRT_FREEBSD_RESTORE_EFL_AC();
82
     return false; /** @todo figure this one ... */
83
 }
84
 
85
@@ -167,12 +195,14 @@ RTDECL(void) RTThreadPreemptDisable(PRTT
86
 
87
 RTDECL(void) RTThreadPreemptRestore(PRTTHREADPREEMPTSTATE pState)
88
 {
89
+    IPRT_FREEBSD_SAVE_EFL_AC(); /* paranoia */
90
     AssertPtr(pState);
91
     Assert(pState->u32Reserved == 42);
92
     pState->u32Reserved = 0;
93
 
94
     RT_ASSERT_PREEMPT_CPUID_RESTORE(pState);
95
     critical_exit();
96
+    IPRT_FREEBSD_RESTORE_EFL_ONLY_AC();  /* paranoia */
97
 }
98
 
99
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_thread2-r0drv-freebsd.c (+35 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/thread2-r0drv-freebsd.c.orig	2018-08-17 00:56:34.555270000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/thread2-r0drv-freebsd.c	2018-08-17 00:55:31.341293000 +0300
3
@@ -70,6 +70,8 @@ DECLHIDDEN(int) rtThreadNativeSetPriorit
4
             return VERR_INVALID_PARAMETER;
5
     }
6
 
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
+
9
 #if __FreeBSD_version < 700000
10
     /* Do like they're doing in subr_ntoskrnl.c... */
11
     mtx_lock_spin(&sched_lock);
12
@@ -86,6 +88,7 @@ DECLHIDDEN(int) rtThreadNativeSetPriorit
13
     thread_unlock(curthread);
14
 #endif
15
 
16
+    IPRT_FREEBSD_RESTORE_EFL_AC();
17
     return VINF_SUCCESS;
18
 }
19
 
20
@@ -135,6 +138,7 @@ static void rtThreadNativeMain(void *pvT
21
 
22
 DECLHIDDEN(int) rtThreadNativeCreate(PRTTHREADINT pThreadInt, PRTNATIVETHREAD pNativeThread)
23
 {
24
+    IPRT_FREEBSD_SAVE_EFL_AC();
25
     int rc;
26
     struct proc *pProc;
27
 
28
@@ -150,6 +154,7 @@ DECLHIDDEN(int) rtThreadNativeCreate(PRT
29
     }
30
     else
31
         rc = RTErrConvertFromErrno(rc);
32
+    IPRT_FREEBSD_RESTORE_EFL_AC();
33
     return rc;
34
 }
35
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_Runtime_r0drv_freebsd_timer-r0drv-freebsd.c (+68 lines)
Line 0 Link Here
1
--- src/VBox/Runtime/r0drv/freebsd/timer-r0drv-freebsd.c.orig	2018-08-17 01:15:03.276436000 +0300
2
+++ src/VBox/Runtime/r0drv/freebsd/timer-r0drv-freebsd.c	2018-08-17 01:17:18.742161000 +0300
3
@@ -92,6 +92,7 @@ static void rtTimerFreeBSDCallback(void
4
 RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, uint32_t fFlags, PFNRTTIMER pfnTimer, void *pvUser)
5
 {
6
     *ppTimer = NULL;
7
+    IPRT_FREEBSD_SAVE_EFL_AC();
8
 
9
     /*
10
      * Validate flags.
11
@@ -121,6 +122,7 @@ RTDECL(int) RTTimerCreateEx(PRTTIMER *pp
12
     callout_init(&pTimer->Callout, CALLOUT_MPSAFE);
13
 
14
     *ppTimer = pTimer;
15
+    IPRT_FREEBSD_RESTORE_EFL_AC();
16
     return VINF_SUCCESS;
17
 }
18
 
19
@@ -141,6 +143,8 @@ DECLINLINE(bool) rtTimerIsValid(PRTTIMER
20
 
21
 RTDECL(int) RTTimerDestroy(PRTTIMER pTimer)
22
 {
23
+    IPRT_FREEBSD_SAVE_EFL_AC();
24
+
25
     /* It's ok to pass NULL pointer. */
26
     if (pTimer == /*NIL_RTTIMER*/ NULL)
27
         return VINF_SUCCESS;
28
@@ -153,6 +157,8 @@ RTDECL(int) RTTimerDestroy(PRTTIMER pTim
29
     pTimer->u32Magic++;
30
     callout_stop(&pTimer->Callout);
31
     RTMemFree(pTimer);
32
+
33
+    IPRT_FREEBSD_RESTORE_EFL_AC();
34
     return VINF_SUCCESS;
35
 }
36
 
37
@@ -160,6 +166,7 @@ RTDECL(int) RTTimerDestroy(PRTTIMER pTim
38
 RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
39
 {
40
     struct timeval tv;
41
+    IPRT_FREEBSD_SAVE_EFL_AC();
42
 
43
     if (!rtTimerIsValid(pTimer))
44
         return VERR_INVALID_HANDLE;
45
@@ -183,12 +190,15 @@ RTDECL(int) RTTimerStart(PRTTIMER pTimer
46
     tv.tv_usec = (u64First % 1000000000) / 1000;
47
     callout_reset(&pTimer->Callout, tvtohz(&tv), rtTimerFreeBSDCallback, pTimer);
48
 
49
+    IPRT_FREEBSD_RESTORE_EFL_AC();
50
     return VINF_SUCCESS;
51
 }
52
 
53
 
54
 RTDECL(int) RTTimerStop(PRTTIMER pTimer)
55
 {
56
+    IPRT_FREEBSD_SAVE_EFL_AC();
57
+
58
     if (!rtTimerIsValid(pTimer))
59
         return VERR_INVALID_HANDLE;
60
     if (pTimer->fSuspended)
61
@@ -200,6 +210,7 @@ RTDECL(int) RTTimerStop(PRTTIMER pTimer)
62
     pTimer->fSuspended = true;
63
     callout_stop(&pTimer->Callout);
64
 
65
+    IPRT_FREEBSD_RESTORE_EFL_AC();
66
     return VINF_SUCCESS;
67
 }
68
 
(-)emulators/virtualbox-ose/files/patch-src_VBox_VMM_VMMR3_APIC.cpp (+11 lines)
Line 0 Link Here
1
--- src/VBox/VMM/VMMR3/APIC.cpp.orig	2018-07-16 18:03:53.000000000 +0300
2
+++ src/VBox/VMM/VMMR3/APIC.cpp	2018-08-15 02:03:06.891951000 +0300
3
@@ -1503,7 +1503,7 @@ static int apicR3InitState(PVM pVM)
4
             SupApicPage.Phys = NIL_RTHCPHYS;
5
 
6
             Assert(pVCpu->idCpu == idCpu);
7
-            Assert(pApicCpu->pvApicPageR3 == NIL_RTR0PTR);
8
+            Assert(pApicCpu->pvApicPageR3 == (void *)NIL_RTR0PTR);
9
             Assert(pApicCpu->pvApicPageR0 == NIL_RTR0PTR);
10
             Assert(pApicCpu->pvApicPageRC == NIL_RTRCPTR);
11
             AssertCompile(sizeof(XAPICPAGE) == PAGE_SIZE);

Return to bug 230460