On 2/17/21 6:03 PM, Thomas Huth wrote: > On 17/02/2021 17.22, Janosch Frank wrote: >> 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? > > You do it in the SAVE_REGS_STACK patch, yes. But not on the bottom of the > new 160 bytes stack frame that you've added here. But I guess it doesn't > really matter for your back traces, since you load %r2 with %r15 before > decrementing the stack by 160, so this new stack frame simply gets ignored > anyway. > > Thomas > Right, I'm currently fixing that up for the next version. diff --git i/s390x/macros.S w/s390x/macros.S index b4275c77..13cff299 100644 --- i/s390x/macros.S +++ w/s390x/macros.S @@ -22,6 +22,11 @@ lgr %r2, %r15 /* Allocate stack space for called C function, as specified in s390 ELF ABI */ slgfi %r15, 160 + /* + * Save the address of the interrupt stack into the back chain + * of the called function. + */ + stg %r2, STACK_FRAME_INT_BACKCHAIN(%r15) brasl %r14, \c_func algfi %r15, 160 RESTORE_REGS_STACK