| /* |
| * 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 2013 IBM Corp. |
| * |
| * 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 */ |
| larl %r6, boot_value |
| stg %r7, 0(%r6) /* save the boot_value before any function calls */ |
| j main /* And call C */ |
| |
| /* |
| * void disabled_wait(void) |
| * |
| * stops the current guest cpu. |
| */ |
| .globl disabled_wait |
| disabled_wait: |
| larl %r1,disabled_wait_psw |
| lpswe 0(%r1) |
| |
| |
| /* |
| * void consume_sclp_int(void) |
| * |
| * eats one sclp interrupt |
| */ |
| .globl consume_sclp_int |
| consume_sclp_int: |
| /* enable service interrupts in cr0 */ |
| stctg 0,0,0(15) |
| oi 6(15), 0x2 |
| lctlg 0,0,0(15) |
| /* 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) |
| |
| external_new_code: |
| /* disable service interrupts in cr0 */ |
| stctg 0,0,0(15) |
| ni 6(15), 0xfd |
| lctlg 0,0,0(15) |
| br 14 |
| |
| .align 8 |
| disabled_wait_psw: |
| .quad 0x0002000180000000,0x0000000000000000 |
| enabled_wait_psw: |
| .quad 0x0302000180000000,0x0000000000000000 |
| external_new_mask: |
| .quad 0x0000000180000000 |