OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / paging.c
1 \r
2 #include "core.h"\r
3 \r
4 uint *ADR_Paging_Directory;\r
5 \r
6 void Initialise_Paging(void *vram, uint xsize, uint ysize, uint bpp)\r
7 {\r
8         uint i, j, k, l, m, n, o, cr0;\r
9         uint *page;\r
10 \r
11         j = (System_MemoryControl_FullSize() + 0x003FFFFF) >> 22;\r
12         l = (((j << 22) - System_MemoryControl_FullSize()) + 0xFFF) >> 12;\r
13         ADR_Paging_Directory = (uint *)System_MemoryControl_Allocate_Page();\r
14 \r
15         for(i = 0; i < 1024; i++){\r
16                 page = (uint *)System_MemoryControl_Allocate_Page();\r
17                 Paging_Set_Entry_Directory(&ADR_Paging_Directory[i], page, PG_NOTPRESENT, 0x00000000);\r
18                 for(k = 0; k < 1024; k++){\r
19                         Paging_Set_Entry_Table(&(Paging_Get_Entry_Setting_Address(ADR_Paging_Directory[i])[k]), (uint *)((i << 22) + (k * 1024 * 4)), PG_NOTPRESENT, 0x00000000);\r
20                 }\r
21         }\r
22 \r
23 Emergency_Out("Mem-Paging:Tables-Initialized");\r
24 \r
25         for(i = 0; i < j; i++){\r
26                 Paging_Set_Entry_Directory(&ADR_Paging_Directory[i], Paging_Get_Entry_Setting_Address(ADR_Paging_Directory[i]), PG_PRESENT | PG_WRITABLE | PG_USER | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);\r
27                 if(i == j - 1 && l != 0){\r
28                         for(k = 0; k < l; k++){\r
29                                 Paging_Set_Entry_Table(&(Paging_Get_Entry_Setting_Address(ADR_Paging_Directory[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
30                         }\r
31                 } else{\r
32                         for(k = 0; k < 1024; k++){\r
33                                 Paging_Set_Entry_Table(&(Paging_Get_Entry_Setting_Address(ADR_Paging_Directory[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
34                         }\r
35                 }\r
36         }\r
37 \r
38 Emergency_Out("Mem-Paging:PhisMemory-Initialized");\r
39 \r
40         m = (uint)vram >> 22;\r
41         n = xsize * ysize * (bpp >> 3);\r
42         o = n >> 12;\r
43         if(n != (o << 12)) o++;\r
44         j = (o + 1023) >> 10;\r
45         l = o - ((j - 1) << 10);\r
46 \r
47         for(i = 0; i < j; i++){\r
48                 Paging_Set_Entry_Directory(&ADR_Paging_Directory[m + i], Paging_Get_Entry_Setting_Address(ADR_Paging_Directory[m + i]), PG_PRESENT | PG_WRITABLE | PG_SUPERVISOR | PG_WRITEBACK | PG_CACHE_ENABLE | PG_NOTACCESSED | PG_NOTWRITTEN | PG_4KBPAGE | PG_NOTGLOBAL, 0x00000000);\r
49                 if(i == j - 1 && l != 0){\r
50                         for(k = 0; k < l; k++){\r
51                                 Paging_Set_Entry_Table(&(Paging_Get_Entry_Setting_Address(ADR_Paging_Directory[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
52                         }\r
53                 } else{\r
54                         for(k = 0; k < 1024; k++){\r
55                                 Paging_Set_Entry_Table(&(Paging_Get_Entry_Setting_Address(ADR_Paging_Directory[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
56                         }\r
57                 }\r
58         }\r
59 \r
60 Emergency_Out("Mem-Paging:VideoMemory-Initialized");\r
61 \r
62         Store_CR3((uint)ADR_Paging_Directory);\r
63         cr0 = Load_CR0();\r
64         cr0 |= CR0_PAGING + CR0_PROTECTIONENABLE;\r
65         Store_CR0(cr0);\r
66 \r
67 Emergency_Out("Mem-Paging:Paging-Enabled");\r
68 \r
69         return;\r
70 }\r
71 \r
72 void Paging_Set_Entry_Directory(uint *dir_entry, uint *table_base, uint attribute, uint available)\r
73 {\r
74         uint entry;\r
75 \r
76         if(attribute & PG_PRESENT){\r
77                 entry = ((uint)table_base & 0xfffff000);\r
78                 entry |= (attribute & 0x000001ff);\r
79                 entry |= ((available & 0x00000007) << 9);\r
80         } else{\r
81                 entry = ((uint)table_base & 0xfffff000);\r
82                 entry |= ((available & 0x00000007) << 9);\r
83                 entry &= 0xfffffffe;\r
84         }\r
85         *dir_entry = entry;\r
86 \r
87         return;\r
88 }\r
89 \r
90 void Paging_Set_Entry_Table(uint *table_entry, uint *page_base, uint attribute, uint available)\r
91 {\r
92         uint entry;\r
93 \r
94         if(attribute & PG_PRESENT){\r
95                 entry = ((uint)page_base & 0xfffff000);\r
96                 entry |= (attribute & 0x000001ff);\r
97                 entry |= ((available & 0x00000007) << 9);       \r
98         } else{\r
99                 entry = (available << 1);\r
100                 entry &= 0xfffffffe;\r
101         }\r
102         *table_entry = entry;\r
103         return;\r
104 }\r
105 \r
106 uint *Paging_Get_Entry_Setting_Address(uint entry)\r
107 {\r
108         return (uint *)(entry & 0xFFFFF000);\r
109 }\r