VirtualBox

Changeset 36140 in vbox for trunk/src/recompiler/tests


Ignore:
Timestamp:
Mar 3, 2011 1:48:16 PM (14 years ago)
Author:
vboxsync
Message:

rem: Re-synced to svn://svn.savannah.nongnu.org/qemu/trunk@5495 (repo UUID c046a42c-6fe2-441c-8c8c-71466251a162).

Location:
trunk/src/recompiler/tests
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/tests/Makefile

    r2426 r36140  
    11-include ../config-host.mak
     2VPATH=$(SRC_PATH)/tests
    23
    3 CFLAGS=-Wall -O2 -g
     4CFLAGS=-Wall -O2 -g -fno-strict-aliasing
    45#CFLAGS+=-msse2
    56LDFLAGS=
    67
    78ifeq ($(ARCH),i386)
    8 TESTS=linux-test testthread sha1-i386 test-i386 runcom
     9TESTS=linux-test testthread sha1-i386 test-i386
    910endif
    1011ifeq ($(ARCH),x86_64)
     
    1314TESTS+=sha1# test_path
    1415#TESTS+=test_path
     16#TESTS+=runcom
    1517
    16 QEMU=../i386-user/qemu-i386
     18QEMU=../i386-linux-user/qemu-i386
    1719
    1820all: $(TESTS)
     
    3234test-i386: test-i386.c test-i386-code16.S test-i386-vm86.S \
    3335           test-i386.h test-i386-shift.h test-i386-muldiv.h
    34         $(CC) $(CFLAGS) $(LDFLAGS) -static -o $@ \
    35               test-i386.c test-i386-code16.S test-i386-vm86.S -lm
     36        $(CC) -m32 $(CFLAGS) $(LDFLAGS) -static -o $@ \
     37              $(<D)/test-i386.c $(<D)/test-i386-code16.S $(<D)/test-i386-vm86.S -lm
    3638
    3739test-x86_64: test-i386.c \
    3840           test-i386.h test-i386-shift.h test-i386-muldiv.h
    39         $(CC) $(CFLAGS) $(LDFLAGS) -static -o $@ test-i386.c -lm
     41        $(CC) -m64 $(CFLAGS) $(LDFLAGS) -static -o $@ $(<D)/test-i386.c -lm
    4042
    4143ifeq ($(ARCH),i386)
     
    4749        $(QEMU) test-i386 > test-i386.out
    4850        @if diff -u test-i386.ref test-i386.out ; then echo "Auto Test OK"; fi
    49 ifeq ($(ARCH),i386)
    50         $(QEMU) -no-code-copy test-i386 > test-i386.out
    51         @if diff -u test-i386.ref test-i386.out ; then echo "Auto Test OK (no code copy)"; fi
    52 endif
     51
     52.PHONY: test-mmap
     53test-mmap: test-mmap.c
     54        $(CC) $(CFLAGS) -Wall -static -O2 $(LDFLAGS) -o $@ $<
     55        -./test-mmap
     56        -$(QEMU) ./test-mmap
     57        -$(QEMU) -p 8192 ./test-mmap 8192
     58        -$(QEMU) -p 16384 ./test-mmap 16384
     59        -$(QEMU) -p 32768 ./test-mmap 32768
    5360
    5461# generic Linux and CPU test
     
    8390        arm-linux-gcc -Wall -g -O2 -c -o $@ $<
    8491
     92test-arm-iwmmxt: test-arm-iwmmxt.s
     93        cpp < $< | arm-linux-gnu-gcc -Wall -static -march=iwmmxt -mabi=aapcs -x assembler - -o $@
     94
    8595# MIPS test
    8696hello-mips: hello-mips.c
     
    90100        mipsel-linux-gnu-gcc -nostdlib -static -mno-abicalls -fno-PIC -mabi=32 -Wall -Wextra -g -O2 -o $@ $<
    91101
    92 # XXX: find a way to compile easily a test for each arch
    93 test2:
    94         @for arch in i386 arm armeb sparc ppc mips mipsel; do \
    95            ../$${arch}-user/qemu-$${arch} $${arch}/ls -l linux-test.c ; \
    96         done
     102# testsuite for the CRIS port.
     103test-cris:
     104        $(MAKE) -C cris check
    97105
    98106clean:
  • trunk/src/recompiler/tests/qruncom.c

    r33540 r36140  
    6060}
    6161
    62 static void set_gate(void *ptr, unsigned int type, unsigned int dpl, 
     62static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
    6363                     unsigned long addr, unsigned int sel)
    6464{
     
    142142}
    143143
    144 static void host_segv_handler(int host_signum, siginfo_t *info, 
     144static void host_segv_handler(int host_signum, siginfo_t *info,
    145145                              void *puc)
    146146{
     
    161161        usage();
    162162    filename = argv[1];
    163    
    164     vm86_mem = mmap((void *)0x00000000, 0x110000, 
    165                     PROT_WRITE | PROT_READ | PROT_EXEC, 
     163
     164    vm86_mem = mmap((void *)0x00000000, 0x110000,
     165                    PROT_WRITE | PROT_READ | PROT_EXEC,
    166166                    MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0);
    167167    if (vm86_mem == MAP_FAILED) {
     
    186186    {
    187187        struct sigaction act;
    188        
     188
    189189        sigfillset(&act.sa_mask);
    190190        act.sa_flags = SA_SIGINFO;
     
    194194        sigaction(SIGSEGV, &act, NULL);
    195195        sigaction(SIGBUS, &act, NULL);
    196 #if defined (TARGET_I386) && defined(USE_CODE_COPY)
    197         sigaction(SIGFPE, &act, NULL);
    198 #endif
    199196    }
    200197
    201198    //    cpu_set_log(CPU_LOG_TB_IN_ASM | CPU_LOG_TB_OUT_ASM | CPU_LOG_EXEC);
    202199
    203     env = cpu_init();
    204 
    205     /* disable code copy to simplify debugging */
    206     code_copy_enabled = 0;
     200    env = cpu_init("qemu32");
    207201
    208202    /* set user mode state (XXX: should be done automatically by
     
    219213       mode. We also activate the VM86 flag to run DOS code */
    220214    env->eflags |= IF_MASK | VM_MASK;
    221    
     215
    222216    /* init basic registers */
    223217    env->eip = 0x100;
     
    225219    seg = (COM_BASE_ADDR - 0x100) >> 4;
    226220
    227     cpu_x86_load_seg_cache(env, R_CS, seg, 
    228                            (seg << 4), 0xffff, 0);
    229     cpu_x86_load_seg_cache(env, R_SS, seg, 
    230                            (seg << 4), 0xffff, 0);
    231     cpu_x86_load_seg_cache(env, R_DS, seg, 
    232                            (seg << 4), 0xffff, 0);
    233     cpu_x86_load_seg_cache(env, R_ES, seg, 
    234                            (seg << 4), 0xffff, 0);
    235     cpu_x86_load_seg_cache(env, R_FS, seg, 
    236                            (seg << 4), 0xffff, 0);
    237     cpu_x86_load_seg_cache(env, R_GS, seg, 
     221    cpu_x86_load_seg_cache(env, R_CS, seg,
     222                           (seg << 4), 0xffff, 0);
     223    cpu_x86_load_seg_cache(env, R_SS, seg,
     224                           (seg << 4), 0xffff, 0);
     225    cpu_x86_load_seg_cache(env, R_DS, seg,
     226                           (seg << 4), 0xffff, 0);
     227    cpu_x86_load_seg_cache(env, R_ES, seg,
     228                           (seg << 4), 0xffff, 0);
     229    cpu_x86_load_seg_cache(env, R_FS, seg,
     230                           (seg << 4), 0xffff, 0);
     231    cpu_x86_load_seg_cache(env, R_GS, seg,
    238232                           (seg << 4), 0xffff, 0);
    239233
     
    261255    set_idt(18, 0);
    262256    set_idt(19, 0);
    263        
     257
    264258    /* put return code */
    265259    *seg_to_linear(env->segs[R_CS].selector, 0) = 0xb4; /* mov ah, $0 */
     
    275269    env->regs[R_EDI] = 0xfffe;
    276270
    277     /* inform the emulator of the mapped memory */
    278     page_set_flags(0x00000000, 0x110000, 
     271    /* inform the emulator of the mmaped memory */
     272    page_set_flags(0x00000000, 0x110000,
    279273                   PAGE_WRITE | PAGE_READ | PAGE_EXEC | PAGE_VALID);
    280274
  • trunk/src/recompiler/tests/test-i386-code16.S

    r2426 r36140  
    88
    99        .globl code16_func1
    10        
     10
    1111        /* basic test */
    1212code16_func1 = . - code16_start
     
    2525        data32 lret
    2626
    27 /* test various jmp opcodes */       
     27/* test various jmp opcodes */
    2828        .globl code16_func3
    2929code16_func3 = . - code16_start
     
    3737        add $2, %ax
    38382:
    39        
     39
    4040        call myfunc
    41        
     41
    4242        lcall $CS_SEG, $(myfunc2 - code16_start)
    4343
     
    4545myjmp1_next:
    4646
    47         cs lcall myfunc2_addr - code16_start
     47        cs lcall *myfunc2_addr - code16_start
    4848
    49         cs ljmp myjmp2_addr - code16_start
     49        cs ljmp *myjmp2_addr - code16_start
    5050myjmp2_next:
    5151
    5252        data32 lret
    53        
     53
    5454myfunc2_addr:
    5555        .short myfunc2 - code16_start
  • trunk/src/recompiler/tests/test-i386-shift.h

    r2426 r36140  
    146146    exec_opl(s2, s0, s1, 0);
    147147#ifdef OP_SHIFTD
    148     if (s1 <= 15)
    149         exec_opw(s2, s0, s1, 0);
     148    exec_opw(s2, s0, s1, 0);
    150149#else
    151150    exec_opw(s2, s0, s1, 0);
  • trunk/src/recompiler/tests/test-i386-vm86.S

    r1 r36140  
    1515        es movw $GET_OFFSET(int90_test), 0x90 * 4
    1616        es movw %cs, 0x90 * 4 + 2
    17        
     17
    1818        /* launch int 0x90 */
    1919
     
    2525        int $0x21
    2626
    27         pushf 
     27        pushf
    2828        popw %dx
    2929        movb $0xff, %ah
     
    3131
    3232        cli
    33         pushf 
     33        pushf
    3434        popw %dx
    3535        movb $0xff, %ah
    3636        int $0x21
    3737
    38         sti       
    39         pushfl 
     38        sti
     39        pushfl
    4040        popl %edx
    4141        movb $0xff, %ah
    4242        int $0x21
    43        
     43
    4444#if 0
    4545        movw $GET_OFFSET(IF_msg1), %dx
     
    5555#endif
    5656
    57         pushf 
     57        pushf
    5858        popw %dx
    5959        movb $0xff, %ah
    6060        int $0x21
    61        
     61
    6262        pushfl
    6363        movw %sp, %bx
     
    7474
    7575int90_test:
    76         pushf 
     76        pushf
    7777        pop %dx
    7878        movb $0xff, %ah
     
    8383        movb $0xff, %ah
    8484        int $0x21
    85        
     85
    8686        movw $GET_OFFSET(int90_msg), %dx
    8787        movb $0x09, %ah
    8888        int $0x21
    8989        iret
    90                    
     90
    9191int90_msg:
    9292        .string "INT90 started\n$"
    93  
     93
    9494hello_world:
    9595        .string "Hello VM86 world\n$"
     
    102102
    103103vm86_code_end:
    104        
  • trunk/src/recompiler/tests/test-i386.c

    r33656 r36140  
    11/*
    22 *  x86 CPU test
    3  * 
     3 *
    44 *  Copyright (c) 2003 Fabrice Bellard
    55 *
     
    4141
    4242#if !defined(__x86_64__)
    43 #define TEST_VM86
     43//#define TEST_VM86
    4444#define TEST_SEGS
    4545#endif
    4646//#define LINUX_VM86_IOPL_FIX
    4747//#define TEST_P4_FLAGS
    48 #if defined(__x86_64__)
     48#ifdef __SSE__
    4949#define TEST_SSE
    5050#define TEST_CMOV  1
    5151#define TEST_FCOMI 1
    5252#else
    53 //#define TEST_SSE
    54 #define TEST_CMOV  0
    55 #define TEST_FCOMI 0
     53#undef TEST_SSE
     54#define TEST_CMOV  1
     55#define TEST_FCOMI 1
    5656#endif
    5757
     
    468468}
    469469
     470#define TEST_LOOP(insn) \
     471{\
     472    for(i = 0; i < sizeof(ecx_vals) / sizeof(long); i++) {\
     473        ecx = ecx_vals[i];\
     474        for(zf = 0; zf < 2; zf++) {\
     475    asm("test %2, %2\n\t"\
     476        "movl $1, %0\n\t"\
     477          insn " 1f\n\t" \
     478        "movl $0, %0\n\t"\
     479        "1:\n\t"\
     480        : "=a" (res)\
     481        : "c" (ecx), "b" (!zf)); \
     482    printf("%-10s ECX=" FMTLX " ZF=%ld r=%d\n", insn, ecx, zf, res);      \
     483        }\
     484   }\
     485}
     486
     487void test_loop(void)
     488{
     489    long ecx, zf;
     490    const long ecx_vals[] = {
     491        0,
     492        1,
     493        0x10000,
     494        0x10001,
     495#if defined(__x86_64__)
     496        0x100000000L,
     497        0x100000001L,
     498#endif
     499    };
     500    int i, res;
     501
     502#if !defined(__x86_64__)
     503    TEST_LOOP("jcxz");
     504    TEST_LOOP("loopw");
     505    TEST_LOOP("loopzw");
     506    TEST_LOOP("loopnzw");
     507#endif
     508
     509    TEST_LOOP("jecxz");
     510    TEST_LOOP("loopl");
     511    TEST_LOOP("loopzl");
     512    TEST_LOOP("loopnzl");
     513}
     514
    470515#undef CC_MASK
    471516#ifdef TEST_P4_FLAGS
     
    481526#include "test-i386-muldiv.h"
    482527
    483 void test_imulw2(long op0, long op1) 
     528void test_imulw2(long op0, long op1)
    484529{
    485530    long res, s1, s0, flags;
     
    490535    asm volatile ("push %4\n\t"
    491536         "popf\n\t"
    492          "imulw %w2, %w0\n\t" 
     537         "imulw %w2, %w0\n\t"
    493538         "pushf\n\t"
    494539         "pop %1\n\t"
     
    499544}
    500545
    501 void test_imull2(long op0, long op1) 
     546void test_imull2(long op0, long op1)
    502547{
    503548    long res, s1, s0, flags;
     
    508553    asm volatile ("push %4\n\t"
    509554         "popf\n\t"
    510          "imull %k2, %k0\n\t" 
     555         "imull %k2, %k0\n\t"
    511556         "pushf\n\t"
    512557         "pop %1\n\t"
     
    518563
    519564#if defined(__x86_64__)
    520 void test_imulq2(long op0, long op1) 
     565void test_imulq2(long op0, long op1)
    521566{
    522567    long res, s1, s0, flags;
     
    527572    asm volatile ("push %4\n\t"
    528573         "popf\n\t"
    529          "imulq %2, %0\n\t" 
     574         "imulq %2, %0\n\t"
    530575         "pushf\n\t"
    531576         "pop %1\n\t"
     
    684729        "mov $0x12345678, %0\n"\
    685730        #op " %" size "2, %" size "0 ; setz %b1" \
    686         : "=r" (res), "=q" (resz)\
    687         : "g" (val));\
     731        : "=&r" (res), "=&q" (resz)\
     732        : "r" (val));\
    688733    printf("%-10s A=" FMTLX " R=" FMTLX " %ld\n", #op, val, res, resz);\
    689734}
     
    714759};
    715760
    716 union float64u q_nan = { .l = 0xFFF8000000000000 };
    717 union float64u s_nan = { .l = 0xFFF0000000000000 };
     761union float64u q_nan = { .l = 0xFFF8000000000000LL };
     762union float64u s_nan = { .l = 0xFFF0000000000000LL };
    718763
    719764void test_fops(double a, double b)
     
    750795        long double fpregs[8];
    751796    } float_env32;
    752    
     797
    753798    asm volatile ("fnstenv %0\n" : : "m" (float_env32));
    754799    float_env32.fpus &= ~0x7f;
     
    769814        : "=a" (fpus)
    770815        : "t" (a), "u" (b));
    771     printf("fcom(%f %f)=%04lx \n", 
     816    printf("fcom(%f %f)=%04lx \n",
    772817           a, b, fpus & (0x4500 | FPUS_EMASK));
    773818    fpu_clear_exceptions();
     
    776821        : "=a" (fpus)
    777822        : "t" (a), "u" (b));
    778     printf("fucom(%f %f)=%04lx\n", 
     823    printf("fucom(%f %f)=%04lx\n",
    779824           a, b, fpus & (0x4500 | FPUS_EMASK));
    780825    if (TEST_FCOMI) {
     
    787832            : "=r" (eflags), "=a" (fpus)
    788833            : "t" (a), "u" (b));
    789         printf("fcomi(%f %f)=%04lx %02lx\n", 
     834        printf("fcomi(%f %f)=%04lx %02lx\n",
    790835               a, b, fpus & FPUS_EMASK, eflags & (CC_Z | CC_P | CC_C));
    791836        fpu_clear_exceptions();
     
    796841            : "=r" (eflags), "=a" (fpus)
    797842            : "t" (a), "u" (b));
    798         printf("fucomi(%f %f)=%04lx %02lx\n", 
     843        printf("fucomi(%f %f)=%04lx %02lx\n",
    799844               a, b, fpus & FPUS_EMASK, eflags & (CC_Z | CC_P | CC_C));
    800845    }
     
    824869    printf("(long double)%f = %Lf\n", a, la);
    825870    printf("a=" FMT64X "\n", *(uint64_t *)&a);
    826     printf("la=" FMT64X " %04x\n", *(uint64_t *)&la, 
     871    printf("la=" FMT64X " %04x\n", *(uint64_t *)&la,
    827872           *(unsigned short *)((char *)(&la) + 8));
    828873
     
    830875    asm volatile ("fstcw %0" : "=m" (fpuc));
    831876    for(i=0;i<4;i++) {
    832         asm volatile ("fldcw %0" : : "m" ((fpuc & ~0x0c00) | (i << 10)));
     877        uint16_t val16;
     878        val16 = (fpuc & ~0x0c00) | (i << 10);
     879        asm volatile ("fldcw %0" : : "m" (val16));
    833880        asm volatile ("fist %0" : "=m" (wa) : "t" (a));
    834881        asm volatile ("fistl %0" : "=m" (ia) : "t" (a));
     
    866913    asm("fbstp %0" : "=m" (bcd[0]) : "t" (a) : "st");
    867914    asm("fbld %1" : "=t" (b) : "m" (bcd[0]));
    868     printf("a=%f bcd=%04x%04x%04x%04x%04x b=%f\n", 
     915    printf("a=%f bcd=%04x%04x%04x%04x%04x b=%f\n",
    869916           a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b);
    870917}
     
    9871034    test_fcvt(q_nan.d);
    9881035    test_fconst();
    989     test_fbcd(1234567890123456);
    990     test_fbcd(-123451234567890);
     1036    test_fbcd(1234567890123456.0);
     1037    test_fbcd(-123451234567890.0);
    9911038    test_fenv();
    9921039    if (TEST_CMOV) {
     
    10521099    TEST_BCD(aaa, 0x1234040a, 0, (CC_C | CC_A));
    10531100    TEST_BCD(aaa, 0x123405fa, 0, (CC_C | CC_A));
    1054    
     1101
    10551102    TEST_BCD(aas, 0x12340205, CC_A, (CC_C | CC_A));
    10561103    TEST_BCD(aas, 0x12340306, CC_A, (CC_C | CC_A));
     
    10741121    asm(#op " %" size "0, %" size "1" \
    10751122        : "=q" (op0), opconst (op1) \
    1076         : "0" (op0), "1" (op1));\
     1123        : "0" (op0));\
    10771124    printf("%-10s A=" FMTLX " B=" FMTLX "\n",\
    10781125           #op, op0, op1);\
     
    10871134    asm(#op " %" size "0, %" size "1" \
    10881135        : "=q" (op0), opconst (op1) \
    1089         : "0" (op0), "1" (op1), "a" (op2));\
     1136        : "0" (op0), "a" (op2));\
    10901137    printf("%-10s EAX=" FMTLX " A=" FMTLX " C=" FMTLX "\n",\
    10911138           #op, op2, op0, op1);\
     
    10951142{
    10961143#if defined(__x86_64__)
    1097     TEST_XCHG(xchgq, "", "=q");
    1098 #endif
    1099     TEST_XCHG(xchgl, "k", "=q");
    1100     TEST_XCHG(xchgw, "w", "=q");
    1101     TEST_XCHG(xchgb, "b", "=q");
     1144    TEST_XCHG(xchgq, "", "+q");
     1145#endif
     1146    TEST_XCHG(xchgl, "k", "+q");
     1147    TEST_XCHG(xchgw, "w", "+q");
     1148    TEST_XCHG(xchgb, "b", "+q");
    11021149
    11031150#if defined(__x86_64__)
    11041151    TEST_XCHG(xchgq, "", "=m");
    11051152#endif
    1106     TEST_XCHG(xchgl, "k", "=m");
    1107     TEST_XCHG(xchgw, "w", "=m");
    1108     TEST_XCHG(xchgb, "b", "=m");
     1153    TEST_XCHG(xchgl, "k", "+m");
     1154    TEST_XCHG(xchgw, "w", "+m");
     1155    TEST_XCHG(xchgb, "b", "+m");
    11091156
    11101157#if defined(__x86_64__)
    1111     TEST_XCHG(xaddq, "", "=q");
    1112 #endif
    1113     TEST_XCHG(xaddl, "k", "=q");
    1114     TEST_XCHG(xaddw, "w", "=q");
    1115     TEST_XCHG(xaddb, "b", "=q");
     1158    TEST_XCHG(xaddq, "", "+q");
     1159#endif
     1160    TEST_XCHG(xaddl, "k", "+q");
     1161    TEST_XCHG(xaddw, "w", "+q");
     1162    TEST_XCHG(xaddb, "b", "+q");
    11161163
    11171164    {
     
    11231170
    11241171#if defined(__x86_64__)
    1125     TEST_XCHG(xaddq, "", "=m");
    1126 #endif
    1127     TEST_XCHG(xaddl, "k", "=m");
    1128     TEST_XCHG(xaddw, "w", "=m");
    1129     TEST_XCHG(xaddb, "b", "=m");
     1172    TEST_XCHG(xaddq, "", "+m");
     1173#endif
     1174    TEST_XCHG(xaddl, "k", "+m");
     1175    TEST_XCHG(xaddw, "w", "+m");
     1176    TEST_XCHG(xaddb, "b", "+m");
    11301177
    11311178#if defined(__x86_64__)
    1132     TEST_CMPXCHG(cmpxchgq, "", "=q", 0xfbca7654);
    1133 #endif
    1134     TEST_CMPXCHG(cmpxchgl, "k", "=q", 0xfbca7654);
    1135     TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfbca7654);
    1136     TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfbca7654);
     1179    TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfbca7654);
     1180#endif
     1181    TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfbca7654);
     1182    TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfbca7654);
     1183    TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfbca7654);
    11371184
    11381185#if defined(__x86_64__)
    1139     TEST_CMPXCHG(cmpxchgq, "", "=q", 0xfffefdfc);
    1140 #endif
    1141     TEST_CMPXCHG(cmpxchgl, "k", "=q", 0xfffefdfc);
    1142     TEST_CMPXCHG(cmpxchgw, "w", "=q", 0xfffefdfc);
    1143     TEST_CMPXCHG(cmpxchgb, "b", "=q", 0xfffefdfc);
     1186    TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfffefdfc);
     1187#endif
     1188    TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfffefdfc);
     1189    TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfffefdfc);
     1190    TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfffefdfc);
    11441191
    11451192#if defined(__x86_64__)
    1146     TEST_CMPXCHG(cmpxchgq, "", "=m", 0xfbca7654);
    1147 #endif
    1148     TEST_CMPXCHG(cmpxchgl, "k", "=m", 0xfbca7654);
    1149     TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfbca7654);
    1150     TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfbca7654);
     1193    TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfbca7654);
     1194#endif
     1195    TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfbca7654);
     1196    TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfbca7654);
     1197    TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfbca7654);
    11511198
    11521199#if defined(__x86_64__)
    1153     TEST_CMPXCHG(cmpxchgq, "", "=m", 0xfffefdfc);
    1154 #endif
    1155     TEST_CMPXCHG(cmpxchgl, "k", "=m", 0xfffefdfc);
    1156     TEST_CMPXCHG(cmpxchgw, "w", "=m", 0xfffefdfc);
    1157     TEST_CMPXCHG(cmpxchgb, "b", "=m", 0xfffefdfc);
     1200    TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfffefdfc);
     1201#endif
     1202    TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfffefdfc);
     1203    TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfffefdfc);
     1204    TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfffefdfc);
    11581205
    11591206    {
    11601207        uint64_t op0, op1, op2;
     1208        long eax, edx;
    11611209        long i, eflags;
    11621210
    11631211        for(i = 0; i < 2; i++) {
    1164             op0 = 0x123456789abcd;
     1212            op0 = 0x123456789abcdLL;
     1213            eax = i2l(op0 & 0xffffffff);
     1214            edx = i2l(op0 >> 32);
    11651215            if (i == 0)
    1166                 op1 = 0xfbca765423456;
     1216                op1 = 0xfbca765423456LL;
    11671217            else
    11681218                op1 = op0;
    1169             op2 = 0x6532432432434;
    1170             asm("cmpxchg8b %1\n"
     1219            op2 = 0x6532432432434LL;
     1220            asm("cmpxchg8b %2\n"
    11711221                "pushf\n"
    1172                 "pop %2\n"
    1173                 : "=A" (op0), "=m" (op1), "=g" (eflags)
    1174                 : "0" (op0), "m" (op1), "b" ((int)op2), "c" ((int)(op2 >> 32)));
    1175             printf("cmpxchg8b: op0=" FMT64X " op1=" FMT64X " CC=%02lx\n",
    1176                     op0, op1, eflags & CC_Z);
     1222                "pop %3\n"
     1223                : "=a" (eax), "=d" (edx), "=m" (op1), "=g" (eflags)
     1224                : "0" (eax), "1" (edx), "m" (op1), "b" ((int)op2), "c" ((int)(op2 >> 32)));
     1225            printf("cmpxchg8b: eax=" FMTLX " edx=" FMTLX " op1=" FMT64X " CC=%02lx\n",
     1226                   eax, edx, op1, eflags & CC_Z);
    11771227        }
    11781228    }
     
    11831233/* segmentation tests */
    11841234
     1235#include <sys/syscall.h>
     1236#include <unistd.h>
    11851237#include <asm/ldt.h>
    1186 #include <linux/unistd.h>
    11871238#include <linux/version.h>
    11881239
    1189 _syscall3(int, modify_ldt, int, func, void *, ptr, unsigned long, bytecount)
     1240static inline int modify_ldt(int func, void * ptr, unsigned long bytecount)
     1241{
     1242    return syscall(__NR_modify_ldt, func, ptr, bytecount);
     1243}
    11901244
    11911245#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 66)
     
    12011255{\
    12021256    int res, res2;\
     1257    uint16_t mseg = seg;\
    12031258    res = 0x12345678;\
    12041259    asm (op " %" size "2, %" size "0\n" \
     
    12071262         "movl $1, %1\n"\
    12081263         "1:\n"\
    1209          : "=r" (res), "=r" (res2) : "m" (seg), "0" (res));\
     1264         : "=r" (res), "=r" (res2) : "m" (mseg), "0" (res));\
    12101265    printf(op ": Z=%d %08x\n", res2, res & ~(mask));\
     1266}
     1267
     1268#define TEST_ARPL(op, size, op1, op2)\
     1269{\
     1270    long a, b, c;                               \
     1271    a = (op1);                                  \
     1272    b = (op2);                                  \
     1273    asm volatile(op " %" size "3, %" size "0\n"\
     1274                 "movl $0,%1\n"\
     1275                 "jnz 1f\n"\
     1276                 "movl $1,%1\n"\
     1277                 "1:\n"\
     1278                 : "=r" (a), "=r" (c) : "0" (a), "r" (b));    \
     1279    printf(op size " A=" FMTLX " B=" FMTLX " R=" FMTLX " z=%ld\n",\
     1280           (long)(op1), (long)(op2), a, c);\
    12111281}
    12121282
     
    12871357    segoff.seg = MK_SEL(2);
    12881358    segoff.offset = 0xabcdef12;
    1289     asm volatile("lfs %2, %0\n\t" 
     1359    asm volatile("lfs %2, %0\n\t"
    12901360                 "movl %%fs, %1\n\t"
    1291                  : "=r" (res), "=g" (res2) 
     1361                 : "=r" (res), "=g" (res2)
    12921362                 : "m" (segoff));
    12931363    printf("FS:reg = %04x:%08x\n", res2, res);
     
    13021372    TEST_LR("lslw", "w", 0xfff8, 0);
    13031373    TEST_LR("lsll", "", 0xfff8, 0);
     1374
     1375    TEST_ARPL("arpl", "w", 0x12345678 | 3, 0x762123c | 1);
     1376    TEST_ARPL("arpl", "w", 0x12345678 | 1, 0x762123c | 3);
     1377    TEST_ARPL("arpl", "w", 0x12345678 | 1, 0x762123c | 1);
    13041378}
    13051379
     
    13281402
    13291403    /* call the first function */
    1330     asm volatile ("lcall %1, %2" 
     1404    asm volatile ("lcall %1, %2"
    13311405                  : "=a" (res)
    13321406                  : "i" (MK_SEL(1)), "i" (&code16_func1): "memory", "cc");
    13331407    printf("func1() = 0x%08x\n", res);
    1334     asm volatile ("lcall %2, %3" 
     1408    asm volatile ("lcall %2, %3"
    13351409                  : "=a" (res), "=c" (res2)
    13361410                  : "i" (MK_SEL(1)), "i" (&code16_func2): "memory", "cc");
    13371411    printf("func2() = 0x%08x spdec=%d\n", res, res2);
    1338     asm volatile ("lcall %1, %2" 
     1412    asm volatile ("lcall %1, %2"
    13391413                  : "=a" (res)
    13401414                  : "i" (MK_SEL(1)), "i" (&code16_func3): "memory", "cc");
     
    13741448
    13751449#if defined(__x86_64__)
     1450#if 0
    13761451    {
     1452        /* XXX: see if Intel Core2 and AMD64 behavior really
     1453           differ. Here we implemented the Intel way which is not
     1454           compatible yet with QEMU. */
    13771455        static struct __attribute__((packed)) {
    1378             uint32_t offset;
     1456            uint64_t offset;
    13791457            uint16_t seg;
    13801458        } desc;
     
    13841462
    13851463        asm volatile ("push %1\n"
    1386                       "call func_lret\n" 
     1464                      "call func_lret\n"
    13871465                      : "=a" (res)
    13881466                      : "r" (cs_sel) : "memory", "cc");
    13891467        printf("func_lret=" FMTLX "\n", res);
    13901468
    1391         /* NOTE: we assume that &func_lret < 4GB */
    13921469        desc.offset = (long)&func_lret;
    13931470        desc.seg = cs_sel;
    1394        
     1471
    13951472        asm volatile ("xor %%rax, %%rax\n"
    1396                       "rex64 lcall %1\n"
     1473                      "rex64 lcall *(%%rcx)\n"
    13971474                      : "=a" (res)
    1398                       : "m" (desc)
     1475                      : "c" (&desc)
    13991476                      : "memory", "cc");
    14001477        printf("func_lret2=" FMTLX "\n", res);
     
    14031480                      "mov $ 1f, %%rax\n"
    14041481                      "push %%rax\n"
    1405                       "ljmp %1\n"
     1482                      "rex64 ljmp *(%%rcx)\n"
    14061483                      "1:\n"
    14071484                      : "=a" (res)
    1408                       : "m" (desc), "b" (cs_sel)
     1485                      : "c" (&desc), "b" (cs_sel)
    14091486                      : "memory", "cc");
    14101487        printf("func_lret3=" FMTLX "\n", res);
    14111488    }
     1489#endif
    14121490#else
    1413     asm volatile ("push %%cs ; call %1" 
     1491    asm volatile ("push %%cs ; call %1"
    14141492                  : "=a" (res)
    14151493                  : "m" (func_lret): "memory", "cc");
    14161494    printf("func_lret=" FMTLX "\n", res);
    14171495
    1418     asm volatile ("pushf ; push %%cs ; call %1" 
     1496    asm volatile ("pushf ; push %%cs ; call %1"
    14191497                  : "=a" (res)
    14201498                  : "m" (func_iret): "memory", "cc");
     
    14831561   TEST_STRING(stos, "rep ");
    14841562   TEST_STRING(lods, ""); /* to verify stos */
    1485    TEST_STRING(lods, "rep "); 
     1563   TEST_STRING(lods, "rep ");
    14861564   TEST_STRING(movs, "");
    14871565   TEST_STRING(movs, "rep ");
     
    15161594}
    15171595
    1518 #undef __syscall_return
    1519 #define __syscall_return(type, res) \
    1520 do { \
    1521         return (type) (res); \
    1522 } while (0)
    1523 
    1524 _syscall2(int, vm86, int, func, struct vm86plus_struct *, v86)
     1596static inline int vm86(int func, struct vm86plus_struct *v86)
     1597{
     1598    return syscall(__NR_vm86, func, v86);
     1599}
    15251600
    15261601extern char vm86_code_start;
     
    15371612    int seg, ret;
    15381613
    1539     vm86_mem = mmap((void *)0x00000000, 0x110000, 
    1540                     PROT_WRITE | PROT_READ | PROT_EXEC, 
     1614    vm86_mem = mmap((void *)0x00000000, 0x110000,
     1615                    PROT_WRITE | PROT_READ | PROT_EXEC,
    15411616                    MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0);
    15421617    if (vm86_mem == MAP_FAILED) {
     
    15611636    /* move code to proper address. We use the same layout as a .com
    15621637       dos program. */
    1563     memcpy(vm86_mem + (VM86_CODE_CS << 4) + VM86_CODE_IP, 
     1638    memcpy(vm86_mem + (VM86_CODE_CS << 4) + VM86_CODE_IP,
    15641639           &vm86_code_start, &vm86_code_end - &vm86_code_start);
    15651640
     
    15731648            {
    15741649                int int_num, ah, v;
    1575                
     1650
    15761651                int_num = VM86_ARG(ret);
    15771652                if (int_num != 0x21)
     
    16761751    struct sigaction act;
    16771752    volatile int val;
    1678    
     1753
    16791754    act.sa_sigaction = sig_handler;
    16801755    sigemptyset(&act.sa_mask);
     
    17291804        ldt.useable = 1;
    17301805        modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */
    1731        
     1806
    17321807        if (setjmp(jmp_env) == 0) {
    17331808            /* segment not present */
     
    17541829        v1 = *(char *)0x1234;
    17551830    }
    1756    
     1831
    17571832    /* test illegal instruction reporting */
    17581833    printf("UD2 exception:\n");
     
    17661841        asm volatile("lock nop");
    17671842    }
    1768    
     1843
    17691844    printf("INT exception:\n");
    17701845    if (setjmp(jmp_env) == 0) {
     
    18381913                      "orl $0x00100, (%%esp)\n"
    18391914                      "popf\n"
    1840                       "movl $0xabcd, %0\n" 
     1915                      "movl $0xabcd, %0\n"
    18411916                      "movl $0x0, %0\n" : "=m" (val) : : "cc", "memory");
    18421917    }
     
    18691944                  "orl $0x00100, (%%esp)\n"
    18701945                  "popf\n"
    1871                   "movl $0xabcd, %0\n" 
     1946                  "movl $0xabcd, %0\n"
    18721947
    18731948                  /* jmp test */
     
    18951970                  "movl $4, %%ecx\n"
    18961971                  "rep cmpsb\n"
    1897                  
     1972
    18981973                  /* getpid() syscall: single step should skip one
    18991974                     instruction */
     
    19011976                  "int $0x80\n"
    19021977                  "movl $0, %%eax\n"
    1903                  
     1978
    19041979                  /* when modifying SS, trace is not done on the next
    19051980                     instruction */
     
    19171992                  "addl $1, %0\n"
    19181993                  "movl $1, %%eax\n"
    1919                  
     1994
    19201995                  "pushf\n"
    19211996                  "andl $~0x00100, (%%esp)\n"
    19221997                  "popf\n"
    1923                   : "=m" (val) 
    1924                   : 
     1998                  : "=m" (val)
     1999                  :
    19252000                  : "cc", "memory", "eax", "ecx", "esi", "edi");
    19262001    printf("val=%d\n", val);
     
    19352010};
    19362011
    1937 asm("smc_code2:\n"
     2012asm(".section \".data\"\n"
     2013    "smc_code2:\n"
    19382014    "movl 4(%esp), %eax\n"
    19392015    "movl %eax, smc_patch_addr2 + 1\n"
     
    19482024    "smc_patch_addr2:\n"
    19492025    "movl $1, %eax\n"
    1950     "ret\n");
     2026    "ret\n"
     2027    ".previous\n"
     2028    );
    19512029
    19522030typedef int FuncType(void);
     
    19552033{
    19562034    int i;
    1957 
    19582035    printf("self modifying code:\n");
    19592036    printf("func1 = 0x%x\n", ((FuncType *)code)());
     
    20372114
    20382115typedef int __m64 __attribute__ ((__mode__ (__V2SI__)));
    2039 typedef int __m128 __attribute__ ((__mode__(__V4SF__)));
     2116typedef float __m128 __attribute__ ((__mode__(__V4SF__)));
    20402117
    20412118typedef union {
     
    22112288
    22122289/* Force %xmm0 usage to avoid the case where both register index are 0
    2213    to test instruction decoding more extensively */
     2290   to test intruction decoding more extensively */
    22142291#define CVT_OP_XMM2MMX(op)\
    22152292{\
    22162293    asm volatile (#op " %1, %0" : "=y" (r.q[0]) : "x" (a.dq) \
    2217                   : "%xmm0");\
     2294                  : "%xmm0"); \
     2295    asm volatile("emms\n"); \
    22182296    printf("%-9s: a=" FMT64X "" FMT64X " r=" FMT64X "\n",\
    22192297           #op,\
     
    22252303{\
    22262304    asm volatile (#op " %1, %0" : "=x" (r.dq) : "y" (a.q[0]));\
     2305    asm volatile("emms\n"); \
    22272306    printf("%-9s: a=" FMT64X " r=" FMT64X "" FMT64X "\n",\
    22282307           #op,\
     
    22932372        " fxsave %1\n"
    22942373        " fninit\n"
    2295         : "=m" (*(uint32_t *)fp2), "=m" (*(uint32_t *)fp) 
     2374        : "=m" (*(uint32_t *)fp2), "=m" (*(uint32_t *)fp)
    22962375        : "m" (a), "m" (b));
    22972376    printf("fpuc=%04x\n", fp->fpuc);
     
    23002379    for(i = 0; i < 3; i++) {
    23012380        printf("ST%d: " FMT64X " %04x\n",
    2302                i, 
     2381               i,
    23032382               *(uint64_t *)&fp->fpregs1[i * 16],
    23042383               *(uint16_t *)&fp->fpregs1[i * 16 + 8]);
     
    23122391    for(i = 0; i < nb_xmm; i++) {
    23132392        printf("xmm%d: " FMT64X "" FMT64X "\n",
    2314                i, 
     2393               i,
    23152394               *(uint64_t *)&fp->xmm_regs[i * 16],
    23162395               *(uint64_t *)&fp->xmm_regs[i * 16 + 8]);
     
    23522431    MMX_OP2(pmulhuw);
    23532432    MMX_OP2(pmulhw);
    2354    
     2433
    23552434    MMX_OP2(psubsb);
    23562435    MMX_OP2(psubsw);
     
    23912470    asm volatile ("pmovmskb %1, %0" : "=r" (r.l[0]) : "y" (a.q[0]));
    23922471    printf("%-9s: r=%08x\n", "pmovmskb", r.l[0]);
    2393    
     2472
    23942473    asm volatile ("pmovmskb %1, %0" : "=r" (r.l[0]) : "x" (a.dq));
    23952474    printf("%-9s: r=%08x\n", "pmovmskb", r.l[0]);
     
    24032482        b.q[0] = test_values[1][0];
    24042483        b.q[1] = test_values[1][1];
    2405         asm volatile("maskmovq %1, %0" : 
     2484        asm volatile("maskmovq %1, %0" :
    24062485                     : "y" (a.q[0]), "y" (b.q[0]), "D" (&r)
    2407                      : "memory"); 
    2408         printf("%-9s: r=" FMT64X " a=" FMT64X " b=" FMT64X "\n", 
    2409                "maskmov", 
    2410                r.q[0], 
    2411                a.q[0], 
     2486                     : "memory");
     2487        printf("%-9s: r=" FMT64X " a=" FMT64X " b=" FMT64X "\n",
     2488               "maskmov",
     2489               r.q[0],
     2490               a.q[0],
    24122491               b.q[0]);
    2413         asm volatile("maskmovdqu %1, %0" : 
     2492        asm volatile("maskmovdqu %1, %0" :
    24142493                     : "x" (a.dq), "x" (b.dq), "D" (&r)
    2415                      : "memory"); 
    2416         printf("%-9s: r=" FMT64X "" FMT64X " a=" FMT64X "" FMT64X " b=" FMT64X "" FMT64X "\n", 
    2417                "maskmov", 
    2418                r.q[1], r.q[0], 
    2419                a.q[1], a.q[0], 
     2494                     : "memory");
     2495        printf("%-9s: r=" FMT64X "" FMT64X " a=" FMT64X "" FMT64X " b=" FMT64X "" FMT64X "\n",
     2496               "maskmov",
     2497               r.q[1], r.q[0],
     2498               a.q[1], a.q[0],
    24202499               b.q[1], b.q[0]);
    24212500    }
     
    25172596        SSE_OPS(cmpnle);
    25182597        SSE_OPS(cmpord);
    2519        
    2520        
     2598
     2599
    25212600        a.d[0] = 2.7;
    25222601        a.d[1] = -3.4;
     
    25942673#endif
    25952674
     2675#define TEST_CONV_RAX(op)\
     2676{\
     2677    unsigned long a, r;\
     2678    a = i2l(0x8234a6f8);\
     2679    r = a;\
     2680    asm volatile(#op : "=a" (r) : "0" (r));\
     2681    printf("%-10s A=" FMTLX " R=" FMTLX "\n", #op, a, r);\
     2682}
     2683
     2684#define TEST_CONV_RAX_RDX(op)\
     2685{\
     2686    unsigned long a, d, r, rh;                   \
     2687    a = i2l(0x8234a6f8);\
     2688    d = i2l(0x8345a1f2);\
     2689    r = a;\
     2690    rh = d;\
     2691    asm volatile(#op : "=a" (r), "=d" (rh) : "0" (r), "1" (rh));   \
     2692    printf("%-10s A=" FMTLX " R=" FMTLX ":" FMTLX "\n", #op, a, r, rh);  \
     2693}
     2694
     2695void test_conv(void)
     2696{
     2697    TEST_CONV_RAX(cbw);
     2698    TEST_CONV_RAX(cwde);
     2699#if defined(__x86_64__)
     2700    TEST_CONV_RAX(cdqe);
     2701#endif
     2702
     2703    TEST_CONV_RAX_RDX(cwd);
     2704    TEST_CONV_RAX_RDX(cdq);
     2705#if defined(__x86_64__)
     2706    TEST_CONV_RAX_RDX(cqo);
     2707#endif
     2708
     2709    {
     2710        unsigned long a, r;
     2711        a = i2l(0x12345678);
     2712        asm volatile("bswapl %k0" : "=r" (r) : "0" (a));
     2713        printf("%-10s: A=" FMTLX " R=" FMTLX "\n", "bswapl", a, r);
     2714    }
     2715#if defined(__x86_64__)
     2716    {
     2717        unsigned long a, r;
     2718        a = i2l(0x12345678);
     2719        asm volatile("bswapq %0" : "=r" (r) : "0" (a));
     2720        printf("%-10s: A=" FMTLX " R=" FMTLX "\n", "bswapq", a, r);
     2721    }
     2722#endif
     2723}
     2724
    25962725extern void *__start_initcall;
    25972726extern void *__stop_initcall;
     
    26112740    test_mul();
    26122741    test_jcc();
     2742    test_loop();
    26132743    test_floats();
    26142744#if !defined(__x86_64__)
     
    26262756    test_vm86();
    26272757#endif
     2758#if !defined(__x86_64__)
    26282759    test_exceptions();
    2629 #if !defined(__x86_64__)
    26302760    test_self_modifying_code();
    26312761    test_single_step();
    26322762#endif
    26332763    test_enter();
     2764    test_conv();
    26342765#ifdef TEST_SSE
    26352766    test_sse();
  • trunk/src/recompiler/tests/test_path.c

    r1 r36140  
    150150    return 0;
    151151}
    152        
     152
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette