1*c78d0c74SHeiko Carstens/* SPDX-License-Identifier: GPL-2.0 */ 2*c78d0c74SHeiko Carstens/* 3*c78d0c74SHeiko Carstens * Code that needs to run below 2 GB. 4*c78d0c74SHeiko Carstens * 5*c78d0c74SHeiko Carstens * Copyright IBM Corp. 2019 6*c78d0c74SHeiko Carstens */ 7*c78d0c74SHeiko Carstens 8*c78d0c74SHeiko Carstens#include <linux/linkage.h> 9*c78d0c74SHeiko Carstens#include <asm/errno.h> 10*c78d0c74SHeiko Carstens#include <asm/sigp.h> 11*c78d0c74SHeiko Carstens 12*c78d0c74SHeiko Carstens .section .amode31.text,"ax" 13*c78d0c74SHeiko Carstens/* 14*c78d0c74SHeiko Carstens * Simplified version of expoline thunk. The normal thunks can not be used here, 15*c78d0c74SHeiko Carstens * because they might be more than 2 GB away, and not reachable by the relative 16*c78d0c74SHeiko Carstens * branch. No comdat, exrl, etc. optimizations used here, because it only 17*c78d0c74SHeiko Carstens * affects a few functions that are not performance-relevant. 18*c78d0c74SHeiko Carstens */ 19*c78d0c74SHeiko Carstens .macro BR_EX_AMODE31_r14 20*c78d0c74SHeiko Carstens larl %r1,0f 21*c78d0c74SHeiko Carstens ex 0,0(%r1) 22*c78d0c74SHeiko Carstens j . 23*c78d0c74SHeiko Carstens0: br %r14 24*c78d0c74SHeiko Carstens .endm 25*c78d0c74SHeiko Carstens 26*c78d0c74SHeiko Carstens/* 27*c78d0c74SHeiko Carstens * int _diag14_amode31(unsigned long rx, unsigned long ry1, unsigned long subcode) 28*c78d0c74SHeiko Carstens */ 29*c78d0c74SHeiko CarstensENTRY(_diag14_amode31) 30*c78d0c74SHeiko Carstens lgr %r1,%r2 31*c78d0c74SHeiko Carstens lgr %r2,%r3 32*c78d0c74SHeiko Carstens lgr %r3,%r4 33*c78d0c74SHeiko Carstens lhi %r5,-EIO 34*c78d0c74SHeiko Carstens sam31 35*c78d0c74SHeiko Carstens diag %r1,%r2,0x14 36*c78d0c74SHeiko Carstens.Ldiag14_ex: 37*c78d0c74SHeiko Carstens ipm %r5 38*c78d0c74SHeiko Carstens srl %r5,28 39*c78d0c74SHeiko Carstens.Ldiag14_fault: 40*c78d0c74SHeiko Carstens sam64 41*c78d0c74SHeiko Carstens lgfr %r2,%r5 42*c78d0c74SHeiko Carstens BR_EX_AMODE31_r14 43*c78d0c74SHeiko Carstens EX_TABLE_AMODE31(.Ldiag14_ex, .Ldiag14_fault) 44*c78d0c74SHeiko CarstensENDPROC(_diag14_amode31) 45*c78d0c74SHeiko Carstens 46*c78d0c74SHeiko Carstens/* 47*c78d0c74SHeiko Carstens * int _diag210_amode31(struct diag210 *addr) 48*c78d0c74SHeiko Carstens */ 49*c78d0c74SHeiko CarstensENTRY(_diag210_amode31) 50*c78d0c74SHeiko Carstens lgr %r1,%r2 51*c78d0c74SHeiko Carstens lhi %r2,-1 52*c78d0c74SHeiko Carstens sam31 53*c78d0c74SHeiko Carstens diag %r1,%r0,0x210 54*c78d0c74SHeiko Carstens.Ldiag210_ex: 55*c78d0c74SHeiko Carstens ipm %r2 56*c78d0c74SHeiko Carstens srl %r2,28 57*c78d0c74SHeiko Carstens.Ldiag210_fault: 58*c78d0c74SHeiko Carstens sam64 59*c78d0c74SHeiko Carstens lgfr %r2,%r2 60*c78d0c74SHeiko Carstens BR_EX_AMODE31_r14 61*c78d0c74SHeiko Carstens EX_TABLE_AMODE31(.Ldiag210_ex, .Ldiag210_fault) 62*c78d0c74SHeiko CarstensENDPROC(_diag210_amode31) 63*c78d0c74SHeiko Carstens 64*c78d0c74SHeiko Carstens/* 65*c78d0c74SHeiko Carstens * int _diag26c_amode31(void *req, void *resp, enum diag26c_sc subcode) 66*c78d0c74SHeiko Carstens */ 67*c78d0c74SHeiko CarstensENTRY(_diag26c_amode31) 68*c78d0c74SHeiko Carstens lghi %r5,-EOPNOTSUPP 69*c78d0c74SHeiko Carstens sam31 70*c78d0c74SHeiko Carstens diag %r2,%r4,0x26c 71*c78d0c74SHeiko Carstens.Ldiag26c_ex: 72*c78d0c74SHeiko Carstens sam64 73*c78d0c74SHeiko Carstens lgfr %r2,%r5 74*c78d0c74SHeiko Carstens BR_EX_AMODE31_r14 75*c78d0c74SHeiko Carstens EX_TABLE_AMODE31(.Ldiag26c_ex, .Ldiag26c_ex) 76*c78d0c74SHeiko CarstensENDPROC(_diag26c_amode31) 77*c78d0c74SHeiko Carstens 78*c78d0c74SHeiko Carstens/* 79*c78d0c74SHeiko Carstens * void _diag0c_amode31(struct hypfs_diag0c_entry *entry) 80*c78d0c74SHeiko Carstens */ 81*c78d0c74SHeiko CarstensENTRY(_diag0c_amode31) 82*c78d0c74SHeiko Carstens sam31 83*c78d0c74SHeiko Carstens diag %r2,%r2,0x0c 84*c78d0c74SHeiko Carstens sam64 85*c78d0c74SHeiko Carstens BR_EX_AMODE31_r14 86*c78d0c74SHeiko CarstensENDPROC(_diag0c_amode31) 87*c78d0c74SHeiko Carstens 88*c78d0c74SHeiko Carstens/* 89*c78d0c74SHeiko Carstens * void _diag308_reset_amode31(void) 90*c78d0c74SHeiko Carstens * 91*c78d0c74SHeiko Carstens * Calls diag 308 subcode 1 and continues execution 92*c78d0c74SHeiko Carstens */ 93*c78d0c74SHeiko CarstensENTRY(_diag308_reset_amode31) 94*c78d0c74SHeiko Carstens larl %r4,.Lctlregs # Save control registers 95*c78d0c74SHeiko Carstens stctg %c0,%c15,0(%r4) 96*c78d0c74SHeiko Carstens lg %r2,0(%r4) # Disable lowcore protection 97*c78d0c74SHeiko Carstens nilh %r2,0xefff 98*c78d0c74SHeiko Carstens larl %r4,.Lctlreg0 99*c78d0c74SHeiko Carstens stg %r2,0(%r4) 100*c78d0c74SHeiko Carstens lctlg %c0,%c0,0(%r4) 101*c78d0c74SHeiko Carstens larl %r4,.Lfpctl # Floating point control register 102*c78d0c74SHeiko Carstens stfpc 0(%r4) 103*c78d0c74SHeiko Carstens larl %r4,.Lprefix # Save prefix register 104*c78d0c74SHeiko Carstens stpx 0(%r4) 105*c78d0c74SHeiko Carstens larl %r4,.Lprefix_zero # Set prefix register to 0 106*c78d0c74SHeiko Carstens spx 0(%r4) 107*c78d0c74SHeiko Carstens larl %r4,.Lcontinue_psw # Save PSW flags 108*c78d0c74SHeiko Carstens epsw %r2,%r3 109*c78d0c74SHeiko Carstens stm %r2,%r3,0(%r4) 110*c78d0c74SHeiko Carstens larl %r4,restart_part2 # Setup restart PSW at absolute 0 111*c78d0c74SHeiko Carstens larl %r3,.Lrestart_diag308_psw 112*c78d0c74SHeiko Carstens og %r4,0(%r3) # Save PSW 113*c78d0c74SHeiko Carstens lghi %r3,0 114*c78d0c74SHeiko Carstens sturg %r4,%r3 # Use sturg, because of large pages 115*c78d0c74SHeiko Carstens lghi %r1,1 116*c78d0c74SHeiko Carstens lghi %r0,0 117*c78d0c74SHeiko Carstens diag %r0,%r1,0x308 118*c78d0c74SHeiko Carstensrestart_part2: 119*c78d0c74SHeiko Carstens lhi %r0,0 # Load r0 with zero 120*c78d0c74SHeiko Carstens lhi %r1,2 # Use mode 2 = ESAME (dump) 121*c78d0c74SHeiko Carstens sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to ESAME mode 122*c78d0c74SHeiko Carstens sam64 # Switch to 64 bit addressing mode 123*c78d0c74SHeiko Carstens larl %r4,.Lctlregs # Restore control registers 124*c78d0c74SHeiko Carstens lctlg %c0,%c15,0(%r4) 125*c78d0c74SHeiko Carstens larl %r4,.Lfpctl # Restore floating point ctl register 126*c78d0c74SHeiko Carstens lfpc 0(%r4) 127*c78d0c74SHeiko Carstens larl %r4,.Lprefix # Restore prefix register 128*c78d0c74SHeiko Carstens spx 0(%r4) 129*c78d0c74SHeiko Carstens larl %r4,.Lcontinue_psw # Restore PSW flags 130*c78d0c74SHeiko Carstens larl %r2,.Lcontinue 131*c78d0c74SHeiko Carstens stg %r2,8(%r4) 132*c78d0c74SHeiko Carstens lpswe 0(%r4) 133*c78d0c74SHeiko Carstens.Lcontinue: 134*c78d0c74SHeiko Carstens BR_EX_AMODE31_r14 135*c78d0c74SHeiko CarstensENDPROC(_diag308_reset_amode31) 136*c78d0c74SHeiko Carstens 137*c78d0c74SHeiko Carstens .section .amode31.data,"aw",@progbits 138*c78d0c74SHeiko Carstens.align 8 139*c78d0c74SHeiko Carstens.Lrestart_diag308_psw: 140*c78d0c74SHeiko Carstens .long 0x00080000,0x80000000 141*c78d0c74SHeiko Carstens 142*c78d0c74SHeiko Carstens.align 8 143*c78d0c74SHeiko Carstens.Lcontinue_psw: 144*c78d0c74SHeiko Carstens .quad 0,0 145*c78d0c74SHeiko Carstens 146*c78d0c74SHeiko Carstens.align 8 147*c78d0c74SHeiko Carstens.Lctlreg0: 148*c78d0c74SHeiko Carstens .quad 0 149*c78d0c74SHeiko Carstens.Lctlregs: 150*c78d0c74SHeiko Carstens .rept 16 151*c78d0c74SHeiko Carstens .quad 0 152*c78d0c74SHeiko Carstens .endr 153*c78d0c74SHeiko Carstens.Lfpctl: 154*c78d0c74SHeiko Carstens .long 0 155*c78d0c74SHeiko Carstens.Lprefix: 156*c78d0c74SHeiko Carstens .long 0 157*c78d0c74SHeiko Carstens.Lprefix_zero: 158*c78d0c74SHeiko Carstens .long 0 159