Skip to content

Commit 9df1db2

Browse files
committed
higher half worked
1 parent 2d0a2be commit 9df1db2

File tree

5 files changed

+47
-306
lines changed

5 files changed

+47
-306
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ opt
55
disk.img
66
*.swp
77
tools/bochs*
8+
kernel.map

arch/i386/page.c

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,43 @@
11
#include <sys/type.h>
22
#include <arch/i386/page.h>
33

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;
66

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+
}
832

933
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));
2843
}

arch/i386/page.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,15 @@ typedef uint32_t pg_t;
3737

3838
#define __PG_OFFSET__ 12
3939

40-
extern pg_t g_pgdir[PG_DIR_SIZE] __pgdir;
41-
extern pg_t g_pg0[PG_TBL_SIZE] __pgtbl; // max 4G
40+
typedef struct pgdir {
41+
pg_t item[PG_DIR_SIZE];
42+
}pgdir_t;
43+
44+
typedef pgdir_t pgtbl_t;
45+
extern pgdir_t g_pgdir __pgdir;
46+
extern pgtbl_t g_pgtbl[1] __pgtbl; // max 4G
47+
48+
#define logic2phys(viraddr) ((void*) viraddr) + 0x0 - KERNEL_OFFSET
4249

4350
#define KERNEL_DIR_SIDX (KERNEL_OFFSET >> 22)
4451
#define KERNEL_DIR_EIDX PG_DIR_SIZE

boot/i386/loader.asm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
%include "boot/i386/gdt.asm"
1+
;%include "boot/i386/gdt.asm"
22

33
global loader
44
extern kernel_main

kernel.map

Lines changed: 0 additions & 282 deletions
This file was deleted.

0 commit comments

Comments
 (0)