qemu-e2k/pc-bios/s390-ccw/start.S
Janosch Frank add923b72e pc-bios: s390x: Move panic() into header and add infinite loop
panic() was defined for the ccw and net bios, i.e. twice, so it's
cleaner to rather put it into the header.

Also let's add an infinite loop into the assembly of disabled_wait() so
the caller doesn't need to take care of it.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20200624075226.92728-9-frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
2020-07-02 10:00:42 +02:00

118 lines
2.6 KiB
ArmAsm

/*
* First stage boot loader for virtio devices. The compiled output goes
* into the pc-bios directory of qemu.
*
* Copyright (c) 2013 Alexander Graf <agraf@suse.de>
* Copyright IBM Corp. 2013, 2017
*
* This work is licensed under the terms of the GNU GPL, version 2 or (at
* your option) any later version. See the COPYING file in the top-level
* directory.
*/
.globl _start
_start:
larl %r15, stack + 0x8000 /* Set up stack */
/* clear bss */
larl %r2, __bss_start
larl %r3, _end
slgr %r3, %r2 /* get sizeof bss */
ltgr %r3,%r3 /* bss emtpy? */
jz done
aghi %r3,-1
srlg %r4,%r3,8 /* how many 256 byte chunks? */
ltgr %r4,%r4
lgr %r1,%r2
jz remainder
loop:
xc 0(256,%r1),0(%r1)
la %r1,256(%r1)
brctg %r4,loop
remainder:
larl %r2,memsetxc
ex %r3,0(%r2)
done:
j main /* And call C */
memsetxc:
xc 0(1,%r1),0(%r1)
/*
* void disabled_wait(void)
*
* stops the current guest cpu.
*/
.globl disabled_wait
disabled_wait:
larl %r1,disabled_wait_psw
lpswe 0(%r1)
1: j 1b
/*
* void consume_sclp_int(void)
*
* eats one sclp interrupt
*/
.globl consume_sclp_int
consume_sclp_int:
/* enable service interrupts in cr0 */
stctg %c0,%c0,0(%r15)
oi 6(%r15),0x2
lctlg %c0,%c0,0(%r15)
/* prepare external call handler */
larl %r1, external_new_code
stg %r1, 0x1b8
larl %r1, external_new_mask
mvc 0x1b0(8),0(%r1)
/* load enabled wait PSW */
larl %r1, enabled_wait_psw
lpswe 0(%r1)
/*
* void consume_io_int(void)
*
* eats one I/O interrupt
*/
.globl consume_io_int
consume_io_int:
/* enable I/O interrupts in cr6 */
stctg %c6,%c6,0(%r15)
oi 4(%r15), 0xff
lctlg %c6,%c6,0(%r15)
/* prepare i/o call handler */
larl %r1, io_new_code
stg %r1, 0x1f8
larl %r1, io_new_mask
mvc 0x1f0(8),0(%r1)
/* load enabled wait PSW */
larl %r1, enabled_wait_psw
lpswe 0(%r1)
external_new_code:
/* disable service interrupts in cr0 */
stctg %c0,%c0,0(%r15)
ni 6(%r15),0xfd
lctlg %c0,%c0,0(%r15)
br %r14
io_new_code:
/* disable I/O interrupts in cr6 */
stctg %c6,%c6,0(%r15)
ni 4(%r15), 0x00
lctlg %c6,%c6,0(%r15)
br %r14
.align 8
disabled_wait_psw:
.quad 0x0002000180000000,0x0000000000000000
enabled_wait_psw:
.quad 0x0302000180000000,0x0000000000000000
external_new_mask:
.quad 0x0000000180000000
io_new_mask:
.quad 0x0000000180000000