1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/src/test/testsh4xir.c Tue Apr 07 10:55:03 2009 +0000
1.5 + * $Id: testsh4x86.c 988 2009-01-15 11:23:20Z nkeynes $
1.7 + * Test cases for the SH4 => XIR decoder. Takes as
1.8 + * input a binary SH4 object (and VMA), generates the
1.9 + * corresponding IR, and dumps it to stdout.
1.11 + * Copyright (c) 2009 Nathan Keynes.
1.13 + * This program is free software; you can redistribute it and/or modify
1.14 + * it under the terms of the GNU General Public License as published by
1.15 + * the Free Software Foundation; either version 2 of the License, or
1.16 + * (at your option) any later version.
1.18 + * This program is distributed in the hope that it will be useful,
1.19 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.20 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.21 + * GNU General Public License for more details.
1.23 +#include <getopt.h>
1.24 +#include <stdlib.h>
1.25 +#include <sys/stat.h>
1.26 +#include <string.h>
1.28 +#include "lxdream.h"
1.29 +#include "sh4/sh4core.h"
1.30 +#include "sh4/sh4mmio.h"
1.31 +#include "sh4/sh4xir.h"
1.34 +struct mmio_region mmio_region_MMU;
1.35 +struct mmio_region mmio_region_PMM;
1.36 +struct breakpoint_struct sh4_breakpoints[MAX_BREAKPOINTS];
1.37 +struct sh4_registers sh4r;
1.38 +int sh4_breakpoint_count = 0;
1.39 +uint32_t sh4_cpu_period = 5;
1.40 +struct sh4_icache_struct sh4_icache;
1.42 +void MMU_ldtlb() { }
1.43 +void FASTCALL sh4_sleep() { }
1.44 +void FASTCALL sh4_write_fpscr( uint32_t val ) { }
1.45 +void sh4_switch_fr_banks() { }
1.46 +void FASTCALL sh4_write_sr( uint32_t val ) { }
1.47 +uint32_t FASTCALL sh4_read_sr( void ) { return 0; }
1.48 +void FASTCALL sh4_raise_trap( int exc ) { }
1.49 +void FASTCALL sh4_raise_exception( int exc ) { }
1.50 +void log_message( void *ptr, int level, const gchar *source, const char *msg, ... ) { }
1.51 +gboolean sh4_execute_instruction( ) { return TRUE; }
1.52 +void **sh4_address_space;
1.53 +void **sh4_user_address_space;
1.54 +unsigned char *xlat_output;
1.56 +#define MAX_INS_SIZE 32
1.57 +#define MAX_XIR_OPS 16384
1.59 +char *option_list = "s:o:d:h";
1.60 +struct option longopts[1] = { { NULL, 0, 0, 0 } };
1.62 +struct xir_symbol_entry debug_symbols[] = {
1.63 + { "sh4_cpu_period", &sh4_cpu_period },
1.64 + { "sh4_write_fpscr", sh4_write_fpscr },
1.65 + { "sh4_write_sr", sh4_write_sr },
1.66 + { "sh4_read_sr", sh4_read_sr },
1.67 + { "sh4_sleep", sh4_sleep },
1.68 + { "sh4_switch_fr_banks", sh4_switch_fr_banks },
1.69 + { "sh4_raise_exception", sh4_raise_exception },
1.70 + { "sh4_raise_trap", sh4_raise_trap },
1.71 + { "sh4_execute_instruction", sh4_execute_instruction },
1.74 +extern struct xlat_source_machine sh4_source_machine;
1.75 +extern struct xlat_target_machine x86_target_machine;
1.78 + fprintf( stderr, "Usage: testsh4xir [options] <input bin file>\n");
1.79 + fprintf( stderr, "Options:\n");
1.80 + fprintf( stderr, " -d <filename> Diff results against contents of file\n" );
1.81 + fprintf( stderr, " -h Display this help message\n" );
1.82 + fprintf( stderr, " -o <filename> Output disassembly to file [stdout]\n" );
1.83 + fprintf( stderr, " -s <addr> Specify start address of binary [8C010000]\n" );
1.86 +int main( int argc, char *argv[] )
1.89 + char *output_file;
1.92 + uint32_t start_addr = 0x8c010000;
1.95 + struct xir_op xir[MAX_XIR_OPS];
1.96 + xir_op_t xir_ptr = &xir[0];
1.98 + while( (opt = getopt_long( argc, argv, option_list, longopts, NULL )) != -1 ) {
1.101 + diff_file = optarg;
1.104 + output_file = optarg;
1.107 + start_addr = strtoul(optarg, NULL, 0);
1.114 + if( optind < argc ) {
1.115 + input_file = argv[optind++];
1.121 + mmio_region_MMU.mem = malloc(4096);
1.122 + memset( mmio_region_MMU.mem, 0, 4096 );
1.124 + ((uint32_t *)mmio_region_MMU.mem)[4] = 1;
1.126 + FILE *in = fopen( input_file, "ro" );
1.127 + if( in == NULL ) {
1.128 + perror( "Unable to open input file" );
1.131 + fstat( fileno(in), &st );
1.132 + inbuf = malloc( st.st_size );
1.133 + fread( inbuf, st.st_size, 1, in );
1.134 + sh4_icache.mask = 0xFFFFF000;
1.135 + sh4_icache.page_vma = start_addr & 0xFFFFF000;
1.136 + sh4_icache.page = (unsigned char *)(inbuf - (start_addr&0xFFF));
1.137 + sh4_icache.page_ppa = start_addr & 0xFFFFF000;
1.139 + struct xir_basic_block xbb;
1.140 + xbb.source = &sh4_source_machine;
1.141 + xbb.ir_alloc_begin = &xir[0];
1.142 + xbb.ir_alloc_end = &xir[MAX_XIR_OPS];
1.143 + xbb.ir_begin = xbb.ir_ptr = xbb.ir_end = xbb.ir_alloc_begin;
1.144 + xbb.pc_begin = start_addr;
1.145 + xbb.pc_end = start_addr+4096;
1.146 + xbb.source->decode_basic_block( &xbb );
1.148 + x86_target_machine.lower( &xbb, xbb.ir_begin, xbb.ir_end );
1.149 + xir_set_register_names( sh4_source_machine.reg_names, x86_target_machine.reg_names );
1.150 + xir_set_symbol_table( debug_symbols );
1.151 + xir_dump_block( &xir[0], NULL );