xref: /qemu/pc-bios/s390-ccw/start.S (revision 0d3a76139827f7d08f1b487fda9f01ecc06741a7)
180fea6e8SAlexander Graf/*
280fea6e8SAlexander Graf * First stage boot loader for virtio devices. The compiled output goes
380fea6e8SAlexander Graf * into the pc-bios directory of qemu.
480fea6e8SAlexander Graf *
580fea6e8SAlexander Graf * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
6339686a3SChristian Borntraeger * Copyright IBM Corp. 2013, 2017
780fea6e8SAlexander Graf *
880fea6e8SAlexander Graf * This work is licensed under the terms of the GNU GPL, version 2 or (at
980fea6e8SAlexander Graf * your option) any later version. See the COPYING file in the top-level
1080fea6e8SAlexander Graf * directory.
1180fea6e8SAlexander Graf */
1280fea6e8SAlexander Graf
1380fea6e8SAlexander Graf        .globl _start
1480fea6e8SAlexander Graf_start:
1580fea6e8SAlexander Graf
1680fea6e8SAlexander Graf	larl   %r15, stack + 0x8000	/* Set up stack */
17339686a3SChristian Borntraeger
18339686a3SChristian Borntraeger	/* clear bss */
19339686a3SChristian Borntraeger	larl %r2, __bss_start
20339686a3SChristian Borntraeger	larl %r3, _end
21339686a3SChristian Borntraeger	slgr %r3, %r2		/* get sizeof bss */
22339686a3SChristian Borntraeger	ltgr	%r3,%r3 	/* bss emtpy? */
23339686a3SChristian Borntraeger	jz	done
24339686a3SChristian Borntraeger	aghi	%r3,-1
25339686a3SChristian Borntraeger	srlg	%r4,%r3,8	/* how many 256 byte chunks? */
26339686a3SChristian Borntraeger	ltgr	%r4,%r4
27339686a3SChristian Borntraeger	lgr	%r1,%r2
28339686a3SChristian Borntraeger	jz	remainder
29339686a3SChristian Borntraegerloop:
30339686a3SChristian Borntraeger	xc	0(256,%r1),0(%r1)
31339686a3SChristian Borntraeger	la	%r1,256(%r1)
32339686a3SChristian Borntraeger	brctg	%r4,loop
33339686a3SChristian Borntraegerremainder:
34339686a3SChristian Borntraeger	larl	%r2,memsetxc
35339686a3SChristian Borntraeger	ex	%r3,0(%r2)
36339686a3SChristian Borntraegerdone:
3780fea6e8SAlexander Graf	j      main		/* And call C */
387f61cbc1SChristian Borntraeger
39339686a3SChristian Borntraegermemsetxc:
40339686a3SChristian Borntraeger	xc	0(1,%r1),0(%r1)
41339686a3SChristian Borntraeger
42339686a3SChristian Borntraeger
437f61cbc1SChristian Borntraeger/*
447f61cbc1SChristian Borntraeger * void disabled_wait(void)
457f61cbc1SChristian Borntraeger *
467f61cbc1SChristian Borntraeger * stops the current guest cpu.
477f61cbc1SChristian Borntraeger */
487f61cbc1SChristian Borntraeger	.globl disabled_wait
497f61cbc1SChristian Borntraegerdisabled_wait:
507f61cbc1SChristian Borntraeger        larl %r1,disabled_wait_psw
517f61cbc1SChristian Borntraeger        lpswe   0(%r1)
527f61cbc1SChristian Borntraeger
53bdc7fe36SChristian Borntraeger
54bdc7fe36SChristian Borntraeger/*
55bdc7fe36SChristian Borntraeger * void consume_sclp_int(void)
56bdc7fe36SChristian Borntraeger *
57bdc7fe36SChristian Borntraeger * eats one sclp interrupt
58bdc7fe36SChristian Borntraeger */
59bdc7fe36SChristian Borntraeger        .globl consume_sclp_int
60bdc7fe36SChristian Borntraegerconsume_sclp_int:
61bdc7fe36SChristian Borntraeger        /* enable service interrupts in cr0 */
62*0d3a7613SThomas Huth        stctg   %c0,%c0,0(%r15)
63*0d3a7613SThomas Huth        oi      6(%r15),0x2
64*0d3a7613SThomas Huth        lctlg   %c0,%c0,0(%r15)
65bdc7fe36SChristian Borntraeger        /* prepare external call handler */
66bdc7fe36SChristian Borntraeger        larl %r1, external_new_code
67bdc7fe36SChristian Borntraeger        stg %r1, 0x1b8
68bdc7fe36SChristian Borntraeger        larl %r1, external_new_mask
69bdc7fe36SChristian Borntraeger        mvc 0x1b0(8),0(%r1)
70bdc7fe36SChristian Borntraeger        /* load enabled wait PSW */
71bdc7fe36SChristian Borntraeger        larl %r1, enabled_wait_psw
72bdc7fe36SChristian Borntraeger        lpswe 0(%r1)
73bdc7fe36SChristian Borntraeger
74bdc7fe36SChristian Borntraegerexternal_new_code:
75bdc7fe36SChristian Borntraeger        /* disable service interrupts in cr0 */
76*0d3a7613SThomas Huth        stctg   %c0,%c0,0(%r15)
77*0d3a7613SThomas Huth        ni      6(%r15),0xfd
78*0d3a7613SThomas Huth        lctlg   %c0,%c0,0(%r15)
79*0d3a7613SThomas Huth        br      %r14
80bdc7fe36SChristian Borntraeger
817f61cbc1SChristian Borntraeger        .align  8
827f61cbc1SChristian Borntraegerdisabled_wait_psw:
837f61cbc1SChristian Borntraeger        .quad   0x0002000180000000,0x0000000000000000
84bdc7fe36SChristian Borntraegerenabled_wait_psw:
85bdc7fe36SChristian Borntraeger        .quad   0x0302000180000000,0x0000000000000000
86bdc7fe36SChristian Borntraegerexternal_new_mask:
87bdc7fe36SChristian Borntraeger        .quad   0x0000000180000000
88