Search
lxdream.org :: lxdream/src/test/testsh4x86.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/test/testsh4x86.c
changeset 1189:1540105786c8
prev1112:4cac5e474d4c
next1263:b3de98d19faf
author nkeynes
date Thu Feb 23 15:24:47 2012 +1000 (12 years ago)
permissions -rw-r--r--
last change Check for existence of glDrawBuffer (assuming that glReadBuffer will
follow). Note only need to guard the common code in gl_fbo.c
view annotate diff log raw
     1 /**
     2  * $Id$
     3  *
     4  * Test cases for the SH4 => x86 translator core. Takes as
     5  * input a binary SH4 object (and VMA), generates the
     6  * corresponding x86 code, and outputs the disassembly.
     7  *
     8  * Copyright (c) 2005 Nathan Keynes.
     9  *
    10  * This program is free software; you can redistribute it and/or modify
    11  * it under the terms of the GNU General Public License as published by
    12  * the Free Software Foundation; either version 2 of the License, or
    13  * (at your option) any later version.
    14  *
    15  * This program is distributed in the hope that it will be useful,
    16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    18  * GNU General Public License for more details.
    19  */
    21 #include <stdio.h>
    22 #include <stdarg.h>
    23 #include <getopt.h>
    24 #include <sys/stat.h>
    25 #include <string.h>
    27 #include "x86dasm/x86dasm.h"
    28 #include "sh4/sh4trans.h"
    29 #include "sh4/sh4core.h"
    30 #include "sh4/sh4mmio.h"
    31 #include "sh4/mmu.h"
    33 struct dreamcast_module sh4_module;
    34 struct mmio_region mmio_region_MMU;
    35 struct mmio_region mmio_region_PMM;
    36 struct breakpoint_struct sh4_breakpoints[MAX_BREAKPOINTS];
    37 int sh4_breakpoint_count = 0;
    39 #define MAX_INS_SIZE 32
    42 struct mem_region_fn **sh4_address_space = (void *)0x12345432;
    43 struct mem_region_fn **sh4_user_address_space = (void *)0x12345678;
    44 char *option_list = "s:o:d:h";
    45 struct option longopts[1] = { { NULL, 0, 0, 0 } };
    47 char *input_file = NULL;
    48 char *diff_file = NULL;
    49 char *output_file = NULL;
    50 gboolean sh4_starting;
    51 uint32_t start_addr = 0x8C010000;
    52 uint32_t sh4_cpu_period = 5;
    53 unsigned char dc_main_ram[4096];
    54 unsigned char dc_boot_rom[4096];
    55 FILE *in;
    57 char *inbuf;
    59 struct x86_symbol local_symbols[] = {
    60     { "sh4r+128", ((char *)&sh4r)+128 },
    61     { "sh4_cpu_period", &sh4_cpu_period },
    62     { "sh4_address_space", (void *)0x12345432 },
    63     { "sh4_user_address_space", (void *)0x12345678 },
    64     { "sh4_write_fpscr", sh4_write_fpscr },
    65     { "sh4_write_sr", sh4_write_sr },
    66     { "sh4_read_sr", sh4_read_sr },
    67     { "sh4_sleep", sh4_sleep },
    68     { "sh4_fsca", sh4_fsca },
    69     { "sh4_ftrv", sh4_ftrv },
    70     { "sh4_switch_fr_banks", sh4_switch_fr_banks },
    71     { "sh4_execute_instruction", sh4_execute_instruction },
    72     { "signsat48", signsat48 },
    73     { "xlat_get_code_by_vma", xlat_get_code_by_vma },
    74     { "xlat_get_code", xlat_get_code }
    75 };
    77 // Stubs
    78 gboolean sh4_execute_instruction( ) { return TRUE; }
    79 void sh4_accept_interrupt() {}
    80 void sh4_set_breakpoint( uint32_t pc, breakpoint_type_t type ) { }
    81 gboolean sh4_clear_breakpoint( uint32_t pc, breakpoint_type_t type ) { return TRUE; }
    82 gboolean dreamcast_is_running() { return FALSE; }
    83 int sh4_get_breakpoint( uint32_t pc ) { return 0; }
    84 void sh4_finalize_instruction() { }
    85 void sh4_core_exit( int exit_code ){}
    86 void sh4_crashdump() {}
    87 void event_execute() {}
    88 void TMU_run_slice( uint32_t nanos ) {}
    89 void CCN_set_cache_control( int val ) { }
    90 void PMM_write_control( int ctr, uint32_t val ) { }
    91 void SCIF_run_slice( uint32_t nanos ) {}
    92 void FASTCALL sh4_write_fpscr( uint32_t val ) { }
    93 void FASTCALL sh4_write_sr( uint32_t val ) { }
    94 uint32_t FASTCALL sh4_read_sr( void ) { return 0; }
    95 void FASTCALL sh4_sleep() { }
    96 void FASTCALL sh4_fsca( uint32_t angle, float *fr ) { }
    97 void FASTCALL sh4_ftrv( float *fv ) { }
    98 void FASTCALL signsat48(void) { }
    99 void sh4_switch_fr_banks() { }
   100 void mem_copy_to_sh4( sh4addr_t addr, sh4ptr_t src, size_t size ) { }
   101 gboolean sh4_has_page( sh4vma_t vma ) { return TRUE; }
   102 void syscall_invoke( uint32_t val ) { }
   103 void dreamcast_stop() {} 
   104 void dreamcast_reset() {}
   105 void FASTCALL sh4_raise_reset( int exc ) { }
   106 void FASTCALL sh4_raise_exception( int exc ) { }
   107 void FASTCALL sh4_raise_tlb_exception( int exc, sh4vma_t vma ) { }
   108 void FASTCALL sh4_raise_tlb_multihit( sh4vma_t vma) { }
   109 void FASTCALL sh4_raise_trap( int exc ) { }
   110 void FASTCALL sh4_flush_store_queue( sh4addr_t addr ) { }
   111 void FASTCALL sh4_flush_store_queue_mmu( sh4addr_t addr, void *exc ) { }
   112 void sh4_handle_pending_events() { }
   113 uint32_t sh4_sleep_run_slice(uint32_t nanosecs) { return nanosecs; }
   114 gboolean gui_error_dialog( const char *fmt, ... ) { return TRUE; }
   115 gboolean FASTCALL mmu_update_icache( sh4vma_t addr ) { return TRUE; }
   116 void MMU_ldtlb() { }
   117 void event_schedule(int event, uint32_t nanos) { }
   118 struct sh4_icache_struct sh4_icache;
   119 struct mem_region_fn mem_region_unmapped;
   120 const struct cpu_desc_struct sh4_cpu_desc;
   121 sh4addr_t FASTCALL mmu_vma_to_phys_disasm( sh4vma_t vma ) { return vma; }
   123 void usage()
   124 {
   125     fprintf( stderr, "Usage: testsh4x86 [options] <input bin file>\n");
   126     fprintf( stderr, "Options:\n");
   127     fprintf( stderr, "  -d <filename>  Diff results against contents of file\n" );
   128     fprintf( stderr, "  -h             Display this help message\n" );
   129     fprintf( stderr, "  -o <filename>  Output disassembly to file [stdout]\n" );
   130     fprintf( stderr, "  -s <addr>      Specify start address of binary [8C010000]\n" );
   131 }
   133 void emit( void *ptr, int level, const gchar *source, const char *msg, ... )
   134 {
   135     va_list ap;
   136     va_start( ap, msg );
   137     vfprintf( stderr, msg, ap );
   138     fprintf( stderr, "\n" );
   139     va_end(ap);
   140 }
   143 struct sh4_registers sh4r;
   146 int main( int argc, char *argv[] )
   147 {
   148     struct stat st;
   149     int opt;
   150     while( (opt = getopt_long( argc, argv, option_list, longopts, NULL )) != -1 ) {
   151 	switch( opt ) {
   152 	case 'd':
   153 	    diff_file = optarg;
   154 	    break;
   155 	case 'o':
   156 	    output_file = optarg;
   157 	    break;
   158 	case 's':
   159 	    start_addr = strtoul(optarg, NULL, 0);
   160 	    break;
   161 	case 'h':
   162 	    usage();
   163 	    exit(0);
   164 	}
   165     }
   166     if( optind < argc ) {
   167 	input_file = argv[optind++];
   168     } else {
   169 	usage();
   170 	exit(1);
   171     }
   173     mmio_region_MMU.mem = malloc(4096);
   174     memset( mmio_region_MMU.mem, 0, 4096 );
   176     ((uint32_t *)mmio_region_MMU.mem)[4] = 1;
   178     in = fopen( input_file, "ro" );
   179     if( in == NULL ) {
   180 	perror( "Unable to open input file" );
   181 	exit(2);
   182     }
   183     fstat( fileno(in), &st );
   184     inbuf = malloc( st.st_size );
   185     fread( inbuf, st.st_size, 1, in );
   186     sh4_icache.mask = 0xFFFFF000;
   187     sh4_icache.page_vma = start_addr & 0xFFFFF000;
   188     sh4_icache.page = (unsigned char *)(inbuf - (sh4_icache.page_vma&0xFFF));
   189     sh4_icache.page_ppa = start_addr & 0xFFFFF000;
   191     xlat_cache_init();
   192     uintptr_t pc;
   193     uint8_t *buf = sh4_translate_basic_block( start_addr );
   194     uint32_t buflen = xlat_get_code_size(buf);
   195     x86_disasm_init( buf, (uintptr_t)buf, buflen );
   196     x86_set_symtab( local_symbols, sizeof(local_symbols)/sizeof(struct x86_symbol) );
   197     for( pc = (uintptr_t)buf; pc < ((uintptr_t)buf) + buflen;  ) {
   198 	char buf[256];
   199 	char op[256];
   200 	uintptr_t pc2 = x86_disasm_instruction( pc, buf, sizeof(buf), op );
   201 	fprintf( stdout, "%p: %s\n", (void *)pc, buf );
   202 	pc = pc2;
   203     }
   204     return 0;
   205 }
.