1/*
2 * Test s390x-softmmu precise self-modifying code handling.
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6    .org 0x8e
7program_interruption_code:
8    .org 0x150
9program_old_psw:
10    .org 0x1D0                         /* program new PSW */
11    .quad 0x180000000,pgm              /* 64-bit mode */
12    .org 0x200                         /* lowcore padding */
13    .globl _start
14_start:
15    lctlg %c0,%c0,c0
16    lghi %r0,15
17
18    /* Test 1: replace sgr with agr. */
19    lghi %r1,21
20    vl %v0,patch1
21    jg 1f                              /* start a new TB */
220:
23    .org . + 6                         /* pad patched code to 16 bytes */
241:
25    vstl %v0,%r0,0b                    /* start writing before TB */
26    sgr %r1,%r1                        /* this becomes `agr %r1,%r1` */
27    cgijne %r1,42,failure
28
29    /* Test 2: replace agr with division by zero. */
30    vl %v0,patch2
31    jg 1f                              /* start a new TB */
320:
33    .org . + 6                         /* pad patched code to 16 bytes */
341:
35    vstl %v0,%r0,0b                    /* start writing before TB */
36    sgr %r1,%r1                        /* this becomes `d %r0,zero` */
37failure:
38    lpswe failure_psw
39
40pgm:
41    chhsi program_interruption_code,0x9          /* divide exception? */
42    jne failure
43    clc program_old_psw(16),expected_old_psw2    /* correct old PSW? */
44    jne failure
45    lpswe success_psw
46
47patch1:
48    .fill 12                           /* replaces padding and stpq */
49    agr %r1,%r1                        /* replaces sgr */
50patch2:
51    .fill 12                           /* replaces padding and stpq */
52    d %r0,zero                         /* replaces sgr */
53zero:
54    .long 0
55expected_old_psw2:
56    .quad 0x200180000000,failure       /* cc is from addition */
57    .align 8
58c0:
59    .quad 0x60000                      /* AFP, VX */
60success_psw:
61    .quad 0x2000000000000,0xfff        /* see is_special_wait_psw() */
62failure_psw:
63    .quad 0x2000000000000,0            /* disabled wait */
64