4 uint *ADR_Paging_Directory;
\r
6 void Initialise_Paging(void *vram, uint xsize, uint ysize, uint bpp)
\r
8 uint i, j, k, l, m, n, o, cr0;
\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
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
23 Emergency_Out("Mem-Paging:Tables-Initialized");
\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
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
38 Emergency_Out("Mem-Paging:PhisMemory-Initialized");
\r
40 m = (uint)vram >> 22;
\r
41 n = xsize * ysize * (bpp >> 3);
\r
43 if(n != (o << 12)) o++;
\r
44 j = (o + 1023) >> 10;
\r
45 l = o - ((j - 1) << 10);
\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
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
60 Emergency_Out("Mem-Paging:VideoMemory-Initialized");
\r
62 Store_CR3((uint)ADR_Paging_Directory);
\r
64 cr0 |= CR0_PAGING + CR0_PROTECTIONENABLE;
\r
67 Emergency_Out("Mem-Paging:Paging-Enabled");
\r
72 void Paging_Set_Entry_Directory(uint *dir_entry, uint *table_base, uint attribute, uint available)
\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
81 entry = ((uint)table_base & 0xfffff000);
\r
82 entry |= ((available & 0x00000007) << 9);
\r
83 entry &= 0xfffffffe;
\r
90 void Paging_Set_Entry_Table(uint *table_entry, uint *page_base, uint attribute, uint available)
\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
99 entry = (available << 1);
\r
100 entry &= 0xfffffffe;
\r
102 *table_entry = entry;
\r
106 uint *Paging_Get_Entry_Setting_Address(uint entry)
\r
108 return (uint *)(entry & 0xFFFFF000);
\r