xref: /openbmc/qemu/pc-bios/s390-ccw/start.S (revision d044b7c3)
1/*
2 * First stage boot loader for virtio devices. The compiled output goes
3 * into the pc-bios directory of qemu.
4 *
5 * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
6 * Copyright IBM Corp. 2013, 2017
7 *
8 * This work is licensed under the terms of the GNU GPL, version 2 or (at
9 * your option) any later version. See the COPYING file in the top-level
10 * directory.
11 */
12
13        .globl _start
14_start:
15
16	larl   %r15, stack + 0x8000	/* Set up stack */
17
18	/* clear bss */
19	larl %r2, __bss_start
20	larl %r3, _end
21	slgr %r3, %r2		/* get sizeof bss */
22	ltgr	%r3,%r3 	/* bss empty? */
23	jz	done
24	aghi	%r3,-1
25	srlg	%r4,%r3,8	/* how many 256 byte chunks? */
26	ltgr	%r4,%r4
27	lgr	%r1,%r2
28	jz	remainder
29loop:
30	xc	0(256,%r1),0(%r1)
31	la	%r1,256(%r1)
32	brctg	%r4,loop
33remainder:
34	larl	%r2,memsetxc
35	ex	%r3,0(%r2)
36done:
37        /* set up a pgm exception disabled wait psw */
38        larl	%r2, disabled_wait_psw
39        mvc	0x01d0(16), 0(%r2)
40        j      main		/* And call C */
41
42memsetxc:
43	xc	0(1,%r1),0(%r1)
44
45
46/*
47 * void disabled_wait(void)
48 *
49 * stops the current guest cpu.
50 */
51	.globl disabled_wait
52disabled_wait:
53	larl	%r1,disabled_wait_psw
54	lpswe	0(%r1)
551:	j	1b
56
57
58/*
59 * void consume_sclp_int(void)
60 *
61 * eats one sclp interrupt
62 */
63        .globl consume_sclp_int
64consume_sclp_int:
65        /* enable service interrupts in cr0 */
66        stctg   %c0,%c0,0(%r15)
67        oi      6(%r15),0x2
68        lctlg   %c0,%c0,0(%r15)
69        /* prepare external call handler */
70        larl %r1, external_new_code
71        stg %r1, 0x1b8
72        larl %r1, external_new_mask
73        mvc 0x1b0(8),0(%r1)
74        /* load enabled wait PSW */
75        larl %r1, enabled_wait_psw
76        lpswe 0(%r1)
77
78/*
79 * void consume_io_int(void)
80 *
81 * eats one I/O interrupt
82 */
83        .globl consume_io_int
84consume_io_int:
85        /* enable I/O interrupts in cr6 */
86        stctg %c6,%c6,0(%r15)
87        oi    4(%r15), 0xff
88        lctlg %c6,%c6,0(%r15)
89        /* prepare i/o call handler */
90        larl  %r1, io_new_code
91        stg   %r1, 0x1f8
92        larl  %r1, io_new_mask
93        mvc   0x1f0(8),0(%r1)
94        /* load enabled wait PSW */
95        larl  %r1, enabled_wait_psw
96        lpswe 0(%r1)
97
98external_new_code:
99        /* disable service interrupts in cr0 */
100        stctg   %c0,%c0,0(%r15)
101        ni      6(%r15),0xfd
102        lctlg   %c0,%c0,0(%r15)
103        br      %r14
104
105io_new_code:
106        /* disable I/O interrupts in cr6 */
107        stctg %c6,%c6,0(%r15)
108        ni    4(%r15), 0x00
109        lctlg %c6,%c6,0(%r15)
110        br    %r14
111
112        .align  8
113disabled_wait_psw:
114        .quad   0x0002000180000000,0x0000000000000000
115enabled_wait_psw:
116        .quad   0x0302000180000000,0x0000000000000000
117external_new_mask:
118        .quad   0x0000000180000000
119io_new_mask:
120        .quad   0x0000000180000000
121