On 24.04.20 12:45, Pierre Morel wrote: > If we use multiple source of interrupts, for example, using SCLP > console to print information while using I/O interrupts, we need > to have a re-entrant register saving interruption handling. So the primary reason is to print during I/O interrupts (which we already do, but usually never trigger - handle_io_int()) > > Instead of saving at a static memory address, let's save the base > registers and the floating point registers on the stack. ".. in case of I/O interrupts". > > Note that we keep the static register saving to recover from the > RESET tests. and for all other types of interrupts. > > Signed-off-by: Pierre Morel <pmorel@xxxxxxxxxxxxx> > --- > s390x/cstart64.S | 34 ++++++++++++++++++++++++++++++++-- > 1 file changed, 32 insertions(+), 2 deletions(-) > > diff --git a/s390x/cstart64.S b/s390x/cstart64.S > index 9af6bb3..ba2e67c 100644 > --- a/s390x/cstart64.S > +++ b/s390x/cstart64.S > @@ -118,6 +118,36 @@ memsetxc: > lmg %r0, %r15, GEN_LC_SW_INT_GRS > .endm > > +/* Save registers on the stack (r15), so we can have stacked interrupts. */ > + .macro SAVE_IRQ_REGS s/SAVE_IRQ_REGS/SAVE_REGS_STACK/ ? Same for the other macro. > + /* Allocate a stack frame for 15 integer registers */ not integers. sizeof(int) == 4. "doublewords" should be the right s390x speak. > + slgfi %r15, 15 * 8 > + /* Store all registers from r0 to r14 on the stack */ > + stmg %r0, %r14, 0(%r15) > + /* Allocate a stack frame for 16 floating point registers */ > + /* The size of a FP register is the size of an integer */ > + slgfi %r15, 16 * 8 > + /* Save fp register on stack: offset to SP is multiple of reg number */ > + .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 > + std \i, \i * 8(%r15) > + .endr > + .endm What about the FPC? > + > +/* Restore the register in reverse order */ > + .macro RESTORE_IRQ_REGS > + /* Restore fp register from stack: SP still where it was left */ > + /* and offset to SP is a multile of reg number */ > + .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 > + ld \i, \i * 8(%r15) > + .endr > + /* Now it is done, rewind the stack pointer by 16 integers */ > + algfi %r15, 16 * 8 > + /* Load the registers from stack */ > + lmg %r0, %r14, 0(%r15) > + /* Rewind the stack by 15 integers */ > + algfi %r15, 15 * 8 > + .endm Dito, FPC? > + > .section .text > /* > * load_reset calling convention: > @@ -182,9 +212,9 @@ mcck_int: > lpswe GEN_LC_MCCK_OLD_PSW > > io_int: > - SAVE_REGS > + SAVE_IRQ_REGS > brasl %r14, handle_io_int > - RESTORE_REGS > + RESTORE_IRQ_REGS > lpswe GEN_LC_IO_OLD_PSW > > svc_int: > -- Thanks, David / dhildenb