xref: /kvm-unit-tests/s390x/cstart64.S (revision e8b0bc334a79df6ccd831aedad5ec1eb2d9db7b3)
1/*
2 * s390x startup code
3 *
4 * Copyright (c) 2017 Red Hat Inc
5 *
6 * Authors:
7 *  Thomas Huth <thuth@redhat.com>
8 *  David Hildenbrand <david@redhat.com>
9 *
10 * This code is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU Library General Public License version 2.
12 */
13#include <asm/asm-offsets.h>
14
15.section .init
16
17/* entry point - for KVM + TCG we directly start in 64 bit mode */
18	.globl start
19start:
20	/* setup stack */
21	larl	%r15, stackptr
22	/* setup initial PSW mask + control registers*/
23	larl	%r1, initial_psw
24	lpswe	0(%r1)
25init_psw_cont:
26	/* setup pgm interrupt handler */
27	larl	%r1, pgm_int_psw
28	mvc	GEN_LC_PGM_NEW_PSW(16), 0(%r1)
29	/* setup ext interrupt handler */
30	larl	%r1, ext_int_psw
31	mvc	GEN_LC_EXT_NEW_PSW(16), 0(%r1)
32	/* setup mcck interrupt handler */
33	larl	%r1, mcck_int_psw
34	mvc	GEN_LC_MCCK_NEW_PSW(16), 0(%r1)
35	/* setup io interrupt handler */
36	larl	%r1, io_int_psw
37	mvc	GEN_LC_IO_NEW_PSW(16), 0(%r1)
38	/* setup svc interrupt handler */
39	larl	%r1, svc_int_psw
40	mvc	GEN_LC_SVC_NEW_PSW(16), 0(%r1)
41	/* setup cr0, enabling e.g. AFP-register control */
42	larl	%r1, initial_cr0
43	lctlg	%c0, %c0, 0(%r1)
44	/* call setup() */
45	brasl	%r14, setup
46	/* forward test parameter */
47	larl	%r2, __argc
48	llgf	%r2, 0(%r2)
49	larl	%r3, __argv
50	/* call to main() */
51	brasl	%r14, main
52	/* forward exit code */
53	lgr	%r3, %r2
54	/* call exit() */
55	j exit
56
57	.macro SAVE_REGS
58	/* save grs 0-15 */
59	stmg	%r0, %r15, GEN_LC_SW_INT_GRS
60	/* save cr0 */
61	stctg	%c0, %c0, GEN_LC_SW_INT_CR0
62	/* load initial cr0 again */
63	larl	%r1, initial_cr0
64	lctlg	%c0, %c0, 0(%r1)
65	/* save fprs 0-15 + fpc */
66	la	%r1, GEN_LC_SW_INT_FPRS
67	std	%f0, 0(%r1)
68	std	%f1, 8(%r1)
69	std	%f2, 16(%r1)
70	std	%f3, 24(%r1)
71	std	%f4, 32(%r1)
72	std	%f5, 40(%r1)
73	std	%f6, 48(%r1)
74	std	%f7, 56(%r1)
75	std	%f8, 64(%r1)
76	std	%f9, 72(%r1)
77	std	%f10, 80(%r1)
78	std	%f11, 88(%r1)
79	std	%f12, 96(%r1)
80	std	%f13, 104(%r1)
81	std	%f14, 112(%r1)
82	std	%f15, 120(%r1)
83	stfpc	GEN_LC_SW_INT_FPC
84	.endm
85
86	.macro RESTORE_REGS
87	/* restore fprs 0-15 + fpc */
88	la	%r1, GEN_LC_SW_INT_FPRS
89	ld	%f0, 0(%r1)
90	ld	%f1, 8(%r1)
91	ld	%f2, 16(%r1)
92	ld	%f3, 24(%r1)
93	ld	%f4, 32(%r1)
94	ld	%f5, 40(%r1)
95	ld	%f6, 48(%r1)
96	ld	%f7, 56(%r1)
97	ld	%f8, 64(%r1)
98	ld	%f9, 72(%r1)
99	ld	%f10, 80(%r1)
100	ld	%f11, 88(%r1)
101	ld	%f12, 96(%r1)
102	ld	%f13, 104(%r1)
103	ld	%f14, 112(%r1)
104	ld	%f15, 120(%r1)
105	lfpc	GEN_LC_SW_INT_FPC
106	/* restore cr0 */
107	lctlg	%c0, %c0, GEN_LC_SW_INT_CR0
108	/* restore grs 0-15 */
109	lmg	%r0, %r15, GEN_LC_SW_INT_GRS
110	.endm
111
112.section .text
113pgm_int:
114	SAVE_REGS
115	brasl	%r14, handle_pgm_int
116	RESTORE_REGS
117	lpswe	GEN_LC_PGM_OLD_PSW
118
119ext_int:
120	SAVE_REGS
121	brasl	%r14, handle_ext_int
122	RESTORE_REGS
123	lpswe	GEN_LC_EXT_OLD_PSW
124
125mcck_int:
126	SAVE_REGS
127	brasl	%r14, handle_mcck_int
128	RESTORE_REGS
129	lpswe	GEN_LC_MCCK_OLD_PSW
130
131io_int:
132	SAVE_REGS
133	brasl	%r14, handle_io_int
134	RESTORE_REGS
135	lpswe	GEN_LC_IO_OLD_PSW
136
137svc_int:
138	SAVE_REGS
139	brasl	%r14, handle_svc_int
140	RESTORE_REGS
141	lpswe	GEN_LC_SVC_OLD_PSW
142
143	.align	8
144initial_psw:
145	.quad	0x0000000180000000, init_psw_cont
146pgm_int_psw:
147	.quad	0x0000000180000000, pgm_int
148ext_int_psw:
149	.quad	0x0000000180000000, ext_int
150mcck_int_psw:
151	.quad	0x0000000180000000, mcck_int
152io_int_psw:
153	.quad	0x0000000180000000, io_int
154svc_int_psw:
155	.quad	0x0000000180000000, svc_int
156initial_cr0:
157	/* enable AFP-register control, so FP regs (+BFP instr) can be used */
158	.quad	0x0000000000040000
159