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