| c5f1f439 |
1 | #include "stdafx.h" |
| 2 | #include "tester1.h" |
| 3 | #include <commctrl.h> |
| 4 | //#include <aygshell.h> |
| 5 | #include <sipapi.h> |
| 6 | #include "setup.h" |
| 7 | |
| 8 | UINT32 ReadPhysical(UINT32 adr) |
| 9 | { |
| 10 | UINT32 base= adr&0xffff0000; |
| 11 | UINT32 offset=adr&0x0000ffff; |
| 12 | UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); |
| 13 | if(!p) return 0xFFFFFFFF; |
| 14 | if(!VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL)) return 0xFFFFFFFF; |
| 15 | UINT32 val=p[offset/4]; |
| 16 | VirtualFree(p,0,MEM_RELEASE); |
| 17 | return val; |
| 18 | } |
| 19 | |
| 20 | void WritePhysical(UINT32 adr,UINT32 val) |
| 21 | { |
| 22 | UINT32 base= adr&0xffff0000; |
| 23 | UINT32 offset=adr&0x0000ffff; |
| 24 | UINT32 *p=(UINT32*)VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE); |
| 25 | VirtualCopy((void*)p,(void*)(base/256),0x10000,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); |
| 26 | p[offset/4]=val; |
| 27 | VirtualFree(p,0,MEM_RELEASE); |
| 28 | } |
| 29 | |
| 30 | UINT32 VirtualToPhysical(UINT32 Virtual) |
| 31 | { |
| 32 | FILE *log=fopen("\\logger1.txt","w"); |
| 33 | |
| 34 | fprintf(log,"virtual: 0x%lx\n",Virtual); |
| 35 | UINT32 mmu=(UINT32)read_mmu(); |
| 36 | // mmu=0xa0000000; |
| 37 | fprintf(log,"mmu: 0x%lx \n",mmu); |
| 38 | |
| 39 | UINT32 AdrFirstLevDesc=(mmu&0xffffc000)+((Virtual>>18)&0xfffffffc); |
| 40 | fprintf(log,"AdrFirstLevDesc: 0x%lx \n",AdrFirstLevDesc); |
| 41 | |
| 42 | UINT32 FirstLevDesc=ReadPhysical(AdrFirstLevDesc); |
| 43 | fprintf(log,"FirstLevDesc: 0x%lx \n",FirstLevDesc); |
| 44 | |
| 45 | |
| 46 | if(0) |
| 47 | { |
| 48 | fprintf(log,"Page\n"); |
| 49 | UINT32 PhysAddr=(FirstLevDesc&0xfff00000)+(Virtual&0xfffff); |
| 50 | fprintf(log,"Physical address: 0x%lx \n",PhysAddr); |
| 51 | fclose(log); |
| 52 | return PhysAddr; |
| 53 | } |
| 54 | |
| 55 | if(FirstLevDesc&0x3==3) // tiny page |
| 56 | { |
| 57 | fprintf(log,"Tiny page\n"); |
| 58 | UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffff000)+((Virtual>>8)&0xffc); |
| 59 | fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); |
| 60 | |
| 61 | UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); |
| 62 | fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); |
| 63 | |
| 64 | UINT32 PhysAddr=(SecondLevDesc&0xffffc000)+(Virtual&0x3ff); |
| 65 | fprintf(log,"Physical address: 0x%lx \n",PhysAddr); |
| 66 | fclose(log); |
| 67 | return PhysAddr; |
| 68 | } |
| 69 | // if(FirstLevDesc&0x3==3) // small page |
| 70 | { |
| 71 | fprintf(log,"Else page\n"); |
| 72 | UINT32 AdrSecondLevDesc=(FirstLevDesc&0xfffffc00)+((Virtual>>10)&0x03fc); |
| 73 | fprintf(log,"AdrSecondLevDesc: 0x%lx \n",AdrSecondLevDesc); |
| 74 | |
| 75 | UINT32 SecondLevDesc=ReadPhysical(AdrSecondLevDesc); |
| 76 | fprintf(log,"SecondLevDesc: 0x%lx \n",SecondLevDesc); |
| 77 | |
| 78 | UINT32 PhysAddr=(SecondLevDesc&0xffff0000)+(Virtual&0xffff); |
| 79 | fprintf(log,"Physical address: 0x%lx \n",PhysAddr); |
| 80 | fclose(log); |
| 81 | return PhysAddr; |
| 82 | |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | |
| 87 | |
| 88 | |
| 89 | |
| 90 | |
| 91 | void DumpMMU() |
| 92 | { |
| 93 | void *mmu=(void*)(MEM_START); |
| 94 | |
| 95 | UINT32 *_mmu=(UINT32*)VirtualAlloc((void*)0x0,sizeof(void*)*0xffff, MEM_RESERVE,PAGE_READWRITE); |
| 96 | int ret=VirtualCopy(_mmu,(void *) ((UINT32)mmu/256),sizeof(void*)*0xffff , PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); |
| 97 | |
| 98 | FILE *log=fopen("\\logger2.txt","w"); |
| 99 | fprintf(log,"mmu_table=0x%lx : \n",_mmu); |
| 100 | fprintf(log,"mmu=0x%lx : \n",mmu); |
| 101 | fprintf(log,"ret=0x%x : \n",ret); |
| 102 | for(UINT32 z=0;z<=0x0100;z++) |
| 103 | fprintf(log,"mmu_table[0x%x]=0x%lx: \n",z,_mmu[z]); |
| 104 | fclose(log); |
| 105 | return; |
| 106 | } |