OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / paging.c
1 \r
2 #include "core.h"\r
3 \r
4 void init_paging(void)\r
5 {\r
6         uint i, j, k, l, m, n, o, cr0;\r
7 \r
8         j = (system.io.mem.total + 1) >> 22;\r
9         l = ((system.io.mem.total - ((j - 1) << 22)) + 4095) >> 12;\r
10 \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
15                 }\r
16         }\r
17 \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
21 \r
22                 if(i == j - 1){\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
26                         }\r
27                 } else{\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
31                         }\r
32                 }\r
33         }\r
34 \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
37         o = n >> 12;\r
38         if(n != (o << 12)) o++;\r
39         j = (o + 1023) >> 10;\r
40         l = o - ((j - 1) << 10);\r
41 \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
44                 if(i == j - 1){\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
47                         }\r
48                 } else{\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
51                         }\r
52                 }\r
53         }\r
54 \r
55         store_cr3((uint)system.io.mem.paging.dir);\r
56         cr0 = load_cr0();\r
57         cr0 |= CR0_PAGING + CR0_PROTECTIONENABLE;\r
58         store_cr0(cr0);\r
59         pipelineflush();\r
60 \r
61         return;\r
62 }\r
63 \r
64 void paging_set_dir(uint *dir_entry, uint *table_base, uint attribute, uint available)\r
65 {\r
66         uint entry;\r
67 \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
72         } else{\r
73                 entry = (available << 1);\r
74                 entry &= 0xfffffffe;\r
75         }\r
76         *dir_entry = entry;\r
77         return;\r
78 }\r
79 \r
80 void paging_set_table(uint *table_entry, uint *page_base, uint attribute, uint available)\r
81 {\r
82         uint entry;\r
83 \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
88         } else{\r
89                 entry = (available << 1);\r
90                 entry &= 0xfffffffe;\r
91         }\r
92         *table_entry = entry;\r
93         return;\r
94 }\r