1/* 2 * s390x startup code 3 * 4 * Copyright (c) 2017 Red Hat Inc 5 * 6 * Authors: 7 * Thomas Huth <thuth@redhat.com> 8 * David Hildenbrand <david@redhat.com> 9 * 10 * This code is free software; you can redistribute it and/or modify it 11 * under the terms of the GNU Library General Public License version 2. 12 */ 13#include <asm/asm-offsets.h> 14 15.section .init 16 17/* entry point - for KVM + TCG we directly start in 64 bit mode */ 18 .globl start 19start: 20 /* setup stack */ 21 larl %r15, stackptr 22 /* setup initial PSW mask + control registers*/ 23 larl %r1, initital_psw 24 lpswe 0(%r1) 25init_psw_cont: 26 /* setup pgm interrupt handler */ 27 larl %r1, pgm_int_psw 28 mvc GEN_LC_PGM_NEW_PSW(16), 0(%r1) 29 /* setup ext interrupt handler */ 30 larl %r1, ext_int_psw 31 mvc GEN_LC_EXT_NEW_PSW(16), 0(%r1) 32 /* setup mcck interrupt handler */ 33 larl %r1, mcck_int_psw 34 mvc GEN_LC_MCCK_NEW_PSW(16), 0(%r1) 35 /* setup io interrupt handler */ 36 larl %r1, ext_int_psw 37 mvc GEN_LC_IO_NEW_PSW(16), 0(%r1) 38 /* setup svc interrupt handler */ 39 larl %r1, mcck_int_psw 40 mvc GEN_LC_SVC_NEW_PSW(16), 0(%r1) 41 /* setup cr0, enabling e.g. AFP-register control */ 42 larl %r1, initital_cr0 43 lctlg %c0, %c0, 0(%r1) 44 /* call setup() */ 45 brasl %r14, setup 46 /* forward test parameter */ 47 larl %r2, __argc 48 llgf %r2, 0(%r2) 49 larl %r3, __argv 50 /* call to main() */ 51 brasl %r14, main 52 /* forward exit code */ 53 lgr %r3, %r2 54 /* call exit() */ 55 j exit 56 57 .macro SAVE_REGS 58 /* save grs 0-15 */ 59 stmg %r0, %r15, GEN_LC_SW_INT_GRS 60 /* save cr0 */ 61 stctg %c0, %c0, GEN_LC_SW_INT_CR0 62 /* load initital cr0 again */ 63 larl %r1, initital_cr0 64 lctlg %c0, %c0, 0(%r1) 65 /* save fprs 0-15 + fpc */ 66 la %r1, GEN_LC_SW_INT_FPRS 67 std %f0, 0(%r1) 68 std %f1, 8(%r1) 69 std %f2, 16(%r1) 70 std %f3, 24(%r1) 71 std %f4, 32(%r1) 72 std %f5, 40(%r1) 73 std %f6, 48(%r1) 74 std %f7, 56(%r1) 75 std %f8, 64(%r1) 76 std %f9, 72(%r1) 77 std %f10, 80(%r1) 78 std %f11, 88(%r1) 79 std %f12, 96(%r1) 80 std %f13, 104(%r1) 81 std %f14, 112(%r1) 82 std %f15, 120(%r1) 83 stfpc GEN_LC_SW_INT_FPC 84 .endm 85 86 .macro RESTORE_REGS 87 /* restore fprs 0-15 + fpc */ 88 la %r1, GEN_LC_SW_INT_FPRS 89 ld %f0, 0(%r1) 90 ld %f1, 8(%r1) 91 ld %f2, 16(%r1) 92 ld %f3, 24(%r1) 93 ld %f4, 32(%r1) 94 ld %f5, 40(%r1) 95 ld %f6, 48(%r1) 96 ld %f7, 56(%r1) 97 ld %f8, 64(%r1) 98 ld %f9, 72(%r1) 99 ld %f10, 80(%r1) 100 ld %f11, 88(%r1) 101 ld %f12, 96(%r1) 102 ld %f13, 104(%r1) 103 ld %f14, 112(%r1) 104 ld %f15, 120(%r1) 105 lfpc GEN_LC_SW_INT_FPC 106 /* restore cr0 */ 107 lctlg %c0, %c0, GEN_LC_SW_INT_CR0 108 /* restore grs 0-15 */ 109 lmg %r0, %r15, GEN_LC_SW_INT_GRS 110 .endm 111 112.section .text 113pgm_int: 114 SAVE_REGS 115 brasl %r14, handle_pgm_int 116 RESTORE_REGS 117 lpswe GEN_LC_PGM_OLD_PSW 118 119ext_int: 120 SAVE_REGS 121 brasl %r14, handle_ext_int 122 RESTORE_REGS 123 lpswe GEN_LC_EXT_OLD_PSW 124 125mcck_int: 126 SAVE_REGS 127 brasl %r14, handle_mcck_int 128 RESTORE_REGS 129 lpswe GEN_LC_MCCK_OLD_PSW 130 131io_int: 132 SAVE_REGS 133 brasl %r14, handle_io_int 134 RESTORE_REGS 135 lpswe GEN_LC_IO_OLD_PSW 136 137svc_int: 138 SAVE_REGS 139 brasl %r14, handle_svc_int 140 RESTORE_REGS 141 lpswe GEN_LC_SVC_OLD_PSW 142 143 .align 8 144initital_psw: 145 .quad 0x0000000180000000, init_psw_cont 146pgm_int_psw: 147 .quad 0x0000000180000000, pgm_int 148ext_int_psw: 149 .quad 0x0000000180000000, ext_int 150mcck_int_psw: 151 .quad 0x0000000180000000, mcck_int 152io_int_psw: 153 .quad 0x0000000180000000, io_int 154svc_int_psw: 155 .quad 0x0000000180000000, svc_int 156initital_cr0: 157 /* enable AFP-register control, so FP regs (+BFP instr) can be used */ 158 .quad 0x0000000000040000 159