diff --git a/src/sys/include/vmm/paging.h b/src/sys/include/vmm/paging.h index 0540e86..f6cfd22 100644 --- a/src/sys/include/vmm/paging.h +++ b/src/sys/include/vmm/paging.h @@ -86,30 +86,31 @@ #define ctob(x) ((x)<>PAGE_SHIFT) -int vmmClearVirtualPage( uInt32 pageAddr ); +int vmmClearVirtualPage(uInt32 pageAddr); -void vmmUnmapPage( uInt32, int ); -void vmmUnmapPages( void *, uInt32 ); -void *vmmMapFromTask( pidType, void *, uInt32 ); -void *vmmCopyVirtualSpace( pidType ); -void *vmmGetFreePage( pidType ); -void *vmmGetFreeKernelPage( pidType pid, uInt16 count ); -void *vmmCreateVirtualSpace( pidType ); -void *vmmGetFreeVirtualPage( pidType, int, int ); +void vmmUnmapPage(uInt32, int); +void vmmUnmapPages(void *, uInt32); +void *vmmMapFromTask(pidType, void *, uInt32); +void *vmmCopyVirtualSpace(pidType); +void *vmmGetFreePage(pidType); +void *vmmGetFreeKernelPage(pidType pid, uInt16 count); +void *vmmCreateVirtualSpace(pidType); +void *vmmGetFreeVirtualPage(pidType, int, int); -uInt32 vmm_getPhysicalAddr( uInt32 ); -int vmm_setPageAttributes( uInt32, uInt16 ); -int vmm_remapPage( uInt32, uInt32, uInt16 ); +uint32_t vmm_getPhysicalAddr(uint32_t); +uint32_t vmm_getRealAddr(uint32_t); +int vmm_setPageAttributes(uInt32, uInt16); +int vmm_remapPage(uInt32, uInt32, uInt16); int vmm_pagingInit(); -void *vmm_getFreeMallocPage( uInt16 count ); +void *vmm_getFreeMallocPage(uInt16 count); //void vmm_pageFault( uInt32, uInt32, uInt32 ); -void vmm_pageFault( struct trapframe *, u_int32_t ); +void vmm_pageFault(struct trapframe *, u_int32_t); void _vmm_pageFault(); -int mmap( struct thread *, struct sys_mmap_args * ); -int obreak( struct thread *, struct obreak_args * ); -int munmap( struct thread *, struct munmap_args * ); +int mmap(struct thread *, struct sys_mmap_args *); +int obreak(struct thread *, struct obreak_args *); +int munmap(struct thread *, struct munmap_args *); -int vmm_cleanVirtualSpace( u_int32_t ); +int vmm_cleanVirtualSpace(u_int32_t); extern uInt32 *kernelPageDirectory; diff --git a/src/sys/pci/lnc.c b/src/sys/pci/lnc.c index 4006469..d5c1e05 100644 --- a/src/sys/pci/lnc.c +++ b/src/sys/pci/lnc.c @@ -144,8 +144,8 @@ lnc->init.tdra = (uint32_t)lnc->txRing; lnc->init.tlen = 3 << 4; - lnc_writeCSR32(lnc, CSR1, (uint32_t) &lnc->init & 0xFFFF); - lnc_writeCSR32(lnc, CSR2, ((uint32_t) &lnc->init >> 16) &0xFFFF); + lnc_writeCSR32(lnc, CSR1, (uint32_t) vmm_getRealAddr(&lnc->init) & 0xFFFF); + lnc_writeCSR32(lnc, CSR2, ((uint32_t) vmm_getRealAddr(&lnc->init) >> 16) &0xFFFF); lnc_writeCSR32(lnc, CSR3, 0); @@ -337,7 +337,7 @@ memset(lnc->rxRing,0x0,lncMemSize); for (i = 0;i < NDESC(lnc->nrdre);i++) { tmpBuffer = kmalloc(buffer_size); - lnc->rxRing->addr = (uint32_t)tmpBuffer; + lnc->rxRing->addr = (uint32_t)vmm_getRealAddr(tmpBuffer); bcnt = (uint16_t)(-buffer_size); bcnt &= 0x0FFF; bcnt |= 0xF000; @@ -357,7 +357,7 @@ memset(lnc->txRing,0x0,lncMemSize); for (i = 0;i < NDESC(lnc->ntdre);i++) { tmpBuffer = kmalloc(buffer_size); - lnc->txRing->addr = (uint32_t)tmpBuffer; + lnc->txRing->addr = (uint32_t)vmm_getRealAddr(tmpBuffer); bcnt = (uint16_t)(-buffer_size); bcnt &= 0x0FFF; bcnt |= 0xF000; diff --git a/src/sys/vmm/getphysicaladdr.c b/src/sys/vmm/getphysicaladdr.c index 97cbfae..ab97c84 100644 --- a/src/sys/vmm/getphysicaladdr.c +++ b/src/sys/vmm/getphysicaladdr.c @@ -53,6 +53,23 @@ return ((uInt32)(pageTable[pageTableIndex] & 0xFFFFF000)); } + +u_int32_t vmm_getRealAddr(uint32_t addr) { + int pageDirectoryIndex = 0x0, pageTableIndex = 0x0; + uint32_t *pageTable = 0x0; + + //Calculate The Page Directory Index + pageDirectoryIndex = (addr >> 22); + + //Calculate The Page Table Index + pageTableIndex = ((addr >> 12) & 0x3FF); + + /* Set pageTable To The Virtual Address Of Table */ + pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + /* Return The Physical Address Of The Page */ + return ((uint32_t)(pageTable[pageTableIndex] & 0xFFFFF000) + (addr & 0xFFF)); + } + /*** END ***/