]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/proc_reg.h
xnu-4570.31.3.tar.gz
[apple/xnu.git] / osfmk / i386 / proc_reg.h
index 9e1e744d1c4e33691a3fa84f47e826d3586cf328..530f9e61c7fac099d5384eda721e13fcaaeec50d 100644 (file)
@@ -306,9 +306,9 @@ static inline uintptr_t get_cr3_base(void)
        return(cr3 & ~(0xFFFULL));
 }
 
-static inline void set_cr3_composed(uintptr_t base, uint16_t pcid, uint32_t preserve)
+static inline void set_cr3_composed(uintptr_t base, uint16_t pcid, uint64_t preserve)
 {
-       __asm__ volatile("mov %0, %%cr3" : : "r" (base | pcid | ( ( (uint64_t)preserve) << 63) ) );
+       __asm__ volatile("mov %0, %%cr3" : : "r" (base | pcid | ( (preserve) << 63) ) );
 }
 
 static inline uintptr_t get_cr4(void)
@@ -383,7 +383,13 @@ static inline void hlt(void)
 
 static inline void flush_tlb_raw(void)
 {
-       set_cr3_raw(get_cr3_raw());
+       uintptr_t cr4 = get_cr4();
+       if (cr4 & CR4_PGE) {
+               set_cr4(cr4 & ~CR4_PGE);
+               set_cr4(cr4 | CR4_PGE);
+       } else {
+               set_cr3_raw(get_cr3_raw());
+       }
 }
 extern int rdmsr64_carefully(uint32_t msr, uint64_t *val);
 extern int wrmsr64_carefully(uint32_t msr, uint64_t val);