Search
lxdream.org :: lxdream/test/sh4/testsh4.c
lxdream 0.9.1
released Jun 29
Download Now
filename test/sh4/testsh4.c
changeset 976:e57a25d9eb7d
prev823:8a592668322f
next1083:34895c8bab20
author nkeynes
date Mon Jan 26 12:32:23 2009 +0000 (15 years ago)
permissions -rw-r--r--
last change Add some initial TLB test cases
file annotate diff log raw
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
}
.