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