diff options
| author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-04-20 10:49:46 -0400 |
|---|---|---|
| committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-05-07 03:07:32 -0400 |
| commit | 6dd85fbb87d1d6b87a3b1f02ca28d7b2abd2e7ba (patch) | |
| tree | 595e60d24724231047b429bb4a40a3e908648e22 | |
| parent | d66a7355717ec903d455277a550d930ba13df4a8 (diff) | |
s390: move expoline assembler macros to a header
To be able to use the expoline branches in different assembler
files move the associated macros from entry.S to a new header
nospec-insn.h.
While we are at it make the macros a bit nicer to use.
Cc: stable@vger.kernel.org # 4.16
Fixes: f19fbd5ed6 ("s390: introduce execute-trampolines for branches")
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
| -rw-r--r-- | arch/s390/include/asm/nospec-insn.h | 127 | ||||
| -rw-r--r-- | arch/s390/kernel/entry.S | 105 |
2 files changed, 151 insertions, 81 deletions
diff --git a/arch/s390/include/asm/nospec-insn.h b/arch/s390/include/asm/nospec-insn.h new file mode 100644 index 000000000000..440689cbcf51 --- /dev/null +++ b/arch/s390/include/asm/nospec-insn.h | |||
| @@ -0,0 +1,127 @@ | |||
| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | ||
| 2 | #ifndef _ASM_S390_NOSPEC_ASM_H | ||
| 3 | #define _ASM_S390_NOSPEC_ASM_H | ||
| 4 | |||
| 5 | #include <asm/dwarf.h> | ||
| 6 | |||
| 7 | #ifdef __ASSEMBLY__ | ||
| 8 | |||
| 9 | #ifdef CONFIG_EXPOLINE | ||
| 10 | |||
| 11 | /* | ||
| 12 | * The expoline macros are used to create thunks in the same format | ||
| 13 | * as gcc generates them. The 'comdat' section flag makes sure that | ||
| 14 | * the various thunks are merged into a single copy. | ||
| 15 | */ | ||
| 16 | .macro __THUNK_PROLOG_NAME name | ||
| 17 | .pushsection .text.\name,"axG",@progbits,\name,comdat | ||
| 18 | .globl \name | ||
| 19 | .hidden \name | ||
| 20 | .type \name,@function | ||
| 21 | \name: | ||
| 22 | CFI_STARTPROC | ||
| 23 | .endm | ||
| 24 | |||
| 25 | .macro __THUNK_EPILOG | ||
| 26 | CFI_ENDPROC | ||
| 27 | .popsection | ||
| 28 | .endm | ||
| 29 | |||
| 30 | .macro __THUNK_PROLOG_BR r1,r2 | ||
| 31 | __THUNK_PROLOG_NAME __s390x_indirect_jump_r\r2\()use_r\r1 | ||
| 32 | .endm | ||
| 33 | |||
| 34 | .macro __THUNK_BR r1,r2 | ||
| 35 | jg __s390x_indirect_jump_r\r2\()use_r\r1 | ||
| 36 | .endm | ||
| 37 | |||
| 38 | .macro __THUNK_BRASL r1,r2,r3 | ||
| 39 | brasl \r1,__s390x_indirect_jump_r\r3\()use_r\r2 | ||
| 40 | .endm | ||
| 41 | |||
| 42 | .macro __DECODE_RR expand,reg,ruse | ||
| 43 | .set __decode_fail,1 | ||
| 44 | .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | ||
| 45 | .ifc \reg,%r\r1 | ||
| 46 | .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | ||
| 47 | .ifc \ruse,%r\r2 | ||
| 48 | \expand \r1,\r2 | ||
| 49 | .set __decode_fail,0 | ||
| 50 | .endif | ||
| 51 | .endr | ||
| 52 | .endif | ||
| 53 | .endr | ||
| 54 | .if __decode_fail == 1 | ||
| 55 | .error "__DECODE_RR failed" | ||
| 56 | .endif | ||
| 57 | .endm | ||
| 58 | |||
| 59 | .macro __DECODE_RRR expand,rsave,rtarget,ruse | ||
| 60 | .set __decode_fail,1 | ||
| 61 | .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | ||
| 62 | .ifc \rsave,%r\r1 | ||
| 63 | .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | ||
| 64 | .ifc \rtarget,%r\r2 | ||
| 65 | .irp r3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | ||
| 66 | .ifc \ruse,%r\r3 | ||
| 67 | \expand \r1,\r2,\r3 | ||
| 68 | .set __decode_fail,0 | ||
| 69 | .endif | ||
| 70 | .endr | ||
| 71 | .endif | ||
| 72 | .endr | ||
| 73 | .endif | ||
| 74 | .endr | ||
| 75 | .if __decode_fail == 1 | ||
| 76 | .error "__DECODE_RRR failed" | ||
| 77 | .endif | ||
| 78 | .endm | ||
| 79 | |||
| 80 | .macro __THUNK_EX_BR reg,ruse | ||
| 81 | #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES | ||
| 82 | exrl 0,555f | ||
| 83 | j . | ||
| 84 | #else | ||
| 85 | larl \ruse,555f | ||
| 86 | ex 0,0(\ruse) | ||
| 87 | j . | ||
| 88 | #endif | ||
| 89 | 555: br \reg | ||
| 90 | .endm | ||
| 91 | |||
| 92 | .macro GEN_BR_THUNK reg,ruse=%r1 | ||
| 93 | __DECODE_RR __THUNK_PROLOG_BR,\reg,\ruse | ||
| 94 | __THUNK_EX_BR \reg,\ruse | ||
| 95 | __THUNK_EPILOG | ||
| 96 | .endm | ||
| 97 | |||
| 98 | .macro BR_EX reg,ruse=%r1 | ||
| 99 | 557: __DECODE_RR __THUNK_BR,\reg,\ruse | ||
| 100 | .pushsection .s390_indirect_branches,"a",@progbits | ||
| 101 | .long 557b-. | ||
| 102 | .popsection | ||
| 103 | .endm | ||
| 104 | |||
| 105 | .macro BASR_EX rsave,rtarget,ruse=%r1 | ||
| 106 | 559: __DECODE_RRR __THUNK_BRASL,\rsave,\rtarget,\ruse | ||
| 107 | .pushsection .s390_indirect_branches,"a",@progbits | ||
| 108 | .long 559b-. | ||
| 109 | .popsection | ||
| 110 | .endm | ||
| 111 | |||
| 112 | #else | ||
| 113 | .macro GEN_BR_THUNK reg,ruse=%r1 | ||
| 114 | .endm | ||
| 115 | |||
| 116 | .macro BR_EX reg,ruse=%r1 | ||
| 117 | br \reg | ||
| 118 | .endm | ||
| 119 | |||
| 120 | .macro BASR_EX rsave,rtarget,ruse=%r1 | ||
| 121 | basr \rsave,\rtarget | ||
| 122 | .endm | ||
| 123 | #endif | ||
| 124 | |||
| 125 | #endif /* __ASSEMBLY__ */ | ||
| 126 | |||
| 127 | #endif /* _ASM_S390_NOSPEC_ASM_H */ | ||
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 3f22f139a041..f03402efab4b 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <asm/setup.h> | 28 | #include <asm/setup.h> |
| 29 | #include <asm/nmi.h> | 29 | #include <asm/nmi.h> |
| 30 | #include <asm/export.h> | 30 | #include <asm/export.h> |
| 31 | #include <asm/nospec-insn.h> | ||
| 31 | 32 | ||
| 32 | __PT_R0 = __PT_GPRS | 33 | __PT_R0 = __PT_GPRS |
| 33 | __PT_R1 = __PT_GPRS + 8 | 34 | __PT_R1 = __PT_GPRS + 8 |
| @@ -183,67 +184,9 @@ _LPP_OFFSET = __LC_LPP | |||
| 183 | "jnz .+8; .long 0xb2e8d000", 82 | 184 | "jnz .+8; .long 0xb2e8d000", 82 |
| 184 | .endm | 185 | .endm |
| 185 | 186 | ||
| 186 | #ifdef CONFIG_EXPOLINE | 187 | GEN_BR_THUNK %r9 |
| 187 | 188 | GEN_BR_THUNK %r14 | |
| 188 | .macro GEN_BR_THUNK name,reg,tmp | 189 | GEN_BR_THUNK %r14,%r11 |
| 189 | .section .text.\name,"axG",@progbits,\name,comdat | ||
| 190 | .globl \name | ||
| 191 | .hidden \name | ||
| 192 | .type \name,@function | ||
| 193 | \name: | ||
| 194 | CFI_STARTPROC | ||
| 195 | #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES | ||
| 196 | exrl 0,0f | ||
| 197 | #else | ||
| 198 | larl \tmp,0f | ||
| 199 | ex 0,0(\tmp) | ||
| 200 | #endif | ||
| 201 | j . | ||
| 202 | 0: br \reg | ||
| 203 | CFI_ENDPROC | ||
| 204 | .endm | ||
| 205 | |||
| 206 | GEN_BR_THUNK __s390x_indirect_jump_r1use_r9,%r9,%r1 | ||
| 207 | GEN_BR_THUNK __s390x_indirect_jump_r1use_r14,%r14,%r1 | ||
| 208 | GEN_BR_THUNK __s390x_indirect_jump_r11use_r14,%r14,%r11 | ||
| 209 | |||
| 210 | .macro BASR_R14_R9 | ||
| 211 | 0: brasl %r14,__s390x_indirect_jump_r1use_r9 | ||
| 212 | .pushsection .s390_indirect_branches,"a",@progbits | ||
| 213 | .long 0b-. | ||
| 214 | .popsection | ||
| 215 | .endm | ||
| 216 | |||
| 217 | .macro BR_R1USE_R14 | ||
| 218 | 0: jg __s390x_indirect_jump_r1use_r14 | ||
| 219 | .pushsection .s390_indirect_branches,"a",@progbits | ||
| 220 | .long 0b-. | ||
| 221 | .popsection | ||
| 222 | .endm | ||
| 223 | |||
| 224 | .macro BR_R11USE_R14 | ||
| 225 | 0: jg __s390x_indirect_jump_r11use_r14 | ||
| 226 | .pushsection .s390_indirect_branches,"a",@progbits | ||
| 227 | .long 0b-. | ||
| 228 | .popsection | ||
| 229 | .endm | ||
| 230 | |||
| 231 | #else /* CONFIG_EXPOLINE */ | ||
| 232 | |||
| 233 | .macro BASR_R14_R9 | ||
| 234 | basr %r14,%r9 | ||
| 235 | .endm | ||
| 236 | |||
| 237 | .macro BR_R1USE_R14 | ||
| 238 | br %r14 | ||
| 239 | .endm | ||
| 240 | |||
| 241 | .macro BR_R11USE_R14 | ||
| 242 | br %r14 | ||
| 243 | .endm | ||
| 244 | |||
| 245 | #endif /* CONFIG_EXPOLINE */ | ||
| 246 | |||
| 247 | 190 | ||
| 248 | .section .kprobes.text, "ax" | 191 | .section .kprobes.text, "ax" |
| 249 | .Ldummy: | 192 | .Ldummy: |
| @@ -260,7 +203,7 @@ _LPP_OFFSET = __LC_LPP | |||
| 260 | ENTRY(__bpon) | 203 | ENTRY(__bpon) |
| 261 | .globl __bpon | 204 | .globl __bpon |
| 262 | BPON | 205 | BPON |
| 263 | BR_R1USE_R14 | 206 | BR_EX %r14 |
| 264 | 207 | ||
| 265 | /* | 208 | /* |
| 266 | * Scheduler resume function, called by switch_to | 209 | * Scheduler resume function, called by switch_to |
| @@ -284,7 +227,7 @@ ENTRY(__switch_to) | |||
| 284 | mvc __LC_CURRENT_PID(4,%r0),0(%r3) # store pid of next | 227 | mvc __LC_CURRENT_PID(4,%r0),0(%r3) # store pid of next |
| 285 | lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task | 228 | lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task |
| 286 | ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40 | 229 | ALTERNATIVE "", ".insn s,0xb2800000,_LPP_OFFSET", 40 |
| 287 | BR_R1USE_R14 | 230 | BR_EX %r14 |
| 288 | 231 | ||
| 289 | .L__critical_start: | 232 | .L__critical_start: |
| 290 | 233 | ||
| @@ -351,7 +294,7 @@ sie_exit: | |||
| 351 | xgr %r5,%r5 | 294 | xgr %r5,%r5 |
| 352 | lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers | 295 | lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers |
| 353 | lg %r2,__SF_SIE_REASON(%r15) # return exit reason code | 296 | lg %r2,__SF_SIE_REASON(%r15) # return exit reason code |
| 354 | BR_R1USE_R14 | 297 | BR_EX %r14 |
| 355 | .Lsie_fault: | 298 | .Lsie_fault: |
| 356 | lghi %r14,-EFAULT | 299 | lghi %r14,-EFAULT |
| 357 | stg %r14,__SF_SIE_REASON(%r15) # set exit reason code | 300 | stg %r14,__SF_SIE_REASON(%r15) # set exit reason code |
| @@ -410,7 +353,7 @@ ENTRY(system_call) | |||
| 410 | lgf %r9,0(%r8,%r10) # get system call add. | 353 | lgf %r9,0(%r8,%r10) # get system call add. |
| 411 | TSTMSK __TI_flags(%r12),_TIF_TRACE | 354 | TSTMSK __TI_flags(%r12),_TIF_TRACE |
| 412 | jnz .Lsysc_tracesys | 355 | jnz .Lsysc_tracesys |
| 413 | BASR_R14_R9 # call sys_xxxx | 356 | BASR_EX %r14,%r9 # call sys_xxxx |
| 414 | stg %r2,__PT_R2(%r11) # store return value | 357 | stg %r2,__PT_R2(%r11) # store return value |
| 415 | 358 | ||
| 416 | .Lsysc_return: | 359 | .Lsysc_return: |
| @@ -595,7 +538,7 @@ ENTRY(system_call) | |||
| 595 | lmg %r3,%r7,__PT_R3(%r11) | 538 | lmg %r3,%r7,__PT_R3(%r11) |
| 596 | stg %r7,STACK_FRAME_OVERHEAD(%r15) | 539 | stg %r7,STACK_FRAME_OVERHEAD(%r15) |
| 597 | lg %r2,__PT_ORIG_GPR2(%r11) | 540 | lg %r2,__PT_ORIG_GPR2(%r11) |
| 598 | BASR_R14_R9 # call sys_xxx | 541 | BASR_EX %r14,%r9 # call sys_xxx |
| 599 | stg %r2,__PT_R2(%r11) # store return value | 542 | stg %r2,__PT_R2(%r11) # store return value |
| 600 | .Lsysc_tracenogo: | 543 | .Lsysc_tracenogo: |
| 601 | TSTMSK __TI_flags(%r12),_TIF_TRACE | 544 | TSTMSK __TI_flags(%r12),_TIF_TRACE |
| @@ -619,7 +562,7 @@ ENTRY(ret_from_fork) | |||
| 619 | lmg %r9,%r10,__PT_R9(%r11) # load gprs | 562 | lmg %r9,%r10,__PT_R9(%r11) # load gprs |
| 620 | ENTRY(kernel_thread_starter) | 563 | ENTRY(kernel_thread_starter) |
| 621 | la %r2,0(%r10) | 564 | la %r2,0(%r10) |
| 622 | BASR_R14_R9 | 565 | BASR_EX %r14,%r9 |
| 623 | j .Lsysc_tracenogo | 566 | j .Lsysc_tracenogo |
| 624 | 567 | ||
| 625 | /* | 568 | /* |
| @@ -701,7 +644,7 @@ ENTRY(pgm_check_handler) | |||
| 701 | je .Lpgm_return | 644 | je .Lpgm_return |
| 702 | lgf %r9,0(%r10,%r1) # load address of handler routine | 645 | lgf %r9,0(%r10,%r1) # load address of handler routine |
| 703 | lgr %r2,%r11 # pass pointer to pt_regs | 646 | lgr %r2,%r11 # pass pointer to pt_regs |
| 704 | BASR_R14_R9 # branch to interrupt-handler | 647 | BASR_EX %r14,%r9 # branch to interrupt-handler |
| 705 | .Lpgm_return: | 648 | .Lpgm_return: |
| 706 | LOCKDEP_SYS_EXIT | 649 | LOCKDEP_SYS_EXIT |
| 707 | tm __PT_PSW+1(%r11),0x01 # returning to user ? | 650 | tm __PT_PSW+1(%r11),0x01 # returning to user ? |
| @@ -1019,7 +962,7 @@ ENTRY(psw_idle) | |||
| 1019 | stpt __TIMER_IDLE_ENTER(%r2) | 962 | stpt __TIMER_IDLE_ENTER(%r2) |
| 1020 | .Lpsw_idle_lpsw: | 963 | .Lpsw_idle_lpsw: |
| 1021 | lpswe __SF_EMPTY(%r15) | 964 | lpswe __SF_EMPTY(%r15) |
| 1022 | BR_R1USE_R14 | 965 | BR_EX %r14 |
| 1023 | .Lpsw_idle_end: | 966 | .Lpsw_idle_end: |
| 1024 | 967 | ||
| 1025 | /* | 968 | /* |
| @@ -1061,7 +1004,7 @@ ENTRY(save_fpu_regs) | |||
| 1061 | .Lsave_fpu_regs_done: | 1004 | .Lsave_fpu_regs_done: |
| 1062 | oi __LC_CPU_FLAGS+7,_CIF_FPU | 1005 | oi __LC_CPU_FLAGS+7,_CIF_FPU |
| 1063 | .Lsave_fpu_regs_exit: | 1006 | .Lsave_fpu_regs_exit: |
| 1064 | BR_R1USE_R14 | 1007 | BR_EX %r14 |
| 1065 | .Lsave_fpu_regs_end: | 1008 | .Lsave_fpu_regs_end: |
| 1066 | EXPORT_SYMBOL(save_fpu_regs) | 1009 | EXPORT_SYMBOL(save_fpu_regs) |
| 1067 | 1010 | ||
| @@ -1107,7 +1050,7 @@ load_fpu_regs: | |||
| 1107 | .Lload_fpu_regs_done: | 1050 | .Lload_fpu_regs_done: |
| 1108 | ni __LC_CPU_FLAGS+7,255-_CIF_FPU | 1051 | ni __LC_CPU_FLAGS+7,255-_CIF_FPU |
| 1109 | .Lload_fpu_regs_exit: | 1052 | .Lload_fpu_regs_exit: |
| 1110 | BR_R1USE_R14 | 1053 | BR_EX %r14 |
| 1111 | .Lload_fpu_regs_end: | 1054 | .Lload_fpu_regs_end: |
| 1112 | 1055 | ||
| 1113 | .L__critical_end: | 1056 | .L__critical_end: |
| @@ -1322,7 +1265,7 @@ cleanup_critical: | |||
| 1322 | jl 0f | 1265 | jl 0f |
| 1323 | clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end | 1266 | clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end |
| 1324 | jl .Lcleanup_load_fpu_regs | 1267 | jl .Lcleanup_load_fpu_regs |
| 1325 | 0: BR_R11USE_R14 | 1268 | 0: BR_EX %r14 |
| 1326 | 1269 | ||
| 1327 | .align 8 | 1270 | .align 8 |
| 1328 | .Lcleanup_table: | 1271 | .Lcleanup_table: |
| @@ -1358,7 +1301,7 @@ cleanup_critical: | |||
| 1358 | ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE | 1301 | ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE |
| 1359 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce | 1302 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce |
| 1360 | larl %r9,sie_exit # skip forward to sie_exit | 1303 | larl %r9,sie_exit # skip forward to sie_exit |
| 1361 | BR_R11USE_R14 | 1304 | BR_EX %r14 |
| 1362 | #endif | 1305 | #endif |
| 1363 | 1306 | ||
| 1364 | .Lcleanup_system_call: | 1307 | .Lcleanup_system_call: |
| @@ -1412,7 +1355,7 @@ cleanup_critical: | |||
| 1412 | stg %r15,56(%r11) # r15 stack pointer | 1355 | stg %r15,56(%r11) # r15 stack pointer |
| 1413 | # set new psw address and exit | 1356 | # set new psw address and exit |
| 1414 | larl %r9,.Lsysc_do_svc | 1357 | larl %r9,.Lsysc_do_svc |
| 1415 | BR_R11USE_R14 | 1358 | BR_EX %r14,%r11 |
| 1416 | .Lcleanup_system_call_insn: | 1359 | .Lcleanup_system_call_insn: |
| 1417 | .quad system_call | 1360 | .quad system_call |
| 1418 | .quad .Lsysc_stmg | 1361 | .quad .Lsysc_stmg |
| @@ -1424,7 +1367,7 @@ cleanup_critical: | |||
| 1424 | 1367 | ||
| 1425 | .Lcleanup_sysc_tif: | 1368 | .Lcleanup_sysc_tif: |
| 1426 | larl %r9,.Lsysc_tif | 1369 | larl %r9,.Lsysc_tif |
| 1427 | BR_R11USE_R14 | 1370 | BR_EX %r14,%r11 |
| 1428 | 1371 | ||
| 1429 | .Lcleanup_sysc_restore: | 1372 | .Lcleanup_sysc_restore: |
| 1430 | # check if stpt has been executed | 1373 | # check if stpt has been executed |
| @@ -1441,14 +1384,14 @@ cleanup_critical: | |||
| 1441 | mvc 0(64,%r11),__PT_R8(%r9) | 1384 | mvc 0(64,%r11),__PT_R8(%r9) |
| 1442 | lmg %r0,%r7,__PT_R0(%r9) | 1385 | lmg %r0,%r7,__PT_R0(%r9) |
| 1443 | 1: lmg %r8,%r9,__LC_RETURN_PSW | 1386 | 1: lmg %r8,%r9,__LC_RETURN_PSW |
| 1444 | BR_R11USE_R14 | 1387 | BR_EX %r14,%r11 |
| 1445 | .Lcleanup_sysc_restore_insn: | 1388 | .Lcleanup_sysc_restore_insn: |
| 1446 | .quad .Lsysc_exit_timer | 1389 | .quad .Lsysc_exit_timer |
| 1447 | .quad .Lsysc_done - 4 | 1390 | .quad .Lsysc_done - 4 |
| 1448 | 1391 | ||
| 1449 | .Lcleanup_io_tif: | 1392 | .Lcleanup_io_tif: |
| 1450 | larl %r9,.Lio_tif | 1393 | larl %r9,.Lio_tif |
| 1451 | BR_R11USE_R14 | 1394 | BR_EX %r14,%r11 |
| 1452 | 1395 | ||
| 1453 | .Lcleanup_io_restore: | 1396 | .Lcleanup_io_restore: |
| 1454 | # check if stpt has been executed | 1397 | # check if stpt has been executed |
| @@ -1462,7 +1405,7 @@ cleanup_critical: | |||
| 1462 | mvc 0(64,%r11),__PT_R8(%r9) | 1405 | mvc 0(64,%r11),__PT_R8(%r9) |
| 1463 | lmg %r0,%r7,__PT_R0(%r9) | 1406 | lmg %r0,%r7,__PT_R0(%r9) |
| 1464 | 1: lmg %r8,%r9,__LC_RETURN_PSW | 1407 | 1: lmg %r8,%r9,__LC_RETURN_PSW |
| 1465 | BR_R11USE_R14 | 1408 | BR_EX %r14,%r11 |
| 1466 | .Lcleanup_io_restore_insn: | 1409 | .Lcleanup_io_restore_insn: |
| 1467 | .quad .Lio_exit_timer | 1410 | .quad .Lio_exit_timer |
| 1468 | .quad .Lio_done - 4 | 1411 | .quad .Lio_done - 4 |
| @@ -1515,17 +1458,17 @@ cleanup_critical: | |||
| 1515 | # prepare return psw | 1458 | # prepare return psw |
| 1516 | nihh %r8,0xfcfd # clear irq & wait state bits | 1459 | nihh %r8,0xfcfd # clear irq & wait state bits |
| 1517 | lg %r9,48(%r11) # return from psw_idle | 1460 | lg %r9,48(%r11) # return from psw_idle |
| 1518 | BR_R11USE_R14 | 1461 | BR_EX %r14,%r11 |
| 1519 | .Lcleanup_idle_insn: | 1462 | .Lcleanup_idle_insn: |
| 1520 | .quad .Lpsw_idle_lpsw | 1463 | .quad .Lpsw_idle_lpsw |
| 1521 | 1464 | ||
| 1522 | .Lcleanup_save_fpu_regs: | 1465 | .Lcleanup_save_fpu_regs: |
| 1523 | larl %r9,save_fpu_regs | 1466 | larl %r9,save_fpu_regs |
| 1524 | BR_R11USE_R14 | 1467 | BR_EX %r14,%r11 |
| 1525 | 1468 | ||
| 1526 | .Lcleanup_load_fpu_regs: | 1469 | .Lcleanup_load_fpu_regs: |
| 1527 | larl %r9,load_fpu_regs | 1470 | larl %r9,load_fpu_regs |
| 1528 | BR_R11USE_R14 | 1471 | BR_EX %r14,%r11 |
| 1529 | 1472 | ||
| 1530 | /* | 1473 | /* |
| 1531 | * Integer constants | 1474 | * Integer constants |
