]>
git.dujemihanovic.xyz Git - nameless-os.git/blob - boot/x86/stage3/paging.c
5a0e5f707db9806fcf84a69930da23810f2369f2
1 /* Code for enabling paging */
6 /* Preallocated page tables. */
7 static uint32_t page_directory
[1024] __attribute__((aligned(4096))) __attribute__((section(".data")));
8 static uint32_t page_table_firstmb
[1024] __attribute__((aligned(4096))) __attribute__((section(".data")));
9 static uint32_t page_table_kernel
[1024] __attribute__((aligned(4096))) __attribute__((section(".data")));
14 asm ("mov %0, %%cr3": : "a" (page_directory
));
15 asm ("mov %%cr0, %0": "=a" (cr3
));
17 asm ("mov %0, %%cr0": : "a" (cr3
));
20 int map_address(void *physical
, void *virtual, int flags
)
22 if ((uint32_t) physical
& 0xfff || (uint32_t) virtual & 0xfff)
23 return ADDRESS_NOT_ALIGNED
;
25 uint32_t pdir_index
= (uint32_t) virtual >> 22;
26 if (pdir_index
!= 0 && pdir_index
!= 0x300)
29 uint32_t ptbl_index
= ((uint32_t) virtual >> 12) & 0x3ff;
32 if (page_table_firstmb
[ptbl_index
] & 1 == 1)
33 return ADDRESS_ALREADY_MAPPED
;
34 page_table_firstmb
[ptbl_index
] = ((uint32_t) physical
& ~0xfff) | (flags
& 0xfff) | 1;
37 if (page_table_kernel
[ptbl_index
] & 1 == 1)
38 return ADDRESS_ALREADY_MAPPED
;
39 page_table_kernel
[ptbl_index
] = ((uint32_t) physical
& ~0xfff) | (flags
& 0xfff) | 1;
45 int map_range(void *phys_start
, void *phys_end
, void *virt_start
, void *virt_end
, int flags
)
47 if ((uint32_t) phys_start
& 0xfff || (uint32_t) phys_end
& 0xfff ||
48 (uint32_t) virt_start
& 0xfff || (uint32_t) virt_end
& 0xfff)
49 return ADDRESS_NOT_ALIGNED
;
51 if ((uint32_t) phys_end
- (uint32_t) phys_start
!= (uint32_t) virt_end
- (uint32_t) virt_start
)
52 return ADDRESS_RANGE_MISMATCHED
;
54 int loops
= ((uint32_t) phys_end
- (uint32_t) phys_start
) / 4096;
55 for (int i
=0; i
<loops
; i
++) {
56 int ret
= map_address(phys_start
+ i
*4096, virt_start
+ i
*4096, flags
);
63 void set_up_page_directory()
65 page_directory
[0] = (uint32_t) page_table_firstmb
| 3;
66 page_directory
[0x300] = (uint32_t) page_table_kernel
| 3;