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

csst.c (973B)


      1#include <stdint.h>
      2#include <unistd.h>
      3
      4int main(void)
      5{
      6    uint64_t parmlist[] __attribute__((aligned(16))) = {
      7        0xfedcba9876543210ull,
      8        0,
      9        0x7777777777777777ull,
     10        0,
     11    };
     12    uint64_t op1 = 0x0123456789abcdefull;
     13    uint64_t op2 = 0;
     14    uint64_t op3 = op1;
     15    uint64_t cc;
     16
     17    asm volatile(
     18        "    lghi %%r0,%[flags]\n"
     19        "    la %%r1,%[parmlist]\n"
     20        "    csst %[op1],%[op2],%[op3]\n"
     21        "    ipm %[cc]\n"
     22        : [op1] "+m" (op1),
     23          [op2] "+m" (op2),
     24          [op3] "+r" (op3),
     25          [cc] "=r" (cc)
     26        : [flags] "K" (0x0301),
     27          [parmlist] "m" (parmlist)
     28        : "r0", "r1", "cc", "memory");
     29    cc = (cc >> 28) & 3;
     30    if (cc) {
     31        write(1, "bad cc\n", 7);
     32        return 1;
     33    }
     34    if (op1 != parmlist[0]) {
     35        write(1, "bad op1\n", 8);
     36        return 1;
     37    }
     38    if (op2 != parmlist[2]) {
     39        write(1, "bad op2\n", 8);
     40        return 1;
     41    }
     42    return 0;
     43}