@@ -20,9 +20,19 @@ static uint64_t *kernelPagingRoot; // pml4 -- PHYSICAL ADDRESS
20
20
*/
21
21
22
22
int platformPagingSetup () {
23
- // identity map the lower memory
24
- // this is already true but we need to replace the paging structs built
25
- // by the boot loader
23
+ // check for PAE/NX
24
+ CPUIDRegisters regs ;
25
+ memset (& regs , 0 , sizeof (CPUIDRegisters ));
26
+ readCPUID (0x80000001 , & regs );
27
+ if (!(regs .edx & (1 << 20 ))) {
28
+ KERROR ("CPU doesn't support PAE/NX\n" );
29
+ while (1 );
30
+ }
31
+
32
+ // enable no-execute pages
33
+ writeMSR (MSR_EFER , readMSR (MSR_EFER ) | MSR_EFER_NX_ENABLE );
34
+
35
+ // map physical memory into the higher half
26
36
uint64_t * pml4 = (uint64_t * )pmmAllocate (); // 512 GiB per entry
27
37
uint64_t * pdp = (uint64_t * )pmmAllocate (); // 1 GiB per entry
28
38
@@ -58,7 +68,7 @@ int platformPagingSetup() {
58
68
writeCR3 ((uint64_t )pml4 );
59
69
60
70
ttyRemapFramebuffer ();
61
- KDEBUG ("kernel paging structures created, identity mapped %d GiB\n" , KERNEL_BASE_MAPPED );
71
+ KDEBUG ("kernel paging structures created, mapped %d GiB at 0x%X \n" , KERNEL_BASE_MAPPED , KERNEL_MMIO_BASE );
62
72
kernelPagingRoot = pml4 ;
63
73
return 0 ;
64
74
}
@@ -137,7 +147,7 @@ uintptr_t platformGetPage(int *flags, uintptr_t addr) {
137
147
if (!(ptEntry & PT_PAGE_NXE )) * flags |= PLATFORM_PAGE_EXEC ;
138
148
if (ptEntry & PT_PAGE_NO_CACHE ) * flags |= PLATFORM_PAGE_NO_CACHE ;
139
149
140
- return (ptEntry & ~(PAGE_SIZE - 1 )) | offset ;
150
+ return (ptEntry & ~(PAGE_SIZE - 1 ) & ~( PT_PAGE_NXE ) ) | offset ;
141
151
}
142
152
143
153
/* platformMapPage(): maps a physical address to a logical address
@@ -205,7 +215,7 @@ uintptr_t platformMapPage(uintptr_t logical, uintptr_t physical, int flags) {
205
215
if (flags & PLATFORM_PAGE_PRESENT ) parsedFlags |= PT_PAGE_PRESENT ;
206
216
if (flags & PLATFORM_PAGE_WRITE ) parsedFlags |= PT_PAGE_RW ;
207
217
if (flags & PLATFORM_PAGE_USER ) parsedFlags |= PT_PAGE_USER ;
208
- if (!flags & PLATFORM_PAGE_EXEC ) parsedFlags |= PT_PAGE_NXE ;
218
+ if (!( flags & PLATFORM_PAGE_EXEC ) ) parsedFlags |= PT_PAGE_NXE ;
209
219
if (flags & PLATFORM_PAGE_NO_CACHE ) parsedFlags |= PT_PAGE_NO_CACHE | PT_PAGE_WRITE_THROUGH ;
210
220
211
221
pt [ptIndex ] = physical | parsedFlags ;
0 commit comments