X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/linexec-j720/blobdiff_plain/77a37381836de85306ad128def744d879c38f95a..c5f1f439f689ac322fc715b979e343c93e8b8ec3:/memory.cpp diff --git a/memory.cpp b/memory.cpp index 96ff433..563e6ad 100644 --- a/memory.cpp +++ b/memory.cpp @@ -1,106 +1,106 @@ -#include "stdafx.h" -#include "tester1.h" -#include -//#include -#include -#include "setup.h" - -UINT32 ReadPhysical(UINT32 adr) -{ - UINT32 base= adr&0xffff0000; - UINT32 offset=adr&0x0000ffff; - UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); - if(!p) return 0xFFFFFFFF; - if(!VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL)) return 0xFFFFFFFF; - UINT32 val=p[offset/4]; - VirtualFree(p,0,MEM_RELEASE); - return val; -} - -void WritePhysical(UINT32 adr,UINT32 val) -{ - UINT32 base= adr&0xffff0000; - UINT32 offset=adr&0x0000ffff; - UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); - VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); - p[offset/4]=val; - VirtualFree(p,0,MEM_RELEASE); -} - -UINT32 VirtualToPhysical(UINT32 Virtual) -{ - FILE *log=fopen("\\logger1.txt","w"); - - fprintf(log,"virtual: 0x%lx\n",Virtual); - UINT32 mmu=(UINT32)read_mmu(); -// mmu=0xa0000000; - fprintf(log,"mmu: 0x%lx \n",mmu); - - UINT32 AdrFirstLevDesc=(mmu&0xffffc000)+((Virtual>>18)&0xfffffffc); - fprintf(log,"AdrFirstLevDesc: 0x%lx \n",AdrFirstLevDesc); - - UINT32 FirstLevDesc=ReadPhysical(AdrFirstLevDesc); - fprintf(log,"FirstLevDesc: 0x%lx \n",FirstLevDesc); - - - if(0) - { - fprintf(log,"Page\n"); - UINT32 PhysAddr=(FirstLevDesc&0xfff00000)+(Virtual&0xfffff); - fprintf(log,"Physical address: 0x%lx \n",PhysAddr); - fclose(log); - return PhysAddr; - } - - if(FirstLevDesc&0x3==3) // tiny page - { - fprintf(log,"Tiny page\n"); - UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffff000)+((Virtual>>8)&0xffc); - fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); - - UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); - fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); - - UINT32 PhysAddr=(SecondLevDesc&0xffffc000)+(Virtual&0x3ff); - fprintf(log,"Physical address: 0x%lx \n",PhysAddr); - fclose(log); - return PhysAddr; - } -// if(FirstLevDesc&0x3==3) // small page - { - fprintf(log,"Else page\n"); - UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffffc00)+((Virtual>>10)&0x03fc); - fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); - - UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); - fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); - - UINT32 PhysAddr=(SecondLevDesc&0xffff0000)+(Virtual&0xffff); - fprintf(log,"Physical address: 0x%lx \n",PhysAddr); - fclose(log); - return PhysAddr; - - } -} - - - - - - -void DumpMMU() -{ - void *mmu=(void*)(MEM_START); - - UINT32 *_mmu=(UINT32*)VirtualAlloc((void*)0x0,sizeof(void*)*0xffff, MEM_RESERVE,PAGE_READWRITE); - int ret=VirtualCopy(_mmu,(void *) ((UINT32)mmu/256),sizeof(void*)*0xffff , PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); - - FILE *log=fopen("\\logger2.txt","w"); - fprintf(log,"mmu_table=0x%lx : \n",_mmu); - fprintf(log,"mmu=0x%lx : \n",mmu); - fprintf(log,"ret=0x%x : \n",ret); - for(UINT32 z=0;z<=0x0100;z++) - fprintf(log,"mmu_table[0x%x]=0x%lx: \n",z,_mmu[z]); - fclose(log); - return; -} +#include "stdafx.h" +#include "tester1.h" +#include +//#include +#include +#include "setup.h" + +UINT32 ReadPhysical(UINT32 adr) +{ + UINT32 base= adr&0xffff0000; + UINT32 offset=adr&0x0000ffff; + UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); + if(!p) return 0xFFFFFFFF; + if(!VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL)) return 0xFFFFFFFF; + UINT32 val=p[offset/4]; + VirtualFree(p,0,MEM_RELEASE); + return val; +} + +void WritePhysical(UINT32 adr,UINT32 val) +{ + UINT32 base= adr&0xffff0000; + UINT32 offset=adr&0x0000ffff; + UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); + VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + p[offset/4]=val; + VirtualFree(p,0,MEM_RELEASE); +} + +UINT32 VirtualToPhysical(UINT32 Virtual) +{ + FILE *log=fopen("\\logger1.txt","w"); + + fprintf(log,"virtual: 0x%lx\n",Virtual); + UINT32 mmu=(UINT32)read_mmu(); +// mmu=0xa0000000; + fprintf(log,"mmu: 0x%lx \n",mmu); + + UINT32 AdrFirstLevDesc=(mmu&0xffffc000)+((Virtual>>18)&0xfffffffc); + fprintf(log,"AdrFirstLevDesc: 0x%lx \n",AdrFirstLevDesc); + + UINT32 FirstLevDesc=ReadPhysical(AdrFirstLevDesc); + fprintf(log,"FirstLevDesc: 0x%lx \n",FirstLevDesc); + + + if(0) + { + fprintf(log,"Page\n"); + UINT32 PhysAddr=(FirstLevDesc&0xfff00000)+(Virtual&0xfffff); + fprintf(log,"Physical address: 0x%lx \n",PhysAddr); + fclose(log); + return PhysAddr; + } + + if(FirstLevDesc&0x3==3) // tiny page + { + fprintf(log,"Tiny page\n"); + UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffff000)+((Virtual>>8)&0xffc); + fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); + + UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); + fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); + + UINT32 PhysAddr=(SecondLevDesc&0xffffc000)+(Virtual&0x3ff); + fprintf(log,"Physical address: 0x%lx \n",PhysAddr); + fclose(log); + return PhysAddr; + } +// if(FirstLevDesc&0x3==3) // small page + { + fprintf(log,"Else page\n"); + UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffffc00)+((Virtual>>10)&0x03fc); + fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); + + UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); + fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); + + UINT32 PhysAddr=(SecondLevDesc&0xffff0000)+(Virtual&0xffff); + fprintf(log,"Physical address: 0x%lx \n",PhysAddr); + fclose(log); + return PhysAddr; + + } +} + + + + + + +void DumpMMU() +{ + void *mmu=(void*)(MEM_START); + + UINT32 *_mmu=(UINT32*)VirtualAlloc((void*)0x0,sizeof(void*)*0xffff, MEM_RESERVE,PAGE_READWRITE); + int ret=VirtualCopy(_mmu,(void *) ((UINT32)mmu/256),sizeof(void*)*0xffff , PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); + + FILE *log=fopen("\\logger2.txt","w"); + fprintf(log,"mmu_table=0x%lx : \n",_mmu); + fprintf(log,"mmu=0x%lx : \n",mmu); + fprintf(log,"ret=0x%x : \n",ret); + for(UINT32 z=0;z<=0x0100;z++) + fprintf(log,"mmu_table[0x%x]=0x%lx: \n",z,_mmu[z]); + fclose(log); + return; +}