1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Code that needs to run below 2 GB.
5 * Copyright IBM Corp. 2019
8 #include <linux/linkage.h>
9 #include <asm/asm-extable.h>
10 #include <asm/errno.h>
13 .section .amode31.text,"ax"
15 * Simplified version of expoline thunk. The normal thunks can not be used here,
16 * because they might be more than 2 GB away, and not reachable by the relative
17 * branch. No comdat, exrl, etc. optimizations used here, because it only
18 * affects a few functions that are not performance-relevant.
20 .macro BR_EX_AMODE31_r14
28 * int _diag14_amode31(unsigned long rx, unsigned long ry1, unsigned long subcode)
30 ENTRY(_diag14_amode31)
44 EX_TABLE_AMODE31(.Ldiag14_ex, .Ldiag14_fault)
45 ENDPROC(_diag14_amode31)
48 * int _diag210_amode31(struct diag210 *addr)
50 ENTRY(_diag210_amode31)
62 EX_TABLE_AMODE31(.Ldiag210_ex, .Ldiag210_fault)
63 ENDPROC(_diag210_amode31)
66 * int _diag26c_amode31(void *req, void *resp, enum diag26c_sc subcode)
68 ENTRY(_diag26c_amode31)
76 EX_TABLE_AMODE31(.Ldiag26c_ex, .Ldiag26c_ex)
77 ENDPROC(_diag26c_amode31)
80 * void _diag0c_amode31(struct hypfs_diag0c_entry *entry)
82 ENTRY(_diag0c_amode31)
87 ENDPROC(_diag0c_amode31)
90 * void _diag308_reset_amode31(void)
92 * Calls diag 308 subcode 1 and continues execution
94 ENTRY(_diag308_reset_amode31)
95 larl %r4,.Lctlregs # Save control registers
97 lg %r2,0(%r4) # Disable lowcore protection
102 larl %r4,.Lfpctl # Floating point control register
104 larl %r4,.Lprefix # Save prefix register
106 larl %r4,.Lprefix_zero # Set prefix register to 0
108 larl %r4,.Lcontinue_psw # Save PSW flags
111 larl %r4,.Lrestart_part2 # Setup restart PSW at absolute 0
112 larl %r3,.Lrestart_diag308_psw
113 og %r4,0(%r3) # Save PSW
115 sturg %r4,%r3 # Use sturg, because of large pages
120 lhi %r0,0 # Load r0 with zero
121 lhi %r1,2 # Use mode 2 = ESAME (dump)
122 sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to ESAME mode
123 sam64 # Switch to 64 bit addressing mode
124 larl %r4,.Lctlregs # Restore control registers
125 lctlg %c0,%c15,0(%r4)
126 larl %r4,.Lfpctl # Restore floating point ctl register
128 larl %r4,.Lprefix # Restore prefix register
130 larl %r4,.Lcontinue_psw # Restore PSW flags
136 ENDPROC(_diag308_reset_amode31)
138 .section .amode31.data,"aw",@progbits
140 .Lrestart_diag308_psw:
141 .long 0x00080000,0x80000000