OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / paging.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/paging.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/paging.c
new file mode 100644 (file)
index 0000000..a50aae5
--- /dev/null
@@ -0,0 +1,94 @@
+\r
+#include "core.h"\r
+\r
+void init_paging(void)\r
+{\r
+       uint i, j, k, l, m, n, o, cr0;\r
+\r
+       j = (system.io.mem.total + 1) >> 22;\r
+       l = ((system.io.mem.total - ((j - 1) << 22)) + 4095) >> 12;\r
+\r
+       for(i = 0; i < 1024; i++){\r
+               paging_set_dir(&system.io.mem.paging.dir[i], &system.io.mem.paging.table[i][0], PG_NOTPRESENT, 0x00000000);\r
+               for(k = 0; k < 1024; k++){\r
+                       paging_set_table(&system.io.mem.paging.table[i][k], (uint *)((i << 22) + (k * 1024 * 4)), PG_NOTPRESENT, 0x00000000);\r
+               }\r
+       }\r
+\r
+       for(i = 0; i < j; i++){\r
+//             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
+               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
+\r
+               if(i == j - 1){\r
+                       for(k = 0; k < l; k++){\r
+//                             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
+                               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
+                       }\r
+               } else{\r
+                       for(k = 0; k < 1024; k++){\r
+//                             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
+                               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
+                       }\r
+               }\r
+       }\r
+\r
+       m = (uint)system.data.info.vesa.PhysBasePtr >> 22;\r
+       n = system.data.info.boot.scrnx * system.data.info.boot.scrny * (system.data.info.vesa.BitsPerPixel >> 3);\r
+       o = n >> 12;\r
+       if(n != (o << 12)) o++;\r
+       j = (o + 1023) >> 10;\r
+       l = o - ((j - 1) << 10);\r
+\r
+       for(i = 0; i < j; i++){\r
+               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
+               if(i == j - 1){\r
+                       for(k = 0; k < l; k++){\r
+                               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
+                       }\r
+               } else{\r
+                       for(k = 0; k < 1024; k++){\r
+                               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
+                       }\r
+               }\r
+       }\r
+\r
+       store_cr3((uint)system.io.mem.paging.dir);\r
+       cr0 = load_cr0();\r
+       cr0 |= CR0_PAGING + CR0_PROTECTIONENABLE;\r
+       store_cr0(cr0);\r
+       pipelineflush();\r
+\r
+       return;\r
+}\r
+\r
+void paging_set_dir(uint *dir_entry, uint *table_base, uint attribute, uint available)\r
+{\r
+       uint entry;\r
+\r
+       if(attribute & PG_PRESENT){\r
+               entry = ((uint)table_base & 0xfffff000);\r
+               entry |= (attribute & 0x000001ff);\r
+               entry |= ((available & 0x00000007) << 9);       \r
+       } else{\r
+               entry = (available << 1);\r
+               entry &= 0xfffffffe;\r
+       }\r
+       *dir_entry = entry;\r
+       return;\r
+}\r
+\r
+void paging_set_table(uint *table_entry, uint *page_base, uint attribute, uint available)\r
+{\r
+       uint entry;\r
+\r
+       if(attribute & PG_PRESENT){\r
+               entry = ((uint)page_base & 0xfffff000);\r
+               entry |= (attribute & 0x000001ff);\r
+               entry |= ((available & 0x00000007) << 9);       \r
+       } else{\r
+               entry = (available << 1);\r
+               entry &= 0xfffffffe;\r
+       }\r
+       *table_entry = entry;\r
+       return;\r
+}\r