xref: /qemu/pc-bios/s390-ccw/start.S (revision e17e57e862faf6e1f372385c18dcf6d3fd31158e)
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
1374fe98eeSThomas Huth#define STACK_SIZE        0x8000
1474fe98eeSThomas Huth#define STACK_FRAME_SIZE  160
1574fe98eeSThomas Huth
1680fea6e8SAlexander Graf    .globl _start
1780fea6e8SAlexander Graf_start:
1880fea6e8SAlexander Graf
1974fe98eeSThomas Huth    larl    %r15,stack + STACK_SIZE - STACK_FRAME_SIZE   /* Set up stack */
20339686a3SChristian Borntraeger
21339686a3SChristian Borntraeger    /* clear bss */
227cd50cbeSThomas Huth    larl    %r2,bss_start_literal   /* __bss_start might be unaligned ... */
237cd50cbeSThomas Huth    lg      %r2,0(%r2)              /* ... so load it indirectly */
24339686a3SChristian Borntraeger    larl    %r3,_end
25339686a3SChristian Borntraeger    slgr    %r3,%r2    /* get sizeof bss */
2644ee69eaSThomas Huth    ltgr    %r3,%r3    /* bss empty? */
27339686a3SChristian Borntraeger    jz      done
28339686a3SChristian Borntraeger    aghi    %r3,-1
29339686a3SChristian Borntraeger    srlg    %r4,%r3,8  /* how many 256 byte chunks? */
30339686a3SChristian Borntraeger    ltgr    %r4,%r4
31339686a3SChristian Borntraeger    lgr     %r1,%r2
32339686a3SChristian Borntraeger    jz      remainder
33339686a3SChristian Borntraegerloop:
34339686a3SChristian Borntraeger    xc      0(256,%r1),0(%r1)
35339686a3SChristian Borntraeger    la      %r1,256(%r1)
36339686a3SChristian Borntraeger    brctg   %r4,loop
37339686a3SChristian Borntraegerremainder:
38339686a3SChristian Borntraeger    larl    %r2,memsetxc
39339686a3SChristian Borntraeger    ex      %r3,0(%r2)
40339686a3SChristian Borntraegerdone:
4125f5adeaSJanosch Frank    /* set up a pgm exception disabled wait psw */
4225f5adeaSJanosch Frank    larl    %r2,disabled_wait_psw
4325f5adeaSJanosch Frank    mvc     0x01d0(16),0(%r2)
4480fea6e8SAlexander Graf    j       main       /* And call C */
457f61cbc1SChristian Borntraeger
46339686a3SChristian Borntraegermemsetxc:
47339686a3SChristian Borntraeger    xc      0(1,%r1),0(%r1)
48339686a3SChristian Borntraeger
497f61cbc1SChristian Borntraeger/*
507f61cbc1SChristian Borntraeger * void disabled_wait(void)
517f61cbc1SChristian Borntraeger *
527f61cbc1SChristian Borntraeger * stops the current guest cpu.
537f61cbc1SChristian Borntraeger */
547f61cbc1SChristian Borntraeger    .globl disabled_wait
557f61cbc1SChristian Borntraegerdisabled_wait:
567f61cbc1SChristian Borntraeger    larl    %r1,disabled_wait_psw
577f61cbc1SChristian Borntraeger    lpswe   0(%r1)
58add923b7SJanosch Frank1:  j       1b
597f61cbc1SChristian Borntraeger
60bdc7fe36SChristian Borntraeger
61bdc7fe36SChristian Borntraeger/*
62bdc7fe36SChristian Borntraeger * void consume_sclp_int(void)
63bdc7fe36SChristian Borntraeger *
64bdc7fe36SChristian Borntraeger * eats one sclp interrupt
65bdc7fe36SChristian Borntraeger */
66bdc7fe36SChristian Borntraeger    .globl consume_sclp_int
67bdc7fe36SChristian Borntraegerconsume_sclp_int:
68bdc7fe36SChristian Borntraeger    /* enable service interrupts in cr0 */
690d3a7613SThomas Huth    stctg   %c0,%c0,0(%r15)
700d3a7613SThomas Huth    oi      6(%r15),0x2
710d3a7613SThomas Huth    lctlg   %c0,%c0,0(%r15)
72bdc7fe36SChristian Borntraeger    /* prepare external call handler */
73bdc7fe36SChristian Borntraeger    larl    %r1,external_new_code
74bdc7fe36SChristian Borntraeger    stg     %r1,0x1b8
75bdc7fe36SChristian Borntraeger    larl    %r1,external_new_mask
76bdc7fe36SChristian Borntraeger    mvc     0x1b0(8),0(%r1)
77bdc7fe36SChristian Borntraeger    /* load enabled wait PSW */
78bdc7fe36SChristian Borntraeger    larl    %r1,enabled_wait_psw
79bdc7fe36SChristian Borntraeger    lpswe   0(%r1)
80bdc7fe36SChristian Borntraeger
813083a1bbSJason J. Herne/*
823083a1bbSJason J. Herne * void consume_io_int(void)
833083a1bbSJason J. Herne *
843083a1bbSJason J. Herne * eats one I/O interrupt
853083a1bbSJason J. Herne */
863083a1bbSJason J. Herne    .globl consume_io_int
873083a1bbSJason J. Herneconsume_io_int:
883083a1bbSJason J. Herne    /* enable I/O interrupts in cr6 */
893083a1bbSJason J. Herne    stctg   %c6,%c6,0(%r15)
903083a1bbSJason J. Herne    oi      4(%r15), 0xff
913083a1bbSJason J. Herne    lctlg   %c6,%c6,0(%r15)
923083a1bbSJason J. Herne    /* prepare i/o call handler */
933083a1bbSJason J. Herne    larl    %r1,io_new_code
943083a1bbSJason J. Herne    stg     %r1,0x1f8
953083a1bbSJason J. Herne    larl    %r1,io_new_mask
963083a1bbSJason J. Herne    mvc     0x1f0(8),0(%r1)
973083a1bbSJason J. Herne    /* load enabled wait PSW */
983083a1bbSJason J. Herne    larl    %r1,enabled_wait_psw
993083a1bbSJason J. Herne    lpswe   0(%r1)
1003083a1bbSJason J. Herne
101bdc7fe36SChristian Borntraegerexternal_new_code:
102bdc7fe36SChristian Borntraeger    /* disable service interrupts in cr0 */
1030d3a7613SThomas Huth    stctg   %c0,%c0,0(%r15)
1040d3a7613SThomas Huth    ni      6(%r15),0xfd
1050d3a7613SThomas Huth    lctlg   %c0,%c0,0(%r15)
1060d3a7613SThomas Huth    br      %r14
107bdc7fe36SChristian Borntraeger
1083083a1bbSJason J. Herneio_new_code:
1093083a1bbSJason J. Herne    /* disable I/O interrupts in cr6 */
1103083a1bbSJason J. Herne    stctg   %c6,%c6,0(%r15)
1113083a1bbSJason J. Herne    ni      4(%r15),0x00
1123083a1bbSJason J. Herne    lctlg   %c6,%c6,0(%r15)
1133083a1bbSJason J. Herne    br      %r14
1143083a1bbSJason J. Herne
115c58df213SJens Remus    .balign 8
1167f61cbc1SChristian Borntraegerdisabled_wait_psw:
1177f61cbc1SChristian Borntraeger    .quad   0x0002000180000000,0x0000000000000000
118bdc7fe36SChristian Borntraegerenabled_wait_psw:
119bdc7fe36SChristian Borntraeger    .quad   0x0302000180000000,0x0000000000000000
120bdc7fe36SChristian Borntraegerexternal_new_mask:
121bdc7fe36SChristian Borntraeger    .quad   0x0000000180000000
1223083a1bbSJason J. Herneio_new_mask:
1233083a1bbSJason J. Herne    .quad   0x0000000180000000
124e31f08dcSThomas Huth
125*3259b442SJens Remus.data
126*3259b442SJens Remus    .balign 8
127*3259b442SJens Remusbss_start_literal:
128*3259b442SJens Remus    .quad   __bss_start
129*3259b442SJens Remus
130e31f08dcSThomas Huth.bss
131c58df213SJens Remus    .balign 8
132e31f08dcSThomas Huthstack:
133e31f08dcSThomas Huth    .space  STACK_SIZE
134e31f08dcSThomas Huth    .size   stack,STACK_SIZE
135