xref: /qemu/tests/tcg/s390x/exrl-trt.c (revision 2b4e8cf0)
1ad8c851dSPavel Zbitskiy #include <stdint.h>
2ad8c851dSPavel Zbitskiy #include <unistd.h>
3ad8c851dSPavel Zbitskiy 
main(void)4ad8c851dSPavel Zbitskiy int main(void)
5ad8c851dSPavel Zbitskiy {
6ad8c851dSPavel Zbitskiy     char op1[] = "hello";
7ad8c851dSPavel Zbitskiy     char op2[256];
8*2b4e8cf0SThomas Huth     register uint64_t r1 asm("r1") = 0xffffffffffffffffull;
9*2b4e8cf0SThomas Huth     register uint64_t r2 asm("r2") = 0xffffffffffffffffull;
10ad8c851dSPavel Zbitskiy     uint64_t cc;
11ad8c851dSPavel Zbitskiy     int i;
12ad8c851dSPavel Zbitskiy 
13ad8c851dSPavel Zbitskiy     for (i = 0; i < 256; i++) {
14ad8c851dSPavel Zbitskiy         if (i == 0) {
15ad8c851dSPavel Zbitskiy             op2[i] = 0xaa;
16ad8c851dSPavel Zbitskiy         } else {
17ad8c851dSPavel Zbitskiy             op2[i] = 0;
18ad8c851dSPavel Zbitskiy         }
19ad8c851dSPavel Zbitskiy     }
20ad8c851dSPavel Zbitskiy     asm volatile(
21ad8c851dSPavel Zbitskiy         "    j 2f\n"
22d944293dSDavid Hildenbrand         "1:  trt 0(1,%[op1]),%[op2]\n"
23ad8c851dSPavel Zbitskiy         "2:  exrl %[op1_len],1b\n"
24ad8c851dSPavel Zbitskiy         "    ipm %[cc]\n"
25ad8c851dSPavel Zbitskiy         : [r1] "+r" (r1),
26ad8c851dSPavel Zbitskiy           [r2] "+r" (r2),
27ad8c851dSPavel Zbitskiy           [cc] "=r" (cc)
28d944293dSDavid Hildenbrand         : [op1] "a" (&op1),
29d944293dSDavid Hildenbrand           [op1_len] "a" (5),
30d944293dSDavid Hildenbrand           [op2] "Q" (op2)
31*2b4e8cf0SThomas Huth         : "cc");
32ad8c851dSPavel Zbitskiy     cc = (cc >> 28) & 3;
33ad8c851dSPavel Zbitskiy     if (cc != 2) {
34ad8c851dSPavel Zbitskiy         write(1, "bad cc\n", 7);
35ad8c851dSPavel Zbitskiy         return 1;
36ad8c851dSPavel Zbitskiy     }
37ad8c851dSPavel Zbitskiy     if ((char *)r1 != &op1[5]) {
38ad8c851dSPavel Zbitskiy         write(1, "bad r1\n", 7);
39ad8c851dSPavel Zbitskiy         return 1;
40ad8c851dSPavel Zbitskiy     }
41ad8c851dSPavel Zbitskiy     if (r2 != 0xffffffffffffffaaull) {
42ad8c851dSPavel Zbitskiy         write(1, "bad r2\n", 7);
43ad8c851dSPavel Zbitskiy         return 1;
44ad8c851dSPavel Zbitskiy     }
45ad8c851dSPavel Zbitskiy     return 0;
46ad8c851dSPavel Zbitskiy }
47