4 void init_paging(void)
\r
6 uint i, j, k, l, m, n, o, cr0;
\r
8 j = (system.io.mem.total + 1) >> 22;
\r
9 l = ((system.io.mem.total - ((j - 1) << 22)) + 4095) >> 12;
\r
11 for(i = 0; i < 1024; i++){
\r
12 paging_set_dir(&system.io.mem.paging.dir[i], &system.io.mem.paging.table[i][0], PG_NOTPRESENT, 0x00000000);
\r
13 for(k = 0; k < 1024; k++){
\r
14 paging_set_table(&system.io.mem.paging.table[i][k], (uint *)((i << 22) + (k * 1024 * 4)), PG_NOTPRESENT, 0x00000000);
\r
18 for(i = 0; i < j; i++){
\r
19 // paging_set_dir(&system.io.mem.paging.dir[i], &system.io.mem.paging.table[i][0], PG_PRESENT | PG_WRITABLE | PG_SUPERVISOR | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
20 paging_set_dir(&system.io.mem.paging.dir[i], &system.io.mem.paging.table[i][0], PG_PRESENT | PG_WRITABLE | PG_USER | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
23 for(k = 0; k < l; k++){
\r
24 // paging_set_table(&system.io.mem.paging.table[i][k], (uint *)((i << 22) + (k * 1024 * 4)), PG_PRESENT | PG_WRITABLE | PG_SUPERVISOR | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
25 paging_set_table(&system.io.mem.paging.table[i][k], (uint *)((i << 22) + (k * 1024 * 4)), PG_PRESENT | PG_WRITABLE | PG_USER | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
28 for(k = 0; k < 1024; k++){
\r
29 // paging_set_table(&system.io.mem.paging.table[i][k], (uint *)((i << 22) + (k * 1024 * 4)), PG_PRESENT | PG_WRITABLE | PG_SUPERVISOR | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
30 paging_set_table(&system.io.mem.paging.table[i][k], (uint *)((i << 22) + (k * 1024 * 4)), PG_PRESENT | PG_WRITABLE | PG_USER | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
35 m = (uint)system.data.info.vesa.PhysBasePtr >> 22;
\r
36 n = system.data.info.boot.scrnx * system.data.info.boot.scrny * (system.data.info.vesa.BitsPerPixel >> 3);
\r
38 if(n != (o << 12)) o++;
\r
39 j = (o + 1023) >> 10;
\r
40 l = o - ((j - 1) << 10);
\r
42 for(i = 0; i < j; i++){
\r
43 paging_set_dir(&system.io.mem.paging.dir[m + i], &system.io.mem.paging.table[m + i][0], PG_PRESENT | PG_WRITABLE | PG_SUPERVISOR | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
45 for(k = 0; k < l; k++){
\r
46 paging_set_table(&system.io.mem.paging.table[m + i][k], (uint *)(((m + i) << 22) + (k * 1024 * 4)), PG_PRESENT | PG_WRITABLE | PG_SUPERVISOR | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
49 for(k = 0; k < 1024; k++){
\r
50 paging_set_table(&system.io.mem.paging.table[m + i][k], (uint *)(((m + i) << 22) + (k * 1024 * 4)), PG_PRESENT | PG_WRITABLE | PG_SUPERVISOR | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);
\r
55 store_cr3((uint)system.io.mem.paging.dir);
\r
57 cr0 |= CR0_PAGING + CR0_PROTECTIONENABLE;
\r
64 void paging_set_dir(uint *dir_entry, uint *table_base, uint attribute, uint available)
\r
68 if(attribute & PG_PRESENT){
\r
69 entry = ((uint)table_base & 0xfffff000);
\r
70 entry |= (attribute & 0x000001ff);
\r
71 entry |= ((available & 0x00000007) << 9);
\r
73 entry = (available << 1);
\r
74 entry &= 0xfffffffe;
\r
80 void paging_set_table(uint *table_entry, uint *page_base, uint attribute, uint available)
\r
84 if(attribute & PG_PRESENT){
\r
85 entry = ((uint)page_base & 0xfffff000);
\r
86 entry |= (attribute & 0x000001ff);
\r
87 entry |= ((available & 0x00000007) << 9);
\r
89 entry = (available << 1);
\r
90 entry &= 0xfffffffe;
\r
92 *table_entry = entry;
\r