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_addo.c (3037B)


      1#include <stdio.h>
      2#include <stdlib.h>
      3#include <stdint.h>
      4#include "sys.h"
      5#include "crisutils.h"
      6
      7/* this would be better to do in asm, it's an orgy in GCC inline asm now.  */
      8
      9#define cris_addo_b(o, v) \
     10	asm volatile ("addo.b\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr");
     11#define cris_addo_w(o, v) \
     12	asm volatile ("addo.w\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr");
     13#define cris_addo_d(o, v) \
     14	asm volatile ("addo.d\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr");
     15#define cris_addo_pi_b(o, v) \
     16	asm volatile ("addo.b\t[%0+], %1, $acr\n" \
     17                         : "+b" (o): "r" (v) : "acr");
     18#define cris_addo_pi_w(o, v) \
     19	asm volatile ("addo.w\t[%0+], %1, $acr\n" \
     20                         : "+b" (o): "r" (v) : "acr");
     21#define cris_addo_pi_d(o, v) \
     22	asm volatile ("addo.d\t[%0+], %1, $acr\n" \
     23                         : "+b" (o): "r" (v) : "acr");
     24
     25struct {
     26	uint32_t v1;
     27	uint16_t v2;
     28	uint32_t v3;
     29	uint8_t v4;
     30	uint8_t v5;
     31	uint16_t v6;
     32	uint32_t v7;
     33} y = {
     34	32769,
     35	-1,
     36	5,
     37	3, -4,
     38	2,
     39	-76789887
     40};
     41
     42static int x[3] = {0x55aa77ff, 0xccff2244, 0x88ccee19};
     43
     44int main(void)
     45{
     46	int *r;
     47	unsigned char *t, *p;
     48
     49	/* Note, this test-case will trig an unaligned access, partly
     50	   to x[0] and to [x1].  */
     51	t = (unsigned char *)x;
     52	t -= 32768;
     53	p = (unsigned char *) &y.v1;
     54	mb(); /* don't reorder anything beyond here.  */
     55	cris_tst_cc_init();
     56	asm volatile ("setf\tzvnc\n");
     57	cris_addo_pi_d(p, t);
     58	cris_tst_cc(1, 1, 1, 1);
     59	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
     60	if (*r != 0x4455aa77)
     61		err();
     62
     63
     64	t += 32770;
     65	mb(); /* don't reorder anything beyond here.  */
     66	cris_tst_cc_init();
     67	asm volatile ("setf\tzvnc\n");
     68	cris_addo_pi_w(p, t);
     69	cris_tst_cc(1, 1, 1, 1);
     70	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
     71	if (*r != 0x4455aa77)
     72		err();
     73
     74	mb(); /* don't reorder anything beyond here.  */
     75	cris_tst_cc_init();
     76	asm volatile ("setf\tzvnc\n");
     77	cris_addo_d(p, r);
     78	cris_tst_cc(1, 1, 1, 1);
     79	p += 4;
     80	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
     81	if (*r != 0xee19ccff)
     82		err();
     83
     84	mb(); /* don't reorder anything beyond here.  */
     85	cris_tst_cc_init();
     86	asm volatile ("setf\tzvnc\n");
     87	cris_addo_pi_b(p, t);
     88	cris_tst_cc(0, 0, 0, 0);
     89	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
     90	if (*(uint16_t*)r != 0xff22)
     91		err();
     92
     93	mb(); /* don't reorder anything beyond here.  */
     94	cris_tst_cc_init();
     95	asm volatile ("setf\tzvnc\n");
     96	cris_addo_b(p, r);
     97	cris_tst_cc(1, 1, 1, 1);
     98	p += 1;
     99	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
    100	if (*r != 0x4455aa77)
    101		err();
    102
    103	mb(); /* don't reorder anything beyond here.  */
    104	cris_tst_cc_init();
    105	asm volatile ("setf\tzvnc\n");
    106	cris_addo_w(p, r);
    107	cris_tst_cc(1, 1, 1, 1);
    108	p += 2;
    109	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
    110	if (*r != 0xff224455)
    111		err();
    112
    113	mb(); /* don't reorder anything beyond here.  */
    114	cris_tst_cc_init();
    115	asm volatile ("setf\tzvnc\n");
    116	cris_addo_pi_d(p, t);
    117	cris_tst_cc(0, 0, 0, 0);
    118	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
    119	r = (void*)(((char *)r) + 76789885);
    120	if (*r != 0x55aa77ff)
    121		err();
    122
    123	pass();
    124	return 0;
    125}