nkeynes@225 | 1 | #include <stdio.h>
|
nkeynes@555 | 2 | #include "../lib.h"
|
nkeynes@225 | 3 |
|
nkeynes@226 | 4 | int total_tests = 0;
|
nkeynes@226 | 5 | int total_fails = 0;
|
nkeynes@226 | 6 |
|
nkeynes@1192 | 7 | void test_print_float_error( int expect, int actual )
|
nkeynes@1192 | 8 | {
|
nkeynes@1192 | 9 | fprintf( stderr, "Error: expected 0x%08x but was 0x%08x\n", expect, actual );
|
nkeynes@1192 | 10 | }
|
nkeynes@1192 | 11 |
|
nkeynes@225 | 12 | int test_print_result( char *testname, int failed, int total )
|
nkeynes@225 | 13 | {
|
nkeynes@231 | 14 | fprintf( stdout, "%s: %d/%d tests passed\n", testname, total-failed, total );
|
nkeynes@226 | 15 | total_tests += total;
|
nkeynes@226 | 16 | total_fails += failed;
|
nkeynes@225 | 17 | return failed;
|
nkeynes@225 | 18 | }
|
nkeynes@225 | 19 |
|
nkeynes@226 | 20 | void test_print_failure( char *testname, int number, char *message )
|
nkeynes@225 | 21 | {
|
nkeynes@226 | 22 | if( message == NULL ) {
|
nkeynes@226 | 23 | fprintf( stderr, "%s: Test %d failed!\n", testname, number );
|
nkeynes@226 | 24 | } else {
|
nkeynes@226 | 25 | fprintf( stderr, "%s: Test %d failed: %s\n", testname, number, message );
|
nkeynes@226 | 26 | }
|
nkeynes@225 | 27 | }
|
nkeynes@225 | 28 |
|
nkeynes@228 | 29 | extern unsigned int interrupt_pc;
|
nkeynes@228 | 30 | extern unsigned int interrupt_count;
|
nkeynes@228 | 31 |
|
nkeynes@228 | 32 | int assert_exception_caught( char *testname, int number, unsigned int expectedpc )
|
nkeynes@228 | 33 | {
|
nkeynes@228 | 34 | if( interrupt_count == 0 ) {
|
nkeynes@228 | 35 | fprintf( stderr, "%s: Test %d failed: Expected exception not delivered\n",
|
nkeynes@228 | 36 | testname, number );
|
nkeynes@228 | 37 | return 1;
|
nkeynes@228 | 38 | } else if( interrupt_count != 1 ) {
|
nkeynes@228 | 39 | fprintf( stderr, "%s: Test %d failed: Expected exception delivered %d times!\n",
|
nkeynes@228 | 40 | testname, number, interrupt_count );
|
nkeynes@228 | 41 | return 1;
|
nkeynes@228 | 42 | } else if( interrupt_pc != expectedpc ) {
|
nkeynes@228 | 43 | fprintf( stderr, "%s: Test %d failed: Expected exception at PC %08X, but was %08X\n",
|
nkeynes@228 | 44 | testname, number, expectedpc, interrupt_pc );
|
nkeynes@228 | 45 | return 1;
|
nkeynes@228 | 46 | } else {
|
nkeynes@228 | 47 | return 0;
|
nkeynes@228 | 48 | }
|
nkeynes@228 | 49 | }
|
nkeynes@228 | 50 |
|
nkeynes@555 | 51 | int assert_tlb_exception_caught( char *testname, int number, unsigned int expectedpc,
|
nkeynes@555 | 52 | unsigned int vpn )
|
nkeynes@555 | 53 | {
|
nkeynes@555 | 54 | if( assert_exception_caught(testname, number, expectedpc) == 1 ) {
|
nkeynes@555 | 55 | return 1;
|
nkeynes@555 | 56 | }
|
nkeynes@555 | 57 |
|
nkeynes@555 | 58 | unsigned int pteh = long_read(0xFF000000);
|
nkeynes@555 | 59 | if( (pteh & 0xFFFFFC00) != (vpn & 0xFFFFFC00) ) {
|
nkeynes@555 | 60 | fprintf(stderr, "%s: Test %d failed: Expected PTEH.VPN = %08X, but was %08X\n",
|
nkeynes@555 | 61 | testname, number, (vpn>>10), (pteh>>10) );
|
nkeynes@555 | 62 | return 1;
|
nkeynes@555 | 63 | }
|
nkeynes@555 | 64 |
|
nkeynes@555 | 65 | unsigned int tea = long_read(0xFF00000C);
|
nkeynes@555 | 66 | if( tea != vpn ) {
|
nkeynes@555 | 67 | fprintf(stderr, "%s: Test %d failed: Expected TEA = %08X, but was %08X\n",
|
nkeynes@555 | 68 | testname, number, vpn, tea );
|
nkeynes@555 | 69 | return 1;
|
nkeynes@555 | 70 | }
|
nkeynes@555 | 71 | return 0;
|
nkeynes@555 | 72 | }
|
nkeynes@555 | 73 |
|
nkeynes@225 | 74 | int main()
|
nkeynes@225 | 75 | {
|
nkeynes@231 | 76 | fprintf( stdout, "Instruction tests...\n" );
|
nkeynes@228 | 77 | install_interrupt_handler();
|
nkeynes@225 | 78 | test_add();
|
nkeynes@226 | 79 | test_addc();
|
nkeynes@226 | 80 | test_addv();
|
nkeynes@226 | 81 | test_and();
|
nkeynes@226 | 82 | test_andi();
|
nkeynes@228 | 83 | test_bf();
|
nkeynes@231 | 84 | test_bt();
|
nkeynes@404 | 85 | test_bsr();
|
nkeynes@231 | 86 | test_cmp();
|
nkeynes@364 | 87 | test_cmpstr();
|
nkeynes@364 | 88 | test_div0();
|
nkeynes@384 | 89 | test_div1();
|
nkeynes@357 | 90 | test_float();
|
nkeynes@1192 | 91 | test_fsrra();
|
nkeynes@358 | 92 | test_fmov();
|
nkeynes@357 | 93 | test_ftrc();
|
nkeynes@823 | 94 | test_ldc();
|
nkeynes@358 | 95 | test_mac();
|
nkeynes@396 | 96 | test_rot();
|
nkeynes@396 | 97 | test_shl();
|
nkeynes@364 | 98 | test_shld();
|
nkeynes@393 | 99 | test_sub();
|
nkeynes@393 | 100 | test_subc();
|
nkeynes@1083 | 101 | test_subv();
|
nkeynes@533 | 102 | test_trapa();
|
nkeynes@399 | 103 | test_tas();
|
nkeynes@393 | 104 | test_xtrct();
|
nkeynes@231 | 105 | fprintf( stdout, "--> %d/%d instruction tests passed (%d%%)\n\n",
|
nkeynes@231 | 106 | total_tests-total_fails, total_tests,
|
nkeynes@231 | 107 | ((total_tests-total_fails)*100)/total_tests );
|
nkeynes@231 | 108 |
|
nkeynes@231 | 109 | fprintf( stdout, "Exception tests...\n" );
|
nkeynes@231 | 110 | test_slot_illegal();
|
nkeynes@233 | 111 | test_undefined();
|
nkeynes@555 | 112 | test_tlb();
|
nkeynes@808 | 113 | test_vmexit();
|
nkeynes@228 | 114 | remove_interrupt_handler();
|
nkeynes@226 | 115 |
|
nkeynes@231 | 116 | fprintf( stdout, "Total: %d/%d tests passed (%d%%)\n", total_tests-total_fails,
|
nkeynes@226 | 117 | total_tests, ((total_tests-total_fails)*100)/total_tests );
|
nkeynes@522 | 118 | return total_fails;
|
nkeynes@225 | 119 | }
|