|
1 | 1 | #include <sys/type.h> |
2 | 2 | #include <arch/i386/page.h> |
3 | 3 |
|
4 | | -pg_t g_pgdir[PG_DIR_SIZE] __pgdir; |
5 | | -pg_t g_pg0[PG_TBL_SIZE] __pgtbl; |
| 4 | +pgdir_t g_pgdir __pgdir; |
| 5 | +pgtbl_t g_pgtbl[1] __pgtbl; |
6 | 6 |
|
7 | | -#define hh2phys(viraddr) (((void*) viraddr) + 0x0 - KERNEL_OFFSET) |
| 7 | +#define set_page_dir(i, pg_tbl_addr, attr) { \ |
| 8 | + g_pgdir.item[i] = (pg_t) ((uint32_t) pg_tbl_addr & 0xFFFFF000) | (attr & 0x00000FFF); \ |
| 9 | +} |
| 10 | + |
| 11 | +#define set_page_tbl(i, j, phy_addr, attr) { \ |
| 12 | + g_pgtbl[i].item[j] = (pg_t) ((uint32_t) phy_addr & 0xFFFFF000) | (attr & 0x00000FFF); \ |
| 13 | +} |
| 14 | + |
| 15 | +#define fill_page_tbl(idx, phy_addr_start, attr) { \ |
| 16 | + int tbli = 0; int start = (phy_addr_start & 0xFFFFF000); \ |
| 17 | + while (tbli < PG_TBL_SIZE) { \ |
| 18 | + set_page_tbl(idx, tbli, start + (tbli << __PG_OFFSET__), attr); \ |
| 19 | + ++tbli; \ |
| 20 | + } \ |
| 21 | +} |
| 22 | + |
| 23 | +#define enable_paging(pgdir_base) { \ |
| 24 | + __asm__ __volatile__ ( \ |
| 25 | + "movl %0, %%eax\n\t" \ |
| 26 | + "movl %%eax, %%cr3\n\t" \ |
| 27 | + "movl %%cr0, %%eax\n\t" \ |
| 28 | + "orl $0x80000000, %%eax\n\t" \ |
| 29 | + "movl %%eax, %%cr0\n\t" :: "a"(pgdir_base) \ |
| 30 | + ); \ |
| 31 | +} |
8 | 32 |
|
9 | 33 | void setup_paging(void) { |
10 | | - void *pgdirptr = hh2phys(g_pgdir); |
11 | | - void *pg0ptr = hh2phys(g_pg0); |
12 | | - int k; |
13 | | - for(k = 0; k < PG_TBL_SIZE; ++k) { |
14 | | - g_pg0[k] = (uint32_t) (k * (1<<__PG_OFFSET__)) | 0x3; |
15 | | - g_pgdir[k] = (uint32_t) 0; |
16 | | - } |
17 | | - |
18 | | - g_pgdir[0] = (uint32_t) pg0ptr | 0x03; |
19 | | - g_pgdir[KERNEL_DIR_SIDX] = (uint32_t) pg0ptr | 0x03; |
20 | | - |
21 | | - __asm__ __volatile__ ( |
22 | | - "movl %0, %%eax\n\t" |
23 | | - "movl %%eax, %%cr3\n\t" |
24 | | - "movl %%cr0, %%eax\n\t" |
25 | | - "orl $0x80000000, %%eax\n\t" |
26 | | - "movl %%eax, %%cr0\n\t" :: "m"(pgdirptr) |
27 | | - ); |
| 34 | + memset(&g_pgdir, 0, sizeof(pgdir_t)); |
| 35 | + |
| 36 | + set_page_dir(0, logic2phys(&g_pgtbl[0]), 0x3); |
| 37 | + set_page_dir(KERNEL_DIR_SIDX, logic2phys(&g_pgtbl[0]), 0x3); |
| 38 | + |
| 39 | + fill_page_tbl(0, 0x0, 0x03); |
| 40 | + /* pg0 0 - 4M */ |
| 41 | + |
| 42 | + enable_paging(logic2phys(&g_pgdir)); |
28 | 43 | } |
0 commit comments