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