nkeynes@225: #include nkeynes@555: #include "../lib.h" nkeynes@225: nkeynes@226: int total_tests = 0; nkeynes@226: int total_fails = 0; nkeynes@226: nkeynes@225: int test_print_result( char *testname, int failed, int total ) nkeynes@225: { nkeynes@231: fprintf( stdout, "%s: %d/%d tests passed\n", testname, total-failed, total ); nkeynes@226: total_tests += total; nkeynes@226: total_fails += failed; nkeynes@225: return failed; nkeynes@225: } nkeynes@225: nkeynes@226: void test_print_failure( char *testname, int number, char *message ) nkeynes@225: { nkeynes@226: if( message == NULL ) { nkeynes@226: fprintf( stderr, "%s: Test %d failed!\n", testname, number ); nkeynes@226: } else { nkeynes@226: fprintf( stderr, "%s: Test %d failed: %s\n", testname, number, message ); nkeynes@226: } nkeynes@225: } nkeynes@225: nkeynes@228: extern unsigned int interrupt_pc; nkeynes@228: extern unsigned int interrupt_count; nkeynes@228: nkeynes@228: int assert_exception_caught( char *testname, int number, unsigned int expectedpc ) nkeynes@228: { nkeynes@228: if( interrupt_count == 0 ) { nkeynes@228: fprintf( stderr, "%s: Test %d failed: Expected exception not delivered\n", nkeynes@228: testname, number ); nkeynes@228: return 1; nkeynes@228: } else if( interrupt_count != 1 ) { nkeynes@228: fprintf( stderr, "%s: Test %d failed: Expected exception delivered %d times!\n", nkeynes@228: testname, number, interrupt_count ); nkeynes@228: return 1; nkeynes@228: } else if( interrupt_pc != expectedpc ) { nkeynes@228: fprintf( stderr, "%s: Test %d failed: Expected exception at PC %08X, but was %08X\n", nkeynes@228: testname, number, expectedpc, interrupt_pc ); nkeynes@228: return 1; nkeynes@228: } else { nkeynes@228: return 0; nkeynes@228: } nkeynes@228: } nkeynes@228: nkeynes@555: int assert_tlb_exception_caught( char *testname, int number, unsigned int expectedpc, nkeynes@555: unsigned int vpn ) nkeynes@555: { nkeynes@555: if( assert_exception_caught(testname, number, expectedpc) == 1 ) { nkeynes@555: return 1; nkeynes@555: } nkeynes@555: nkeynes@555: unsigned int pteh = long_read(0xFF000000); nkeynes@555: if( (pteh & 0xFFFFFC00) != (vpn & 0xFFFFFC00) ) { nkeynes@555: fprintf(stderr, "%s: Test %d failed: Expected PTEH.VPN = %08X, but was %08X\n", nkeynes@555: testname, number, (vpn>>10), (pteh>>10) ); nkeynes@555: return 1; nkeynes@555: } nkeynes@555: nkeynes@555: unsigned int tea = long_read(0xFF00000C); nkeynes@555: if( tea != vpn ) { nkeynes@555: fprintf(stderr, "%s: Test %d failed: Expected TEA = %08X, but was %08X\n", nkeynes@555: testname, number, vpn, tea ); nkeynes@555: return 1; nkeynes@555: } nkeynes@555: return 0; nkeynes@555: } nkeynes@555: nkeynes@225: int main() nkeynes@225: { nkeynes@231: fprintf( stdout, "Instruction tests...\n" ); nkeynes@228: install_interrupt_handler(); nkeynes@225: test_add(); nkeynes@226: test_addc(); nkeynes@226: test_addv(); nkeynes@226: test_and(); nkeynes@226: test_andi(); nkeynes@228: test_bf(); nkeynes@231: test_bt(); nkeynes@404: test_bsr(); nkeynes@231: test_cmp(); nkeynes@364: test_cmpstr(); nkeynes@364: test_div0(); nkeynes@384: test_div1(); nkeynes@357: test_float(); nkeynes@358: test_fmov(); nkeynes@357: test_ftrc(); nkeynes@358: test_mac(); nkeynes@396: test_rot(); nkeynes@396: test_shl(); nkeynes@364: test_shld(); nkeynes@393: test_sub(); nkeynes@393: test_subc(); nkeynes@533: test_trapa(); nkeynes@399: test_tas(); nkeynes@393: test_xtrct(); nkeynes@231: fprintf( stdout, "--> %d/%d instruction tests passed (%d%%)\n\n", nkeynes@231: total_tests-total_fails, total_tests, nkeynes@231: ((total_tests-total_fails)*100)/total_tests ); nkeynes@231: nkeynes@231: fprintf( stdout, "Exception tests...\n" ); nkeynes@231: test_slot_illegal(); nkeynes@233: test_undefined(); nkeynes@555: test_tlb(); nkeynes@228: remove_interrupt_handler(); nkeynes@226: nkeynes@231: fprintf( stdout, "Total: %d/%d tests passed (%d%%)\n", total_tests-total_fails, nkeynes@226: total_tests, ((total_tests-total_fails)*100)/total_tests ); nkeynes@522: return total_fails; nkeynes@225: }