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

check_addcm.c (1918B)


      1#include <stdio.h>
      2#include <stdlib.h>
      3#include <stdint.h>
      4#include "sys.h"
      5#include "crisutils.h"
      6
      7/* need to avoid acr as source here.  */
      8static always_inline int cris_addc_m(int a, const int *b)
      9{
     10	asm volatile ("addc [%1], %0\n" : "+r" (a) : "r" (b));
     11	return a;
     12}
     13
     14/* 'b' is a crisv32 constrain to avoid postinc with $acr.  */
     15static always_inline int cris_addc_pi_m(int a, int **b)
     16{
     17	asm volatile ("addc [%1+], %0\n" : "+r" (a), "+b" (*b));
     18	return a;
     19}
     20
     21#define verify_addc_m(a, b, res, n, z, v, c)  \
     22{                                           \
     23	int r;                              \
     24	r = cris_addc_m((a), (b));            \
     25	cris_tst_cc((n), (z), (v), (c));    \
     26	if (r != (res))                     \
     27		err();                      \
     28}
     29
     30#define verify_addc_pi_m(a, b, res, n, z, v, c)  \
     31{                                           \
     32	int r;                              \
     33	r = cris_addc_pi_m((a), (b));            \
     34	cris_tst_cc((n), (z), (v), (c));    \
     35	if (r != (res))                     \
     36		err();                      \
     37}
     38
     39int x[] = { 0, 0, 2, -1, 0xffff, -1, 0x5432f789};
     40
     41int main(void)
     42{
     43	int *p = (void *)&x[0];
     44#if 1
     45	cris_tst_cc_init();
     46	asm volatile ("clearf cz");
     47	verify_addc_m(0, p, 0, 0, 0, 0, 0);
     48
     49	cris_tst_cc_init();
     50	asm volatile ("setf z");
     51	verify_addc_m(0, p, 0, 0, 1, 0, 0);
     52
     53	cris_tst_cc_init();
     54	asm volatile ("setf c");
     55	verify_addc_m(0, p, 1, 0, 0, 0, 0);
     56
     57	cris_tst_cc_init();
     58	asm volatile ("clearf c");
     59	verify_addc_pi_m(0, &p, 0, 0, 1, 0, 0);
     60
     61	p = &x[1];
     62	cris_tst_cc_init();
     63	asm volatile ("setf c");
     64	verify_addc_pi_m(0, &p, 1, 0, 0, 0, 0);
     65
     66	if (p != &x[2])
     67		err();
     68
     69	cris_tst_cc_init();
     70	asm volatile ("clearf c");
     71	verify_addc_pi_m(-1, &p, 1, 0, 0, 0, 1);
     72
     73	if (p != &x[3])
     74		err();
     75#endif
     76	p = &x[3];
     77	/* TODO: investigate why this one fails.  */
     78	cris_tst_cc_init();
     79	asm volatile ("setf c");
     80	verify_addc_m(2, p, 2, 0, 0, 0, 1);
     81	p += 4;
     82
     83	pass();
     84	return 0;
     85}