Merge remote-tracking branch 'remotes/cody/tags/block-pull-request' into staging
[qemu.git] / pc-bios / s390-ccw / start.S
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 2013 IBM Corp.
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 j       main                    /* And call C */
18
19 /*
20  * void disabled_wait(void)
21  *
22  * stops the current guest cpu.
23  */
24         .globl disabled_wait
25 disabled_wait:
26         larl %r1,disabled_wait_psw
27         lpswe   0(%r1)
28
29
30 /*
31  * void consume_sclp_int(void)
32  *
33  * eats one sclp interrupt
34  */
35         .globl consume_sclp_int
36 consume_sclp_int:
37         /* enable service interrupts in cr0 */
38         stctg 0,0,0(15)
39         oi 6(15), 0x2
40         lctlg 0,0,0(15)
41         /* prepare external call handler */
42         larl %r1, external_new_code
43         stg %r1, 0x1b8
44         larl %r1, external_new_mask
45         mvc 0x1b0(8),0(%r1)
46         /* load enabled wait PSW */
47         larl %r1, enabled_wait_psw
48         lpswe 0(%r1)
49
50 external_new_code:
51         /* disable service interrupts in cr0 */
52         stctg 0,0,0(15)
53         ni 6(15), 0xfd
54         lctlg 0,0,0(15)
55         br 14
56
57         .align  8
58 disabled_wait_psw:
59         .quad   0x0002000180000000,0x0000000000000000
60 enabled_wait_psw:
61         .quad   0x0302000180000000,0x0000000000000000
62 external_new_mask:
63         .quad   0x0000000180000000