aboutsummaryrefslogtreecommitdiff
path: root/tests/tcg/s390x/per.S
blob: 79e704a6ff6108cf80115be18d593d20fe9eac72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
	.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