cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

test-i386.h (3449B)


      1
      2#define exec_op glue(exec_, OP)
      3#define exec_opq glue(glue(exec_, OP), q)
      4#define exec_opl glue(glue(exec_, OP), l)
      5#define exec_opw glue(glue(exec_, OP), w)
      6#define exec_opb glue(glue(exec_, OP), b)
      7
      8#define EXECOP2(size, rsize, res, s1, flags) \
      9    asm ("push %4\n\t"\
     10         "popf\n\t"\
     11         stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \
     12         "pushf\n\t"\
     13         "pop %1\n\t"\
     14         : "=q" (res), "=g" (flags)\
     15         : "q" (s1), "0" (res), "1" (flags)); \
     16    printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \
     17           stringify(OP) size, s0, s1, res, iflags, flags & CC_MASK);
     18
     19#define EXECOP1(size, rsize, res, flags) \
     20    asm ("push %3\n\t"\
     21         "popf\n\t"\
     22         stringify(OP) size " %" rsize "0\n\t" \
     23         "pushf\n\t"\
     24         "pop %1\n\t"\
     25         : "=q" (res), "=g" (flags)\
     26         : "0" (res), "1" (flags)); \
     27    printf("%-10s A=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \
     28           stringify(OP) size, s0, res, iflags, flags & CC_MASK);
     29
     30#ifdef OP1
     31#if defined(__x86_64__)
     32void exec_opq(long s0, long s1, long iflags)
     33{
     34    long res, flags;
     35    res = s0;
     36    flags = iflags;
     37    EXECOP1("q", "", res, flags);
     38}
     39#endif
     40
     41void exec_opl(long s0, long s1, long iflags)
     42{
     43    long res, flags;
     44    res = s0;
     45    flags = iflags;
     46    EXECOP1("l", "k", res, flags);
     47}
     48
     49void exec_opw(long s0, long s1, long iflags)
     50{
     51    long res, flags;
     52    res = s0;
     53    flags = iflags;
     54    EXECOP1("w", "w", res, flags);
     55}
     56
     57void exec_opb(long s0, long s1, long iflags)
     58{
     59    long res, flags;
     60    res = s0;
     61    flags = iflags;
     62    EXECOP1("b", "b", res, flags);
     63}
     64#else
     65#if defined(__x86_64__)
     66void exec_opq(long s0, long s1, long iflags)
     67{
     68    long res, flags;
     69    res = s0;
     70    flags = iflags;
     71    EXECOP2("q", "", res, s1, flags);
     72}
     73#endif
     74
     75void exec_opl(long s0, long s1, long iflags)
     76{
     77    long res, flags;
     78    res = s0;
     79    flags = iflags;
     80    EXECOP2("l", "k", res, s1, flags);
     81}
     82
     83void exec_opw(long s0, long s1, long iflags)
     84{
     85    long res, flags;
     86    res = s0;
     87    flags = iflags;
     88    EXECOP2("w", "w", res, s1, flags);
     89}
     90
     91void exec_opb(long s0, long s1, long iflags)
     92{
     93    long res, flags;
     94    res = s0;
     95    flags = iflags;
     96    EXECOP2("b", "b", res, s1, flags);
     97}
     98#endif
     99
    100void exec_op(long s0, long s1)
    101{
    102    s0 = i2l(s0);
    103    s1 = i2l(s1);
    104#if defined(__x86_64__)
    105    exec_opq(s0, s1, 0);
    106#endif
    107    exec_opl(s0, s1, 0);
    108    exec_opw(s0, s1, 0);
    109    exec_opb(s0, s1, 0);
    110#ifdef OP_CC
    111#if defined(__x86_64__)
    112    exec_opq(s0, s1, CC_C);
    113#endif
    114    exec_opl(s0, s1, CC_C);
    115    exec_opw(s0, s1, CC_C);
    116    exec_opb(s0, s1, CC_C);
    117#endif
    118}
    119
    120void glue(test_, OP)(void)
    121{
    122    exec_op(0x12345678, 0x812FADA);
    123    exec_op(0x12341, 0x12341);
    124    exec_op(0x12341, -0x12341);
    125    exec_op(0xffffffff, 0);
    126    exec_op(0xffffffff, -1);
    127    exec_op(0xffffffff, 1);
    128    exec_op(0xffffffff, 2);
    129    exec_op(0x7fffffff, 0);
    130    exec_op(0x7fffffff, 1);
    131    exec_op(0x7fffffff, -1);
    132    exec_op(0x80000000, -1);
    133    exec_op(0x80000000, 1);
    134    exec_op(0x80000000, -2);
    135    exec_op(0x12347fff, 0);
    136    exec_op(0x12347fff, 1);
    137    exec_op(0x12347fff, -1);
    138    exec_op(0x12348000, -1);
    139    exec_op(0x12348000, 1);
    140    exec_op(0x12348000, -2);
    141    exec_op(0x12347f7f, 0);
    142    exec_op(0x12347f7f, 1);
    143    exec_op(0x12347f7f, -1);
    144    exec_op(0x12348080, -1);
    145    exec_op(0x12348080, 1);
    146    exec_op(0x12348080, -2);
    147}
    148
    149void *glue(_test_, OP) __init_call = glue(test_, OP);
    150
    151#undef OP
    152#undef OP_CC