OSDN Git Service

src/vboxguest-5.0.2
authorMiguel Bernal Marin <miguel.bernal.marin@linux.intel.com>
Fri, 4 Sep 2015 15:39:39 +0000 (10:39 -0500)
committerMiguel Bernal Marin <miguel.bernal.marin@linux.intel.com>
Fri, 4 Sep 2015 15:39:39 +0000 (10:39 -0500)
53 files changed:
dkms.conf
vboxguest/common/time/time.c
vboxguest/include/VBox/VBoxGuestLib.h
vboxguest/include/VBox/err.h
vboxguest/include/iprt/asm-amd64-x86.h
vboxguest/include/iprt/assert.h
vboxguest/include/iprt/cdefs.h
vboxguest/include/iprt/err.h
vboxguest/include/iprt/heap.h
vboxguest/include/iprt/lockvalidator.h
vboxguest/include/iprt/log.h
vboxguest/include/iprt/mangling.h
vboxguest/include/iprt/semaphore.h
vboxguest/include/iprt/string.h
vboxguest/include/iprt/thread.h
vboxguest/include/iprt/types.h
vboxguest/r0drv/linux/RTLogWriteDebugger-r0drv-linux.c
vboxguest/r0drv/linux/alloc-r0drv-linux.c
vboxguest/r0drv/linux/assert-r0drv-linux.c
vboxguest/r0drv/linux/initterm-r0drv-linux.c
vboxguest/r0drv/linux/memobj-r0drv-linux.c
vboxguest/r0drv/linux/memuserkernel-r0drv-linux.c
vboxguest/r0drv/linux/mp-r0drv-linux.c
vboxguest/r0drv/linux/mpnotification-r0drv-linux.c
vboxguest/r0drv/linux/semevent-r0drv-linux.c
vboxguest/r0drv/linux/semeventmulti-r0drv-linux.c
vboxguest/r0drv/linux/semfastmutex-r0drv-linux.c
vboxguest/r0drv/linux/semmutex-r0drv-linux.c
vboxguest/r0drv/linux/spinlock-r0drv-linux.c
vboxguest/r0drv/linux/the-linux-kernel.h
vboxguest/r0drv/linux/thread-r0drv-linux.c
vboxguest/r0drv/linux/thread2-r0drv-linux.c
vboxguest/r0drv/linux/time-r0drv-linux.c
vboxguest/r0drv/linux/timer-r0drv-linux.c
vboxguest/revision-generated.h
vboxguest/version-generated.h
vboxsf/dirops.c
vboxsf/include/VBox/VBoxGuestLib.h
vboxsf/include/VBox/err.h
vboxsf/include/iprt/asm-amd64-x86.h
vboxsf/include/iprt/assert.h
vboxsf/include/iprt/cdefs.h
vboxsf/include/iprt/err.h
vboxsf/include/iprt/log.h
vboxsf/include/iprt/mangling.h
vboxsf/include/iprt/semaphore.h
vboxsf/include/iprt/string.h
vboxsf/include/iprt/types.h
vboxsf/lnkops.c
vboxsf/r0drv/linux/the-linux-kernel.h
vboxsf/version-generated.h
vboxvideo/include/iprt/mangling.h
vboxvideo/version-generated.h

index 9b6bd59..dc950f7 100644 (file)
--- a/dkms.conf
+++ b/dkms.conf
@@ -15,7 +15,7 @@
 #
 
 PACKAGE_NAME="vboxguest"
-PACKAGE_VERSION=5.0.0
+PACKAGE_VERSION=5.0.2
 AUTOINSTALL=yes
 
 BUILT_MODULE_NAME[0]="vboxguest"
index 8eb4cac..8442cc8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: time.cpp 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: time.cpp 101690 2015-07-18 18:55:25Z bird $ */\r
 /** @file\r
  * IPRT - Time.\r
  */\r
@@ -706,7 +706,7 @@ RTDECL(char *) RTTimeToString(PCRTTIME pTime, char *psz, size_t cb)
             offUTCHour = -offUTCHour;\r
         }\r
         cch = RTStrPrintf(psz, cb,\r
-                          "%RI32-%02u-%02uT%02u:%02u:%02u.%09RU32%c%02%02",\r
+                          "%RI32-%02u-%02uT%02u:%02u:%02u.%09RU32%c%02d%02d",\r
                           pTime->i32Year, pTime->u8Month, pTime->u8MonthDay,\r
                           pTime->u8Hour, pTime->u8Minute, pTime->u8Second, pTime->u32Nanosecond,\r
                           chSign, offUTCHour, offUTCMinute);\r
index 88d29cf..2844426 100644 (file)
@@ -540,8 +540,10 @@ VBGLR3DECL(int)     VbglR3GuestPropConnect(uint32_t *pu32ClientId);
 VBGLR3DECL(int)     VbglR3GuestPropDisconnect(uint32_t u32ClientId);\r
 VBGLR3DECL(int)     VbglR3GuestPropWrite(uint32_t u32ClientId, const char *pszName, const char *pszValue, const char *pszFlags);\r
 VBGLR3DECL(int)     VbglR3GuestPropWriteValue(uint32_t u32ClientId, const char *pszName, const char *pszValue);\r
-VBGLR3DECL(int)     VbglR3GuestPropWriteValueV(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, va_list va);\r
-VBGLR3DECL(int)     VbglR3GuestPropWriteValueF(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, ...);\r
+VBGLR3DECL(int)     VbglR3GuestPropWriteValueV(uint32_t u32ClientId, const char *pszName,\r
+                                               const char *pszValueFormat, va_list va) RT_IPRT_FORMAT_ATTR(3, 0);\r
+VBGLR3DECL(int)     VbglR3GuestPropWriteValueF(uint32_t u32ClientId, const char *pszName,\r
+                                               const char *pszValueFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 VBGLR3DECL(int)     VbglR3GuestPropRead(uint32_t u32ClientId, const char *pszName, void *pvBuf, uint32_t cbBuf, char **ppszValue, uint64_t *pu64Timestamp, char **ppszFlags, uint32_t *pcbBufActual);\r
 VBGLR3DECL(int)     VbglR3GuestPropReadValue(uint32_t ClientId, const char *pszName, char *pszValue, uint32_t cchValue, uint32_t *pcchValueActual);\r
 VBGLR3DECL(int)     VbglR3GuestPropReadValueAlloc(uint32_t u32ClientId, const char *pszName, char **ppszValue);\r
index dffcbc6..885dd8f 100644 (file)
 #define VERR_VMM_SWITCHER_STUB              (-2715)\r
 /** HM returned in the wrong state. */\r
 #define VERR_VMM_WRONG_HM_VMCPU_STATE       (-2716)\r
+/** SMAP enabled, but the AC flag was found to be clear - check the kernel\r
+ * log for details. */\r
+#define VERR_VMM_SMAP_BUT_AC_CLEAR          (-2717)\r
 /** @} */\r
 \r
 \r
 #define VERR_VD_DMG_XML_PARSE_ERROR                 (-3284)\r
 /** Unable to locate a usable DMG file within the XAR archive. */\r
 #define VERR_VD_DMG_NOT_FOUND_INSIDE_XAR            (-3285)\r
+/** The size of the raw image is not dividable by 512 */\r
+#define VERR_VD_RAW_SIZE_MODULO_512                 (-3286)\r
+/** The size of the raw image is not dividable by 2048 */\r
+#define VERR_VD_RAW_SIZE_MODULO_2048                (-3287)\r
+/** The size of the raw optical image is too small (<= 32K) */\r
+#define VERR_VD_RAW_SIZE_OPTICAL_TOO_SMALL          (-3288)\r
+/** The size of the raw floppy image is too big (>2.88MB) */\r
+#define VERR_VD_RAW_SIZE_FLOPPY_TOO_BIG             (-3289)\r
+\r
 /** @} */\r
 \r
 \r
 #define VWRN_SUPDRV_TSC_DELTA_MEASUREMENT_FAILED     3746\r
 /** A TSC-delta measurement request is currently being serviced. */\r
 #define VERR_SUPDRV_TSC_DELTA_MEASUREMENT_BUSY      (-3747)\r
+/** The process trying to open VBoxDrv is not a budding VM process (1). */\r
+#define VERR_SUPDRV_NOT_BUDDING_VM_PROCESS_1        (-3748)\r
+/** The process trying to open VBoxDrv is not a budding VM process (2). */\r
+#define VERR_SUPDRV_NOT_BUDDING_VM_PROCESS_2        (-3749)\r
 /** @} */\r
 \r
 \r
 /** Internal VMX processing error no 5. */\r
 #define VERR_VMX_IPE_5                              (-4027)\r
 /** VT-x features for all modes (SMX and non-SMX) disabled by the BIOS. */\r
-#define VERR_VMX_MSR_ALL_VMXON_DISABLED             (-4028)\r
+#define VERR_VMX_MSR_ALL_VMX_DISABLED               (-4028)\r
 /** VT-x features disabled by the BIOS. */\r
-#define VERR_VMX_MSR_VMXON_DISABLED                 (-4029)\r
+#define VERR_VMX_MSR_VMX_DISABLED                   (-4029)\r
 /** VM-Entry Controls internal cache invalid. */\r
 #define VERR_VMX_ENTRY_CTLS_CACHE_INVALID           (-4030)\r
 /** VM-Exit Controls internal cache invalid. */\r
 /** VM-Execution Secondary Processor-based Controls internal\r
  *  cache invalid. */\r
 #define VERR_VMX_PROC_EXEC2_CTLS_CACHE_INVALID      (-4034)\r
+/** Failed to set VMXON enable bit while enabling VT-x through the MSR. */\r
+#define VERR_VMX_MSR_VMX_ENABLE_FAILED              (-4035)\r
+/** Failed to enable VMXON-in-SMX bit while enabling VT-x through the MSR. */\r
+#define VERR_VMX_MSR_SMX_VMX_ENABLE_FAILED          (-4036)\r
 /** @} */\r
 \r
 \r
index 4fe780b..1f09e21 100644 (file)
@@ -597,6 +597,184 @@ DECLINLINE(void) ASMSetFlags(RTCCUINTREG uFlags)
 \r
 \r
 /**\r
+ * Modifies the [RE]FLAGS register.\r
+ * @returns Original value.\r
+ * @param   fAndEfl     Flags to keep (applied first).\r
+ * @param   fOrEfl      Flags to be set.\r
+ */\r
+#if RT_INLINE_ASM_EXTERNAL && RT_INLINE_ASM_USES_INTRIN < 15\r
+DECLASM(RTCCUINTREG) ASMChangeFlags(RTCCUINTREG fAndEfl, RTCCUINTREG fOrEfl);\r
+#else\r
+DECLINLINE(RTCCUINTREG) ASMChangeFlags(RTCCUINTREG fAndEfl, RTCCUINTREG fOrEfl)\r
+{\r
+    RTCCUINTREG fOldEfl;\r
+# if RT_INLINE_ASM_GNU_STYLE\r
+#  ifdef RT_ARCH_AMD64\r
+    __asm__ __volatile__("pushfq\n\t"\r
+                         "movq  (%%rsp), %0\n\t"\r
+                         "andq  %0, %1\n\t"\r
+                         "orq   %3, %1\n\t"\r
+                         "mov   %1, (%%rsp)\n\t"\r
+                         "popfq\n\t"\r
+                         : "=&r" (fOldEfl),\r
+                           "=r" (fAndEfl)\r
+                         : "1" (fAndEfl),\r
+                           "rn" (fOrEfl) );\r
+#  else\r
+    __asm__ __volatile__("pushfl\n\t"\r
+                         "movl  (%%esp), %0\n\t"\r
+                         "andl  %1, (%%esp)\n\t"\r
+                         "orl   %2, (%%esp)\n\t"\r
+                         "popfl\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fAndEfl),\r
+                           "rn" (fOrEfl) );\r
+#  endif\r
+# elif RT_INLINE_ASM_USES_INTRIN >= 15\r
+    fOldEfl = __readeflags();\r
+    __writeeflags((fOldEfl & fAndEfl) | fOrEfl);\r
+# else\r
+    __asm\r
+    {\r
+#  ifdef RT_ARCH_AMD64\r
+        mov     rdx, [fAndEfl]\r
+        mov     rcx, [fOrEfl]\r
+        pushfq\r
+        mov     rax, [rsp]\r
+        and     rdx, rax\r
+        or      rdx, rcx\r
+        mov     [rsp], rdx\r
+        popfq\r
+        mov     [fOldEfl], rax\r
+#  else\r
+        mov     edx, [fAndEfl]\r
+        mov     ecx, [fOrEfl]\r
+        pushfd\r
+        mov     eax, [esp]\r
+        and     edx, eax\r
+        or      edx, ecx\r
+        mov     [esp], edx\r
+        popfd\r
+        mov     [fOldEfl], eax\r
+#  endif\r
+    }\r
+# endif\r
+    return fOldEfl;\r
+}\r
+#endif\r
+\r
+\r
+/**\r
+ * Modifies the [RE]FLAGS register by ORing in one or more flags.\r
+ * @returns Original value.\r
+ * @param   fOrEfl      The flags to be set (ORed in).\r
+ */\r
+#if RT_INLINE_ASM_EXTERNAL && RT_INLINE_ASM_USES_INTRIN < 15\r
+DECLASM(RTCCUINTREG) ASMAddFlags(RTCCUINTREG fOrEfl);\r
+#else\r
+DECLINLINE(RTCCUINTREG) ASMAddFlags(RTCCUINTREG fOrEfl)\r
+{\r
+    RTCCUINTREG fOldEfl;\r
+# if RT_INLINE_ASM_GNU_STYLE\r
+#  ifdef RT_ARCH_AMD64\r
+    __asm__ __volatile__("pushfq\n\t"\r
+                         "movq  (%%rsp), %0\n\t"\r
+                         "orq   %1, (%%rsp)\n\t"\r
+                         "popfq\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fOrEfl) );\r
+#  else\r
+    __asm__ __volatile__("pushfl\n\t"\r
+                         "movl  (%%esp), %0\n\t"\r
+                         "orl   %1, (%%esp)\n\t"\r
+                         "popfl\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fOrEfl) );\r
+#  endif\r
+# elif RT_INLINE_ASM_USES_INTRIN >= 15\r
+    fOldEfl = __readeflags();\r
+    __writeeflags(fOldEfl | fOrEfl);\r
+# else\r
+    __asm\r
+    {\r
+#  ifdef RT_ARCH_AMD64\r
+        mov     rcx, [fOrEfl]\r
+        pushfq\r
+        mov     rdx, [rsp]\r
+        or      [rsp], rcx\r
+        popfq\r
+        mov     [fOldEfl], rax\r
+#  else\r
+        mov     ecx, [fOrEfl]\r
+        pushfd\r
+        mov     edx, [esp]\r
+        or      [esp], ecx\r
+        popfd\r
+        mov     [fOldEfl], eax\r
+#  endif\r
+    }\r
+# endif\r
+    return fOldEfl;\r
+}\r
+#endif\r
+\r
+\r
+/**\r
+ * Modifies the [RE]FLAGS register by AND'ing out one or more flags.\r
+ * @returns Original value.\r
+ * @param   fAndEfl      The flags to keep.\r
+ */\r
+#if RT_INLINE_ASM_EXTERNAL && RT_INLINE_ASM_USES_INTRIN < 15\r
+DECLASM(RTCCUINTREG) ASMClearFlags(RTCCUINTREG fAndEfl);\r
+#else\r
+DECLINLINE(RTCCUINTREG) ASMClearFlags(RTCCUINTREG fAndEfl)\r
+{\r
+    RTCCUINTREG fOldEfl;\r
+# if RT_INLINE_ASM_GNU_STYLE\r
+#  ifdef RT_ARCH_AMD64\r
+    __asm__ __volatile__("pushfq\n\t"\r
+                         "movq  (%%rsp), %0\n\t"\r
+                         "andq  %1, (%%rsp)\n\t"\r
+                         "popfq\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fAndEfl) );\r
+#  else\r
+    __asm__ __volatile__("pushfl\n\t"\r
+                         "movl  (%%esp), %0\n\t"\r
+                         "andl  %1, (%%esp)\n\t"\r
+                         "popfl\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fAndEfl) );\r
+#  endif\r
+# elif RT_INLINE_ASM_USES_INTRIN >= 15\r
+    fOldEfl = __readeflags();\r
+    __writeeflags(fOldEfl & fAndEfl);\r
+# else\r
+    __asm\r
+    {\r
+#  ifdef RT_ARCH_AMD64\r
+        mov     rdx, [fAndEfl]\r
+        pushfq\r
+        mov     rdx, [rsp]\r
+        and     [rsp], rdx\r
+        popfq\r
+        mov     [fOldEfl], rax\r
+#  else\r
+        mov     edx, [fAndEfl]\r
+        pushfd\r
+        mov     edx, [esp]\r
+        and     [esp], edx\r
+        popfd\r
+        mov     [fOldEfl], eax\r
+#  endif\r
+    }\r
+# endif\r
+    return fOldEfl;\r
+}\r
+#endif\r
+\r
+\r
+/**\r
  * Gets the content of the CPU timestamp counter register.\r
  *\r
  * @returns TSC.\r
index 2643451..3db1b01 100644 (file)
@@ -98,7 +98,7 @@ RTDECL(void)    RTAssertMsg1Weak(const char *pszExpr, unsigned uLine, const char
  * @param   pszFormat   Printf like format string.\r
  * @param   ...         Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /**\r
  * Weak version of RTAssertMsg2 that forwards to RTAssertMsg2WeakV.\r
  *\r
@@ -106,7 +106,7 @@ RTDECL(void)    RTAssertMsg2(const char *pszFormat, ...);
  *\r
  * @copydoc RTAssertMsg2\r
  */\r
-RTDECL(void)    RTAssertMsg2Weak(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2Weak(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * The 2nd (optional) part of an assert message.\r
@@ -114,14 +114,14 @@ RTDECL(void)    RTAssertMsg2Weak(const char *pszFormat, ...);
  * @param   pszFormat   Printf like format string.\r
  * @param   va          Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2V(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2V(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 /**\r
  * Weak version of RTAssertMsg2V that can be overridden locally in a module to\r
  * modify, redirect or otherwise mess with the assertion output.\r
  *\r
  * @copydoc RTAssertMsg2V\r
  */\r
-RTDECL(void)    RTAssertMsg2WeakV(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2WeakV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Additional information which should be appended to the 2nd part of an\r
@@ -130,7 +130,7 @@ RTDECL(void)    RTAssertMsg2WeakV(const char *pszFormat, va_list va);
  * @param   pszFormat   Printf like format string.\r
  * @param   ...         Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2Add(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2Add(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /**\r
  * Weak version of RTAssertMsg2Add that forwards to RTAssertMsg2AddWeakV.\r
  *\r
@@ -138,7 +138,7 @@ RTDECL(void)    RTAssertMsg2Add(const char *pszFormat, ...);
  *\r
  * @copydoc RTAssertMsg2Add\r
  */\r
-RTDECL(void)    RTAssertMsg2AddWeak(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2AddWeak(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * Additional information which should be appended to the 2nd part of an\r
@@ -147,14 +147,14 @@ RTDECL(void)    RTAssertMsg2AddWeak(const char *pszFormat, ...);
  * @param   pszFormat   Printf like format string.\r
  * @param   va          Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2AddV(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2AddV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 /**\r
  * Weak version of RTAssertMsg2AddV that can be overridden locally in a module\r
  * to modify, redirect or otherwise mess with the assertion output.\r
  *\r
  * @copydoc RTAssertMsg2AddV\r
  */\r
-RTDECL(void)    RTAssertMsg2AddWeakV(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2AddWeakV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 #ifdef IN_RING0\r
 /**\r
index 299997a..d8af93f 100644 (file)
 # define RT_THROW(type)\r
 #endif\r
 \r
+/** @def RT_IPRT_FORMAT_ATTR\r
+ * Identifies a function taking an IPRT format string.\r
+ * @param   a_iFmt  The index (1-based) of the format string argument.\r
+ * @param   a_iArgs The index (1-based) of the first format argument, use 0 for\r
+ *                  va_list.\r
+ */\r
+#if defined(__GNUC__) && defined(WITH_IPRT_FORMAT_ATTRIBUTE)\r
+# define RT_IPRT_FORMAT_ATTR(a_iFmt, a_iArgs)   __attribute__((__iprt_format__(a_iFmt, a_iArgs)))\r
+#else\r
+# define RT_IPRT_FORMAT_ATTR(a_iFmt, a_iArgs)\r
+#endif\r
+\r
+/** @def RT_IPRT_FORMAT_ATTR_MAYBE_NULL\r
+ * Identifies a function taking an IPRT format string, NULL is allowed.\r
+ * @param   a_iFmt  The index (1-based) of the format string argument.\r
+ * @param   a_iArgs The index (1-based) of the first format argument, use 0 for\r
+ *                  va_list.\r
+ */\r
+#if defined(__GNUC__) && defined(WITH_IPRT_FORMAT_ATTRIBUTE)\r
+# define RT_IPRT_FORMAT_ATTR_MAYBE_NULL(a_iFmt, a_iArgs)   __attribute__((__iprt_format_maybe_null__(a_iFmt, a_iArgs)))\r
+#else\r
+# define RT_IPRT_FORMAT_ATTR_MAYBE_NULL(a_iFmt, a_iArgs)\r
+#endif\r
+\r
+\r
 /** @def RT_GCC_SUPPORTS_VISIBILITY_HIDDEN\r
  * Indicates that the "hidden" visibility attribute can be used (GCC) */\r
 #if defined(__GNUC__)\r
index 8683918..a535528 100644 (file)
@@ -505,7 +505,7 @@ RTDECL(int)         RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg
  * @param   pszFormat           The format string.\r
  * @param   ...                 The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...);\r
+RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 /**\r
  * Fills in the error info details, with a vsprintf style message.\r
@@ -517,7 +517,7 @@ RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFo
  * @param   pszFormat           The format string.\r
  * @param   va                  The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);\r
+RTDECL(int)         RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Adds more error info details.\r
@@ -540,7 +540,7 @@ RTDECL(int)         RTErrInfoAdd(PRTERRINFO pErrInfo, int rc, const char *pszMsg
  * @param   pszFormat           The format string to add.\r
  * @param   ...                 The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...);\r
+RTDECL(int)         RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 /**\r
  * Adds more error info details, with a vsprintf style message.\r
@@ -552,7 +552,7 @@ RTDECL(int)         RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFo
  * @param   pszFormat           The format string to add.\r
  * @param   va                  The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);\r
+RTDECL(int)         RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Checks if the error info is set.\r
index 07bb7df..6031503 100644 (file)
@@ -180,7 +180,7 @@ RTDECL(size_t) RTHeapSimpleGetFreeSize(RTHEAPSIMPLE Heap);
  * @param   pszFormat   IPRT format string.\r
  * @param   ...         Format arguments.\r
  */\r
-typedef DECLCALLBACK(void) FNRTHEAPSIMPLEPRINTF(const char *pszFormat, ...);\r
+typedef DECLCALLBACK(void) FNRTHEAPSIMPLEPRINTF(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /** Pointer to a FNRTHEAPSIMPLEPRINTF function. */\r
 typedef FNRTHEAPSIMPLEPRINTF *PFNRTHEAPSIMPLEPRINTF;\r
 \r
@@ -335,7 +335,7 @@ RTDECL(size_t) RTHeapOffsetGetFreeSize(RTHEAPOFFSET hHeap);
  * @param   pszFormat   IPRT format string.\r
  * @param   ...         Format arguments.\r
  */\r
-typedef DECLCALLBACK(void) FNRTHEAPOFFSETPRINTF(const char *pszFormat, ...);\r
+typedef DECLCALLBACK(void) FNRTHEAPOFFSETPRINTF(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /** Pointer to a FNRTHEAPOFFSETPRINTF function. */\r
 typedef FNRTHEAPOFFSETPRINTF *PFNRTHEAPOFFSETPRINTF;\r
 \r
index 73eb935..9bad62d 100644 (file)
@@ -264,8 +264,8 @@ RTDECL(int) RTLockValidatorRecMakeSiblings(PRTLOCKVALRECCORE pRec1, PRTLOCKVALRE
  *                              optional (NULL). Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(void) RTLockValidatorRecExclInit(PRTLOCKVALRECEXCL pRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                        void *hLock, bool fEnabled, const char *pszNameFmt, ...);\r
+RTDECL(void) RTLockValidatorRecExclInit(PRTLOCKVALRECEXCL pRec, RTLOCKVALCLASS hClass, uint32_t uSubClass, void *hLock,\r
+                                        bool fEnabled, const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(6, 7);\r
 /**\r
  * Initialize a lock validator record.\r
  *\r
@@ -285,8 +285,8 @@ RTDECL(void) RTLockValidatorRecExclInit(PRTLOCKVALRECEXCL pRec, RTLOCKVALCLASS h
  *                              optional (NULL). Max length is 32 bytes.\r
  * @param   va                  Format string arguments.\r
  */\r
-RTDECL(void) RTLockValidatorRecExclInitV(PRTLOCKVALRECEXCL pRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                         void *hLock, bool fEnabled, const char *pszNameFmt, va_list va);\r
+RTDECL(void) RTLockValidatorRecExclInitV(PRTLOCKVALRECEXCL pRec, RTLOCKVALCLASS hClass, uint32_t uSubClass, void *hLock,\r
+                                         bool fEnabled, const char *pszNameFmt, va_list va) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(6, 0);\r
 /**\r
  * Uninitialize a lock validator record previously initialized by\r
  * RTLockRecValidatorInit.\r
@@ -316,8 +316,8 @@ RTDECL(void) RTLockValidatorRecExclDelete(PRTLOCKVALRECEXCL pRec);
  *                              optional (NULL). Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int)  RTLockValidatorRecExclCreate(PRTLOCKVALRECEXCL *ppRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                          void *hLock, bool fEnabled, const char *pszNameFmt, ...);\r
+RTDECL(int)  RTLockValidatorRecExclCreate(PRTLOCKVALRECEXCL *ppRec, RTLOCKVALCLASS hClass, uint32_t uSubClass, void *hLock,\r
+                                          bool fEnabled, const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(6, 7);\r
 \r
 /**\r
  * Create and initialize a lock validator record.\r
@@ -340,8 +340,8 @@ RTDECL(int)  RTLockValidatorRecExclCreate(PRTLOCKVALRECEXCL *ppRec, RTLOCKVALCLA
  *                              optional (NULL). Max length is 32 bytes.\r
  * @param   va                  Format string arguments.\r
  */\r
-RTDECL(int)  RTLockValidatorRecExclCreateV(PRTLOCKVALRECEXCL *ppRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                           void *hLock, bool fEnabled, const char *pszNameFmt, va_list va);\r
+RTDECL(int)  RTLockValidatorRecExclCreateV(PRTLOCKVALRECEXCL *ppRec, RTLOCKVALCLASS hClass, uint32_t uSubClass, void *hLock,\r
+                                           bool fEnabled, const char *pszNameFmt, va_list va) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(6, 0);\r
 \r
 /**\r
  * Deinitialize and destroy a record created by RTLockValidatorRecExclCreate.\r
@@ -564,7 +564,8 @@ RTDECL(int) RTLockValidatorRecExclCheckOrderAndBlocking(PRTLOCKVALRECEXCL pRec,
  * @param   ...                 Format string arguments.\r
  */\r
 RTDECL(void) RTLockValidatorRecSharedInit(PRTLOCKVALRECSHRD pRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                          void *hLock, bool fSignaller, bool fEnabled, const char *pszNameFmt, ...);\r
+                                          void *hLock, bool fSignaller, bool fEnabled,\r
+                                          const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(7, 8);\r
 \r
 /**\r
  * Initialize a lock validator record for a shared lock.\r
@@ -589,7 +590,8 @@ RTDECL(void) RTLockValidatorRecSharedInit(PRTLOCKVALRECSHRD pRec, RTLOCKVALCLASS
  * @param   va                  Format string arguments.\r
  */\r
 RTDECL(void) RTLockValidatorRecSharedInitV(PRTLOCKVALRECSHRD pRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                           void *hLock, bool fSignaller, bool fEnabled, const char *pszNameFmt, va_list va);\r
+                                           void *hLock, bool fSignaller, bool fEnabled,\r
+                                           const char *pszNameFmt, va_list va) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(7, 0);\r
 \r
 /**\r
  * Uninitialize a lock validator record previously initialized by\r
@@ -624,7 +626,8 @@ RTDECL(void) RTLockValidatorRecSharedDelete(PRTLOCKVALRECSHRD pRec);
  * @param   ...                 Format string arguments.\r
  */\r
 RTDECL(int) RTLockValidatorRecSharedCreate(PRTLOCKVALRECSHRD *ppRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                           void *pvLock, bool fSignaller, bool fEnabled, const char *pszNameFmt, ...);\r
+                                           void *pvLock, bool fSignaller, bool fEnabled,\r
+                                           const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(7, 8);\r
 \r
 /**\r
  * Create and initialize a lock validator record for a shared lock.\r
@@ -651,7 +654,8 @@ RTDECL(int) RTLockValidatorRecSharedCreate(PRTLOCKVALRECSHRD *ppRec, RTLOCKVALCL
  * @param   va                  Format string arguments.\r
  */\r
 RTDECL(int) RTLockValidatorRecSharedCreateV(PRTLOCKVALRECSHRD *ppRec, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
-                                            void *pvLock, bool fSignaller, bool fEnabled, const char *pszNameFmt, va_list va);\r
+                                            void *pvLock, bool fSignaller, bool fEnabled,\r
+                                            const char *pszNameFmt, va_list va) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(7, 0);\r
 \r
 /**\r
  * Deinitialize and destroy a record created by RTLockValidatorRecSharedCreate.\r
@@ -944,7 +948,7 @@ RTDECL(bool) RTLockValidatorHoldsLocksInSubClass(RTTHREAD hCurrentThread, RTLOCK
 RTDECL(int) RTLockValidatorClassCreateEx(PRTLOCKVALCLASS phClass, PCRTLOCKVALSRCPOS pSrcPos,\r
                                          bool fAutodidact, bool fRecursionOk, bool fStrictReleaseOrder,\r
                                          RTMSINTERVAL cMsMinDeadlock, RTMSINTERVAL cMsMinOrder,\r
-                                         const char *pszNameFmt, ...);\r
+                                         const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(8, 9);\r
 \r
 /**\r
  * Creates a new lock validator class, all properties specified.\r
@@ -973,7 +977,7 @@ RTDECL(int) RTLockValidatorClassCreateEx(PRTLOCKVALCLASS phClass, PCRTLOCKVALSRC
 RTDECL(int) RTLockValidatorClassCreateExV(PRTLOCKVALCLASS phClass, PCRTLOCKVALSRCPOS pSrcPos,\r
                                           bool fAutodidact, bool fRecursionOk, bool fStrictReleaseOrder,\r
                                           RTMSINTERVAL cMsMinDeadlock, RTMSINTERVAL cMsMinOrder,\r
-                                          const char *pszNameFmt, va_list va);\r
+                                          const char *pszNameFmt, va_list va) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(8, 0);\r
 \r
 /**\r
  * Creates a new lock validator class.\r
@@ -990,7 +994,8 @@ RTDECL(int) RTLockValidatorClassCreateExV(PRTLOCKVALCLASS phClass, PCRTLOCKVALSR
  *                              length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int) RTLockValidatorClassCreate(PRTLOCKVALCLASS phClass, bool fAutodidact, RT_SRC_POS_DECL, const char *pszNameFmt, ...);\r
+RTDECL(int) RTLockValidatorClassCreate(PRTLOCKVALCLASS phClass, bool fAutodidact, RT_SRC_POS_DECL,\r
+                                       const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(6, 7);\r
 \r
 /**\r
  * Creates a new lock validator class with a reference that is consumed by the\r
@@ -1008,7 +1013,8 @@ RTDECL(int) RTLockValidatorClassCreate(PRTLOCKVALCLASS phClass, bool fAutodidact
  *                              length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(RTLOCKVALCLASS) RTLockValidatorClassCreateUnique(RT_SRC_POS_DECL, const char *pszNameFmt, ...);\r
+RTDECL(RTLOCKVALCLASS) RTLockValidatorClassCreateUnique(RT_SRC_POS_DECL,\r
+                                                        const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(4, 5);\r
 \r
 /**\r
  * Finds a class for the specified source position.\r
@@ -1029,7 +1035,8 @@ RTDECL(RTLOCKVALCLASS) RTLockValidatorClassFindForSrcPos(PRTLOCKVALSRCPOS pSrcPo
  *                              length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(RTLOCKVALCLASS) RTLockValidatorClassForSrcPos(RT_SRC_POS_DECL, const char *pszNameFmt, ...);\r
+RTDECL(RTLOCKVALCLASS) RTLockValidatorClassForSrcPos(RT_SRC_POS_DECL,\r
+                                                     const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(4, 5);\r
 \r
 /**\r
  * Retains a reference to a lock validator class.\r
index 3a7176b..5eb8c92 100644 (file)
@@ -184,7 +184,7 @@ typedef enum RTLOGPHASE
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments as specified in the format string.\r
  */\r
-typedef DECLCALLBACK(void) FNRTLOGGER(const char *pszFormat, ...);\r
+typedef DECLCALLBACK(void) FNRTLOGGER(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /** Pointer to logger function. */\r
 typedef FNRTLOGGER *PFNRTLOGGER;\r
 \r
@@ -213,7 +213,7 @@ typedef RCPTRTYPE(FNRTLOGFLUSHGC *) PFNRTLOGFLUSHGC;
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments specified in the format string.\r
  */\r
-typedef DECLCALLBACK(void) FNRTLOGPHASEMSG(PRTLOGGER pLogger, const char *pszFormat, ...);\r
+typedef DECLCALLBACK(void) FNRTLOGPHASEMSG(PRTLOGGER pLogger, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(2, 3);\r
 /** Pointer to header/footer message callback function. */\r
 typedef FNRTLOGPHASEMSG *PFNRTLOGPHASEMSG;\r
 \r
@@ -457,7 +457,8 @@ typedef enum RTLOGDEST
 } RTLOGDEST;\r
 \r
 \r
-RTDECL(void) RTLogPrintfEx(void *pvInstance, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);\r
+RTDECL(void) RTLogPrintfEx(void *pvInstance, unsigned fFlags, unsigned iGroup,\r
+                           const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(4, 5);\r
 \r
 \r
 #ifdef DOXYGEN_RUNNING\r
@@ -1702,7 +1703,8 @@ RTDECL(PRTLOGGER) RTLogRelGetDefaultInstanceEx(uint32_t fFlagsAndGroup);
  * @param   ...         Format arguments.\r
  * @remark  This is a worker function for LogRelIt.\r
  */\r
-RTDECL(void) RTLogRelLogger(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);\r
+RTDECL(void) RTLogRelLogger(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                            const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(4, 5);\r
 \r
 /**\r
  * Write to a logger instance, defaulting to the release one.\r
@@ -1718,7 +1720,8 @@ RTDECL(void) RTLogRelLogger(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,
  * @param   pszFormat   Format string.\r
  * @param   args        Format arguments.\r
  */\r
-RTDECL(void) RTLogRelLoggerV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogRelLoggerV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                             const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(4, 0);\r
 \r
 /**\r
  * printf like function for writing to the default release log.\r
@@ -1728,7 +1731,7 @@ RTDECL(void) RTLogRelLoggerV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogRelPrintf(const char *pszFormat, ...);\r
+RTDECL(void) RTLogRelPrintf(const char *pszFormat, ...)  RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * vprintf like function for writing to the default release log.\r
@@ -1738,7 +1741,7 @@ RTDECL(void) RTLogRelPrintf(const char *pszFormat, ...);
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogRelPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogRelPrintfV(const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Changes the buffering setting of the default release logger.\r
@@ -1952,7 +1955,7 @@ RTDECL(PRTLOGGER) RTLogDefaultInit(void);
  */\r
 RTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,\r
                         const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,\r
-                        uint32_t fDestFlags, const char *pszFilenameFmt, ...);\r
+                        uint32_t fDestFlags, const char *pszFilenameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(8, 9);\r
 \r
 /**\r
  * Create a logger instance.\r
@@ -1988,8 +1991,8 @@ RTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGro
 RTDECL(int) RTLogCreateEx(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,\r
                           const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,\r
                           uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory,\r
-                          uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,\r
-                          char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, ...);\r
+                          uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot, char *pszErrorMsg, size_t cchErrorMsg,\r
+                          const char *pszFilenameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(14, 15);\r
 \r
 /**\r
  * Create a logger instance.\r
@@ -2027,8 +2030,8 @@ RTDECL(int) RTLogCreateEx(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszG
 RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,\r
                            const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,\r
                            uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory,\r
-                           uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,\r
-                           char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, va_list args);\r
+                           uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot, char *pszErrorMsg, size_t cchErrorMsg,\r
+                           const char *pszFilenameFmt, va_list args) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(14, 0);\r
 \r
 /**\r
  * Create a logger instance for singled threaded ring-0 usage.\r
@@ -2260,7 +2263,7 @@ RTDECL(void) RTLogFlush(PRTLOGGER pLogger);
  * @param   pszFormat   Format string.\r
  * @param   ...         Format arguments.\r
  */\r
-RTDECL(void) RTLogLogger(PRTLOGGER pLogger, void *pvCallerRet, const char *pszFormat, ...);\r
+RTDECL(void) RTLogLogger(PRTLOGGER pLogger, void *pvCallerRet, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 /**\r
  * Write to a logger instance.\r
@@ -2269,7 +2272,7 @@ RTDECL(void) RTLogLogger(PRTLOGGER pLogger, void *pvCallerRet, const char *pszFo
  * @param   pszFormat   Format string.\r
  * @param   args        Format arguments.\r
  */\r
-RTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Write to a logger instance.\r
@@ -2286,7 +2289,8 @@ RTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args
  * @param   ...         Format arguments.\r
  * @remark  This is a worker function of LogIt.\r
  */\r
-RTDECL(void) RTLogLoggerEx(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);\r
+RTDECL(void) RTLogLoggerEx(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                           const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(4, 5);\r
 \r
 /**\r
  * Write to a logger instance.\r
@@ -2302,7 +2306,8 @@ RTDECL(void) RTLogLoggerEx(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,
  * @param   pszFormat   Format string.\r
  * @param   args        Format arguments.\r
  */\r
-RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                            const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(4, 0);\r
 \r
 /**\r
  * printf like function for writing to the default log.\r
@@ -2312,7 +2317,7 @@ RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogPrintf(const char *pszFormat, ...);\r
+RTDECL(void) RTLogPrintf(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * vprintf like function for writing to the default log.\r
@@ -2322,7 +2327,7 @@ RTDECL(void) RTLogPrintf(const char *pszFormat, ...);
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args)  RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Dumper vprintf-like function outputting to a logger.\r
@@ -2332,7 +2337,7 @@ RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args);
  * @param   pszFormat       Format string.\r
  * @param   va              Format arguments.\r
  */\r
-RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va);\r
+RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(2, 0);\r
 \r
 \r
 #ifndef DECLARED_FNRTSTROUTPUT          /* duplicated in iprt/string.h */\r
@@ -2361,7 +2366,7 @@ typedef FNRTSTROUTPUT *PFNRTSTROUTPUT;
  * @param   pszFormat   Format string.\r
  * @param   args        Argument list.\r
  */\r
-RTDECL(size_t) RTLogFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArg, const char *pszFormat, va_list args);\r
+RTDECL(size_t) RTLogFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArg, const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Write log buffer to COM port.\r
@@ -2378,7 +2383,7 @@ RTDECL(void) RTLogWriteCom(const char *pach, size_t cb);
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...);\r
+RTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * Prints a formatted string to the serial port used for logging.\r
@@ -2387,7 +2392,7 @@ RTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...);
  * @param   pszFormat   Format string.\r
  * @param   args        Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t)  RTLogComPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(size_t)  RTLogComPrintfV(const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 \r
 #if 0 /* not implemented yet */\r
@@ -2497,7 +2502,7 @@ RTDECL(void) RTLogWriteStdErr(const char *pach, size_t cb);
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t) RTLogBackdoorPrintf(const char *pszFormat, ...);\r
+RTDECL(size_t) RTLogBackdoorPrintf(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * Prints a formatted string to the backdoor port.\r
@@ -2506,7 +2511,7 @@ RTDECL(size_t) RTLogBackdoorPrintf(const char *pszFormat, ...);
  * @param   pszFormat   Format string.\r
  * @param   args        Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t)  RTLogBackdoorPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(size_t)  RTLogBackdoorPrintfV(const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 #endif /* VBOX */\r
 \r
index 2cd198b..6089a67 100644 (file)
 # define RTSymlinkIsDangling                            RT_MANGLER(RTSymlinkIsDangling)\r
 # define RTSymlinkRead                                  RT_MANGLER(RTSymlinkRead)\r
 # define RTSymlinkReadA                                 RT_MANGLER(RTSymlinkReadA)\r
+# define RTSystemIsInsideVM                             RT_MANGLER(RTSystemIsInsideVM)\r
 # define RTSystemQueryAvailableRam                      RT_MANGLER(RTSystemQueryAvailableRam)\r
 # define RTSystemQueryDmiString                         RT_MANGLER(RTSystemQueryDmiString)\r
 # define RTSystemQueryOSInfo                            RT_MANGLER(RTSystemQueryOSInfo)\r
index 032ffd3..606e364 100644 (file)
@@ -130,7 +130,8 @@ RTDECL(int)  RTSemEventCreate(PRTSEMEVENT phEventSem);
  *                              optional (NULL).  Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int)  RTSemEventCreateEx(PRTSEMEVENT phEventSem, uint32_t fFlags, RTLOCKVALCLASS hClass, const char *pszNameFmt, ...);\r
+RTDECL(int)  RTSemEventCreateEx(PRTSEMEVENT phEventSem, uint32_t fFlags, RTLOCKVALCLASS hClass,\r
+                                const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(4, 5);\r
 \r
 /** @name RTSemMutexCreateEx flags\r
  * @{ */\r
@@ -300,7 +301,7 @@ RTDECL(int)  RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem);
  * @param   ...                 Format string arguments.\r
  */\r
 RTDECL(int)  RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass,\r
-                                     const char *pszNameFmt, ...);\r
+                                     const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(4, 5);\r
 \r
 /** @name RTSemMutexCreateEx flags\r
  * @{ */\r
@@ -480,8 +481,8 @@ RTDECL(int)  RTSemMutexCreate(PRTSEMMUTEX phMutexSem);
  *                              optional (NULL).  Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int) RTSemMutexCreateEx(PRTSEMMUTEX phMutexSem, uint32_t fFlags,\r
-                               RTLOCKVALCLASS hClass, uint32_t uSubClass, const char *pszNameFmt, ...);\r
+RTDECL(int) RTSemMutexCreateEx(PRTSEMMUTEX phMutexSem, uint32_t fFlags, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
+                               const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(5, 6);\r
 \r
 /** @name RTSemMutexCreateEx flags\r
  * @{ */\r
@@ -844,8 +845,8 @@ RTDECL(int)   RTSemRWCreate(PRTSEMRW phRWSem);
  *                              optional (NULL).  Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int)   RTSemRWCreateEx(PRTSEMRW phRWSem, uint32_t fFlags,\r
-                              RTLOCKVALCLASS hClass, uint32_t uSubClass, const char *pszNameFmt, ...);\r
+RTDECL(int)   RTSemRWCreateEx(PRTSEMRW phRWSem, uint32_t fFlags, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
+                              const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(5, 6);\r
 \r
 /** @name RTSemRWCreateEx flags\r
  * @{ */\r
index edb2404..05b496e 100644 (file)
@@ -33,7 +33,9 @@
 #include <iprt/err.h> /* for VINF_SUCCESS */\r
 #if defined(RT_OS_LINUX) && defined(__KERNEL__)\r
   RT_C_DECLS_BEGIN\r
+# define new newhack /* string.h: strreplace */\r
 # include <linux/string.h>\r
+# undef new\r
   RT_C_DECLS_END\r
 \r
 #elif defined(IN_XF86_MODULE) && !defined(NO_ANSIC)\r
@@ -1726,7 +1728,8 @@ typedef FNSTRFORMAT *PFNSTRFORMAT;
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   InArgs      Argument list.\r
  */\r
-RTDECL(size_t) RTStrFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat, const char *pszFormat, va_list InArgs);\r
+RTDECL(size_t) RTStrFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat,\r
+                            const char *pszFormat, va_list InArgs) RT_IPRT_FORMAT_ATTR(5, 0);\r
 \r
 /**\r
  * Partial implementation of a printf like formatter.\r
@@ -1743,7 +1746,8 @@ RTDECL(size_t) RTStrFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRF
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         Argument list.\r
  */\r
-RTDECL(size_t) RTStrFormat(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat, const char *pszFormat, ...);\r
+RTDECL(size_t) RTStrFormat(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat,\r
+                           const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(5, 6);\r
 \r
 /**\r
  * Formats an integer number according to the parameters.\r
@@ -1756,7 +1760,8 @@ RTDECL(size_t) RTStrFormat(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFO
  * @param   cchPrecision    Precision.\r
  * @param   fFlags          Flags, RTSTR_F_XXX.\r
  */\r
-RTDECL(int) RTStrFormatNumber(char *psz, uint64_t u64Value, unsigned int uiBase, signed int cchWidth, signed int cchPrecision, unsigned int fFlags);\r
+RTDECL(int) RTStrFormatNumber(char *psz, uint64_t u64Value, unsigned int uiBase, signed int cchWidth, signed int cchPrecision,\r
+                              unsigned int fFlags);\r
 \r
 /**\r
  * Formats an unsigned 8-bit number.\r
@@ -1949,7 +1954,7 @@ RTDECL(int) RTStrFormatTypeSetUser(const char *pszType, void *pvUser);
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   args        The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintfV(char *pszBuffer, size_t cchBuffer, const char *pszFormat, va_list args);\r
+RTDECL(size_t) RTStrPrintfV(char *pszBuffer, size_t cchBuffer, const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * String printf.\r
@@ -1961,7 +1966,7 @@ RTDECL(size_t) RTStrPrintfV(char *pszBuffer, size_t cchBuffer, const char *pszFo
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintf(char *pszBuffer, size_t cchBuffer, const char *pszFormat, ...);\r
+RTDECL(size_t) RTStrPrintf(char *pszBuffer, size_t cchBuffer, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 \r
 /**\r
@@ -1976,7 +1981,8 @@ RTDECL(size_t) RTStrPrintf(char *pszBuffer, size_t cchBuffer, const char *pszFor
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   args        The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintfExV(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer, const char *pszFormat, va_list args);\r
+RTDECL(size_t) RTStrPrintfExV(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer,\r
+                              const char *pszFormat, va_list args)  RT_IPRT_FORMAT_ATTR(5, 0);\r
 \r
 /**\r
  * String printf with custom formatting.\r
@@ -1990,7 +1996,8 @@ RTDECL(size_t) RTStrPrintfExV(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuff
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintfEx(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer, const char *pszFormat, ...);\r
+RTDECL(size_t) RTStrPrintfEx(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer,\r
+                             const char *pszFormat, ...)  RT_IPRT_FORMAT_ATTR(5, 6);\r
 \r
 \r
 /**\r
@@ -2020,7 +2027,7 @@ RTDECL(size_t) RTStrPrintfEx(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffe
  * @param   args        The format argument.\r
  * @param   pszTag      Allocation tag used for statistics and such.\r
  */\r
-RTDECL(int) RTStrAPrintfVTag(char **ppszBuffer, const char *pszFormat, va_list args, const char *pszTag);\r
+RTDECL(int) RTStrAPrintfVTag(char **ppszBuffer, const char *pszFormat, va_list args, const char *pszTag) RT_IPRT_FORMAT_ATTR(2, 0);\r
 \r
 /**\r
  * Allocating string printf.\r
@@ -2034,7 +2041,7 @@ RTDECL(int) RTStrAPrintfVTag(char **ppszBuffer, const char *pszFormat, va_list a
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(int) RTStrAPrintf(char **ppszBuffer, const char *pszFormat, ...)\r
+DECLINLINE(int) RT_IPRT_FORMAT_ATTR(2, 3) RTStrAPrintf(char **ppszBuffer, const char *pszFormat, ...)\r
 {\r
     int     cbRet;\r
     va_list va;\r
@@ -2057,7 +2064,7 @@ DECLINLINE(int) RTStrAPrintf(char **ppszBuffer, const char *pszFormat, ...)
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(int) RTStrAPrintfTag(char **ppszBuffer, const char *pszTag, const char *pszFormat, ...)\r
+DECLINLINE(int) RT_IPRT_FORMAT_ATTR(3, 4) RTStrAPrintfTag(char **ppszBuffer, const char *pszTag, const char *pszFormat, ...)\r
 {\r
     int     cbRet;\r
     va_list va;\r
@@ -2086,7 +2093,7 @@ DECLINLINE(int) RTStrAPrintfTag(char **ppszBuffer, const char *pszTag, const cha
  * @param   args        The format argument.\r
  * @param   pszTag      Allocation tag used for statistics and such.\r
  */\r
-RTDECL(char *) RTStrAPrintf2VTag(const char *pszFormat, va_list args, const char *pszTag);\r
+RTDECL(char *) RTStrAPrintf2VTag(const char *pszFormat, va_list args, const char *pszTag) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Allocating string printf, version 2 (default tag).\r
@@ -2096,7 +2103,7 @@ RTDECL(char *) RTStrAPrintf2VTag(const char *pszFormat, va_list args, const char
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(char *) RTStrAPrintf2(const char *pszFormat, ...)\r
+DECLINLINE(char *) RT_IPRT_FORMAT_ATTR(1, 2) RTStrAPrintf2(const char *pszFormat, ...)\r
 {\r
     char   *pszRet;\r
     va_list va;\r
@@ -2115,7 +2122,7 @@ DECLINLINE(char *) RTStrAPrintf2(const char *pszFormat, ...)
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(char *) RTStrAPrintf2Tag(const char *pszTag, const char *pszFormat, ...)\r
+DECLINLINE(char *) RT_IPRT_FORMAT_ATTR(2, 3) RTStrAPrintf2Tag(const char *pszTag, const char *pszFormat, ...)\r
 {\r
     char   *pszRet;\r
     va_list va;\r
index 5eb32a9..fff45a0 100644 (file)
@@ -298,7 +298,7 @@ typedef DECLCALLBACKPTR(int, PFNRTTHREADCREATE)(PRTTHREAD pThread, PFNRTTHREAD p
  * @param   va          Format arguments.\r
  */\r
 RTDECL(int) RTThreadCreateV(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,\r
-                            RTTHREADTYPE enmType, uint32_t fFlags, const char *pszNameFmt, va_list va);\r
+                            RTTHREADTYPE enmType, uint32_t fFlags, const char *pszNameFmt, va_list va) RT_IPRT_FORMAT_ATTR(7, 0);\r
 \r
 /**\r
  * Create a new thread.\r
@@ -316,7 +316,7 @@ RTDECL(int) RTThreadCreateV(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUs
  * @param   ...         Format arguments.\r
  */\r
 RTDECL(int) RTThreadCreateF(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,\r
-                            RTTHREADTYPE enmType, uint32_t fFlags, const char *pszNameFmt, ...);\r
+                            RTTHREADTYPE enmType, uint32_t fFlags, const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR(7, 8);\r
 \r
 /**\r
  * Gets the native thread id of a IPRT thread.\r
index 3436f53..23687fc 100644 (file)
@@ -70,7 +70,7 @@ RT_C_DECLS_END
 #  endif\r
 #  include <sys/types.h>\r
 #  ifndef offsetof\r
-#   error "offsetof is not defined..."\r
+#   error "offsetof is not defined!"\r
 #  endif\r
 \r
 # elif defined(RT_OS_FREEBSD) && HC_ARCH_BITS == 64 && defined(RT_ARCH_X86)\r
@@ -2198,7 +2198,7 @@ typedef FNRTPROGRESS *PFNRTPROGRESS;
  * @param   pszFormat       The format string.\r
  * @param   va              Arguments for the format string.\r
  */\r
-typedef DECLCALLBACK(void) FNRTDUMPPRINTFV(void *pvUser, const char *pszFormat, va_list va);\r
+typedef DECLCALLBACK(void) FNRTDUMPPRINTFV(void *pvUser, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(2, 0);\r
 /** Pointer to a generic printf-like function for dumping. */\r
 typedef FNRTDUMPPRINTFV *PFNRTDUMPPRINTFV;\r
 \r
@@ -2415,7 +2415,7 @@ typedef const RTRANGE *PCRTRANGE;
  */\r
 typedef union RTPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void                   *pv;\r
     /** As a signed integer. */\r
     intptr_t                i;\r
@@ -2454,7 +2454,7 @@ typedef RTPTRUNION *PRTPTRUNION;
  */\r
 typedef union RTCPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void const             *pv;\r
     /** As a signed integer. */\r
     intptr_t                i;\r
@@ -2493,7 +2493,7 @@ typedef RTCPTRUNION *PRTCPTRUNION;
  */\r
 typedef union RTVPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void volatile          *pv;\r
     /** As a signed integer. */\r
     intptr_t                i;\r
@@ -2532,7 +2532,7 @@ typedef RTVPTRUNION *PRTVPTRUNION;
  */\r
 typedef union RTCVPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void const volatile            *pv;\r
     /** As a signed integer. */\r
     intptr_t                        i;\r
index 2d35ee6..b6048c9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: RTLogWriteDebugger-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: RTLogWriteDebugger-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Log To Debugger, Ring-0 Driver, Linux.\r
  */\r
@@ -35,7 +35,9 @@
 \r
 RTDECL(void) RTLogWriteDebugger(const char *pch, size_t cb)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     printk("%.*s", (int)cb, pch);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 RT_EXPORT_SYMBOL(RTLogWriteDebugger);\r
 \r
index ae6656f..44fa3f2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: alloc-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: alloc-r0drv-linux.c 102053 2015-08-12 13:43:38Z fmehnert $ */\r
 /** @file\r
  * IPRT - Memory Allocation, Ring-0 Driver, Linux.\r
  */\r
@@ -234,6 +234,7 @@ static PRTMEMHDR rtR0MemAllocExecVmArea(size_t cb)
 DECLHIDDEN(int) rtR0MemAllocEx(size_t cb, uint32_t fFlags, PRTMEMHDR *ppHdr)\r
 {\r
     PRTMEMHDR pHdr;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Allocate.\r
@@ -297,7 +298,10 @@ DECLHIDDEN(int) rtR0MemAllocEx(size_t cb, uint32_t fFlags, PRTMEMHDR *ppHdr)
             pHdr = vmalloc(cb + sizeof(*pHdr));\r
     }\r
     if (RT_UNLIKELY(!pHdr))\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_NO_MEMORY;\r
+    }\r
 \r
     /*\r
      * Initialize.\r
@@ -308,6 +312,7 @@ DECLHIDDEN(int) rtR0MemAllocEx(size_t cb, uint32_t fFlags, PRTMEMHDR *ppHdr)
     pHdr->cbReq     = cb;\r
 \r
     *ppHdr = pHdr;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 \r
@@ -317,6 +322,8 @@ DECLHIDDEN(int) rtR0MemAllocEx(size_t cb, uint32_t fFlags, PRTMEMHDR *ppHdr)
  */\r
 DECLHIDDEN(void) rtR0MemFree(PRTMEMHDR pHdr)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     pHdr->u32Magic += 1;\r
     if (pHdr->fFlags & RTMEMHDR_FLAG_KMALLOC)\r
         kfree(pHdr);\r
@@ -345,6 +352,8 @@ DECLHIDDEN(void) rtR0MemFree(PRTMEMHDR pHdr)
 #endif\r
     else\r
         vfree(pHdr);\r
+\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 \r
 \r
@@ -383,6 +392,8 @@ RTR0DECL(void *) RTMemContAlloc(PRTCCPHYS pPhys, size_t cb)
     int             cOrder;\r
     unsigned        cPages;\r
     struct page    *paPages;\r
+    void           *pvRet;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * validate input.\r
@@ -434,10 +445,13 @@ RTR0DECL(void *) RTMemContAlloc(PRTCCPHYS pPhys, size_t cb)
 #endif\r
         }\r
         *pPhys = page_to_phys(paPages);\r
-        return phys_to_virt(page_to_phys(paPages));\r
+        pvRet = phys_to_virt(page_to_phys(paPages));\r
     }\r
+    else\r
+        pvRet = NULL;\r
 \r
-    return NULL;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
+    return pvRet;\r
 }\r
 RT_EXPORT_SYMBOL(RTMemContAlloc);\r
 \r
@@ -456,6 +470,7 @@ RTR0DECL(void) RTMemContFree(void *pv, size_t cb)
         unsigned        cPages;\r
         unsigned        iPage;\r
         struct page    *paPages;\r
+        IPRT_LINUX_SAVE_EFL_AC();\r
 \r
         /* validate */\r
         AssertMsg(!((uintptr_t)pv & PAGE_OFFSET_MASK), ("pv=%p\n", pv));\r
@@ -478,6 +493,7 @@ RTR0DECL(void) RTMemContFree(void *pv, size_t cb)
 #endif\r
         }\r
         __free_pages(paPages, cOrder);\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
     }\r
 }\r
 RT_EXPORT_SYMBOL(RTMemContFree);\r
index 2a33167..0f64816 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: assert-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: assert-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT -  Assertion Workers, Ring-0 Drivers, Linux.\r
  */\r
 \r
 DECLHIDDEN(void) rtR0AssertNativeMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     printk(KERN_EMERG\r
            "\r\n!!Assertion Failed!!\r\n"\r
            "Expression: %s\r\n"\r
            "Location  : %s(%d) %s\r\n",\r
            pszExpr, pszFile, uLine, pszFunction);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 \r
 \r
 DECLHIDDEN(void) rtR0AssertNativeMsg2V(bool fInitial, const char *pszFormat, va_list va)\r
 {\r
     char szMsg[256];\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     RTStrPrintfV(szMsg, sizeof(szMsg) - 1, pszFormat, va);\r
     szMsg[sizeof(szMsg) - 1] = '\0';\r
     printk(KERN_EMERG "%s", szMsg);\r
 \r
     NOREF(fInitial);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 \r
 \r
index 897c71c..8139409 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: initterm-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: initterm-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Initialization & Termination, R0 Driver, Linux.\r
  */\r
@@ -62,6 +62,8 @@ DECLHIDDEN(void) rtR0MemExecCleanup(void);
  */\r
 DECLHIDDEN(void) rtR0LnxWorkqueuePush(RTR0LNXWORKQUEUEITEM *pWork, void (*pfnWorker)(RTR0LNXWORKQUEUEITEM *))\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41)\r
 # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)\r
     INIT_WORK(pWork, pfnWorker);\r
@@ -73,6 +75,8 @@ DECLHIDDEN(void) rtR0LnxWorkqueuePush(RTR0LNXWORKQUEUEITEM *pWork, void (*pfnWor
     INIT_TQUEUE(pWork, (void (*)(void *))pfnWorker, pWork);\r
     queue_task(pWork, &g_rtR0LnxWorkQueue);\r
 #endif\r
+\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 \r
 \r
@@ -84,16 +88,23 @@ DECLHIDDEN(void) rtR0LnxWorkqueuePush(RTR0LNXWORKQUEUEITEM *pWork, void (*pfnWor
  */\r
 DECLHIDDEN(void) rtR0LnxWorkqueueFlush(void)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41)\r
     flush_workqueue(g_prtR0LnxWorkQueue);\r
 #else\r
     run_task_queue(&g_rtR0LnxWorkQueue);\r
 #endif\r
+\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 \r
 \r
 DECLHIDDEN(int) rtR0InitNative(void)\r
 {\r
+    int rc = VINF_SUCCESS;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41)\r
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)\r
     g_prtR0LnxWorkQueue = create_workqueue("iprt-VBoxWQueue");\r
@@ -101,15 +112,18 @@ DECLHIDDEN(int) rtR0InitNative(void)
     g_prtR0LnxWorkQueue = create_workqueue("iprt-VBoxQ");\r
  #endif\r
     if (!g_prtR0LnxWorkQueue)\r
-        return VERR_NO_MEMORY;\r
+        rc = VERR_NO_MEMORY;\r
 #endif\r
 \r
-    return VINF_SUCCESS;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
+    return rc;\r
 }\r
 \r
 \r
 DECLHIDDEN(void) rtR0TermNative(void)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     rtR0LnxWorkqueueFlush();\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41)\r
     destroy_workqueue(g_prtR0LnxWorkQueue);\r
@@ -117,5 +131,7 @@ DECLHIDDEN(void) rtR0TermNative(void)
 #endif\r
 \r
     rtR0MemExecCleanup();\r
+\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 \r
index db56c35..278af34 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: memobj-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: memobj-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Ring-0 Memory Objects, Linux.\r
  */\r
@@ -547,6 +547,7 @@ static void rtR0MemObjLinuxVUnmap(PRTR0MEMOBJLNX pMemLnx)
 \r
 DECLHIDDEN(int) rtR0MemObjNativeFree(RTR0MEMOBJ pMem)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     PRTR0MEMOBJLNX pMemLnx = (PRTR0MEMOBJLNX)pMem;\r
 \r
     /*\r
@@ -625,12 +626,14 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR0MEMOBJ pMem)
             AssertMsgFailed(("enmType=%d\n", pMemLnx->Core.enmType));\r
             return VERR_INTERNAL_ERROR;\r
     }\r
+    IPRT_LINUX_RESTORE_EFL_ONLY_AC();\r
     return VINF_SUCCESS;\r
 }\r
 \r
 \r
 DECLHIDDEN(int) rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     PRTR0MEMOBJLNX pMemLnx;\r
     int rc;\r
 \r
@@ -647,6 +650,7 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb,
         if (RT_SUCCESS(rc))\r
         {\r
             *ppMem = &pMemLnx->Core;\r
+            IPRT_LINUX_RESTORE_EFL_AC();\r
             return rc;\r
         }\r
 \r
@@ -654,12 +658,14 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocPage(PPRTR0MEMOBJINTERNAL ppMem, size_t cb,
         rtR0MemObjDelete(&pMemLnx->Core);\r
     }\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
 \r
 DECLHIDDEN(int) rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     PRTR0MEMOBJLNX pMemLnx;\r
     int rc;\r
 \r
@@ -687,6 +693,7 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb,
         if (RT_SUCCESS(rc))\r
         {\r
             *ppMem = &pMemLnx->Core;\r
+            IPRT_LINUX_RESTORE_EFL_AC();\r
             return rc;\r
         }\r
 \r
@@ -694,12 +701,14 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocLow(PPRTR0MEMOBJINTERNAL ppMem, size_t cb,
         rtR0MemObjDelete(&pMemLnx->Core);\r
     }\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
 \r
 DECLHIDDEN(int) rtR0MemObjNativeAllocCont(PPRTR0MEMOBJINTERNAL ppMem, size_t cb, bool fExecutable)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     PRTR0MEMOBJLNX pMemLnx;\r
     int rc;\r
 \r
@@ -730,6 +739,7 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocCont(PPRTR0MEMOBJINTERNAL ppMem, size_t cb,
 #endif\r
             pMemLnx->Core.u.Cont.Phys = page_to_phys(pMemLnx->apPages[0]);\r
             *ppMem = &pMemLnx->Core;\r
+            IPRT_LINUX_RESTORE_EFL_AC();\r
             return rc;\r
         }\r
 \r
@@ -737,6 +747,7 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocCont(PPRTR0MEMOBJINTERNAL ppMem, size_t cb,
         rtR0MemObjDelete(&pMemLnx->Core);\r
     }\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
@@ -808,6 +819,7 @@ static int rtR0MemObjLinuxAllocPhysSub(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJTYP
                                        size_t cb, size_t uAlignment, RTHCPHYS PhysHighest)\r
 {\r
     int rc;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * There are two clear cases and that's the <=16MB and anything-goes ones.\r
@@ -843,6 +855,7 @@ static int rtR0MemObjLinuxAllocPhysSub(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJTYP
             /* ZONE_DMA: 0-16MB */\r
             rc = rtR0MemObjLinuxAllocPhysSub2(ppMem, enmType, cb, uAlignment, PhysHighest, GFP_DMA);\r
     }\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
@@ -953,6 +966,8 @@ DECLHIDDEN(int) rtR0MemObjNativeAllocPhysNC(PPRTR0MEMOBJINTERNAL ppMem, size_t c
 \r
 DECLHIDDEN(int) rtR0MemObjNativeEnterPhys(PPRTR0MEMOBJINTERNAL ppMem, RTHCPHYS Phys, size_t cb, uint32_t uCachePolicy)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * All we need to do here is to validate that we can use\r
      * ioremap on the specified address (32/64-bit dma_addr_t).\r
@@ -963,19 +978,24 @@ DECLHIDDEN(int) rtR0MemObjNativeEnterPhys(PPRTR0MEMOBJINTERNAL ppMem, RTHCPHYS P
 \r
     pMemLnx = (PRTR0MEMOBJLNX)rtR0MemObjNew(sizeof(*pMemLnx), RTR0MEMOBJTYPE_PHYS, NULL, cb);\r
     if (!pMemLnx)\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_NO_MEMORY;\r
+    }\r
 \r
     pMemLnx->Core.u.Phys.PhysBase = PhysAddr;\r
     pMemLnx->Core.u.Phys.fAllocated = false;\r
     pMemLnx->Core.u.Phys.uCachePolicy = uCachePolicy;\r
     Assert(!pMemLnx->cPages);\r
     *ppMem = &pMemLnx->Core;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 \r
 \r
 DECLHIDDEN(int) rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     const int cPages = cb >> PAGE_SHIFT;\r
     struct task_struct *pTask = rtR0ProcessToLinuxTask(R0Process);\r
     struct vm_area_struct **papVMAs;\r
@@ -996,7 +1016,10 @@ DECLHIDDEN(int) rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3P
      */\r
     pMemLnx = (PRTR0MEMOBJLNX)rtR0MemObjNew(RT_OFFSETOF(RTR0MEMOBJLNX, apPages[cPages]), RTR0MEMOBJTYPE_LOCK, (void *)R3Ptr, cb);\r
     if (!pMemLnx)\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_NO_MEMORY;\r
+    }\r
 \r
     papVMAs = (struct vm_area_struct **)RTMemAlloc(sizeof(*papVMAs) * cPages);\r
     if (papVMAs)\r
@@ -1047,6 +1070,7 @@ DECLHIDDEN(int) rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3P
             Assert(!pMemLnx->fMappedToRing0);\r
             *ppMem = &pMemLnx->Core;\r
 \r
+            IPRT_LINUX_RESTORE_EFL_AC();\r
             return VINF_SUCCESS;\r
         }\r
 \r
@@ -1067,12 +1091,14 @@ DECLHIDDEN(int) rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3P
     }\r
 \r
     rtR0MemObjDelete(&pMemLnx->Core);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
 \r
 DECLHIDDEN(int) rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     void           *pvLast = (uint8_t *)pv + cb - 1;\r
     size_t const    cPages = cb >> PAGE_SHIFT;\r
     PRTR0MEMOBJLNX  pMemLnx;\r
@@ -1105,7 +1131,10 @@ DECLHIDDEN(int) rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv,
      */\r
     pMemLnx = (PRTR0MEMOBJLNX)rtR0MemObjNew(RT_OFFSETOF(RTR0MEMOBJLNX, apPages[cPages]), RTR0MEMOBJTYPE_LOCK, pv, cb);\r
     if (!pMemLnx)\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_NO_MEMORY;\r
+    }\r
 \r
     /*\r
      * Gather the pages.\r
@@ -1146,10 +1175,12 @@ DECLHIDDEN(int) rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv,
         Assert(!pMemLnx->fMappedToRing0);\r
         *ppMem = &pMemLnx->Core;\r
 \r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VINF_SUCCESS;\r
     }\r
 \r
     rtR0MemObjDelete(&pMemLnx->Core);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
@@ -1157,6 +1188,7 @@ DECLHIDDEN(int) rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv,
 DECLHIDDEN(int) rtR0MemObjNativeReserveKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pvFixed, size_t cb, size_t uAlignment)\r
 {\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 22)\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     const size_t cPages = cb >> PAGE_SHIFT;\r
     struct page *pDummyPage;\r
     struct page **papPages;\r
@@ -1171,36 +1203,39 @@ DECLHIDDEN(int) rtR0MemObjNativeReserveKernel(PPRTR0MEMOBJINTERNAL ppMem, void *
      * the dummy page is mapped all over the reserved area.\r
      */\r
     pDummyPage = alloc_page(GFP_HIGHUSER | __GFP_NOWARN);\r
-    if (!pDummyPage)\r
-        return VERR_NO_MEMORY;\r
-    papPages = RTMemAlloc(sizeof(*papPages) * cPages);\r
-    if (papPages)\r
+    if (pDummyPage)\r
     {\r
-        void *pv;\r
-        size_t iPage = cPages;\r
-        while (iPage-- > 0)\r
-            papPages[iPage] = pDummyPage;\r
+        papPages = RTMemAlloc(sizeof(*papPages) * cPages);\r
+        if (papPages)\r
+        {\r
+            void *pv;\r
+            size_t iPage = cPages;\r
+            while (iPage-- > 0)\r
+                papPages[iPage] = pDummyPage;\r
 # ifdef VM_MAP\r
-        pv = vmap(papPages, cPages, VM_MAP, PAGE_KERNEL_RO);\r
+            pv = vmap(papPages, cPages, VM_MAP, PAGE_KERNEL_RO);\r
 # else\r
-        pv = vmap(papPages, cPages, VM_ALLOC, PAGE_KERNEL_RO);\r
+            pv = vmap(papPages, cPages, VM_ALLOC, PAGE_KERNEL_RO);\r
 # endif\r
-        RTMemFree(papPages);\r
-        if (pv)\r
-        {\r
-            PRTR0MEMOBJLNX pMemLnx = (PRTR0MEMOBJLNX)rtR0MemObjNew(sizeof(*pMemLnx), RTR0MEMOBJTYPE_RES_VIRT, pv, cb);\r
-            if (pMemLnx)\r
+            RTMemFree(papPages);\r
+            if (pv)\r
             {\r
-                pMemLnx->Core.u.ResVirt.R0Process = NIL_RTR0PROCESS;\r
-                pMemLnx->cPages = 1;\r
-                pMemLnx->apPages[0] = pDummyPage;\r
-                *ppMem = &pMemLnx->Core;\r
-                return VINF_SUCCESS;\r
+                PRTR0MEMOBJLNX pMemLnx = (PRTR0MEMOBJLNX)rtR0MemObjNew(sizeof(*pMemLnx), RTR0MEMOBJTYPE_RES_VIRT, pv, cb);\r
+                if (pMemLnx)\r
+                {\r
+                    pMemLnx->Core.u.ResVirt.R0Process = NIL_RTR0PROCESS;\r
+                    pMemLnx->cPages = 1;\r
+                    pMemLnx->apPages[0] = pDummyPage;\r
+                    *ppMem = &pMemLnx->Core;\r
+                    IPRT_LINUX_RESTORE_EFL_AC();\r
+                    return VINF_SUCCESS;\r
+                }\r
+                vunmap(pv);\r
             }\r
-            vunmap(pv);\r
         }\r
+        __free_page(pDummyPage);\r
     }\r
-    __free_page(pDummyPage);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VERR_NO_MEMORY;\r
 \r
 #else   /* < 2.4.22 */\r
@@ -1215,6 +1250,7 @@ DECLHIDDEN(int) rtR0MemObjNativeReserveKernel(PPRTR0MEMOBJINTERNAL ppMem, void *
 \r
 DECLHIDDEN(int) rtR0MemObjNativeReserveUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3PtrFixed, size_t cb, size_t uAlignment, RTR0PROCESS R0Process)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     PRTR0MEMOBJLNX      pMemLnx;\r
     void               *pv;\r
     struct task_struct *pTask = rtR0ProcessToLinuxTask(R0Process);\r
@@ -1232,17 +1268,22 @@ DECLHIDDEN(int) rtR0MemObjNativeReserveUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR
      */\r
     pv = rtR0MemObjLinuxDoMmap(R3PtrFixed, cb, uAlignment, pTask, RTMEM_PROT_NONE);\r
     if (pv == (void *)-1)\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_NO_MEMORY;\r
+    }\r
 \r
     pMemLnx = (PRTR0MEMOBJLNX)rtR0MemObjNew(sizeof(*pMemLnx), RTR0MEMOBJTYPE_RES_VIRT, pv, cb);\r
     if (!pMemLnx)\r
     {\r
         rtR0MemObjLinuxDoMunmap(pv, cb, pTask);\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_NO_MEMORY;\r
     }\r
 \r
     pMemLnx->Core.u.ResVirt.R0Process = R0Process;\r
     *ppMem = &pMemLnx->Core;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 \r
@@ -1254,6 +1295,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ
     int rc = VERR_NO_MEMORY;\r
     PRTR0MEMOBJLNX pMemLnxToMap = (PRTR0MEMOBJLNX)pMemToMap;\r
     PRTR0MEMOBJLNX pMemLnx;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /* Fail if requested to do something we can't. */\r
     AssertMsgReturn(!offSub && !cbSub, ("%#x %#x\n", offSub, cbSub), VERR_NOT_SUPPORTED);\r
@@ -1325,11 +1367,13 @@ DECLHIDDEN(int) rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ
         {\r
             pMemLnx->Core.u.Mapping.R0Process = NIL_RTR0PROCESS;\r
             *ppMem = &pMemLnx->Core;\r
+            IPRT_LINUX_RESTORE_EFL_AC();\r
             return VINF_SUCCESS;\r
         }\r
         rtR0MemObjDelete(&pMemLnx->Core);\r
     }\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
@@ -1394,6 +1438,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ p
     struct page        *pDummyPage;\r
     RTHCPHYS            DummyPhys;\r
 #endif\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Check for restrictions.\r
@@ -1409,7 +1454,10 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ p
      */\r
     pDummyPage = alloc_page(GFP_USER | __GFP_NOWARN);\r
     if (!pDummyPage)\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_NO_MEMORY;\r
+    }\r
     SetPageReserved(pDummyPage);\r
     DummyPhys = page_to_phys(pDummyPage);\r
 #endif\r
@@ -1563,6 +1611,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ p
                 pMemLnx->Core.pv = pv;\r
                 pMemLnx->Core.u.Mapping.R0Process = R0Process;\r
                 *ppMem = &pMemLnx->Core;\r
+                IPRT_LINUX_RESTORE_EFL_AC();\r
                 return VINF_SUCCESS;\r
             }\r
 \r
@@ -1577,6 +1626,7 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ p
     __free_page(pDummyPage);\r
 #endif\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 \r
index 1f48b23..1d51386 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: memuserkernel-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: memuserkernel-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - User & Kernel Memory, Ring-0 Driver, Linux.\r
  */\r
 \r
 RTR0DECL(int) RTR0MemUserCopyFrom(void *pvDst, RTR3PTR R3PtrSrc, size_t cb)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     if (RT_LIKELY(copy_from_user(pvDst, (void *)R3PtrSrc, cb) == 0))\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VINF_SUCCESS;\r
+    }\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VERR_ACCESS_DENIED;\r
 }\r
 RT_EXPORT_SYMBOL(RTR0MemUserCopyFrom);\r
@@ -46,8 +51,13 @@ RT_EXPORT_SYMBOL(RTR0MemUserCopyFrom);
 \r
 RTR0DECL(int) RTR0MemUserCopyTo(RTR3PTR R3PtrDst, void const *pvSrc, size_t cb)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     if (RT_LIKELY(copy_to_user((void *)R3PtrDst, pvSrc, cb) == 0))\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VINF_SUCCESS;\r
+    }\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VERR_ACCESS_DENIED;\r
 }\r
 RT_EXPORT_SYMBOL(RTR0MemUserCopyTo);\r
@@ -55,7 +65,10 @@ RT_EXPORT_SYMBOL(RTR0MemUserCopyTo);
 \r
 RTR0DECL(bool) RTR0MemUserIsValidAddr(RTR3PTR R3Ptr)\r
 {\r
-    return access_ok(VERIFY_READ, (void *)R3Ptr, 1);\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+    bool fRc = access_ok(VERIFY_READ, (void *)R3Ptr, 1);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
+    return fRc;\r
 }\r
 RT_EXPORT_SYMBOL(RTR0MemUserIsValidAddr);\r
 \r
@@ -113,6 +126,7 @@ static int rtR0MemKernelCopyLnxWorker(void *pvDst, void const *pvSrc, size_t cb)
 #  endif\r
 # endif /* !_ASM_EXTABLE */\r
     int rc;\r
+    IPRT_LINUX_SAVE_EFL_AC(); /* paranoia */\r
     if (!cb)\r
         return VINF_SUCCESS;\r
 \r
@@ -135,6 +149,7 @@ static int rtR0MemKernelCopyLnxWorker(void *pvDst, void const *pvSrc, size_t cb)
                             "2" (pvSrc),\r
                             "3" (cb)\r
                           : "memory");\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 #else\r
     return VERR_NOT_SUPPORTED;\r
index 8e75ab1..a42099c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mp-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: mp-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Multiprocessor, Ring-0 Driver, Linux.\r
  */\r
@@ -248,6 +248,7 @@ static void rtmpLinuxAllWrapper(void *pvInfo)
 \r
 RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     int rc;\r
     RTMPARGS Args;\r
     RTCPUSET OnlineSet;\r
@@ -300,6 +301,7 @@ RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
     }\r
 \r
     RTThreadPreemptRestore(&PreemptState);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTMpOnAll);\r
@@ -307,6 +309,7 @@ RT_EXPORT_SYMBOL(RTMpOnAll);
 \r
 RTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     int rc;\r
     RTMPARGS Args;\r
 \r
@@ -326,6 +329,7 @@ RTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
     RTThreadPreemptRestore(&PreemptState);\r
 \r
     Assert(rc == 0); NOREF(rc);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTMpOnOthers);\r
@@ -355,6 +359,7 @@ static void rtMpLinuxOnPairWrapper(void *pvInfo)
 \r
 RTDECL(int) RTMpOnPair(RTCPUID idCpu1, RTCPUID idCpu2, uint32_t fFlags, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     int rc;\r
     RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;\r
 \r
@@ -442,6 +447,7 @@ RTDECL(int) RTMpOnPair(RTCPUID idCpu1, RTCPUID idCpu2, uint32_t fFlags, PFNRTMPW
     else\r
         rc = VERR_CPU_NOT_FOUND;\r
     RTThreadPreemptRestore(&PreemptState);;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 RT_EXPORT_SYMBOL(RTMpOnPair);\r
@@ -477,6 +483,7 @@ static void rtmpOnSpecificLinuxWrapper(void *pvInfo)
 \r
 RTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     int rc;\r
     RTMPARGS Args;\r
 \r
@@ -516,6 +523,7 @@ RTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1
     RTThreadPreemptRestore(&PreemptState);;\r
 \r
     NOREF(rc);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 RT_EXPORT_SYMBOL(RTMpOnSpecific);\r
@@ -538,6 +546,7 @@ RTDECL(int) RTMpPokeCpu(RTCPUID idCpu)
 {\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)\r
     int rc;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     if (!RTMpIsCpuPossible(idCpu))\r
         return VERR_CPU_NOT_FOUND;\r
@@ -553,6 +562,7 @@ RTDECL(int) RTMpPokeCpu(RTCPUID idCpu)
 # endif /* older kernels */\r
     NOREF(rc);\r
     Assert(rc == 0);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 \r
 #else  /* older kernels */\r
index 89ccc52..40a97d8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mpnotification-r0drv-linux.c 99004 2015-03-17 11:15:47Z fmehnert $ */\r
+/* $Id: mpnotification-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Multiprocessor Event Notifications, Ring-0 Driver, Linux.\r
  */\r
@@ -173,12 +173,14 @@ static int rtMpNotificationLinuxCallback(struct notifier_block *pNotifierBlock,
 DECLHIDDEN(int) rtR0MpNotificationNativeInit(void)\r
 {\r
     int rc;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
 # ifdef CPU_DOWN_FAILED\r
     RTCpuSetEmpty(&g_MpPendingOfflineSet);\r
 # endif\r
 \r
     rc = register_cpu_notifier(&g_NotifierBlock);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     AssertMsgReturn(!rc, ("%d\n", rc), RTErrConvertFromErrno(rc));\r
     return VINF_SUCCESS;\r
 }\r
@@ -186,7 +188,9 @@ DECLHIDDEN(int) rtR0MpNotificationNativeInit(void)
 \r
 DECLHIDDEN(void) rtR0MpNotificationNativeTerm(void)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     unregister_cpu_notifier(&g_NotifierBlock);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
 }\r
 \r
 #else   /* Not supported / Not needed */\r
index 71f061f..8ccc028 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: semevent-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: semevent-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Single Release Event Semaphores, Ring-0 Driver, Linux.\r
  */\r
@@ -72,6 +72,7 @@ RTDECL(int)  RTSemEventCreate(PRTSEMEVENT phEventSem)
 RTDECL(int)  RTSemEventCreateEx(PRTSEMEVENT phEventSem, uint32_t fFlags, RTLOCKVALCLASS hClass, const char *pszNameFmt, ...)\r
 {\r
     PRTSEMEVENTINTERNAL pThis;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     AssertReturn(!(fFlags & ~(RTSEMEVENT_FLAGS_NO_LOCK_VAL | RTSEMEVENT_FLAGS_BOOTSTRAP_HACK)), VERR_INVALID_PARAMETER);\r
     Assert(!(fFlags & RTSEMEVENT_FLAGS_BOOTSTRAP_HACK) || (fFlags & RTSEMEVENT_FLAGS_NO_LOCK_VAL));\r
@@ -86,6 +87,7 @@ RTDECL(int)  RTSemEventCreateEx(PRTSEMEVENT phEventSem, uint32_t fFlags, RTLOCKV
     init_waitqueue_head(&pThis->Head);\r
 \r
     *phEventSem = pThis;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemEventCreate);\r
@@ -117,6 +119,8 @@ DECLINLINE(void) rtR0SemEventLnxRelease(PRTSEMEVENTINTERNAL pThis)
 \r
 RTDECL(int)  RTSemEventDestroy(RTSEMEVENT hEventSem)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * Validate input.\r
      */\r
@@ -134,6 +138,8 @@ RTDECL(int)  RTSemEventDestroy(RTSEMEVENT hEventSem)
     Assert(!waitqueue_active(&pThis->Head));\r
     wake_up_all(&pThis->Head);\r
     rtR0SemEventLnxRelease(pThis);\r
+\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemEventDestroy);\r
@@ -141,6 +147,8 @@ RT_EXPORT_SYMBOL(RTSemEventDestroy);
 \r
 RTDECL(int)  RTSemEventSignal(RTSEMEVENT hEventSem)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * Validate input.\r
      */\r
@@ -156,6 +164,7 @@ RTDECL(int)  RTSemEventSignal(RTSEMEVENT hEventSem)
     wake_up(&pThis->Head);\r
 \r
     rtR0SemEventLnxRelease(pThis);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemEventSignal);\r
@@ -194,6 +203,7 @@ static int rtR0SemEventLnxWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, uint6
         /*\r
          * We have to wait.\r
          */\r
+        IPRT_LINUX_SAVE_EFL_AC();\r
         RTR0SEMLNXWAIT Wait;\r
         rc = rtR0SemLnxWaitInit(&Wait, fFlags, uTimeout, &pThis->Head);\r
         if (RT_SUCCESS(rc))\r
@@ -230,6 +240,7 @@ static int rtR0SemEventLnxWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, uint6
             rtR0SemLnxWaitDelete(&Wait);\r
             IPRT_DEBUG_SEMS_STATE_RC(pThis, 'E', rc);\r
         }\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
     }\r
 \r
     rtR0SemEventLnxRelease(pThis);\r
index 0895a7e..cc61cb9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: semeventmulti-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: semeventmulti-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Multiple Release Event Semaphores, Ring-0 Driver, Linux.\r
  */\r
@@ -95,6 +95,7 @@ RTDECL(int)  RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t
                                      const char *pszNameFmt, ...)\r
 {\r
     PRTSEMEVENTMULTIINTERNAL pThis;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER);\r
     pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pThis));\r
@@ -106,8 +107,10 @@ RTDECL(int)  RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t
         init_waitqueue_head(&pThis->Head);\r
 \r
         *phEventMultiSem = pThis;\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VINF_SUCCESS;\r
     }\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VERR_NO_MEMORY;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemEventMultiCreate);\r
@@ -143,6 +146,8 @@ DECLINLINE(void) rtR0SemEventMultiLnxRelease(PRTSEMEVENTMULTIINTERNAL pThis)
 \r
 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * Validate input.\r
      */\r
@@ -161,6 +166,8 @@ RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem)
     Assert(!waitqueue_active(&pThis->Head));\r
     wake_up_all(&pThis->Head);\r
     rtR0SemEventMultiLnxRelease(pThis);\r
+\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemEventMultiDestroy);\r
@@ -168,6 +175,7 @@ RT_EXPORT_SYMBOL(RTSemEventMultiDestroy);
 \r
 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     uint32_t fNew;\r
     uint32_t fOld;\r
 \r
@@ -197,6 +205,7 @@ RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem)
     wake_up_all(&pThis->Head);\r
 \r
     rtR0SemEventMultiLnxRelease(pThis);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemEventMultiSignal);\r
@@ -260,6 +269,7 @@ static int rtR0SemEventMultiLnxWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t fFl
          * We have to wait.\r
          */\r
         RTR0SEMLNXWAIT Wait;\r
+        IPRT_LINUX_SAVE_EFL_AC();\r
         rc = rtR0SemLnxWaitInit(&Wait, fFlags, uTimeout, &pThis->Head);\r
         if (RT_SUCCESS(rc))\r
         {\r
@@ -295,6 +305,7 @@ static int rtR0SemEventMultiLnxWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t fFl
             rtR0SemLnxWaitDelete(&Wait);\r
             IPRT_DEBUG_SEMS_STATE_RC(pThis, 'E', rc);\r
         }\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
     }\r
 \r
     rtR0SemEventMultiLnxRelease(pThis);\r
index 6cd2c50..1e8ca67 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: semfastmutex-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: semfastmutex-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Fast Mutex Semaphores, Ring-0 Driver, Linux.\r
  */\r
@@ -63,6 +63,8 @@ typedef struct RTSEMFASTMUTEXINTERNAL
 \r
 RTDECL(int)  RTSemFastMutexCreate(PRTSEMFASTMUTEX phFastMtx)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * Allocate.\r
      */\r
@@ -81,6 +83,7 @@ RTDECL(int)  RTSemFastMutexCreate(PRTSEMFASTMUTEX phFastMtx)
 #endif\r
 \r
     *phFastMtx = pThis;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemFastMutexCreate);\r
@@ -106,6 +109,8 @@ RT_EXPORT_SYMBOL(RTSemFastMutexDestroy);
 \r
 RTDECL(int)  RTSemFastMutexRequest(RTSEMFASTMUTEX hFastMtx)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * Validate.\r
      */\r
@@ -120,6 +125,8 @@ RTDECL(int)  RTSemFastMutexRequest(RTSEMFASTMUTEX hFastMtx)
     AssertRelease(pThis->Owner == NIL_RTNATIVETHREAD);\r
     ASMAtomicUoWriteSize(&pThis->Owner, RTThreadNativeSelf());\r
 #endif\r
+\r
+    IPRT_LINUX_RESTORE_EFL_ONLY_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemFastMutexRequest);\r
@@ -127,6 +134,8 @@ RT_EXPORT_SYMBOL(RTSemFastMutexRequest);
 \r
 RTDECL(int)  RTSemFastMutexRelease(RTSEMFASTMUTEX hFastMtx)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * Validate.\r
      */\r
@@ -140,6 +149,8 @@ RTDECL(int)  RTSemFastMutexRelease(RTSEMFASTMUTEX hFastMtx)
 #endif\r
     up(&pThis->Semaphore);\r
     IPRT_DEBUG_SEMS_STATE(pThis, 'u');\r
+\r
+    IPRT_LINUX_RESTORE_EFL_ONLY_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemFastMutexRelease);\r
index c39a5f3..2476101 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: semmutex-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: semmutex-r0drv-linux.c 102039 2015-08-12 08:54:55Z fmehnert $ */\r
 /** @file\r
  * IPRT - Mutex Semaphores, Ring-0 Driver, Linux.\r
  */\r
@@ -86,26 +86,33 @@ typedef struct RTSEMMUTEXINTERNAL
 \r
 RTDECL(int) RTSemMutexCreate(PRTSEMMUTEX phMtx)\r
 {\r
+    int rc = VINF_SUCCESS;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     /*\r
      * Allocate.\r
      */\r
     PRTSEMMUTEXINTERNAL pThis;\r
     pThis = (PRTSEMMUTEXINTERNAL)RTMemAlloc(sizeof(*pThis));\r
-    if (!pThis)\r
-        return VERR_NO_MEMORY;\r
+    if (pThis)\r
+    {\r
+        /*\r
+         * Initialize.\r
+         */\r
+        pThis->u32Magic     = RTSEMMUTEX_MAGIC;\r
+        pThis->cRecursions  = 0;\r
+        pThis->pOwnerTask   = NULL;\r
+        pThis->cRefs        = 1;\r
+        RTListInit(&pThis->WaiterList);\r
+        spin_lock_init(&pThis->Spinlock);\r
+\r
+        *phMtx = pThis;\r
+    }\r
+    else\r
+        rc = VERR_NO_MEMORY;\r
 \r
-    /*\r
-     * Initialize.\r
-     */\r
-    pThis->u32Magic     = RTSEMMUTEX_MAGIC;\r
-    pThis->cRecursions  = 0;\r
-    pThis->pOwnerTask   = NULL;\r
-    pThis->cRefs        = 1;\r
-    RTListInit(&pThis->WaiterList);\r
-    spin_lock_init(&pThis->Spinlock);\r
-\r
-    *phMtx = pThis;\r
-    return VINF_SUCCESS;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
+    return rc;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemMutexCreate);\r
 \r
@@ -129,6 +136,8 @@ RTDECL(int) RTSemMutexDestroy(RTSEMMUTEX hMtx)
      */\r
     AssertReturn(ASMAtomicCmpXchgU32(&pThis->u32Magic, RTSEMMUTEX_MAGIC_DEAD, RTSEMMUTEX_MAGIC), VERR_INVALID_HANDLE);\r
 \r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+\r
     spin_lock_irqsave(&pThis->Spinlock, fSavedIrq);\r
     RTListForEach(&pThis->WaiterList, pCur, RTSEMMUTEXLNXWAITER, ListEntry)\r
     {\r
@@ -144,6 +153,8 @@ RTDECL(int) RTSemMutexDestroy(RTSEMMUTEX hMtx)
         RTMemFree(pThis);\r
     }\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
+\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemMutexDestroy);\r
@@ -250,6 +261,7 @@ DECLINLINE(int) rtSemMutexLinuxRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMilli
     struct task_struct *pSelf = current;\r
     unsigned long       fSavedIrq;\r
     int                 rc;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Validate.\r
@@ -289,10 +301,15 @@ DECLINLINE(int) rtSemMutexLinuxRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMilli
      * No, so go to sleep.\r
      */\r
     else\r
-        return rtSemMutexLinuxRequestSleep(pThis, cMillies, fInterruptible, fSavedIrq);\r
+    {\r
+        rc = rtSemMutexLinuxRequestSleep(pThis, cMillies, fInterruptible, fSavedIrq);\r
+        IPRT_LINUX_RESTORE_EFL_ONLY_AC();\r
+        return rc;\r
+    }\r
 \r
     IPRT_DEBUG_SEMS_STATE_RC(pThis, 'M', rc);\r
     spin_unlock_irqrestore(&pThis->Spinlock, fSavedIrq);\r
+    IPRT_LINUX_RESTORE_EFL_ONLY_AC();\r
     return rc;\r
 }\r
 \r
@@ -331,6 +348,7 @@ RTDECL(int) RTSemMutexRelease(RTSEMMUTEX hMtx)
     struct task_struct *pSelf = current;\r
     unsigned long       fSavedIrq;\r
     int                 rc;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Validate.\r
@@ -366,6 +384,7 @@ RTDECL(int) RTSemMutexRelease(RTSEMMUTEX hMtx)
     spin_unlock_irqrestore(&pThis->Spinlock, fSavedIrq);\r
 \r
     AssertRC(rc);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return rc;\r
 }\r
 RT_EXPORT_SYMBOL(RTSemMutexRelease);\r
@@ -376,6 +395,7 @@ RTDECL(bool) RTSemMutexIsOwned(RTSEMMUTEX hMutexSem)
     PRTSEMMUTEXINTERNAL pThis = hMutexSem;\r
     unsigned long       fSavedIrq;\r
     bool                fOwned;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Validate.\r
@@ -391,6 +411,7 @@ RTDECL(bool) RTSemMutexIsOwned(RTSEMMUTEX hMutexSem)
     fOwned = pThis->pOwnerTask != NULL;\r
     spin_unlock_irqrestore(&pThis->Spinlock, fSavedIrq);\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return fOwned;\r
 \r
 }\r
index 7f90c0d..d8e4941 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: spinlock-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: spinlock-r0drv-linux.c 102092 2015-08-13 14:49:41Z bird $ */\r
 /** @file\r
  * IPRT - Spinlocks, Ring-0 Driver, Linux.\r
  */\r
@@ -73,6 +73,7 @@ typedef struct RTSPINLOCKINTERNAL
 \r
 RTDECL(int)  RTSpinlockCreate(PRTSPINLOCK pSpinlock, uint32_t fFlags, const char *pszName)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     PRTSPINLOCKINTERNAL pThis;\r
     AssertReturn(fFlags == RTSPINLOCK_FLAGS_INTERRUPT_SAFE || fFlags == RTSPINLOCK_FLAGS_INTERRUPT_UNSAFE, VERR_INVALID_PARAMETER);\r
 \r
@@ -97,6 +98,7 @@ RTDECL(int)  RTSpinlockCreate(PRTSPINLOCK pSpinlock, uint32_t fFlags, const char
     spin_lock_init(&pThis->Spinlock);\r
 \r
     *pSpinlock = pThis;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTSpinlockCreate);\r
@@ -126,6 +128,7 @@ RT_EXPORT_SYMBOL(RTSpinlockDestroy);
 RTDECL(void) RTSpinlockAcquire(RTSPINLOCK Spinlock)\r
 {\r
     PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     RT_ASSERT_PREEMPT_CPUID_VAR();\r
     AssertMsg(pThis && pThis->u32Magic == RTSPINLOCK_MAGIC,\r
               ("pThis=%p u32Magic=%08x\n", pThis, pThis ? (int)pThis->u32Magic : 0));\r
@@ -145,6 +148,7 @@ RTDECL(void) RTSpinlockAcquire(RTSPINLOCK Spinlock)
     lockdep_on();\r
 #endif\r
 \r
+    IPRT_LINUX_RESTORE_EFL_ONLY_AC();\r
     RT_ASSERT_PREEMPT_CPUID_SPIN_ACQUIRED(pThis);\r
 }\r
 RT_EXPORT_SYMBOL(RTSpinlockAcquire);\r
@@ -153,6 +157,7 @@ RT_EXPORT_SYMBOL(RTSpinlockAcquire);
 RTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock)\r
 {\r
     PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock;\r
+    IPRT_LINUX_SAVE_EFL_AC();           /* spin_unlock* may preempt and trash eflags.ac. */\r
     RT_ASSERT_PREEMPT_CPUID_SPIN_RELEASE_VARS();\r
     AssertMsg(pThis && pThis->u32Magic == RTSPINLOCK_MAGIC,\r
               ("pThis=%p u32Magic=%08x\n", pThis, pThis ? (int)pThis->u32Magic : 0));\r
@@ -173,6 +178,7 @@ RTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock)
     lockdep_on();\r
 #endif\r
 \r
+    IPRT_LINUX_RESTORE_EFL_ONLY_AC();\r
     RT_ASSERT_PREEMPT_CPUID();\r
 }\r
 RT_EXPORT_SYMBOL(RTSpinlockRelease);\r
index fc73f14..f890958 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: the-linux-kernel.h 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: the-linux-kernel.h 102085 2015-08-13 13:26:00Z bird $ */\r
 /** @file\r
  * IPRT - Include all necessary headers for the Linux kernel.\r
  */\r
@@ -382,12 +382,12 @@ DECLINLINE(unsigned long) msecs_to_jiffies(unsigned int cMillies)
  * The AMD 64 switch_to in macro in arch/x86/include/asm/switch_to.h stopped\r
  * restoring flags.\r
  * @{ */\r
-#ifdef CONFIG_X86_SMAP\r
+#if defined(CONFIG_X86_SMAP) || defined(RT_STRICT) || defined(IPRT_WITH_EFLAGS_AC_PRESERVING)\r
 # include <iprt/asm-amd64-x86.h>\r
 # define IPRT_X86_EFL_AC                    RT_BIT(18)\r
-# define IPRT_LINUX_SAVE_EFL_AC()           RTCCUINTREG fSavedEfl = ASMGetFlags();\r
+# define IPRT_LINUX_SAVE_EFL_AC()           RTCCUINTREG fSavedEfl = ASMGetFlags()\r
 # define IPRT_LINUX_RESTORE_EFL_AC()        ASMSetFlags(fSavedEfl)\r
-# define IPRT_LINUX_RESTORE_EFL_ONLY_AC()   ASMSetFlags((ASMGetFlags() & ~IPRT_X86_EFL_AC) | (fSavedEfl & IPRT_X86_EFL_AC))\r
+# define IPRT_LINUX_RESTORE_EFL_ONLY_AC()   ASMChangeFlags(~IPRT_X86_EFL_AC, fSavedEfl & IPRT_X86_EFL_AC)\r
 #else\r
 # define IPRT_LINUX_SAVE_EFL_AC()           do { } while (0)\r
 # define IPRT_LINUX_RESTORE_EFL_AC()        do { } while (0)\r
index e56ba0d..c4cd5e6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: thread-r0drv-linux.c 100317 2015-05-14 15:59:15Z bird $ */\r
+/* $Id: thread-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Threads, Ring-0 Driver, Linux.\r
  */\r
@@ -59,9 +59,11 @@ RT_EXPORT_SYMBOL(RTThreadNativeSelf);
 \r
 static int rtR0ThreadLnxSleepCommon(RTMSINTERVAL cMillies)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     long cJiffies = msecs_to_jiffies(cMillies);\r
     set_current_state(TASK_INTERRUPTIBLE);\r
     cJiffies = schedule_timeout(cJiffies);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     if (!cJiffies)\r
         return VINF_SUCCESS;\r
     return VERR_INTERRUPTED;\r
@@ -84,6 +86,7 @@ RT_EXPORT_SYMBOL(RTThreadSleepNoLog);
 \r
 RTDECL(bool) RTThreadYield(void)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 20)\r
     yield();\r
 #else\r
@@ -92,6 +95,7 @@ RTDECL(bool) RTThreadYield(void)
     sys_sched_yield();\r
     schedule();\r
 #endif\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return true;\r
 }\r
 RT_EXPORT_SYMBOL(RTThreadYield);\r
index 4707eaf..6c4df33 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: thread2-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: thread2-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Threads (Part 2), Ring-0 Driver, Linux.\r
  */\r
@@ -137,16 +137,20 @@ DECLHIDDEN(int) rtThreadNativeCreate(PRTTHREADINT pThreadInt, PRTNATIVETHREAD pN
 {\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 4)\r
     struct task_struct *NativeThread;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     RT_ASSERT_PREEMPTIBLE();\r
 \r
     NativeThread = kthread_run(rtThreadNativeMain, pThreadInt, "iprt-%s", pThreadInt->szName);\r
 \r
-    if (IS_ERR(NativeThread))\r
-        return VERR_GENERAL_FAILURE;\r
-\r
-    *pNativeThread = (RTNATIVETHREAD)NativeThread;\r
-    return VINF_SUCCESS;\r
+    if (!IS_ERR(NativeThread))\r
+    {\r
+        *pNativeThread = (RTNATIVETHREAD)NativeThread;\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
+        return VINF_SUCCESS;\r
+    }\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
+    return VERR_GENERAL_FAILURE;\r
 #else\r
     return VERR_NOT_IMPLEMENTED;\r
 #endif\r
index 9c42434..2b09ec8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: time-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: time-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Time, Ring-0 Driver, Linux.\r
  */\r
@@ -169,14 +169,17 @@ RT_EXPORT_SYMBOL(RTTimeSystemMilliTS);
 \r
 RTDECL(PRTTIMESPEC) RTTimeNow(PRTTIMESPEC pTime)\r
 {\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)\r
     struct timespec Ts;\r
     ktime_get_real_ts(&Ts);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return RTTimeSpecSetTimespec(pTime, &Ts);\r
 \r
 #else   /* < 2.6.16 */\r
     struct timeval Tv;\r
     do_gettimeofday(&Tv);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return RTTimeSpecSetTimeval(pTime, &Tv);\r
 #endif\r
 }\r
index c1b8232..0371435 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: timer-r0drv-linux.c 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: timer-r0drv-linux.c 102031 2015-08-11 14:39:19Z bird $ */\r
 /** @file\r
  * IPRT - Timers, Ring-0 Driver, Linux.\r
  */\r
@@ -1185,6 +1185,7 @@ RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
 {\r
     RTTIMERLINUXSTARTONCPUARGS Args;\r
     int rc2;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Validate.\r
@@ -1202,7 +1203,11 @@ RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
      * Omni timer?\r
      */\r
     if (pTimer->fAllCpus)\r
-        return rtTimerLnxOmniStart(pTimer, &Args);\r
+    {\r
+        rc2 = rtTimerLnxOmniStart(pTimer, &Args);\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
+        return rc2;\r
+    }\r
 #endif\r
 \r
     /*\r
@@ -1233,6 +1238,7 @@ RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
                             return rc2;\r
                         }\r
                     }\r
+                    IPRT_LINUX_RESTORE_EFL_AC();\r
                     return VINF_SUCCESS;\r
                 }\r
                 break;\r
@@ -1242,12 +1248,14 @@ RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
                 if (rtTimerLnxCmpXchgState(&pTimer->aSubTimers[0].enmState, RTTIMERLNXSTATE_CB_RESTARTING, enmState))\r
                 {\r
                     ASMAtomicWriteBool(&pTimer->fSuspended, false);\r
+                    IPRT_LINUX_RESTORE_EFL_AC();\r
                     return VINF_SUCCESS;\r
                 }\r
                 break;\r
 \r
             default:\r
                 AssertMsgFailed(("%d\n", enmState));\r
+                IPRT_LINUX_RESTORE_EFL_AC();\r
                 return VERR_INTERNAL_ERROR_4;\r
         }\r
         ASMNopPause();\r
@@ -1328,6 +1336,7 @@ RTDECL(int) RTTimerStop(PRTTIMER pTimer)
     /*\r
      * Validate.\r
      */\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
     AssertPtrReturn(pTimer, VERR_INVALID_HANDLE);\r
     AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_HANDLE);\r
     RTTIMERLNX_LOG(("stop %p\n", pTimer));\r
@@ -1336,6 +1345,8 @@ RTDECL(int) RTTimerStop(PRTTIMER pTimer)
         return VERR_TIMER_SUSPENDED;\r
 \r
     rtTimerLnxStop(pTimer, false /*fForDestroy*/);\r
+\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTTimerStop);\r
@@ -1345,6 +1356,7 @@ RTDECL(int) RTTimerChangeInterval(PRTTIMER pTimer, uint64_t u64NanoInterval)
 {\r
     unsigned long cJiffies;\r
     unsigned long flFlags;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Validate.\r
@@ -1364,6 +1376,7 @@ RTDECL(int) RTTimerChangeInterval(PRTTIMER pTimer, uint64_t u64NanoInterval)
     if (pTimer->fHighRes)\r
     {\r
         ASMAtomicWriteU64(&pTimer->u64NanoInterval, u64NanoInterval);\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VINF_SUCCESS;\r
     }\r
 #endif\r
@@ -1384,6 +1397,7 @@ RTDECL(int) RTTimerChangeInterval(PRTTIMER pTimer, uint64_t u64NanoInterval)
     pTimer->cJiffies = cJiffies;\r
     ASMAtomicWriteU64(&pTimer->u64NanoInterval, u64NanoInterval);\r
     spin_unlock_irqrestore(&pTimer->ChgIntLock, flFlags);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTTimerChangeInterval);\r
@@ -1392,6 +1406,7 @@ RT_EXPORT_SYMBOL(RTTimerChangeInterval);
 RTDECL(int) RTTimerDestroy(PRTTIMER pTimer)\r
 {\r
     bool fCanDestroy;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     /*\r
      * Validate. It's ok to pass NULL pointer.\r
@@ -1459,6 +1474,7 @@ RTDECL(int) RTTimerDestroy(PRTTIMER pTimer)
             rtTimerLnxDestroyIt(pTimer);\r
     }\r
 \r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTTimerDestroy);\r
@@ -1470,6 +1486,7 @@ RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, uint32_
     RTCPUID     iCpu;\r
     unsigned    cCpus;\r
     int         rc;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
 \r
     rtR0LnxWorkqueueFlush();                /* for 2.4 */\r
     *ppTimer = NULL;\r
@@ -1478,11 +1495,17 @@ RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, uint32_
      * Validate flags.\r
      */\r
     if (!RTTIMER_FLAGS_ARE_VALID(fFlags))\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_INVALID_PARAMETER;\r
+    }\r
     if (    (fFlags & RTTIMER_FLAGS_CPU_SPECIFIC)\r
         &&  (fFlags & RTTIMER_FLAGS_CPU_ALL) != RTTIMER_FLAGS_CPU_ALL\r
         &&  !RTMpIsCpuPossible(RTMpCpuIdFromSetIndex(fFlags & RTTIMER_FLAGS_CPU_MASK)))\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return VERR_CPU_NOT_FOUND;\r
+    }\r
 \r
     /*\r
      * Allocate the timer handler.\r
@@ -1493,14 +1516,17 @@ RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, uint32_
     {\r
         cCpus = RTMpGetMaxCpuId() + 1;\r
         Assert(cCpus <= RTCPUSET_MAX_CPUS); /* On linux we have a 1:1 relationship between cpuid and set index. */\r
-        AssertReturn(u64NanoInterval, VERR_NOT_IMPLEMENTED); /* We don't implement single shot on all cpus, sorry. */\r
+        AssertReturnStmt(u64NanoInterval, IPRT_LINUX_RESTORE_EFL_AC(), VERR_NOT_IMPLEMENTED); /* We don't implement single shot on all cpus, sorry. */\r
     }\r
 #endif\r
 \r
     rc = RTMemAllocEx(RT_OFFSETOF(RTTIMER, aSubTimers[cCpus]), 0,\r
                       RTMEMALLOCEX_FLAGS_ZEROED | RTMEMALLOCEX_FLAGS_ANY_CTX_FREE, (void **)&pTimer);\r
     if (RT_FAILURE(rc))\r
+    {\r
+        IPRT_LINUX_RESTORE_EFL_AC();\r
         return rc;\r
+    }\r
 \r
     /*\r
      * Initialize it.\r
@@ -1567,6 +1593,7 @@ RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, uint32_
         if (RT_FAILURE(rc))\r
         {\r
             RTTimerDestroy(pTimer);\r
+            IPRT_LINUX_RESTORE_EFL_AC();\r
             return rc;\r
         }\r
     }\r
@@ -1574,6 +1601,7 @@ RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, uint32_
 \r
     RTTIMERLNX_LOG(("create %p hires=%d fFlags=%#x cCpus=%u\n", pTimer, pTimer->fHighRes, fFlags, cCpus));\r
     *ppTimer = pTimer;\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     return VINF_SUCCESS;\r
 }\r
 RT_EXPORT_SYMBOL(RTTimerCreateEx);\r
@@ -1584,7 +1612,10 @@ RTDECL(uint32_t) RTTimerGetSystemGranularity(void)
 #if 0 /** @todo Not sure if this is what we want or not... Add new API for\r
        *        querying the resolution of the high res timers? */\r
     struct timespec Ts;\r
-    int rc = hrtimer_get_res(CLOCK_MONOTONIC, &Ts);\r
+    int rc;\r
+    IPRT_LINUX_SAVE_EFL_AC();\r
+    rc = hrtimer_get_res(CLOCK_MONOTONIC, &Ts);\r
+    IPRT_LINUX_RESTORE_EFL_AC();\r
     if (!rc)\r
     {\r
         Assert(!Ts.tv_sec);\r
index 40b79e4..f36e329 100644 (file)
@@ -1 +1 @@
-#define VBOX_SVN_REV 101573
+#define VBOX_SVN_REV 102096
index f001e81..02cbdff 100644 (file)
@@ -3,9 +3,9 @@
 
 #define VBOX_VERSION_MAJOR 5
 #define VBOX_VERSION_MINOR 0
-#define VBOX_VERSION_BUILD 0
-#define VBOX_VERSION_STRING_RAW "5.0.0"
-#define VBOX_VERSION_STRING "5.0.0"
+#define VBOX_VERSION_BUILD 2
+#define VBOX_VERSION_STRING_RAW "5.0.2"
+#define VBOX_VERSION_STRING "5.0.2"
 #define VBOX_API_VERSION_STRING "5_0"
 
 #define VBOX_BUILD_SERVER_BUILD 1
index 0ebb1a2..d54eee7 100644 (file)
@@ -111,11 +111,34 @@ static int sf_dir_release(struct inode *inode, struct file *file)
 }\r
 \r
 /**\r
+ * Translate RTFMODE into DT_xxx (in conjunction to rtDirType())\r
+ * @param fMode     file mode\r
+ * returns d_type\r
+ */\r
+static int sf_get_d_type(RTFMODE fMode)\r
+{\r
+    int d_type;\r
+    switch (fMode & RTFS_TYPE_MASK)\r
+    {\r
+        case RTFS_TYPE_FIFO:      d_type = DT_FIFO;    break;\r
+        case RTFS_TYPE_DEV_CHAR:  d_type = DT_CHR;     break;\r
+        case RTFS_TYPE_DIRECTORY: d_type = DT_DIR;     break;\r
+        case RTFS_TYPE_DEV_BLOCK: d_type = DT_BLK;     break;\r
+        case RTFS_TYPE_FILE:      d_type = DT_REG;     break;\r
+        case RTFS_TYPE_SYMLINK:   d_type = DT_LNK;     break;\r
+        case RTFS_TYPE_SOCKET:    d_type = DT_SOCK;    break;\r
+        case RTFS_TYPE_WHITEOUT:  d_type = DT_WHT;     break;\r
+        default:                  d_type = DT_UNKNOWN; break;\r
+    }\r
+    return d_type;\r
+}\r
+\r
+/**\r
  * Extract element ([dir]->f_pos) from the directory [dir] into [d_name].\r
  *\r
  * @returns 0 for success, 1 for end reached, Linux error code otherwise.\r
  */\r
-static int sf_getdent(struct file *dir, char d_name[NAME_MAX])\r
+static int sf_getdent(struct file *dir, char d_name[NAME_MAX], int *d_type)\r
 {\r
     loff_t cur;\r
     struct sf_glob_info *sf_g;\r
@@ -201,6 +224,8 @@ static int sf_getdent(struct file *dir, char d_name[NAME_MAX])
             info = (SHFLDIRINFO *) ((uintptr_t) info + size);\r
         }\r
 \r
+        *d_type = sf_get_d_type(info->Info.Attr.fMode);\r
+\r
         return sf_nlscpy(sf_g, d_name, NAME_MAX,\r
                          info->name.String.utf8, info->name.u16Length);\r
     }\r
@@ -244,8 +269,9 @@ static int sf_dir_read(struct file *dir, void *opaque, filldir_t filldir)
         ino_t fake_ino;\r
         loff_t sanity;\r
         char d_name[NAME_MAX];\r
+        int d_type = DT_UNKNOWN;\r
 \r
-        err = sf_getdent(dir, d_name);\r
+        err = sf_getdent(dir, d_name, &d_type);\r
         switch (err)\r
         {\r
             case 1:\r
@@ -280,13 +306,13 @@ static int sf_dir_read(struct file *dir, void *opaque, filldir_t filldir)
         }\r
 \r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)\r
-        if (!dir_emit(ctx, d_name, strlen(d_name), fake_ino, DT_UNKNOWN))\r
+        if (!dir_emit(ctx, d_name, strlen(d_name), fake_ino, d_type))\r
         {\r
             LogFunc(("dir_emit failed\n"));\r
             return 0;\r
         }\r
 #else\r
-        err = filldir(opaque, d_name, strlen(d_name), dir->f_pos, fake_ino, DT_UNKNOWN);\r
+        err = filldir(opaque, d_name, strlen(d_name), dir->f_pos, fake_ino, d_type);\r
         if (err)\r
         {\r
             LogFunc(("filldir returned error %d\n", err));\r
index 88d29cf..2844426 100644 (file)
@@ -540,8 +540,10 @@ VBGLR3DECL(int)     VbglR3GuestPropConnect(uint32_t *pu32ClientId);
 VBGLR3DECL(int)     VbglR3GuestPropDisconnect(uint32_t u32ClientId);\r
 VBGLR3DECL(int)     VbglR3GuestPropWrite(uint32_t u32ClientId, const char *pszName, const char *pszValue, const char *pszFlags);\r
 VBGLR3DECL(int)     VbglR3GuestPropWriteValue(uint32_t u32ClientId, const char *pszName, const char *pszValue);\r
-VBGLR3DECL(int)     VbglR3GuestPropWriteValueV(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, va_list va);\r
-VBGLR3DECL(int)     VbglR3GuestPropWriteValueF(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, ...);\r
+VBGLR3DECL(int)     VbglR3GuestPropWriteValueV(uint32_t u32ClientId, const char *pszName,\r
+                                               const char *pszValueFormat, va_list va) RT_IPRT_FORMAT_ATTR(3, 0);\r
+VBGLR3DECL(int)     VbglR3GuestPropWriteValueF(uint32_t u32ClientId, const char *pszName,\r
+                                               const char *pszValueFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 VBGLR3DECL(int)     VbglR3GuestPropRead(uint32_t u32ClientId, const char *pszName, void *pvBuf, uint32_t cbBuf, char **ppszValue, uint64_t *pu64Timestamp, char **ppszFlags, uint32_t *pcbBufActual);\r
 VBGLR3DECL(int)     VbglR3GuestPropReadValue(uint32_t ClientId, const char *pszName, char *pszValue, uint32_t cchValue, uint32_t *pcchValueActual);\r
 VBGLR3DECL(int)     VbglR3GuestPropReadValueAlloc(uint32_t u32ClientId, const char *pszName, char **ppszValue);\r
index dffcbc6..885dd8f 100644 (file)
 #define VERR_VMM_SWITCHER_STUB              (-2715)\r
 /** HM returned in the wrong state. */\r
 #define VERR_VMM_WRONG_HM_VMCPU_STATE       (-2716)\r
+/** SMAP enabled, but the AC flag was found to be clear - check the kernel\r
+ * log for details. */\r
+#define VERR_VMM_SMAP_BUT_AC_CLEAR          (-2717)\r
 /** @} */\r
 \r
 \r
 #define VERR_VD_DMG_XML_PARSE_ERROR                 (-3284)\r
 /** Unable to locate a usable DMG file within the XAR archive. */\r
 #define VERR_VD_DMG_NOT_FOUND_INSIDE_XAR            (-3285)\r
+/** The size of the raw image is not dividable by 512 */\r
+#define VERR_VD_RAW_SIZE_MODULO_512                 (-3286)\r
+/** The size of the raw image is not dividable by 2048 */\r
+#define VERR_VD_RAW_SIZE_MODULO_2048                (-3287)\r
+/** The size of the raw optical image is too small (<= 32K) */\r
+#define VERR_VD_RAW_SIZE_OPTICAL_TOO_SMALL          (-3288)\r
+/** The size of the raw floppy image is too big (>2.88MB) */\r
+#define VERR_VD_RAW_SIZE_FLOPPY_TOO_BIG             (-3289)\r
+\r
 /** @} */\r
 \r
 \r
 #define VWRN_SUPDRV_TSC_DELTA_MEASUREMENT_FAILED     3746\r
 /** A TSC-delta measurement request is currently being serviced. */\r
 #define VERR_SUPDRV_TSC_DELTA_MEASUREMENT_BUSY      (-3747)\r
+/** The process trying to open VBoxDrv is not a budding VM process (1). */\r
+#define VERR_SUPDRV_NOT_BUDDING_VM_PROCESS_1        (-3748)\r
+/** The process trying to open VBoxDrv is not a budding VM process (2). */\r
+#define VERR_SUPDRV_NOT_BUDDING_VM_PROCESS_2        (-3749)\r
 /** @} */\r
 \r
 \r
 /** Internal VMX processing error no 5. */\r
 #define VERR_VMX_IPE_5                              (-4027)\r
 /** VT-x features for all modes (SMX and non-SMX) disabled by the BIOS. */\r
-#define VERR_VMX_MSR_ALL_VMXON_DISABLED             (-4028)\r
+#define VERR_VMX_MSR_ALL_VMX_DISABLED               (-4028)\r
 /** VT-x features disabled by the BIOS. */\r
-#define VERR_VMX_MSR_VMXON_DISABLED                 (-4029)\r
+#define VERR_VMX_MSR_VMX_DISABLED                   (-4029)\r
 /** VM-Entry Controls internal cache invalid. */\r
 #define VERR_VMX_ENTRY_CTLS_CACHE_INVALID           (-4030)\r
 /** VM-Exit Controls internal cache invalid. */\r
 /** VM-Execution Secondary Processor-based Controls internal\r
  *  cache invalid. */\r
 #define VERR_VMX_PROC_EXEC2_CTLS_CACHE_INVALID      (-4034)\r
+/** Failed to set VMXON enable bit while enabling VT-x through the MSR. */\r
+#define VERR_VMX_MSR_VMX_ENABLE_FAILED              (-4035)\r
+/** Failed to enable VMXON-in-SMX bit while enabling VT-x through the MSR. */\r
+#define VERR_VMX_MSR_SMX_VMX_ENABLE_FAILED          (-4036)\r
 /** @} */\r
 \r
 \r
index 4fe780b..1f09e21 100644 (file)
@@ -597,6 +597,184 @@ DECLINLINE(void) ASMSetFlags(RTCCUINTREG uFlags)
 \r
 \r
 /**\r
+ * Modifies the [RE]FLAGS register.\r
+ * @returns Original value.\r
+ * @param   fAndEfl     Flags to keep (applied first).\r
+ * @param   fOrEfl      Flags to be set.\r
+ */\r
+#if RT_INLINE_ASM_EXTERNAL && RT_INLINE_ASM_USES_INTRIN < 15\r
+DECLASM(RTCCUINTREG) ASMChangeFlags(RTCCUINTREG fAndEfl, RTCCUINTREG fOrEfl);\r
+#else\r
+DECLINLINE(RTCCUINTREG) ASMChangeFlags(RTCCUINTREG fAndEfl, RTCCUINTREG fOrEfl)\r
+{\r
+    RTCCUINTREG fOldEfl;\r
+# if RT_INLINE_ASM_GNU_STYLE\r
+#  ifdef RT_ARCH_AMD64\r
+    __asm__ __volatile__("pushfq\n\t"\r
+                         "movq  (%%rsp), %0\n\t"\r
+                         "andq  %0, %1\n\t"\r
+                         "orq   %3, %1\n\t"\r
+                         "mov   %1, (%%rsp)\n\t"\r
+                         "popfq\n\t"\r
+                         : "=&r" (fOldEfl),\r
+                           "=r" (fAndEfl)\r
+                         : "1" (fAndEfl),\r
+                           "rn" (fOrEfl) );\r
+#  else\r
+    __asm__ __volatile__("pushfl\n\t"\r
+                         "movl  (%%esp), %0\n\t"\r
+                         "andl  %1, (%%esp)\n\t"\r
+                         "orl   %2, (%%esp)\n\t"\r
+                         "popfl\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fAndEfl),\r
+                           "rn" (fOrEfl) );\r
+#  endif\r
+# elif RT_INLINE_ASM_USES_INTRIN >= 15\r
+    fOldEfl = __readeflags();\r
+    __writeeflags((fOldEfl & fAndEfl) | fOrEfl);\r
+# else\r
+    __asm\r
+    {\r
+#  ifdef RT_ARCH_AMD64\r
+        mov     rdx, [fAndEfl]\r
+        mov     rcx, [fOrEfl]\r
+        pushfq\r
+        mov     rax, [rsp]\r
+        and     rdx, rax\r
+        or      rdx, rcx\r
+        mov     [rsp], rdx\r
+        popfq\r
+        mov     [fOldEfl], rax\r
+#  else\r
+        mov     edx, [fAndEfl]\r
+        mov     ecx, [fOrEfl]\r
+        pushfd\r
+        mov     eax, [esp]\r
+        and     edx, eax\r
+        or      edx, ecx\r
+        mov     [esp], edx\r
+        popfd\r
+        mov     [fOldEfl], eax\r
+#  endif\r
+    }\r
+# endif\r
+    return fOldEfl;\r
+}\r
+#endif\r
+\r
+\r
+/**\r
+ * Modifies the [RE]FLAGS register by ORing in one or more flags.\r
+ * @returns Original value.\r
+ * @param   fOrEfl      The flags to be set (ORed in).\r
+ */\r
+#if RT_INLINE_ASM_EXTERNAL && RT_INLINE_ASM_USES_INTRIN < 15\r
+DECLASM(RTCCUINTREG) ASMAddFlags(RTCCUINTREG fOrEfl);\r
+#else\r
+DECLINLINE(RTCCUINTREG) ASMAddFlags(RTCCUINTREG fOrEfl)\r
+{\r
+    RTCCUINTREG fOldEfl;\r
+# if RT_INLINE_ASM_GNU_STYLE\r
+#  ifdef RT_ARCH_AMD64\r
+    __asm__ __volatile__("pushfq\n\t"\r
+                         "movq  (%%rsp), %0\n\t"\r
+                         "orq   %1, (%%rsp)\n\t"\r
+                         "popfq\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fOrEfl) );\r
+#  else\r
+    __asm__ __volatile__("pushfl\n\t"\r
+                         "movl  (%%esp), %0\n\t"\r
+                         "orl   %1, (%%esp)\n\t"\r
+                         "popfl\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fOrEfl) );\r
+#  endif\r
+# elif RT_INLINE_ASM_USES_INTRIN >= 15\r
+    fOldEfl = __readeflags();\r
+    __writeeflags(fOldEfl | fOrEfl);\r
+# else\r
+    __asm\r
+    {\r
+#  ifdef RT_ARCH_AMD64\r
+        mov     rcx, [fOrEfl]\r
+        pushfq\r
+        mov     rdx, [rsp]\r
+        or      [rsp], rcx\r
+        popfq\r
+        mov     [fOldEfl], rax\r
+#  else\r
+        mov     ecx, [fOrEfl]\r
+        pushfd\r
+        mov     edx, [esp]\r
+        or      [esp], ecx\r
+        popfd\r
+        mov     [fOldEfl], eax\r
+#  endif\r
+    }\r
+# endif\r
+    return fOldEfl;\r
+}\r
+#endif\r
+\r
+\r
+/**\r
+ * Modifies the [RE]FLAGS register by AND'ing out one or more flags.\r
+ * @returns Original value.\r
+ * @param   fAndEfl      The flags to keep.\r
+ */\r
+#if RT_INLINE_ASM_EXTERNAL && RT_INLINE_ASM_USES_INTRIN < 15\r
+DECLASM(RTCCUINTREG) ASMClearFlags(RTCCUINTREG fAndEfl);\r
+#else\r
+DECLINLINE(RTCCUINTREG) ASMClearFlags(RTCCUINTREG fAndEfl)\r
+{\r
+    RTCCUINTREG fOldEfl;\r
+# if RT_INLINE_ASM_GNU_STYLE\r
+#  ifdef RT_ARCH_AMD64\r
+    __asm__ __volatile__("pushfq\n\t"\r
+                         "movq  (%%rsp), %0\n\t"\r
+                         "andq  %1, (%%rsp)\n\t"\r
+                         "popfq\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fAndEfl) );\r
+#  else\r
+    __asm__ __volatile__("pushfl\n\t"\r
+                         "movl  (%%esp), %0\n\t"\r
+                         "andl  %1, (%%esp)\n\t"\r
+                         "popfl\n\t"\r
+                         : "=&r" (fOldEfl)\r
+                         : "rn" (fAndEfl) );\r
+#  endif\r
+# elif RT_INLINE_ASM_USES_INTRIN >= 15\r
+    fOldEfl = __readeflags();\r
+    __writeeflags(fOldEfl & fAndEfl);\r
+# else\r
+    __asm\r
+    {\r
+#  ifdef RT_ARCH_AMD64\r
+        mov     rdx, [fAndEfl]\r
+        pushfq\r
+        mov     rdx, [rsp]\r
+        and     [rsp], rdx\r
+        popfq\r
+        mov     [fOldEfl], rax\r
+#  else\r
+        mov     edx, [fAndEfl]\r
+        pushfd\r
+        mov     edx, [esp]\r
+        and     [esp], edx\r
+        popfd\r
+        mov     [fOldEfl], eax\r
+#  endif\r
+    }\r
+# endif\r
+    return fOldEfl;\r
+}\r
+#endif\r
+\r
+\r
+/**\r
  * Gets the content of the CPU timestamp counter register.\r
  *\r
  * @returns TSC.\r
index 2643451..3db1b01 100644 (file)
@@ -98,7 +98,7 @@ RTDECL(void)    RTAssertMsg1Weak(const char *pszExpr, unsigned uLine, const char
  * @param   pszFormat   Printf like format string.\r
  * @param   ...         Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /**\r
  * Weak version of RTAssertMsg2 that forwards to RTAssertMsg2WeakV.\r
  *\r
@@ -106,7 +106,7 @@ RTDECL(void)    RTAssertMsg2(const char *pszFormat, ...);
  *\r
  * @copydoc RTAssertMsg2\r
  */\r
-RTDECL(void)    RTAssertMsg2Weak(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2Weak(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * The 2nd (optional) part of an assert message.\r
@@ -114,14 +114,14 @@ RTDECL(void)    RTAssertMsg2Weak(const char *pszFormat, ...);
  * @param   pszFormat   Printf like format string.\r
  * @param   va          Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2V(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2V(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 /**\r
  * Weak version of RTAssertMsg2V that can be overridden locally in a module to\r
  * modify, redirect or otherwise mess with the assertion output.\r
  *\r
  * @copydoc RTAssertMsg2V\r
  */\r
-RTDECL(void)    RTAssertMsg2WeakV(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2WeakV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Additional information which should be appended to the 2nd part of an\r
@@ -130,7 +130,7 @@ RTDECL(void)    RTAssertMsg2WeakV(const char *pszFormat, va_list va);
  * @param   pszFormat   Printf like format string.\r
  * @param   ...         Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2Add(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2Add(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /**\r
  * Weak version of RTAssertMsg2Add that forwards to RTAssertMsg2AddWeakV.\r
  *\r
@@ -138,7 +138,7 @@ RTDECL(void)    RTAssertMsg2Add(const char *pszFormat, ...);
  *\r
  * @copydoc RTAssertMsg2Add\r
  */\r
-RTDECL(void)    RTAssertMsg2AddWeak(const char *pszFormat, ...);\r
+RTDECL(void)    RTAssertMsg2AddWeak(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * Additional information which should be appended to the 2nd part of an\r
@@ -147,14 +147,14 @@ RTDECL(void)    RTAssertMsg2AddWeak(const char *pszFormat, ...);
  * @param   pszFormat   Printf like format string.\r
  * @param   va          Arguments to that string.\r
  */\r
-RTDECL(void)    RTAssertMsg2AddV(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2AddV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 /**\r
  * Weak version of RTAssertMsg2AddV that can be overridden locally in a module\r
  * to modify, redirect or otherwise mess with the assertion output.\r
  *\r
  * @copydoc RTAssertMsg2AddV\r
  */\r
-RTDECL(void)    RTAssertMsg2AddWeakV(const char *pszFormat, va_list va);\r
+RTDECL(void)    RTAssertMsg2AddWeakV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 #ifdef IN_RING0\r
 /**\r
index 299997a..d8af93f 100644 (file)
 # define RT_THROW(type)\r
 #endif\r
 \r
+/** @def RT_IPRT_FORMAT_ATTR\r
+ * Identifies a function taking an IPRT format string.\r
+ * @param   a_iFmt  The index (1-based) of the format string argument.\r
+ * @param   a_iArgs The index (1-based) of the first format argument, use 0 for\r
+ *                  va_list.\r
+ */\r
+#if defined(__GNUC__) && defined(WITH_IPRT_FORMAT_ATTRIBUTE)\r
+# define RT_IPRT_FORMAT_ATTR(a_iFmt, a_iArgs)   __attribute__((__iprt_format__(a_iFmt, a_iArgs)))\r
+#else\r
+# define RT_IPRT_FORMAT_ATTR(a_iFmt, a_iArgs)\r
+#endif\r
+\r
+/** @def RT_IPRT_FORMAT_ATTR_MAYBE_NULL\r
+ * Identifies a function taking an IPRT format string, NULL is allowed.\r
+ * @param   a_iFmt  The index (1-based) of the format string argument.\r
+ * @param   a_iArgs The index (1-based) of the first format argument, use 0 for\r
+ *                  va_list.\r
+ */\r
+#if defined(__GNUC__) && defined(WITH_IPRT_FORMAT_ATTRIBUTE)\r
+# define RT_IPRT_FORMAT_ATTR_MAYBE_NULL(a_iFmt, a_iArgs)   __attribute__((__iprt_format_maybe_null__(a_iFmt, a_iArgs)))\r
+#else\r
+# define RT_IPRT_FORMAT_ATTR_MAYBE_NULL(a_iFmt, a_iArgs)\r
+#endif\r
+\r
+\r
 /** @def RT_GCC_SUPPORTS_VISIBILITY_HIDDEN\r
  * Indicates that the "hidden" visibility attribute can be used (GCC) */\r
 #if defined(__GNUC__)\r
index 8683918..a535528 100644 (file)
@@ -505,7 +505,7 @@ RTDECL(int)         RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg
  * @param   pszFormat           The format string.\r
  * @param   ...                 The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...);\r
+RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 /**\r
  * Fills in the error info details, with a vsprintf style message.\r
@@ -517,7 +517,7 @@ RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFo
  * @param   pszFormat           The format string.\r
  * @param   va                  The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);\r
+RTDECL(int)         RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Adds more error info details.\r
@@ -540,7 +540,7 @@ RTDECL(int)         RTErrInfoAdd(PRTERRINFO pErrInfo, int rc, const char *pszMsg
  * @param   pszFormat           The format string to add.\r
  * @param   ...                 The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...);\r
+RTDECL(int)         RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 /**\r
  * Adds more error info details, with a vsprintf style message.\r
@@ -552,7 +552,7 @@ RTDECL(int)         RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFo
  * @param   pszFormat           The format string to add.\r
  * @param   va                  The format arguments.\r
  */\r
-RTDECL(int)         RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);\r
+RTDECL(int)         RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Checks if the error info is set.\r
index 3a7176b..5eb8c92 100644 (file)
@@ -184,7 +184,7 @@ typedef enum RTLOGPHASE
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments as specified in the format string.\r
  */\r
-typedef DECLCALLBACK(void) FNRTLOGGER(const char *pszFormat, ...);\r
+typedef DECLCALLBACK(void) FNRTLOGGER(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 /** Pointer to logger function. */\r
 typedef FNRTLOGGER *PFNRTLOGGER;\r
 \r
@@ -213,7 +213,7 @@ typedef RCPTRTYPE(FNRTLOGFLUSHGC *) PFNRTLOGFLUSHGC;
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments specified in the format string.\r
  */\r
-typedef DECLCALLBACK(void) FNRTLOGPHASEMSG(PRTLOGGER pLogger, const char *pszFormat, ...);\r
+typedef DECLCALLBACK(void) FNRTLOGPHASEMSG(PRTLOGGER pLogger, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(2, 3);\r
 /** Pointer to header/footer message callback function. */\r
 typedef FNRTLOGPHASEMSG *PFNRTLOGPHASEMSG;\r
 \r
@@ -457,7 +457,8 @@ typedef enum RTLOGDEST
 } RTLOGDEST;\r
 \r
 \r
-RTDECL(void) RTLogPrintfEx(void *pvInstance, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);\r
+RTDECL(void) RTLogPrintfEx(void *pvInstance, unsigned fFlags, unsigned iGroup,\r
+                           const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(4, 5);\r
 \r
 \r
 #ifdef DOXYGEN_RUNNING\r
@@ -1702,7 +1703,8 @@ RTDECL(PRTLOGGER) RTLogRelGetDefaultInstanceEx(uint32_t fFlagsAndGroup);
  * @param   ...         Format arguments.\r
  * @remark  This is a worker function for LogRelIt.\r
  */\r
-RTDECL(void) RTLogRelLogger(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);\r
+RTDECL(void) RTLogRelLogger(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                            const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(4, 5);\r
 \r
 /**\r
  * Write to a logger instance, defaulting to the release one.\r
@@ -1718,7 +1720,8 @@ RTDECL(void) RTLogRelLogger(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,
  * @param   pszFormat   Format string.\r
  * @param   args        Format arguments.\r
  */\r
-RTDECL(void) RTLogRelLoggerV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogRelLoggerV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                             const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(4, 0);\r
 \r
 /**\r
  * printf like function for writing to the default release log.\r
@@ -1728,7 +1731,7 @@ RTDECL(void) RTLogRelLoggerV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogRelPrintf(const char *pszFormat, ...);\r
+RTDECL(void) RTLogRelPrintf(const char *pszFormat, ...)  RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * vprintf like function for writing to the default release log.\r
@@ -1738,7 +1741,7 @@ RTDECL(void) RTLogRelPrintf(const char *pszFormat, ...);
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogRelPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogRelPrintfV(const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Changes the buffering setting of the default release logger.\r
@@ -1952,7 +1955,7 @@ RTDECL(PRTLOGGER) RTLogDefaultInit(void);
  */\r
 RTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,\r
                         const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,\r
-                        uint32_t fDestFlags, const char *pszFilenameFmt, ...);\r
+                        uint32_t fDestFlags, const char *pszFilenameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(8, 9);\r
 \r
 /**\r
  * Create a logger instance.\r
@@ -1988,8 +1991,8 @@ RTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGro
 RTDECL(int) RTLogCreateEx(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,\r
                           const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,\r
                           uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory,\r
-                          uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,\r
-                          char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, ...);\r
+                          uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot, char *pszErrorMsg, size_t cchErrorMsg,\r
+                          const char *pszFilenameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(14, 15);\r
 \r
 /**\r
  * Create a logger instance.\r
@@ -2027,8 +2030,8 @@ RTDECL(int) RTLogCreateEx(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszG
 RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,\r
                            const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,\r
                            uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory,\r
-                           uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,\r
-                           char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, va_list args);\r
+                           uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot, char *pszErrorMsg, size_t cchErrorMsg,\r
+                           const char *pszFilenameFmt, va_list args) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(14, 0);\r
 \r
 /**\r
  * Create a logger instance for singled threaded ring-0 usage.\r
@@ -2260,7 +2263,7 @@ RTDECL(void) RTLogFlush(PRTLOGGER pLogger);
  * @param   pszFormat   Format string.\r
  * @param   ...         Format arguments.\r
  */\r
-RTDECL(void) RTLogLogger(PRTLOGGER pLogger, void *pvCallerRet, const char *pszFormat, ...);\r
+RTDECL(void) RTLogLogger(PRTLOGGER pLogger, void *pvCallerRet, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 /**\r
  * Write to a logger instance.\r
@@ -2269,7 +2272,7 @@ RTDECL(void) RTLogLogger(PRTLOGGER pLogger, void *pvCallerRet, const char *pszFo
  * @param   pszFormat   Format string.\r
  * @param   args        Format arguments.\r
  */\r
-RTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Write to a logger instance.\r
@@ -2286,7 +2289,8 @@ RTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args
  * @param   ...         Format arguments.\r
  * @remark  This is a worker function of LogIt.\r
  */\r
-RTDECL(void) RTLogLoggerEx(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);\r
+RTDECL(void) RTLogLoggerEx(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                           const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(4, 5);\r
 \r
 /**\r
  * Write to a logger instance.\r
@@ -2302,7 +2306,8 @@ RTDECL(void) RTLogLoggerEx(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,
  * @param   pszFormat   Format string.\r
  * @param   args        Format arguments.\r
  */\r
-RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,\r
+                            const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(4, 0);\r
 \r
 /**\r
  * printf like function for writing to the default log.\r
@@ -2312,7 +2317,7 @@ RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup,
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogPrintf(const char *pszFormat, ...);\r
+RTDECL(void) RTLogPrintf(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * vprintf like function for writing to the default log.\r
@@ -2322,7 +2327,7 @@ RTDECL(void) RTLogPrintf(const char *pszFormat, ...);
  *\r
  * @remark The API doesn't support formatting of floating point numbers at the moment.\r
  */\r
-RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args)  RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Dumper vprintf-like function outputting to a logger.\r
@@ -2332,7 +2337,7 @@ RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args);
  * @param   pszFormat       Format string.\r
  * @param   va              Format arguments.\r
  */\r
-RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va);\r
+RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(2, 0);\r
 \r
 \r
 #ifndef DECLARED_FNRTSTROUTPUT          /* duplicated in iprt/string.h */\r
@@ -2361,7 +2366,7 @@ typedef FNRTSTROUTPUT *PFNRTSTROUTPUT;
  * @param   pszFormat   Format string.\r
  * @param   args        Argument list.\r
  */\r
-RTDECL(size_t) RTLogFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArg, const char *pszFormat, va_list args);\r
+RTDECL(size_t) RTLogFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArg, const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * Write log buffer to COM port.\r
@@ -2378,7 +2383,7 @@ RTDECL(void) RTLogWriteCom(const char *pach, size_t cb);
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...);\r
+RTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * Prints a formatted string to the serial port used for logging.\r
@@ -2387,7 +2392,7 @@ RTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...);
  * @param   pszFormat   Format string.\r
  * @param   args        Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t)  RTLogComPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(size_t)  RTLogComPrintfV(const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 \r
 #if 0 /* not implemented yet */\r
@@ -2497,7 +2502,7 @@ RTDECL(void) RTLogWriteStdErr(const char *pach, size_t cb);
  * @param   pszFormat   Format string.\r
  * @param   ...         Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t) RTLogBackdoorPrintf(const char *pszFormat, ...);\r
+RTDECL(size_t) RTLogBackdoorPrintf(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2);\r
 \r
 /**\r
  * Prints a formatted string to the backdoor port.\r
@@ -2506,7 +2511,7 @@ RTDECL(size_t) RTLogBackdoorPrintf(const char *pszFormat, ...);
  * @param   pszFormat   Format string.\r
  * @param   args        Optional arguments specified in the format string.\r
  */\r
-RTDECL(size_t)  RTLogBackdoorPrintfV(const char *pszFormat, va_list args);\r
+RTDECL(size_t)  RTLogBackdoorPrintfV(const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 #endif /* VBOX */\r
 \r
index 2cd198b..6089a67 100644 (file)
 # define RTSymlinkIsDangling                            RT_MANGLER(RTSymlinkIsDangling)\r
 # define RTSymlinkRead                                  RT_MANGLER(RTSymlinkRead)\r
 # define RTSymlinkReadA                                 RT_MANGLER(RTSymlinkReadA)\r
+# define RTSystemIsInsideVM                             RT_MANGLER(RTSystemIsInsideVM)\r
 # define RTSystemQueryAvailableRam                      RT_MANGLER(RTSystemQueryAvailableRam)\r
 # define RTSystemQueryDmiString                         RT_MANGLER(RTSystemQueryDmiString)\r
 # define RTSystemQueryOSInfo                            RT_MANGLER(RTSystemQueryOSInfo)\r
index 032ffd3..606e364 100644 (file)
@@ -130,7 +130,8 @@ RTDECL(int)  RTSemEventCreate(PRTSEMEVENT phEventSem);
  *                              optional (NULL).  Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int)  RTSemEventCreateEx(PRTSEMEVENT phEventSem, uint32_t fFlags, RTLOCKVALCLASS hClass, const char *pszNameFmt, ...);\r
+RTDECL(int)  RTSemEventCreateEx(PRTSEMEVENT phEventSem, uint32_t fFlags, RTLOCKVALCLASS hClass,\r
+                                const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(4, 5);\r
 \r
 /** @name RTSemMutexCreateEx flags\r
  * @{ */\r
@@ -300,7 +301,7 @@ RTDECL(int)  RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem);
  * @param   ...                 Format string arguments.\r
  */\r
 RTDECL(int)  RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass,\r
-                                     const char *pszNameFmt, ...);\r
+                                     const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(4, 5);\r
 \r
 /** @name RTSemMutexCreateEx flags\r
  * @{ */\r
@@ -480,8 +481,8 @@ RTDECL(int)  RTSemMutexCreate(PRTSEMMUTEX phMutexSem);
  *                              optional (NULL).  Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int) RTSemMutexCreateEx(PRTSEMMUTEX phMutexSem, uint32_t fFlags,\r
-                               RTLOCKVALCLASS hClass, uint32_t uSubClass, const char *pszNameFmt, ...);\r
+RTDECL(int) RTSemMutexCreateEx(PRTSEMMUTEX phMutexSem, uint32_t fFlags, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
+                               const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(5, 6);\r
 \r
 /** @name RTSemMutexCreateEx flags\r
  * @{ */\r
@@ -844,8 +845,8 @@ RTDECL(int)   RTSemRWCreate(PRTSEMRW phRWSem);
  *                              optional (NULL).  Max length is 32 bytes.\r
  * @param   ...                 Format string arguments.\r
  */\r
-RTDECL(int)   RTSemRWCreateEx(PRTSEMRW phRWSem, uint32_t fFlags,\r
-                              RTLOCKVALCLASS hClass, uint32_t uSubClass, const char *pszNameFmt, ...);\r
+RTDECL(int)   RTSemRWCreateEx(PRTSEMRW phRWSem, uint32_t fFlags, RTLOCKVALCLASS hClass, uint32_t uSubClass,\r
+                              const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR_MAYBE_NULL(5, 6);\r
 \r
 /** @name RTSemRWCreateEx flags\r
  * @{ */\r
index edb2404..05b496e 100644 (file)
@@ -33,7 +33,9 @@
 #include <iprt/err.h> /* for VINF_SUCCESS */\r
 #if defined(RT_OS_LINUX) && defined(__KERNEL__)\r
   RT_C_DECLS_BEGIN\r
+# define new newhack /* string.h: strreplace */\r
 # include <linux/string.h>\r
+# undef new\r
   RT_C_DECLS_END\r
 \r
 #elif defined(IN_XF86_MODULE) && !defined(NO_ANSIC)\r
@@ -1726,7 +1728,8 @@ typedef FNSTRFORMAT *PFNSTRFORMAT;
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   InArgs      Argument list.\r
  */\r
-RTDECL(size_t) RTStrFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat, const char *pszFormat, va_list InArgs);\r
+RTDECL(size_t) RTStrFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat,\r
+                            const char *pszFormat, va_list InArgs) RT_IPRT_FORMAT_ATTR(5, 0);\r
 \r
 /**\r
  * Partial implementation of a printf like formatter.\r
@@ -1743,7 +1746,8 @@ RTDECL(size_t) RTStrFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRF
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         Argument list.\r
  */\r
-RTDECL(size_t) RTStrFormat(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat, const char *pszFormat, ...);\r
+RTDECL(size_t) RTStrFormat(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFORMAT pfnFormat, void *pvArgFormat,\r
+                           const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(5, 6);\r
 \r
 /**\r
  * Formats an integer number according to the parameters.\r
@@ -1756,7 +1760,8 @@ RTDECL(size_t) RTStrFormat(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, PFNSTRFO
  * @param   cchPrecision    Precision.\r
  * @param   fFlags          Flags, RTSTR_F_XXX.\r
  */\r
-RTDECL(int) RTStrFormatNumber(char *psz, uint64_t u64Value, unsigned int uiBase, signed int cchWidth, signed int cchPrecision, unsigned int fFlags);\r
+RTDECL(int) RTStrFormatNumber(char *psz, uint64_t u64Value, unsigned int uiBase, signed int cchWidth, signed int cchPrecision,\r
+                              unsigned int fFlags);\r
 \r
 /**\r
  * Formats an unsigned 8-bit number.\r
@@ -1949,7 +1954,7 @@ RTDECL(int) RTStrFormatTypeSetUser(const char *pszType, void *pvUser);
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   args        The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintfV(char *pszBuffer, size_t cchBuffer, const char *pszFormat, va_list args);\r
+RTDECL(size_t) RTStrPrintfV(char *pszBuffer, size_t cchBuffer, const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(3, 0);\r
 \r
 /**\r
  * String printf.\r
@@ -1961,7 +1966,7 @@ RTDECL(size_t) RTStrPrintfV(char *pszBuffer, size_t cchBuffer, const char *pszFo
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintf(char *pszBuffer, size_t cchBuffer, const char *pszFormat, ...);\r
+RTDECL(size_t) RTStrPrintf(char *pszBuffer, size_t cchBuffer, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);\r
 \r
 \r
 /**\r
@@ -1976,7 +1981,8 @@ RTDECL(size_t) RTStrPrintf(char *pszBuffer, size_t cchBuffer, const char *pszFor
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   args        The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintfExV(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer, const char *pszFormat, va_list args);\r
+RTDECL(size_t) RTStrPrintfExV(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer,\r
+                              const char *pszFormat, va_list args)  RT_IPRT_FORMAT_ATTR(5, 0);\r
 \r
 /**\r
  * String printf with custom formatting.\r
@@ -1990,7 +1996,8 @@ RTDECL(size_t) RTStrPrintfExV(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuff
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-RTDECL(size_t) RTStrPrintfEx(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer, const char *pszFormat, ...);\r
+RTDECL(size_t) RTStrPrintfEx(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffer, size_t cchBuffer,\r
+                             const char *pszFormat, ...)  RT_IPRT_FORMAT_ATTR(5, 6);\r
 \r
 \r
 /**\r
@@ -2020,7 +2027,7 @@ RTDECL(size_t) RTStrPrintfEx(PFNSTRFORMAT pfnFormat, void *pvArg, char *pszBuffe
  * @param   args        The format argument.\r
  * @param   pszTag      Allocation tag used for statistics and such.\r
  */\r
-RTDECL(int) RTStrAPrintfVTag(char **ppszBuffer, const char *pszFormat, va_list args, const char *pszTag);\r
+RTDECL(int) RTStrAPrintfVTag(char **ppszBuffer, const char *pszFormat, va_list args, const char *pszTag) RT_IPRT_FORMAT_ATTR(2, 0);\r
 \r
 /**\r
  * Allocating string printf.\r
@@ -2034,7 +2041,7 @@ RTDECL(int) RTStrAPrintfVTag(char **ppszBuffer, const char *pszFormat, va_list a
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(int) RTStrAPrintf(char **ppszBuffer, const char *pszFormat, ...)\r
+DECLINLINE(int) RT_IPRT_FORMAT_ATTR(2, 3) RTStrAPrintf(char **ppszBuffer, const char *pszFormat, ...)\r
 {\r
     int     cbRet;\r
     va_list va;\r
@@ -2057,7 +2064,7 @@ DECLINLINE(int) RTStrAPrintf(char **ppszBuffer, const char *pszFormat, ...)
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(int) RTStrAPrintfTag(char **ppszBuffer, const char *pszTag, const char *pszFormat, ...)\r
+DECLINLINE(int) RT_IPRT_FORMAT_ATTR(3, 4) RTStrAPrintfTag(char **ppszBuffer, const char *pszTag, const char *pszFormat, ...)\r
 {\r
     int     cbRet;\r
     va_list va;\r
@@ -2086,7 +2093,7 @@ DECLINLINE(int) RTStrAPrintfTag(char **ppszBuffer, const char *pszTag, const cha
  * @param   args        The format argument.\r
  * @param   pszTag      Allocation tag used for statistics and such.\r
  */\r
-RTDECL(char *) RTStrAPrintf2VTag(const char *pszFormat, va_list args, const char *pszTag);\r
+RTDECL(char *) RTStrAPrintf2VTag(const char *pszFormat, va_list args, const char *pszTag) RT_IPRT_FORMAT_ATTR(1, 0);\r
 \r
 /**\r
  * Allocating string printf, version 2 (default tag).\r
@@ -2096,7 +2103,7 @@ RTDECL(char *) RTStrAPrintf2VTag(const char *pszFormat, va_list args, const char
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(char *) RTStrAPrintf2(const char *pszFormat, ...)\r
+DECLINLINE(char *) RT_IPRT_FORMAT_ATTR(1, 2) RTStrAPrintf2(const char *pszFormat, ...)\r
 {\r
     char   *pszRet;\r
     va_list va;\r
@@ -2115,7 +2122,7 @@ DECLINLINE(char *) RTStrAPrintf2(const char *pszFormat, ...)
  * @param   pszFormat   Pointer to the format string, @see pg_rt_str_format.\r
  * @param   ...         The format argument.\r
  */\r
-DECLINLINE(char *) RTStrAPrintf2Tag(const char *pszTag, const char *pszFormat, ...)\r
+DECLINLINE(char *) RT_IPRT_FORMAT_ATTR(2, 3) RTStrAPrintf2Tag(const char *pszTag, const char *pszFormat, ...)\r
 {\r
     char   *pszRet;\r
     va_list va;\r
index 3436f53..23687fc 100644 (file)
@@ -70,7 +70,7 @@ RT_C_DECLS_END
 #  endif\r
 #  include <sys/types.h>\r
 #  ifndef offsetof\r
-#   error "offsetof is not defined..."\r
+#   error "offsetof is not defined!"\r
 #  endif\r
 \r
 # elif defined(RT_OS_FREEBSD) && HC_ARCH_BITS == 64 && defined(RT_ARCH_X86)\r
@@ -2198,7 +2198,7 @@ typedef FNRTPROGRESS *PFNRTPROGRESS;
  * @param   pszFormat       The format string.\r
  * @param   va              Arguments for the format string.\r
  */\r
-typedef DECLCALLBACK(void) FNRTDUMPPRINTFV(void *pvUser, const char *pszFormat, va_list va);\r
+typedef DECLCALLBACK(void) FNRTDUMPPRINTFV(void *pvUser, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(2, 0);\r
 /** Pointer to a generic printf-like function for dumping. */\r
 typedef FNRTDUMPPRINTFV *PFNRTDUMPPRINTFV;\r
 \r
@@ -2415,7 +2415,7 @@ typedef const RTRANGE *PCRTRANGE;
  */\r
 typedef union RTPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void                   *pv;\r
     /** As a signed integer. */\r
     intptr_t                i;\r
@@ -2454,7 +2454,7 @@ typedef RTPTRUNION *PRTPTRUNION;
  */\r
 typedef union RTCPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void const             *pv;\r
     /** As a signed integer. */\r
     intptr_t                i;\r
@@ -2493,7 +2493,7 @@ typedef RTCPTRUNION *PRTCPTRUNION;
  */\r
 typedef union RTVPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void volatile          *pv;\r
     /** As a signed integer. */\r
     intptr_t                i;\r
@@ -2532,7 +2532,7 @@ typedef RTVPTRUNION *PRTVPTRUNION;
  */\r
 typedef union RTCVPTRUNION\r
 {\r
-    /** Pointer into the void... */\r
+    /** Pointer into the void. */\r
     void const volatile            *pv;\r
     /** As a signed integer. */\r
     intptr_t                        i;\r
index 2f03709..cc0873f 100644 (file)
 \r
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)\r
 \r
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)\r
+static const char *sf_follow_link(struct dentry *dentry, void **cookie)\r
+# else\r
 static void *sf_follow_link(struct dentry *dentry, struct nameidata *nd)\r
+# endif\r
 {\r
     struct inode *inode = dentry->d_inode;\r
     struct sf_glob_info *sf_g = GET_GLOB_INFO(inode->i_sb);\r
@@ -40,22 +44,32 @@ static void *sf_follow_link(struct dentry *dentry, struct nameidata *nd)
             error = -EPROTO;\r
         }\r
     }\r
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)\r
+    return error ? ERR_PTR(error) : (*cookie = path);\r
+# else\r
     nd_set_link(nd, error ? ERR_PTR(error) : path);\r
     return NULL;\r
+# endif\r
 }\r
 \r
+# if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)\r
 static void sf_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)\r
 {\r
     char *page = nd_get_link(nd);\r
     if (!IS_ERR(page))\r
         free_page((unsigned long)page);\r
 }\r
+#endif\r
 \r
 struct inode_operations sf_lnk_iops =\r
 {\r
     .readlink       = generic_readlink,\r
     .follow_link    = sf_follow_link,\r
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)\r
+    .put_link       = free_page_put_link,\r
+# else\r
     .put_link       = sf_put_link\r
+# endif\r
 };\r
 \r
 #endif\r
index fc73f14..f890958 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: the-linux-kernel.h 100874 2015-06-09 14:01:31Z bird $ */\r
+/* $Id: the-linux-kernel.h 102085 2015-08-13 13:26:00Z bird $ */\r
 /** @file\r
  * IPRT - Include all necessary headers for the Linux kernel.\r
  */\r
@@ -382,12 +382,12 @@ DECLINLINE(unsigned long) msecs_to_jiffies(unsigned int cMillies)
  * The AMD 64 switch_to in macro in arch/x86/include/asm/switch_to.h stopped\r
  * restoring flags.\r
  * @{ */\r
-#ifdef CONFIG_X86_SMAP\r
+#if defined(CONFIG_X86_SMAP) || defined(RT_STRICT) || defined(IPRT_WITH_EFLAGS_AC_PRESERVING)\r
 # include <iprt/asm-amd64-x86.h>\r
 # define IPRT_X86_EFL_AC                    RT_BIT(18)\r
-# define IPRT_LINUX_SAVE_EFL_AC()           RTCCUINTREG fSavedEfl = ASMGetFlags();\r
+# define IPRT_LINUX_SAVE_EFL_AC()           RTCCUINTREG fSavedEfl = ASMGetFlags()\r
 # define IPRT_LINUX_RESTORE_EFL_AC()        ASMSetFlags(fSavedEfl)\r
-# define IPRT_LINUX_RESTORE_EFL_ONLY_AC()   ASMSetFlags((ASMGetFlags() & ~IPRT_X86_EFL_AC) | (fSavedEfl & IPRT_X86_EFL_AC))\r
+# define IPRT_LINUX_RESTORE_EFL_ONLY_AC()   ASMChangeFlags(~IPRT_X86_EFL_AC, fSavedEfl & IPRT_X86_EFL_AC)\r
 #else\r
 # define IPRT_LINUX_SAVE_EFL_AC()           do { } while (0)\r
 # define IPRT_LINUX_RESTORE_EFL_AC()        do { } while (0)\r
index f001e81..02cbdff 100644 (file)
@@ -3,9 +3,9 @@
 
 #define VBOX_VERSION_MAJOR 5
 #define VBOX_VERSION_MINOR 0
-#define VBOX_VERSION_BUILD 0
-#define VBOX_VERSION_STRING_RAW "5.0.0"
-#define VBOX_VERSION_STRING "5.0.0"
+#define VBOX_VERSION_BUILD 2
+#define VBOX_VERSION_STRING_RAW "5.0.2"
+#define VBOX_VERSION_STRING "5.0.2"
 #define VBOX_API_VERSION_STRING "5_0"
 
 #define VBOX_BUILD_SERVER_BUILD 1
index 2cd198b..6089a67 100644 (file)
 # define RTSymlinkIsDangling                            RT_MANGLER(RTSymlinkIsDangling)\r
 # define RTSymlinkRead                                  RT_MANGLER(RTSymlinkRead)\r
 # define RTSymlinkReadA                                 RT_MANGLER(RTSymlinkReadA)\r
+# define RTSystemIsInsideVM                             RT_MANGLER(RTSystemIsInsideVM)\r
 # define RTSystemQueryAvailableRam                      RT_MANGLER(RTSystemQueryAvailableRam)\r
 # define RTSystemQueryDmiString                         RT_MANGLER(RTSystemQueryDmiString)\r
 # define RTSystemQueryOSInfo                            RT_MANGLER(RTSystemQueryOSInfo)\r
index f001e81..02cbdff 100644 (file)
@@ -3,9 +3,9 @@
 
 #define VBOX_VERSION_MAJOR 5
 #define VBOX_VERSION_MINOR 0
-#define VBOX_VERSION_BUILD 0
-#define VBOX_VERSION_STRING_RAW "5.0.0"
-#define VBOX_VERSION_STRING "5.0.0"
+#define VBOX_VERSION_BUILD 2
+#define VBOX_VERSION_STRING_RAW "5.0.2"
+#define VBOX_VERSION_STRING "5.0.2"
 #define VBOX_API_VERSION_STRING "5_0"
 
 #define VBOX_BUILD_SERVER_BUILD 1