1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar buffer[] ="0123456789abcdef";
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar target[] ="XXXXXXXXXXXXXXXX";
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(void)
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   setbuf(stdout, NULL);
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- Copy 10+1 bytes from buffer to target\n");
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- EXRL to OR in the length\n");
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("before: buffer = |%s|\n", buffer);
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("before: target = |%s|\n", target);
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lghi 2, 10\n\t"
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 ".insn ril,0xc60000000000,2,1f\n\t" // exrl 2, 1f
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j    2f\n\t"
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "1:\n\t"
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "mvc  0(1,%0),0(%1)\n\t"
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "2:\n\t"
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (target), "a" (buffer) : "1", "2", "memory");
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("after:  buffer = |%s|\n", buffer);
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("after:  target = |%s|\n", target);
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- EXRL 0,... has no effect (writes out target)\n");
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("        target = |");
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lghi 0, 0xff\n\t" // fill nonsense in r0
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 2, 1\n\t"    // stdout
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lgr  3, %0\n\t"   // target
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 4, %1\n\t"   // len
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 ".insn ril,0xc60000000000,0,1f\n\t" // exrl 0, 1f
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j    2f\n\t"
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "1:\n\t"
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "svc  4\n\t"       // NR_write
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "2:\n\t"
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (target), "i" (sizeof target - 1)
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "0", "2", "3", "4");
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("|\n");
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("------- EXRL to OR in the syscall number (writes out target)\n");
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("        target = |");
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lghi 1, 4\n\t"    // NR_write
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 2, 1\n\t"    // stdout
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lgr  3, %0\n\t"   // target
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 4, %1\n\t"   // len
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 ".insn ril,0xc60000000000,1,1f\n\t" // exrl 1, 1f
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j    2f\n\t"
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "1:\n\t"
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "svc  0\n\t"       // changed to NR_write
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "2:\n\t"
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (target), "i" (sizeof target - 1)
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "1", "2", "3", "4");
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("|\n");
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
60