Changeset 835

Show
Ignore:
Timestamp:
02/05/07 19:47:02 (2 years ago)
Author:
common
Message:

libemu

  • instrtest
    • -n forces nasm compilation of all instructions, else the precompiled code is taken (if availible)
    • fixed some indentings
    • added precompiled code to all instructions
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libemu/trunk/testsuite/instrtest.c

    r831 r835  
    2121#define SUCCESS "\033[32;1msuccess\033[0m" 
    2222 
    23 int verbose; 
     23static struct run_time_options 
     24
     25        int verbose; 
     26        int nasm_force; 
     27} opts; 
    2428 
    2529static const char *regm[] = { 
     
    6064    },*/ 
    6165    /* 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        }, 
    8393        /* 01 */ 
    8494        { 
    8595                .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}, 
    89101                .out_state.mem_state = {0, 0}, 
    90102        }, 
    91103        { 
    92104                .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}, 
    94108                .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}, 
    96110                .out_state.mem_state = {0x40000, 0x22225555}, 
    97111        }, 
    98112        { 
    99113                .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}, 
    103119                .out_state.mem_state = {0, 0}, 
    104120        }, 
    105121        { 
    106122                .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}, 
    108126                .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}, 
    110128                .out_state.mem_state = {0x40000, 0x44445555}, 
    111129        }, 
    112130        /* 02 */ 
    113131        { 
    114                 .instr = "add c1,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}, 
    120138                .out_state.mem_state = {0, 0}, 
    121139        }, 
    122140        { 
    123141                .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}, 
    125145                .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}, 
    127147                .out_state.mem_state = {0x40000, 0x30303030}, 
    128148        }, 
     
    130150        { 
    131151                .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}, 
    137157                .out_state.mem_state = {0, 0}, 
    138158        }, 
    139159        { 
    140160                .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}, 
    142164                .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}, 
    144166                .out_state.mem_state = {0x40000, 0x44443333}, 
    145167        }, 
    146168        { 
    147169                .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}, 
    153175                .out_state.mem_state = {0, 0}, 
    154176        }, 
    155177        { 
    156178                .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}, 
    158182                .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}, 
    160184                .out_state.mem_state = {0x40000, 0x44443333}, 
    161185        }, 
    162186        { 
    163187                .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}, 
    165191                .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}, 
    167193                .out_state.mem_state = {0xdeadbef8, 0x44443333}, 
    168194        }, 
    169195        /* 04 */ 
    170196        { 
    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        }, 
    177205        /* 05 */ 
    178206        { 
    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        }, 
    192224}; 
    193225 
     
    197229        for (i=0;i<sizeof(tests)/sizeof(struct instr_test);i++) 
    198230        { 
    199                 if ( tests[i].code != NULL ) 
     231                if ( opts.nasm_force == 0 && tests[i].code != NULL ) 
    200232                { // dup it so we can free it 
    201233                        uint8_t *c = (uint8_t *)malloc(tests[i].codesize); 
     
    207239                        FILE *f=fopen("/tmp/foo.S","w+"); 
    208240 
     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 
    209247                        fwrite(use,strlen(use),1,f); 
    210248                        fwrite(tests[i].instr,1,strlen(tests[i].instr),f); 
     
    212250                        system("cd /tmp/; nasm foo.S"); 
    213251                        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 
    214258                        fseek(f,0,SEEK_END); 
    215259 
     
    243287                int j=0; 
    244288 
    245                 if ( verbose == 1 ) 
     289                if ( opts.verbose == 1 ) 
    246290                { 
    247291                        printf("code '"); 
     
    275319                emu_cpu_eip_set(emu_cpu_get(e), static_offset); 
    276320 
    277                 if (verbose == 1) 
     321                if (opts.verbose == 1) 
    278322                { 
    279323                emu_log_level_set(emu_logging_get(e),EMU_LOG_DEBUG); 
     
    290334    
    291335 
    292                 if (verbose == 1) 
     336                if (opts.verbose == 1) 
    293337                { 
    294338                        emu_log_level_set(emu_logging_get(e),EMU_LOG_DEBUG); 
     
    304348                        if ( emu_cpu_reg32_get(cpu, j) ==  tests[i].out_state.reg[j] ) 
    305349                        { 
    306                                 if (verbose == 1) 
     350                                if (opts.verbose == 1) 
    307351                                        printf("\t %s "SUCCESS"\n",regm[j]); 
    308352                        } else 
     
    321365                                if ( value == tests[i].out_state.mem_state[1] ) 
    322366                                { 
    323                                         if (verbose == 1) 
     367                                        if (opts.verbose == 1) 
    324368                                                printf("\t memory "SUCCESS"\n"); 
    325369                                } 
     
    361405int main(int argc, char *argv[]) 
    362406{ 
    363         verbose = 0
     407        memset(&opts,0,sizeof(struct run_time_options))
    364408 
    365409        while ( 1 ) 
     
    369413                static struct option long_options[] = { 
    370414                        {"verbose"                      , 0, 0, 'v'}, 
     415                        {"nasm-force"           , 0, 0, 'n'}, 
    371416                        {0, 0, 0, 0} 
    372417                }; 
    373418 
    374                 c = getopt_long (argc, argv, "v", long_options, &option_index); 
     419                c = getopt_long (argc, argv, "vn", long_options, &option_index); 
    375420                if ( c == -1 ) 
    376421                        break; 
     
    379424                { 
    380425                case 'v': 
    381                         verbose = 1; 
     426                        opts.verbose = 1; 
    382427                        break; 
     428 
     429                case 'n': 
     430                        opts.nasm_force = 1; 
     431                        break; 
     432 
    383433 
    384434                default: