master
s 82 lines 1.44 KB
Raw
1 .org 0x8d
2 ilc:
3 .org 0x8e
4 program_interruption_code:
5 .org 0x96
6 per_code:
7 .org 0x98
8 per_address:
9 .org 0x150
10 program_old_psw:
11 .org 0x1d0
12 program_new_psw:
13 .quad 0, pgm_handler
14
15 .org 0x200 /* exit lowcore */
16
17 per_on_psw:
18 .quad 0x4000000000000000, start_per
19 per_on_regs:
20 .quad 0x80000000, 0, -1 /* successful-branching everywhere */
21 per_off_regs:
22 .quad 0, 0 ,0
23 success_psw:
24 .quad 0x2000000000000, 0xfff /* see is_special_wait_psw() */
25 failure_psw:
26 .quad 0x2000000000000, 0 /* disabled wait */
27
28 .org 0x2000 /* exit lowcore pages */
29
30 .globl _start
31 _start:
32 lpswe per_on_psw
33 start_per:
34 lctlg %c9, %c11, per_on_regs
35
36 /* Test unconditional relative branch. */
37 larl %r0, j1
38 larl %r1, d1
39 lhi %r2, 0
40 j1: j d1
41 lpswe failure_psw
42 d1:
43
44 /* Test unconditional indirect branch. */
45 larl %r0, j2
46 larl %r1, d2
47 j2: br %r1
48 lpswe failure_psw
49 d2:
50
51 /* Test conditional relative branch. */
52 larl %r0, j3
53 larl %r1, d3
54 clr %r1, %r2 /* d3 != 0 */
55 j3: jne d3
56 lpswe failure_psw
57 d3:
58
59 /* Test conditional register branch. */
60 larl %r0, j4
61 larl %r1, d4
62 clr %r1, %r2 /* d4 != 0 */
63 j4: bner %r1
64 lpswe failure_psw
65 d4:
66
67 /* Success! */
68 nop
69 lpswe success_psw
70
71 pgm_handler:
72 chhsi program_interruption_code, 0x80 /* PER event? */
73 jne fail
74 cli per_code, 0x80 /* successful-branching event? */
75 jne fail
76 clg %r0, per_address /* per_address == jump insn? */
77 jne fail
78 clg %r1, program_old_psw+8 /* psw.addr updated to dest? */
79 jne fail
80 lpswe program_old_psw
81 fail:
82 lpswe failure_psw