filename | test/testmmu.c |
changeset | 551:07125ce718da |
prev | 550:a27e31340147 |
author | nkeynes |
date | Sun Dec 14 07:50:48 2008 +0000 (15 years ago) |
permissions | -rw-r--r-- |
last change | Setup a 'proper' stackframe in translated blocks. This doesn't affect performance noticeably, but does ensure that a) The stack is aligned correctly on OS X with no extra effort, and b) We can't mess up the stack and crash that way anymore. Replace all PUSH/POP instructions (outside of prologue/epilogue) with ESP-rel moves to stack local variables. Finally merge ia32mac and ia32abi together, since they're pretty much the same now anyway (and thereby simplifying maintenance a good deal) |
file | annotate | diff | log | raw |
nkeynes@550 | 1 | #include <assert.h> |
nkeynes@550 | 2 | #include <stdio.h> |
nkeynes@550 | 3 | #include "lib.h" |
nkeynes@550 | 4 | |
nkeynes@550 | 5 | #define PTEH 0xFF000000 |
nkeynes@550 | 6 | #define PTEL 0xFF000004 |
nkeynes@550 | 7 | #define TTB 0xFF000008 |
nkeynes@550 | 8 | #define TEA 0xFF00000C |
nkeynes@550 | 9 | #define MMUCR 0xFF000010 |
nkeynes@550 | 10 | #define PTEA 0xFF000034 |
nkeynes@550 | 11 | |
nkeynes@550 | 12 | #define ITLB_ADDR(entry) (0xF2000000 + (entry<<8)) |
nkeynes@550 | 13 | #define ITLB_DATA(entry) (0xF3000000 + (entry<<8)) |
nkeynes@550 | 14 | #define UTLB_ADDR(entry) (0xF6000000 + (entry<<8)) |
nkeynes@550 | 15 | #define UTLB_DATA1(entry) (0xF7000000 + (entry<<8)) |
nkeynes@550 | 16 | #define UTLB_DATA2(entry) (0xF7800000 + (entry<<8)) |
nkeynes@550 | 17 | |
nkeynes@550 | 18 | /* Bang on the mmio side of the TLBs to make sure the bits |
nkeynes@550 | 19 | * respond appropriately (with AT disabled so we don't risk |
nkeynes@550 | 20 | * doing a hard crash) */ |
nkeynes@550 | 21 | void test_tlb_mmio() |
nkeynes@550 | 22 | { |
nkeynes@550 | 23 | int entry; |
nkeynes@550 | 24 | for( entry=0; entry<64; entry++ ) { |
nkeynes@550 | 25 | long_write( UTLB_DATA1(entry), 0 ); |
nkeynes@550 | 26 | long_write( UTLB_ADDR(entry), 0xFFFFFFFF ); |
nkeynes@550 | 27 | assert( long_read( UTLB_ADDR(entry) ) == 0xFFFFFFFF ); |
nkeynes@550 | 28 | assert( long_read( UTLB_DATA1(entry) ) == 0x00000104 ); |
nkeynes@550 | 29 | long_write( UTLB_ADDR(entry), 0x00000000 ); |
nkeynes@550 | 30 | assert( long_read( UTLB_ADDR(entry) ) == 0x00000000 ); |
nkeynes@550 | 31 | assert( long_read( UTLB_DATA1(entry) ) == 0x00000000 ); |
nkeynes@550 | 32 | long_write( UTLB_DATA1(entry), 0xFFFFFFFF ); |
nkeynes@550 | 33 | assert( long_read( UTLB_DATA1(entry) ) == 0x1FFFFDFF ); |
nkeynes@550 | 34 | assert( long_read( UTLB_ADDR(entry) ) == 0x00000300 ); |
nkeynes@550 | 35 | long_write( UTLB_DATA1(entry), 0x00000000 ); |
nkeynes@550 | 36 | assert( long_read( UTLB_DATA1(entry) ) == 0x00000000 ); |
nkeynes@550 | 37 | assert( long_read( UTLB_ADDR(entry) ) == 0x00000000 ); |
nkeynes@550 | 38 | long_write( UTLB_DATA2(entry), 0xFFFFFFFF ); |
nkeynes@550 | 39 | assert( long_read( UTLB_DATA2(entry) ) == 0x0000000F ); |
nkeynes@550 | 40 | long_write( UTLB_DATA2(entry), 0x00000000 ); |
nkeynes@550 | 41 | assert( long_read( UTLB_DATA2(entry) ) == 0x00000000 ); |
nkeynes@550 | 42 | } |
nkeynes@550 | 43 | |
nkeynes@550 | 44 | for( entry=0; entry<4; entry++ ) { |
nkeynes@550 | 45 | long_write( ITLB_DATA(entry), 0 ); |
nkeynes@550 | 46 | long_write( ITLB_ADDR(entry), 0xFFFFFFFF ); |
nkeynes@550 | 47 | assert( long_read( ITLB_ADDR(entry) ) == 0xFFFFFDFF ); |
nkeynes@550 | 48 | assert( long_read( ITLB_DATA(entry) ) == 0x00000100 ); |
nkeynes@550 | 49 | long_write( ITLB_ADDR(entry), 0x00000000 ); |
nkeynes@550 | 50 | assert( long_read( ITLB_ADDR(entry) ) == 0x00000000 ); |
nkeynes@550 | 51 | assert( long_read( ITLB_DATA(entry) ) == 0x00000000 ); |
nkeynes@550 | 52 | long_write( ITLB_DATA(entry), 0xFFFFFFFF ); |
nkeynes@550 | 53 | assert( long_read( ITLB_DATA(entry) ) == 0x1FFFFDDA ); |
nkeynes@550 | 54 | assert( long_read( ITLB_ADDR(entry) ) == 0x00000100 ); |
nkeynes@550 | 55 | long_write( ITLB_DATA(entry), 0x00000000 ); |
nkeynes@550 | 56 | assert( long_read( ITLB_DATA(entry) ) == 0x00000000 ); |
nkeynes@550 | 57 | assert( long_read( ITLB_ADDR(entry) ) == 0x00000000 ); |
nkeynes@550 | 58 | |
nkeynes@550 | 59 | } |
nkeynes@550 | 60 | } |
nkeynes@550 | 61 | |
nkeynes@550 | 62 | int main( int argc, char *argv[] ) |
nkeynes@550 | 63 | { |
nkeynes@550 | 64 | test_tlb_mmio(); |
nkeynes@551 | 65 | return 0; |
nkeynes@550 | 66 | } |
.