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-cond.c (1473B)


      1#include <unistd.h>
      2
      3#ifdef TEST_CMOV
      4
      5#define TEST_COND(N) 				\
      6int test_##N (long a)				\
      7{						\
      8  int res = 1;					\
      9                                                \
     10  asm ("cmov"#N" %1,$31,%0"			\
     11       : "+r" (res) : "r" (a));			\
     12  return !res;					\
     13}
     14
     15#else
     16
     17#define TEST_COND(N) 				\
     18int test_##N (long a)				\
     19{						\
     20  int res = 1;					\
     21                                                \
     22  asm ("b"#N" %1,1f\n\t"			\
     23       "addq $31,$31,%0\n\t"			\
     24       "1: unop\n"				\
     25       : "+r" (res) : "r" (a));			\
     26  return res;					\
     27}
     28
     29#endif
     30
     31TEST_COND(eq)
     32TEST_COND(ne)
     33TEST_COND(ge)
     34TEST_COND(gt)
     35TEST_COND(lbc)
     36TEST_COND(lbs)
     37TEST_COND(le)
     38TEST_COND(lt)
     39
     40static struct {
     41  int (*func)(long);
     42  long v;
     43  int r;
     44} vectors[] =
     45  {
     46    {test_eq, 0, 1},
     47    {test_eq, 1, 0},
     48
     49    {test_ne, 0, 0},
     50    {test_ne, 1, 1},
     51
     52    {test_ge, 0, 1},
     53    {test_ge, 1, 1},
     54    {test_ge, -1, 0},
     55
     56    {test_gt, 0, 0},
     57    {test_gt, 1, 1},
     58    {test_gt, -1, 0},
     59
     60    {test_lbc, 0, 1},
     61    {test_lbc, 1, 0},
     62    {test_lbc, -1, 0},
     63
     64    {test_lbs, 0, 0},
     65    {test_lbs, 1, 1},
     66    {test_lbs, -1, 1},
     67
     68    {test_le, 0, 1},
     69    {test_le, 1, 0},
     70    {test_le, -1, 1},
     71
     72    {test_lt, 0, 0},
     73    {test_lt, 1, 0},
     74    {test_lt, -1, 1},
     75  };
     76
     77int main (void)
     78{
     79  int i;
     80
     81  for (i = 0; i < sizeof (vectors)/sizeof(vectors[0]); i++)
     82    if ((*vectors[i].func)(vectors[i].v) != vectors[i].r) {
     83      write(1, "Failed\n", 7);
     84      return 1;
     85    }
     86  write(1, "OK\n", 3);
     87  return 0;
     88}