filename | src/test/testsh4x86.c |
changeset | 934:3acd3b3ee6d1 |
prev | 931:430048ea8b71 |
next | 939:6f2302afeb89 |
author | nkeynes |
date | Fri Dec 26 14:25:23 2008 +0000 (15 years ago) |
branch | lxdream-mem |
permissions | -rw-r--r-- |
last change | Change RAM regions to use static arrays rather than mmap regions, for a 2-3% performance gain. General mem cleanups, including some save state fixes that break states again. |
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 "x86dasm/x86dasm.h"
26 #include "sh4/sh4trans.h"
27 #include "sh4/sh4core.h"
28 #include "sh4/sh4mmio.h"
30 struct dreamcast_module sh4_module;
31 struct mmio_region mmio_region_MMU;
32 struct mmio_region mmio_region_PMM;
33 struct breakpoint_struct sh4_breakpoints[MAX_BREAKPOINTS];
34 int sh4_breakpoint_count = 0;
36 #define MAX_INS_SIZE 32
39 struct mem_region_fn **sh4_address_space = (void *)0x12345432;
40 char *option_list = "s:o:d:h";
41 struct option longopts[1] = { { NULL, 0, 0, 0 } };
43 char *input_file = NULL;
44 char *diff_file = NULL;
45 char *output_file = NULL;
46 gboolean sh4_starting;
47 uint32_t start_addr = 0x8C010000;
48 uint32_t sh4_cpu_period = 5;
49 unsigned char dc_main_ram[4096];
50 unsigned char dc_boot_rom[4096];
51 FILE *in;
53 char *inbuf;
55 struct x86_symbol local_symbols[] = {
56 { "sh4r+128", ((char *)&sh4r)+128 },
57 { "sh4_cpu_period", &sh4_cpu_period },
58 { "mmu_vma_to_phys_read", mmu_vma_to_phys_read },
59 { "mmu_vma_to_phys_write", mmu_vma_to_phys_write },
60 { "sh4_address_space", 0x12345432 },
61 { "sh4_write_fpscr", sh4_write_fpscr },
62 { "sh4_write_sr", sh4_write_sr },
63 { "sh4_read_sr", sh4_read_sr },
64 { "sh4_sleep", sh4_sleep },
65 { "sh4_fsca", sh4_fsca },
66 { "sh4_ftrv", sh4_ftrv },
67 { "sh4_switch_fr_banks", sh4_switch_fr_banks },
68 { "sh4_execute_instruction", sh4_execute_instruction },
69 { "signsat48", signsat48 },
70 { "sh4_read_byte", sh4_read_byte },
71 { "sh4_read_word", sh4_read_word },
72 { "sh4_read_long", sh4_read_long },
73 { "sh4_write_byte", sh4_write_byte },
74 { "sh4_write_word", sh4_write_word },
75 { "sh4_write_long", sh4_write_long },
76 { "xlat_get_code_by_vma", xlat_get_code_by_vma },
77 { "xlat_get_code", xlat_get_code }
78 };
80 int32_t FASTCALL sh4_read_byte( uint32_t addr )
81 {
82 return *(uint8_t *)(inbuf+(addr-start_addr));
83 }
84 int32_t FASTCALL sh4_read_word( uint32_t addr )
85 {
86 return *(uint16_t *)(inbuf+(addr-start_addr));
87 }
88 int32_t FASTCALL sh4_read_long( uint32_t addr )
89 {
90 return *(uint32_t *)(inbuf+(addr-start_addr));
91 }
93 // Stubs
94 gboolean sh4_execute_instruction( ) { return TRUE; }
95 void sh4_accept_interrupt() {}
96 void sh4_set_breakpoint( uint32_t pc, breakpoint_type_t type ) { }
97 gboolean sh4_clear_breakpoint( uint32_t pc, breakpoint_type_t type ) { return TRUE; }
98 gboolean dreamcast_is_running() { return FALSE; }
99 int sh4_get_breakpoint( uint32_t pc ) { return 0; }
100 void sh4_core_exit( int exit_code ){}
101 void sh4_flush_icache(){}
102 void event_execute() {}
103 void TMU_run_slice( uint32_t nanos ) {}
104 void CCN_set_cache_control( uint32_t val ) { }
105 void PMM_write_control( int ctr, uint32_t val ) { }
106 void SCIF_run_slice( uint32_t nanos ) {}
107 void FASTCALL sh4_write_byte( uint32_t addr, uint32_t val ) {}
108 void FASTCALL sh4_write_word( uint32_t addr, uint32_t val ) {}
109 void FASTCALL sh4_write_long( uint32_t addr, uint32_t val ) {}
110 void FASTCALL sh4_write_fpscr( uint32_t val ) { }
111 void FASTCALL sh4_write_sr( uint32_t val ) { }
112 uint32_t FASTCALL sh4_read_sr( void ) { return 0; }
113 void FASTCALL sh4_sleep() { }
114 void FASTCALL sh4_fsca( uint32_t angle, float *fr ) { }
115 void FASTCALL sh4_ftrv( float *fv ) { }
116 void FASTCALL signsat48(void) { }
117 void sh4_switch_fr_banks() { }
118 void mem_copy_to_sh4( sh4addr_t addr, sh4ptr_t src, size_t size ) { }
119 gboolean sh4_has_page( sh4vma_t vma ) { return TRUE; }
120 void syscall_invoke( uint32_t val ) { }
121 void dreamcast_stop() {}
122 void dreamcast_reset() {}
123 gboolean FASTCALL sh4_raise_reset( int exc ) { return TRUE; }
124 gboolean FASTCALL sh4_raise_exception( int exc ) { return TRUE; }
125 gboolean FASTCALL sh4_raise_tlb_exception( int exc ) { return TRUE; }
126 gboolean FASTCALL sh4_raise_trap( int exc ) { return TRUE; }
127 uint32_t sh4_sleep_run_slice(uint32_t nanosecs) { return nanosecs; }
128 gboolean gui_error_dialog( const char *fmt, ... ) { return TRUE; }
129 struct sh4_icache_struct sh4_icache;
130 struct mem_region_fn mem_region_unmapped;
132 void usage()
133 {
134 fprintf( stderr, "Usage: testsh4x86 [options] <input bin file>\n");
135 fprintf( stderr, "Options:\n");
136 fprintf( stderr, " -d <filename> Diff results against contents of file\n" );
137 fprintf( stderr, " -h Display this help message\n" );
138 fprintf( stderr, " -o <filename> Output disassembly to file [stdout]\n" );
139 fprintf( stderr, " -s <addr> Specify start address of binary [8C010000]\n" );
140 }
142 void emit( void *ptr, int level, const gchar *source, const char *msg, ... )
143 {
144 va_list ap;
145 va_start( ap, msg );
146 vfprintf( stderr, msg, ap );
147 fprintf( stderr, "\n" );
148 va_end(ap);
149 }
152 struct sh4_registers sh4r;
155 int main( int argc, char *argv[] )
156 {
157 struct stat st;
158 int opt;
159 while( (opt = getopt_long( argc, argv, option_list, longopts, NULL )) != -1 ) {
160 switch( opt ) {
161 case 'd':
162 diff_file = optarg;
163 break;
164 case 'o':
165 output_file = optarg;
166 break;
167 case 's':
168 start_addr = strtoul(optarg, NULL, 0);
169 break;
170 case 'h':
171 usage();
172 exit(0);
173 }
174 }
175 if( optind < argc ) {
176 input_file = argv[optind++];
177 } else {
178 usage();
179 exit(1);
180 }
182 mmio_region_MMU.mem = malloc(4096);
183 memset( mmio_region_MMU.mem, 0, 4096 );
185 ((uint32_t *)mmio_region_MMU.mem)[4] = 1;
187 in = fopen( input_file, "ro" );
188 if( in == NULL ) {
189 perror( "Unable to open input file" );
190 exit(2);
191 }
192 fstat( fileno(in), &st );
193 inbuf = malloc( st.st_size );
194 fread( inbuf, st.st_size, 1, in );
195 sh4_icache.mask = 0xFFFFF000;
196 sh4_icache.page_vma = start_addr & 0xFFFFF000;
197 sh4_icache.page = (unsigned char *)(inbuf - (sh4_icache.page_vma&0xFFF));
198 sh4_icache.page_ppa = start_addr & 0xFFFFF000;
200 xlat_cache_init();
201 uintptr_t pc;
202 uint8_t *buf = sh4_translate_basic_block( start_addr );
203 uint32_t buflen = xlat_get_code_size(buf);
204 x86_disasm_init( (uintptr_t)buf, (uintptr_t)buf, buflen );
205 x86_set_symtab( local_symbols, sizeof(local_symbols)/sizeof(struct x86_symbol) );
206 for( pc = buf; pc < buf + buflen; ) {
207 char buf[256];
208 char op[256];
209 uintptr_t pc2 = x86_disasm_instruction( pc, buf, sizeof(buf), op );
210 fprintf( stdout, "%08x: %s\n", pc, buf );
211 pc = pc2;
212 }
213 return 0;
214 }
.