.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