]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOHibernateRestoreKernel.c
xnu-4570.51.1.tar.gz
[apple/xnu.git] / iokit / Kernel / IOHibernateRestoreKernel.c
index 141a280a54d5cb8bb4afbf3c2489e62fa50372f1..fc5a1b7f22899cf657cdaa88c54da5c1d389ec35 100644 (file)
@@ -73,17 +73,7 @@ extern void acpi_wake_prot_entry(void);
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #if defined(__i386__) || defined(__x86_64__)
-
-#define rdtsc(lo,hi) \
-    __asm__ volatile("lfence; rdtsc; lfence" : "=a" (lo), "=d" (hi))
-
-static inline uint64_t rdtsc64(void)
-{
-    uint64_t lo, hi;
-    rdtsc(lo, hi);
-    return ((hi) << 32) | (lo);
-}
-
+#include <i386/proc_reg.h>
 #else
 
 static inline uint64_t rdtsc64(void)
@@ -396,21 +386,21 @@ store_one_page(uint32_t procFlags, uint32_t * src, uint32_t compressedSize,
                uint32_t * buffer, uint32_t ppnum)
 {
        uint64_t dst = ptoa_64(ppnum);
-       uint8_t scratch[WKdm_SCRATCH_BUF_SIZE] __attribute__ ((aligned (16)));
+       uint8_t scratch[WKdm_SCRATCH_BUF_SIZE_INTERNAL] __attribute__ ((aligned (16)));
 
        if (compressedSize != PAGE_SIZE)
        {
                dst = pal_hib_map(DEST_COPY_AREA, dst);
                if (compressedSize != 4) WKdm_decompress_new((WK_word*) src, (WK_word*)(uintptr_t)dst, (WK_word*) &scratch[0], compressedSize);
-               else {
-                       int i;
-                       uint32_t *s, *d;
-                       
-                       s = src;
-                       d = (uint32_t *)(uintptr_t)dst;
+               else
+               {
+                       size_t i;
+                       uint32_t s, *d;
 
-                       for (i = 0; i < (int)(PAGE_SIZE / sizeof(int32_t)); i++)
-                               *d++ = *s;
+                       s = *src;
+                       d = (uint32_t *)(uintptr_t)dst;
+            if (!s) __nosan_bzero((void *) dst, PAGE_SIZE);
+            else    for (i = 0; i < (PAGE_SIZE / sizeof(int32_t)); i++) *d++ = s;
                }
        }
        else
@@ -456,7 +446,7 @@ hibernate_kernel_entrypoint(uint32_t p1,
     uint64_t timeStart;
     timeStart = rdtsc64();
 
-    assert_static(sizeof(IOHibernateImageHeader) == 512);
+    static_assert(sizeof(IOHibernateImageHeader) == 512);
 
     headerPhys = ptoa_64(p1);
 
@@ -465,7 +455,7 @@ hibernate_kernel_entrypoint(uint32_t p1,
 
     debug_code(kIOHibernateRestoreCodeImageStart, headerPhys);
 
-    memcpy(gIOHibernateCurrentHeader,
+    __nosan_memcpy(gIOHibernateCurrentHeader,
           (void *) pal_hib_map(IMAGE_AREA, headerPhys), 
           sizeof(IOHibernateImageHeader));
 
@@ -638,7 +628,7 @@ hibernate_kernel_entrypoint(uint32_t p1,
                    // alloc new buffer page
                    bufferPage = hibernate_page_list_grab(map, &nextFree);
                    dst = (uint32_t *)pal_hib_map(DEST_COPY_AREA, ptoa_64(bufferPage));
-                   memcpy(dst, src, compressedSize);
+                   __nosan_memcpy(dst, src, compressedSize);
                }
                if (copyPageIndex > ((PAGE_SIZE >> 2) - 3))
                {