xref: /qemu/pc-bios/s390-ccw/start.S (revision add923b72e76080ca5339a27d58ed13566156935)
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)
52*add923b7SJanosch Frank1:	j	1b
537f61cbc1SChristian Borntraeger
54bdc7fe36SChristian Borntraeger
55bdc7fe36SChristian Borntraeger/*
56bdc7fe36SChristian Borntraeger * void consume_sclp_int(void)
57bdc7fe36SChristian Borntraeger *
58bdc7fe36SChristian Borntraeger * eats one sclp interrupt
59bdc7fe36SChristian Borntraeger */
60bdc7fe36SChristian Borntraeger        .globl consume_sclp_int
61bdc7fe36SChristian Borntraegerconsume_sclp_int:
62bdc7fe36SChristian Borntraeger        /* enable service interrupts in cr0 */
630d3a7613SThomas Huth        stctg   %c0,%c0,0(%r15)
640d3a7613SThomas Huth        oi      6(%r15),0x2
650d3a7613SThomas Huth        lctlg   %c0,%c0,0(%r15)
66bdc7fe36SChristian Borntraeger        /* prepare external call handler */
67bdc7fe36SChristian Borntraeger        larl %r1, external_new_code
68bdc7fe36SChristian Borntraeger        stg %r1, 0x1b8
69bdc7fe36SChristian Borntraeger        larl %r1, external_new_mask
70bdc7fe36SChristian Borntraeger        mvc 0x1b0(8),0(%r1)
71bdc7fe36SChristian Borntraeger        /* load enabled wait PSW */
72bdc7fe36SChristian Borntraeger        larl %r1, enabled_wait_psw
73bdc7fe36SChristian Borntraeger        lpswe 0(%r1)
74bdc7fe36SChristian Borntraeger
753083a1bbSJason J. Herne/*
763083a1bbSJason J. Herne * void consume_io_int(void)
773083a1bbSJason J. Herne *
783083a1bbSJason J. Herne * eats one I/O interrupt
793083a1bbSJason J. Herne */
803083a1bbSJason J. Herne        .globl consume_io_int
813083a1bbSJason J. Herneconsume_io_int:
823083a1bbSJason J. Herne        /* enable I/O interrupts in cr6 */
833083a1bbSJason J. Herne        stctg %c6,%c6,0(%r15)
843083a1bbSJason J. Herne        oi    4(%r15), 0xff
853083a1bbSJason J. Herne        lctlg %c6,%c6,0(%r15)
863083a1bbSJason J. Herne        /* prepare i/o call handler */
873083a1bbSJason J. Herne        larl  %r1, io_new_code
883083a1bbSJason J. Herne        stg   %r1, 0x1f8
893083a1bbSJason J. Herne        larl  %r1, io_new_mask
903083a1bbSJason J. Herne        mvc   0x1f0(8),0(%r1)
913083a1bbSJason J. Herne        /* load enabled wait PSW */
923083a1bbSJason J. Herne        larl  %r1, enabled_wait_psw
933083a1bbSJason J. Herne        lpswe 0(%r1)
943083a1bbSJason J. Herne
95bdc7fe36SChristian Borntraegerexternal_new_code:
96bdc7fe36SChristian Borntraeger        /* disable service interrupts in cr0 */
970d3a7613SThomas Huth        stctg   %c0,%c0,0(%r15)
980d3a7613SThomas Huth        ni      6(%r15),0xfd
990d3a7613SThomas Huth        lctlg   %c0,%c0,0(%r15)
1000d3a7613SThomas Huth        br      %r14
101bdc7fe36SChristian Borntraeger
1023083a1bbSJason J. Herneio_new_code:
1033083a1bbSJason J. Herne        /* disable I/O interrupts in cr6 */
1043083a1bbSJason J. Herne        stctg %c6,%c6,0(%r15)
1053083a1bbSJason J. Herne        ni    4(%r15), 0x00
1063083a1bbSJason J. Herne        lctlg %c6,%c6,0(%r15)
1073083a1bbSJason J. Herne        br    %r14
1083083a1bbSJason J. Herne
1097f61cbc1SChristian Borntraeger        .align  8
1107f61cbc1SChristian Borntraegerdisabled_wait_psw:
1117f61cbc1SChristian Borntraeger        .quad   0x0002000180000000,0x0000000000000000
112bdc7fe36SChristian Borntraegerenabled_wait_psw:
113bdc7fe36SChristian Borntraeger        .quad   0x0302000180000000,0x0000000000000000
114bdc7fe36SChristian Borntraegerexternal_new_mask:
115bdc7fe36SChristian Borntraeger        .quad   0x0000000180000000
1163083a1bbSJason J. Herneio_new_mask:
1173083a1bbSJason J. Herne        .quad   0x0000000180000000
118