Changeset 835
- Timestamp:
- 02/05/07 19:47:02 (2 years ago)
- Files:
-
- libemu/trunk/testsuite/instrtest.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
libemu/trunk/testsuite/instrtest.c
r831 r835 21 21 #define SUCCESS "\033[32;1msuccess\033[0m" 22 22 23 int verbose; 23 static struct run_time_options 24 { 25 int verbose; 26 int nasm_force; 27 } opts; 24 28 25 29 static const char *regm[] = { … … 60 64 },*/ 61 65 /* 00 */ 62 { 63 .instr = "add ah,al", 64 .in_state.reg = {0xff01,0,0,0,0,0,0,0 }, 65 .in_state.mem_state = {0, 0}, 66 .out_state.reg = {0x01,0,0,0,0,0,0,0 }, 67 .out_state.mem_state = {0, 0}, 68 }, 69 { 70 .instr = "add ch,dl", 71 .in_state.reg = {0,0x1000,0x20,0,0,0,0,0 }, 72 .in_state.mem_state = {0, 0}, 73 .out_state.reg = {0,0x3000,0x20,0,0,0,0,0 }, 74 .out_state.mem_state = {0, 0}, 75 }, 76 { 77 .instr = "add [ecx],al", 78 .in_state.reg = {0x10,0x40000,0,0,0,0,0,0 }, 79 .in_state.mem_state = {0x40000, 0x10101010}, 80 .out_state.reg = {0x10,0x40000,0,0,0,0,0,0 }, 81 .out_state.mem_state = {0x40000, 0x10101020}, 82 }, 66 { 67 .instr = "add ah,al", 68 .code = "\x00\xc4", 69 .codesize = 2, 70 .in_state.reg = {0xff01,0,0,0,0,0,0,0}, 71 .in_state.mem_state = {0, 0}, 72 .out_state.reg = {0x01,0,0,0,0,0,0,0}, 73 .out_state.mem_state = {0, 0}, 74 }, 75 { 76 .instr = "add ch,dl", 77 .code = "\x00\xd5", 78 .codesize = 2, 79 .in_state.reg = {0,0x1000,0x20,0,0,0,0,0}, 80 .in_state.mem_state = {0, 0}, 81 .out_state.reg = {0,0x3000,0x20,0,0,0,0,0}, 82 .out_state.mem_state = {0, 0}, 83 }, 84 { 85 .instr = "add [ecx],al", 86 .code = "\x00\x01", 87 .codesize = 2, 88 .in_state.reg = {0x10,0x40000,0,0,0,0,0,0}, 89 .in_state.mem_state = {0x40000, 0x10101010}, 90 .out_state.reg = {0x10,0x40000,0,0,0,0,0,0}, 91 .out_state.mem_state = {0x40000, 0x10101020}, 92 }, 83 93 /* 01 */ 84 94 { 85 95 .instr = "add ax,cx", 86 .in_state.reg = {0xffff1111,0xffff2222,0,0,0,0,0,0 }, 87 .in_state.mem_state = {0, 0}, 88 .out_state.reg = {0xffff3333,0xffff2222,0,0,0,0,0,0 }, 96 .code = "\x66\x01\xc8", 97 .codesize = 3, 98 .in_state.reg = {0xffff1111,0xffff2222,0,0,0,0,0,0}, 99 .in_state.mem_state = {0, 0}, 100 .out_state.reg = {0xffff3333,0xffff2222,0,0,0,0,0,0}, 89 101 .out_state.mem_state = {0, 0}, 90 102 }, 91 103 { 92 104 .instr = "add [ecx],ax", 93 .in_state.reg = {0xffff1111,0x40000,0,0,0,0,0,0 }, 105 .code = "\x66\x01\x01", 106 .codesize = 3, 107 .in_state.reg = {0xffff1111,0x40000,0,0,0,0,0,0}, 94 108 .in_state.mem_state = {0x40000, 0x22224444}, 95 .out_state.reg = {0xffff1111,0x40000,0,0,0,0,0,0 },109 .out_state.reg = {0xffff1111,0x40000,0,0,0,0,0,0}, 96 110 .out_state.mem_state = {0x40000, 0x22225555}, 97 111 }, 98 112 { 99 113 .instr = "add eax,ecx", 100 .in_state.reg = {0x11112222,0x22221111,0,0,0,0,0,0 }, 101 .in_state.mem_state = {0, 0}, 102 .out_state.reg = {0x33333333,0x22221111,0,0,0,0,0,0 }, 114 .code = "\x01\xc8", 115 .codesize = 2, 116 .in_state.reg = {0x11112222,0x22221111,0,0,0,0,0,0}, 117 .in_state.mem_state = {0, 0}, 118 .out_state.reg = {0x33333333,0x22221111,0,0,0,0,0,0}, 103 119 .out_state.mem_state = {0, 0}, 104 120 }, 105 121 { 106 122 .instr = "add [ecx],eax", 107 .in_state.reg = {0x22221111,0x40000,0,0,0,0,0,0 }, 123 .code = "\x01\x01", 124 .codesize = 2, 125 .in_state.reg = {0x22221111,0x40000,0,0,0,0,0,0}, 108 126 .in_state.mem_state = {0x40000, 0x22224444}, 109 .out_state.reg = {0x22221111,0x40000,0,0,0,0,0,0 },127 .out_state.reg = {0x22221111,0x40000,0,0,0,0,0,0}, 110 128 .out_state.mem_state = {0x40000, 0x44445555}, 111 129 }, 112 130 /* 02 */ 113 131 { 114 .instr = "add c 1,bh",115 .code = "\x02\xcf", /* add cl,bh */116 .codesize = 2,117 .in_state.reg = {0,0xff,0,0x100,0,0,0,0 },118 .in_state.mem_state = {0, 0}, 119 .out_state.reg = {0,0,0,0x100,0,0,0,0 },132 .instr = "add cl,bh", 133 .code = "\x02\xcf", /* add cl,bh */ 134 .codesize = 2, 135 .in_state.reg = {0,0xff,0,0x100,0,0,0,0}, 136 .in_state.mem_state = {0, 0}, 137 .out_state.reg = {0,0,0,0x100,0,0,0,0}, 120 138 .out_state.mem_state = {0, 0}, 121 139 }, 122 140 { 123 141 .instr = "add al,[ecx]", 124 .in_state.reg = {0x3,0x40000,0,0,0,0,0,0 }, 142 .code = "\x02\x01", 143 .codesize = 2, 144 .in_state.reg = {0x3,0x40000,0,0,0,0,0,0}, 125 145 .in_state.mem_state = {0x40000, 0x30303030}, 126 .out_state.reg = {0x33,0x40000,0,0,0,0,0,0 },146 .out_state.reg = {0x33,0x40000,0,0,0,0,0,0}, 127 147 .out_state.mem_state = {0x40000, 0x30303030}, 128 148 }, … … 130 150 { 131 151 .instr = "add cx,di", 132 .code = "\x66\x03\xcf", /* add cx,di */133 .codesize = 3,134 .in_state.reg = {0,0x10101010,0,0,0,0,0,0x02020202 },135 .in_state.mem_state = {0, 0}, 136 .out_state.reg = {0,0x10101212,0,0,0,0,0,0x02020202 },152 .code = "\x66\x03\xcf", /* add cx,di */ 153 .codesize = 3, 154 .in_state.reg = {0,0x10101010,0,0,0,0,0,0x02020202}, 155 .in_state.mem_state = {0, 0}, 156 .out_state.reg = {0,0x10101212,0,0,0,0,0,0x02020202}, 137 157 .out_state.mem_state = {0, 0}, 138 158 }, 139 159 { 140 160 .instr = "add ax,[ecx]", 141 .in_state.reg = {0x11112222,0x40000,0,0,0,0,0,0 }, 161 .code = "\x66\x03\x01", 162 .codesize = 3, 163 .in_state.reg = {0x11112222,0x40000,0,0,0,0,0,0}, 142 164 .in_state.mem_state = {0x40000, 0x44443333}, 143 .out_state.reg = {0x11115555,0x40000,0,0,0,0,0,0 },165 .out_state.reg = {0x11115555,0x40000,0,0,0,0,0,0}, 144 166 .out_state.mem_state = {0x40000, 0x44443333}, 145 167 }, 146 168 { 147 169 .instr = "add ecx,edi", 148 .code = "\x03\xcf", /* add ecx,edi */149 .codesize = 2,150 .in_state.reg = {0,0x10101010,0,0,0,0,0,0x02020202 },151 .in_state.mem_state = {0, 0}, 152 .out_state.reg = {0,0x12121212,0,0,0,0,0,0x02020202 },170 .code = "\x03\xcf", /* add ecx,edi */ 171 .codesize = 2, 172 .in_state.reg = {0,0x10101010,0,0,0,0,0,0x02020202}, 173 .in_state.mem_state = {0, 0}, 174 .out_state.reg = {0,0x12121212,0,0,0,0,0,0x02020202}, 153 175 .out_state.mem_state = {0, 0}, 154 176 }, 155 177 { 156 178 .instr = "add eax,[ecx]", 157 .in_state.reg = {0x11112222,0x40000,0,0,0,0,0,0 }, 179 .code = "\x03\x01", 180 .codesize = 2, 181 .in_state.reg = {0x11112222,0x40000,0,0,0,0,0,0}, 158 182 .in_state.mem_state = {0x40000, 0x44443333}, 159 .out_state.reg = {0x55555555,0x40000,0,0,0,0,0,0 },183 .out_state.reg = {0x55555555,0x40000,0,0,0,0,0,0}, 160 184 .out_state.mem_state = {0x40000, 0x44443333}, 161 185 }, 162 186 { 163 187 .instr = "add ecx,[ebx+eax*4+0xdeadbeef]", 164 .in_state.reg = {0x2,0x1,0,0x1,0,0,0,0 }, 188 .code = "\x03\x8c\x83\xef\xbe\xad\xde", 189 .codesize = 7, 190 .in_state.reg = {0x2,0x1,0,0x1,0,0,0,0}, 165 191 .in_state.mem_state = {0xdeadbef8, 0x44443333}, 166 .out_state.reg = {0x2,0x44443334,0,0x1,0,0,0,0 },192 .out_state.reg = {0x2,0x44443334,0,0x1,0,0,0,0}, 167 193 .out_state.mem_state = {0xdeadbef8, 0x44443333}, 168 194 }, 169 195 /* 04 */ 170 196 { 171 .instr = "add al,0x11", 172 .in_state.reg = {0x22222222,0,0,0,0,0,0,0 }, 173 .in_state.mem_state = {0, 0}, 174 .out_state.reg = {0x22222233,0,0,0,0,0,0,0 }, 175 .out_state.mem_state = {0, 0}, 176 }, 197 .instr = "add al,0x11", 198 .code = "\x04\x11", 199 .codesize = 2, 200 .in_state.reg = {0x22222222,0,0,0,0,0,0,0}, 201 .in_state.mem_state = {0, 0}, 202 .out_state.reg = {0x22222233,0,0,0,0,0,0,0}, 203 .out_state.mem_state = {0, 0}, 204 }, 177 205 /* 05 */ 178 206 { 179 .instr = "add ax,0x1111", 180 .in_state.reg = {0x22222222,0,0,0,0,0,0,0 }, 181 .in_state.mem_state = {0, 0}, 182 .out_state.reg = {0x22223333,0,0,0,0,0,0,0 }, 183 .out_state.mem_state = {0, 0}, 184 }, 185 { 186 .instr = "add eax,0x11111111", 187 .in_state.reg = {0x22222222,0,0,0,0,0,0,0 }, 188 .in_state.mem_state = {0, 0}, 189 .out_state.reg = {0x33333333,0,0,0,0,0,0,0 }, 190 .out_state.mem_state = {0, 0}, 191 }, 207 .instr = "add ax,0x1111", 208 .code = "\x66\x05\x11\x11", 209 .codesize = 4, 210 .in_state.reg = {0x22222222,0,0,0,0,0,0,0}, 211 .in_state.mem_state = {0, 0}, 212 .out_state.reg = {0x22223333,0,0,0,0,0,0,0}, 213 .out_state.mem_state = {0, 0}, 214 }, 215 { 216 .instr = "add eax,0x11111111", 217 .code = "\x05\x11\x11\x11\x11", 218 .codesize = 5, 219 .in_state.reg = {0x22222222,0,0,0,0,0,0,0}, 220 .in_state.mem_state = {0, 0}, 221 .out_state.reg = {0x33333333,0,0,0,0,0,0,0}, 222 .out_state.mem_state = {0, 0}, 223 }, 192 224 }; 193 225 … … 197 229 for (i=0;i<sizeof(tests)/sizeof(struct instr_test);i++) 198 230 { 199 if ( tests[i].code != NULL )231 if ( opts.nasm_force == 0 && tests[i].code != NULL ) 200 232 { // dup it so we can free it 201 233 uint8_t *c = (uint8_t *)malloc(tests[i].codesize); … … 207 239 FILE *f=fopen("/tmp/foo.S","w+"); 208 240 241 if (f == NULL) 242 { 243 printf("failed to create asm file for nasm instruction %s\n\n\t%s",tests[i].instr,strerror(errno)); 244 return -1; 245 } 246 209 247 fwrite(use,strlen(use),1,f); 210 248 fwrite(tests[i].instr,1,strlen(tests[i].instr),f); … … 212 250 system("cd /tmp/; nasm foo.S"); 213 251 f=fopen("/tmp/foo","r"); 252 if (f == NULL) 253 { 254 printf("failed to open compiled nasm file for read for instruction %s\n\n\t%s",tests[i].instr,strerror(errno)); 255 return -1; 256 } 257 214 258 fseek(f,0,SEEK_END); 215 259 … … 243 287 int j=0; 244 288 245 if ( verbose == 1 )289 if ( opts.verbose == 1 ) 246 290 { 247 291 printf("code '"); … … 275 319 emu_cpu_eip_set(emu_cpu_get(e), static_offset); 276 320 277 if ( verbose == 1)321 if (opts.verbose == 1) 278 322 { 279 323 emu_log_level_set(emu_logging_get(e),EMU_LOG_DEBUG); … … 290 334 291 335 292 if ( verbose == 1)336 if (opts.verbose == 1) 293 337 { 294 338 emu_log_level_set(emu_logging_get(e),EMU_LOG_DEBUG); … … 304 348 if ( emu_cpu_reg32_get(cpu, j) == tests[i].out_state.reg[j] ) 305 349 { 306 if ( verbose == 1)350 if (opts.verbose == 1) 307 351 printf("\t %s "SUCCESS"\n",regm[j]); 308 352 } else … … 321 365 if ( value == tests[i].out_state.mem_state[1] ) 322 366 { 323 if ( verbose == 1)367 if (opts.verbose == 1) 324 368 printf("\t memory "SUCCESS"\n"); 325 369 } … … 361 405 int main(int argc, char *argv[]) 362 406 { 363 verbose = 0;407 memset(&opts,0,sizeof(struct run_time_options)); 364 408 365 409 while ( 1 ) … … 369 413 static struct option long_options[] = { 370 414 {"verbose" , 0, 0, 'v'}, 415 {"nasm-force" , 0, 0, 'n'}, 371 416 {0, 0, 0, 0} 372 417 }; 373 418 374 c = getopt_long (argc, argv, "v ", long_options, &option_index);419 c = getopt_long (argc, argv, "vn", long_options, &option_index); 375 420 if ( c == -1 ) 376 421 break; … … 379 424 { 380 425 case 'v': 381 verbose = 1;426 opts.verbose = 1; 382 427 break; 428 429 case 'n': 430 opts.nasm_force = 1; 431 break; 432 383 433 384 434 default:
