1 /* 2 * Test modifying an EXECUTE target. 3 * 4 * SPDX-License-Identifier: GPL-2.0-or-later 5 */ 6 #include <assert.h> 7 #include <stdlib.h> 8 9 /* Make sure we exercise the same EXECUTE instruction. */ 10 extern void execute(unsigned char *insn, unsigned char mask, 11 unsigned long *r1_r5); 12 asm(".globl execute\n" 13 "execute:\n" 14 "lg %r1,0(%r4)\n" 15 "lg %r5,8(%r4)\n" 16 "ex %r3,0(%r2)\n" 17 "stg %r5,8(%r4)\n" 18 "stg %r1,0(%r4)\n" 19 "br %r14\n"); 20 21 /* Define an RWX EXECUTE target. */ 22 extern unsigned char lgfi[]; 23 asm(".pushsection .rwx,\"awx\",@progbits\n" 24 ".globl lgfi\n" 25 "lgfi: lgfi %r0,0\n" 26 ".popsection\n"); 27 28 int main(void) 29 { 30 unsigned long r1_r5[2]; 31 32 /* Create an initial TB. */ 33 r1_r5[0] = -1; 34 r1_r5[1] = -1; 35 execute(lgfi, 1 << 4, r1_r5); 36 assert(r1_r5[0] == 0); 37 assert(r1_r5[1] == -1); 38 39 /* Test changing the mask. */ 40 execute(lgfi, 5 << 4, r1_r5); 41 assert(r1_r5[0] == 0); 42 assert(r1_r5[1] == 0); 43 44 /* Test changing the target. */ 45 lgfi[5] = 42; 46 execute(lgfi, 5 << 4, r1_r5); 47 assert(r1_r5[0] == 0); 48 assert(r1_r5[1] == 42); 49 50 /* Test changing both the mask and the target. */ 51 lgfi[5] = 24; 52 execute(lgfi, 1 << 4, r1_r5); 53 assert(r1_r5[0] == 24); 54 assert(r1_r5[1] == 42); 55 56 return EXIT_SUCCESS; 57 } 58