Changeset 518 for Whitix/branches/hybrid

Show
Ignore:
Timestamp:
05/24/08 09:46:43 (3 months ago)
Author:
mwhitworth
Message:

Convert code to use new APIs, use function pointers, fix VirtToPhys.

Files:
1 modified

Legend:

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

    r399 r518  
    2222#include <fs/vfs.h> 
    2323#include <vmm.h> 
     24#include <module.h> 
     25#include <init.h> 
    2426#include <sections.h> 
    2527#include <malloc.h> 
    2628#include <slab.h> 
     29#include <imports.h> 
    2730 
    2831#define PGDIR_SELF 1023 /* Entry in the page directory of the page directory itself */ 
     
    6265int VirtMemManagerSetup(struct Process* process) 
    6366{ 
    64         process->memManager=(struct MemManager*)MemCacheAlloc(managerCache); 
     67        process->memManager=(struct MemManager*)memCacheAlloc(managerCache); 
    6568        if (!process->memManager) 
    6669                return -EFAULT; 
     
    174177 
    175178error: 
    176         printf("VirtMemManagerInit failed\n"); 
     179        KePrint("VirtMemManagerInit failed\n"); 
    177180        IrqRestoreFlags(flags); 
    178181        return -ENOMEM; 
     
    194197        return 0; 
    195198} 
     199 
     200SYMBOL_EXPORT(VirtSetCurrent); 
    196201 
    197202int VirtDestroyMemManager(struct MemManager* manager) 
     
    221226        VirtUnmapPhysPage((DWORD)vPageDir); 
    222227        ListRemove(&manager->list); 
    223         MemCacheFree(managerCache,manager); 
    224  
    225         return 0; 
    226 } 
    227  
    228 extern int SlabInit(); 
     228        memCacheFree(managerCache,manager); 
     229 
     230        return 0; 
     231} 
     232 
     233int VirtEarlyInit() 
     234{ 
     235        /* Init the kernel page tables */ 
     236        VirtMemManagerInit(&kernelMem, true); 
     237 
     238        return 0; 
     239} 
    229240 
    230241int VirtInit() 
    231242{ 
    232         /* Init the kernel page tables */ 
    233         VirtMemManagerInit(&kernelMem,true); 
    234  
    235         /* And the slab allocator */ 
    236         SlabInit(); 
    237  
    238         managerCache=MemCacheCreate("Manager Cache",sizeof(struct MemManager),NULL,NULL,0); 
     243        managerCache=memCacheCreate("Manager Cache",sizeof(struct MemManager),NULL,NULL,0); 
    239244        if (!managerCache) 
    240245                return -ENOMEM; 
     
    282287} 
    283288 
     289SYMBOL_EXPORT(VirtMemMapPage); 
     290 
    284291void VirtUnmapPages(DWORD start,DWORD len) 
    285292{ 
     
    325332        } 
    326333 
    327         printf("VirtMapPhysPage failed\n"); 
    328         IrqRestoreFlags(flags); 
    329         return 0; 
    330 } 
     334        KePrint("VirtMapPhysPage failed\n"); 
     335        IrqRestoreFlags(flags); 
     336        return 0; 
     337} 
     338 
     339SYMBOL_EXPORT(VirtMapPhysPage); 
    331340 
    332341DWORD VirtMapPhysRange(DWORD virt,DWORD endVirt,DWORD numPages,int perms) 
     
    339348        IrqSaveFlags(flags); 
    340349 
    341 //      printf("VirtMapPhysRange(%#X,%#X,%u,%d)\n",virt,endVirt,numPages,perms); 
     350//      KePrint("VirtMapPhysRange(%#X,%#X,%u,%d)\n",virt,endVirt,numPages,perms); 
    342351 
    343352        for (i=virt; i<endVirt; i+=PAGE_SIZE) 
     
    366375        /* Now map them in */ 
    367376        for (i=start; i<start+(numPages*PAGE_SIZE); i+=PAGE_SIZE) 
    368                 VirtMemMapPage(i,PageAlloc()->physAddr,perms); 
     377        { 
     378                struct PhysPage* page=PageAlloc(); 
     379 
     380                if (!page) 
     381                { 
     382                        for (i-=PAGE_SIZE; i>start; i-=PAGE_SIZE) 
     383                                VirtUnmapPhysPage(PageGetStruct(PAGE_ALIGN(VirtToPhys(i)))); 
     384 
     385                        return 0; 
     386                } 
     387 
     388                VirtMemMapPage(i,page->physAddr,perms); 
     389        } 
    369390 
    370391        IrqRestoreFlags(flags); 
     
    372393        return start; 
    373394} 
     395 
     396SYMBOL_EXPORT(VirtMapPhysRange); 
    374397 
    375398void VirtUnmapPhysPage(DWORD virt) 
     
    383406} 
    384407 
     408SYMBOL_EXPORT(VirtUnmapPhysPage); 
     409 
    385410DWORD VirtAllocateTemp(DWORD phys) 
    386411{ 
     
    400425} 
    401426 
     427SYMBOL_EXPORT(VirtAllocateTemp); 
     428 
    402429void VirtShowFault(DWORD address,int error) 
    403430{ 
    404         printf("\nAddress = %#X (pageDir[%d] = %#X)",address,address >> 22,pageDir[address >> 22]); 
     431        KePrint("\nAddress = %#X (pageDir[%d] = %#X)",address,address >> 22,pageDir[address >> 22]); 
    405432 
    406433        if (pageDir[address >> 22]) 
    407                 printf(" pageTable[%d] = %#X",address >> 12,pageTable[address >> 12]); 
    408  
    409         printf("\n"); 
     434                KePrint(" pageTable[%d] = %#X",address >> 12,pageTable[address >> 12]); 
     435 
     436        KePrint("\n"); 
    410437 
    411438        if (error & 1) 
    412                 printf("Protection violation, "); 
     439                KePrint("Protection violation, "); 
    413440        else 
    414                 printf("Page not present, "); 
     441                KePrint("Page not present, "); 
    415442                                 
    416443        if (error & 2) 
    417                 printf("writing, "); 
     444                KePrint("writing, "); 
    418445        else 
    419                 printf("reading, "); 
     446                KePrint("reading, "); 
    420447                                 
    421448        if (error & 4) 
    422                 printf("in user mode\n"); 
     449                KePrint("in user mode\n"); 
    423450        else 
    424                 printf("in kernel mode\n");      
     451                KePrint("in kernel mode\n");     
    425452} 
    426453 
    427454DWORD VirtToPhys(DWORD virt) 
    428455{ 
    429         return pageTable[PGTABLE_ENT(virt)]; 
    430 } 
    431  
     456        return PAGE_ALIGN(pageTable[PGTABLE_ENT(virt)])+PAGE_OFFSET(virt); 
     457} 
     458 
     459SYMBOL_EXPORT(VirtToPhys); 
     460