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