The ELF ABI dictates that we need to allocate 160 bytes of stack space for the C functions we're calling. Since we would need to do that for every interruption handler which, combined with the new stack argument being saved in GR2, makes cstart64.S look a bit messy. So let's introduce the CALL_INT_HANDLER macro that handles all of that, calls the C interrupt handler and handles cleanup afterwards. Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Reviewed-by: Thomas Huth <thuth@xxxxxxxxxx> Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> --- s390x/cstart64.S | 27 +++++---------------------- s390x/macros.S | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/s390x/cstart64.S b/s390x/cstart64.S index ad0e2145..666a9567 100644 --- a/s390x/cstart64.S +++ b/s390x/cstart64.S @@ -92,36 +92,19 @@ memsetxc: .section .text pgm_int: - SAVE_REGS_STACK - lgr %r2, %r15 - brasl %r14, handle_pgm_int - RESTORE_REGS_STACK - lpswe GEN_LC_PGM_OLD_PSW + CALL_INT_HANDLER handle_pgm_int, GEN_LC_PGM_OLD_PSW ext_int: - SAVE_REGS_STACK - lgr %r2, %r15 - brasl %r14, handle_ext_int - RESTORE_REGS_STACK - lpswe GEN_LC_EXT_OLD_PSW + CALL_INT_HANDLER handle_ext_int, GEN_LC_EXT_OLD_PSW mcck_int: - SAVE_REGS_STACK - brasl %r14, handle_mcck_int - RESTORE_REGS_STACK - lpswe GEN_LC_MCCK_OLD_PSW + CALL_INT_HANDLER handle_mcck_int, GEN_LC_MCCK_OLD_PSW io_int: - SAVE_REGS_STACK - brasl %r14, handle_io_int - RESTORE_REGS_STACK - lpswe GEN_LC_IO_OLD_PSW + CALL_INT_HANDLER handle_io_int, GEN_LC_IO_OLD_PSW svc_int: - SAVE_REGS_STACK - brasl %r14, handle_svc_int - RESTORE_REGS_STACK - lpswe GEN_LC_SVC_OLD_PSW + CALL_INT_HANDLER handle_svc_int, GEN_LC_SVC_OLD_PSW .align 8 initial_psw: diff --git a/s390x/macros.S b/s390x/macros.S index a7d62c6f..11f4397a 100644 --- a/s390x/macros.S +++ b/s390x/macros.S @@ -11,6 +11,23 @@ * David Hildenbrand <david@xxxxxxxxxx> */ #include <asm/asm-offsets.h> +/* + * Exception handler macro that saves registers on the stack, + * allocates stack space and calls the C handler function. Afterwards + * we re-load the registers and load the old PSW. + */ + .macro CALL_INT_HANDLER c_func, old_psw + SAVE_REGS_STACK + /* Save the stack address in GR2 which is the first function argument */ + lgr %r2, %r15 + /* Allocate stack space for called C function, as specified in s390 ELF ABI */ + slgfi %r15, 160 + brasl %r14, \c_func + algfi %r15, 160 + RESTORE_REGS_STACK + lpswe \old_psw + .endm + .macro SAVE_REGS /* save grs 0-15 */ stmg %r0, %r15, GEN_LC_SW_INT_GRS -- 2.29.2