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