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