Changeset 2042

Show
Ignore:
Timestamp:
04/03/09 19:03:56 (3 years ago)
Author:
mwhitworth
Message:

Don't map the first page of memory, to properly catch null pointer errors.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/arch/i386/mm/virt.c

    r1862 r2042  
    6868                extern DWORD bootPageDirectory; 
    6969                manager->pageDir = (DWORD*)(VA_TO_PA(&bootPageDirectory)); 
     70                 
     71                VirtMemMapPage(0, 0, 0); 
    7072        }else{ 
    7173                manager->pageDir=(DWORD*)(PageAlloc()->physAddr); 
     
    202204        { 
    203205                pageDir[virtEnt]=PageAlloc()->physAddr | perms | PAGE_RW; 
     206                 
    204207                /* Zero out the whole page table */ 
    205208                ZeroMemory(&pageTable[virtEnt*1024], PAGE_SIZE); 
    206  
     209                 
    207210                /* If in kernel memory space, map to all other page directories */ 
    208211                if (virtEnt >= 768) 
     
    210213                        ListForEachEntry(manager,&managerList,list) 
    211214                        { 
     215                                /* Avoid copying to the same page table entry */ 
     216                                if ((DWORD)manager->pageDir == VirtToPhys((DWORD)pageDir)) 
     217                                        break; 
     218                                         
    212219                                virtDir=(DWORD*)VirtAllocateTemp((DWORD)manager->pageDir); 
    213                                 virtDir[virtEnt]=pageDir[virtEnt]; 
     220                                virtDir[virtEnt] = pageDir[virtEnt]; 
    214221                                VirtUnmapPhysPage((DWORD)virtDir); 
    215222                        } 
    216223                } 
    217224        } 
    218  
     225         
    219226        pageTable[PGTABLE_ENT(virt)]=phys | perms; 
    220227        invlpg(virt); 
    221  
     228         
    222229        IrqRestoreFlags(flags); 
    223230        return 0; 
     
    263270                if (!(pageDir[PGDIR_ENT(i)]) || !(pageTable[PGTABLE_ENT(i)])) /* Definitely not used */ 
    264271                { 
    265                         VirtMemMapPage(i,page,perms); 
     272                        VirtMemMapPage(i, page, perms); 
    266273                        IrqRestoreFlags(flags); 
    267274                        return i; 
     
    348355                                pageTable[PGTABLE_ENT(address)] &= ~(0xFFF); 
    349356                                pageTable[PGTABLE_ENT(address)] |= protection; 
    350 //                              KePrint("address = %#X\n", pageTable[PGTABLE_ENT(address)]); 
    351357                        } 
    352358                } 
     
    386392                if (!pageDir[PGDIR_ENT(i)] || !pageTable[PGTABLE_ENT(i)]) /* Definitely not used */ 
    387393                { 
    388                         VirtMemMapPage(i,phys,PAGE_PRESENT | PAGE_KERNEL | PAGE_RW); 
     394                        VirtMemMapPage(i, phys, PAGE_PRESENT | PAGE_KERNEL | PAGE_RW); 
    389395                        return i; 
    390396                } 
     
    398404void VirtShowFault(DWORD address,int error) 
    399405{ 
    400         KePrint("\nAddress = %#X (pageDir[%d] = %#X)",address,address >> 22,pageDir[address >> 22]); 
     406        KePrint("\nAddress = %#X (pageDir[%d] = %#X)",address, address >> 22, pageDir[address >> 22]); 
    401407 
    402408        if (pageDir[address >> 22])