diff --git a/src/hulk/cpu.d b/src/hulk/cpu.d index c46fae6..73c7f4b 100644 --- a/src/hulk/cpu.d +++ b/src/hulk/cpu.d @@ -57,6 +57,7 @@ enum ulong XCR0_PKRU = 0x100u; /** @} */ /** MSR register numbers. @{ */ +enum uint MSR_PAT = 0x277u; enum uint MSR_EFER = 0xC000_0080u; /** @} */ diff --git a/src/hulk/hurl/hurl.d b/src/hulk/hurl/hurl.d index bc100a1..9e41bf3 100644 --- a/src/hulk/hurl/hurl.d +++ b/src/hulk/hurl/hurl.d @@ -91,7 +91,7 @@ struct Hurl map_range(HULK_FRAMEBUFFER, cast(ulong)header.bootinfo.fb.buffer, header.bootinfo.fb.height * header.bootinfo.fb.stride * 4u, - PT_WRITABLE | PT_NO_EXECUTE); + PT_PAT | PT_WRITABLE | PT_NO_EXECUTE); /* Map framebuffer buffer1. */ map_range(cast(ulong)header.bootinfo.fb_buffer1_phys, cast(ulong)header.bootinfo.fb_buffer1_phys, @@ -197,6 +197,10 @@ struct Hurl } } + /* Set PAT4 to indicate Write Combining so we can set the PAT bit in a + * page table entry to use Write Combining for that page. */ + wrmsr(MSR_PAT, (rdmsr(MSR_PAT) & 0xFFFF_FF00_FFFF_FFFFu) | 0x0000_0001_0000_0000u); + /* * Now that we have available physical pages to allocate from, we can * build new page tables to replace the bootloader page tables. diff --git a/src/hulk/pagetable.d b/src/hulk/pagetable.d index 61ed22f..7475c8b 100644 --- a/src/hulk/pagetable.d +++ b/src/hulk/pagetable.d @@ -11,7 +11,8 @@ enum ulong PT_WRITE_THROUGH = 0x8u; enum ulong PT_DISABLE_CACHE = 0x10u; enum ulong PT_ACCESSED = 0x20u; enum ulong PT_DIRTY = 0x40u; -enum ulong PT_HUGE_PAGE = 0x80u; +enum ulong PT_PAT = 0x80u; /* Page table entry bit. */ +enum ulong PT_HUGE_PAGE = 0x80u; /* Page directory entry bit. */ enum ulong PT_GLOBAL = 0x100u; enum ulong PT_NO_EXECUTE = 0x8000_0000_0000_0000u; /** @} */