On 2/17/21 4:55 PM, Thomas Huth wrote: > On 17/02/2021 15.41, Janosch Frank wrote: >> 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> >> --- >> s390x/cstart64.S | 28 +++++----------------------- >> s390x/macros.S | 17 +++++++++++++++++ >> 2 files changed, 22 insertions(+), 23 deletions(-) >> >> diff --git a/s390x/cstart64.S b/s390x/cstart64.S >> index 35d20293..666a9567 100644 >> --- a/s390x/cstart64.S >> +++ b/s390x/cstart64.S >> @@ -92,37 +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 >> - lgr %r2, %r15 >> - 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..212a3823 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 pace for called C function, as specified in s390 ELF ABI */ >> + slgfi %r15, 160 > > By the way, don't you have to store a back chain pointer at the bottom of > that area, too, if you want to use -mbackchoin in the next patch? Don't I already do that in #2? + /* Store the gr15 value before we allocated the new stack */ + lgr %r0, %r15 + algfi %r0, 32 * 8 + 4 * 8 + stg %r0, 13 * 8 + STACK_FRAME_INT_GRS0(%r15) + stg %r0, STACK_FRAME_INT_BACKCHAIN(%r15) I can vertainly move the hunk here and improve the comment. > > Thomas > > >> + 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 >> >