blob: 79e704a6ff6108cf80115be18d593d20fe9eac72 [file] [log] [blame]
.org 0x8d
ilc:
.org 0x8e
program_interruption_code:
.org 0x96
per_code:
.org 0x98
per_address:
.org 0x150
program_old_psw:
.org 0x1d0
program_new_psw:
.quad 0, pgm_handler
.org 0x200 /* exit lowcore */
per_on_psw:
.quad 0x4000000000000000, start_per
per_on_regs:
.quad 0x80000000, 0, -1 /* successful-branching everywhere */
per_off_regs:
.quad 0, 0 ,0
success_psw:
.quad 0x2000000000000, 0xfff /* see is_special_wait_psw() */
failure_psw:
.quad 0x2000000000000, 0 /* disabled wait */
.org 0x2000 /* exit lowcore pages */
.globl _start
_start:
lpswe per_on_psw
start_per:
lctlg %c9, %c11, per_on_regs
/* Test unconditional relative branch. */
larl %r0, j1
larl %r1, d1
lhi %r2, 0
j1: j d1
lpswe failure_psw
d1:
/* Test unconditional indirect branch. */
larl %r0, j2
larl %r1, d2
j2: br %r1
lpswe failure_psw
d2:
/* Test conditional relative branch. */
larl %r0, j3
larl %r1, d3
clr %r1, %r2 /* d3 != 0 */
j3: jne d3
lpswe failure_psw
d3:
/* Test conditional register branch. */
larl %r0, j4
larl %r1, d4
clr %r1, %r2 /* d4 != 0 */
j4: bner %r1
lpswe failure_psw
d4:
/* Success! */
nop
lpswe success_psw
pgm_handler:
chhsi program_interruption_code, 0x80 /* PER event? */
jne fail
cli per_code, 0x80 /* successful-branching event? */
jne fail
clg %r0, per_address /* per_address == jump insn? */
jne fail
clg %r1, program_old_psw+8 /* psw.addr updated to dest? */
jne fail
lpswe program_old_psw
fail:
lpswe failure_psw