blob: 9a26ed3ea0e334cee33dcd4568ec4e41ff6fb482 [file] [log] [blame]
/*
* s390x startup code
*
* Copyright (c) 2017 Red Hat Inc
*
* Authors:
* Thomas Huth <thuth@redhat.com>
* David Hildenbrand <david@redhat.com>
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU Library General Public License version 2.
*/
#include <asm/asm-offsets.h>
.section .init
/* entry point - for KVM + TCG we directly start in 64 bit mode */
.globl start
start:
/* setup stack */
larl %r15, stackptr
/* setup initial PSW mask + control registers*/
larl %r1, initital_psw
lpswe 0(%r1)
init_psw_cont:
/* setup pgm interrupt handler */
larl %r1, pgm_int_psw
mvc GEN_LC_PGM_NEW_PSW(16), 0(%r1)
/* setup cr0, enabling e.g. AFP-register control */
larl %r1, initital_cr0
lctlg %c0, %c0, 0(%r1)
/* call setup() */
brasl %r14, setup
/* forward test parameter */
larl %r2, __argc
llgf %r2, 0(%r2)
larl %r3, __argv
/* call to main() */
brasl %r14, main
/* forward exit code */
lgr %r3, %r2
/* call exit() */
j exit
pgm_int:
/* save grs 0-15 */
stmg %r0, %r15, GEN_LC_SW_INT_GRS
/* save fprs 0-15 + fpc */
larl %r1, GEN_LC_SW_INT_FPRS
std %f0, 0(%r1)
std %f1, 8(%r1)
std %f2, 16(%r1)
std %f3, 24(%r1)
std %f4, 32(%r1)
std %f5, 40(%r1)
std %f6, 48(%r1)
std %f7, 56(%r1)
std %f8, 64(%r1)
std %f9, 72(%r1)
std %f10, 80(%r1)
std %f11, 88(%r1)
std %f12, 96(%r1)
std %f13, 104(%r1)
std %f14, 112(%r1)
std %f15, 120(%r1)
stfpc GEN_LC_SW_INT_FPC
/* call our c handler */
brasl %r14, handle_pgm_int
/* restore fprs 0-15 + fpc */
larl %r1, GEN_LC_SW_INT_FPRS
ld %f0, 0(%r1)
ld %f1, 8(%r1)
ld %f2, 16(%r1)
ld %f3, 24(%r1)
ld %f4, 32(%r1)
ld %f5, 40(%r1)
ld %f6, 48(%r1)
ld %f7, 56(%r1)
ld %f8, 64(%r1)
ld %f9, 72(%r1)
ld %f10, 80(%r1)
ld %f11, 88(%r1)
ld %f12, 96(%r1)
ld %f13, 104(%r1)
ld %f14, 112(%r1)
ld %f15, 120(%r1)
lfpc GEN_LC_SW_INT_FPC
/* restore grs 0-15 */
lmg %r0, %r15, GEN_LC_SW_INT_GRS
lpswe GEN_LC_PGM_OLD_PSW
.align 8
initital_psw:
.quad 0x0000000180000000, init_psw_cont
pgm_int_psw:
.quad 0x0000000180000000, pgm_int
initital_cr0:
/* enable AFP-register control, so FP regs (+BFP instr) can be used */
.quad 0x0000000000040000