Re: [kvm-unit-tests PATCH v5 01/10] s390x: saving regs for interrupts

Janosch Frank
2020-04-22T07:47:50Z

[-- Attachment #1.1: Type: text/plain, Size: 1903 bytes --]

On 2/20/20 1:00 PM, 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.
>
> Instead of saving at a static memory address, let's save the base
> registers and the floating point registers on the stack.
>
> Note that we keep the static register saving to recover from the
> RESET tests.
>
> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
> ---
> s390x/cstart64.S | 23 +++++++++++++++++++++--
> 1 file changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/s390x/cstart64.S b/s390x/cstart64.S
> index 9af6bb3..45da523 100644
> --- a/s390x/cstart64.S
> +++ b/s390x/cstart64.S
> @@ -118,6 +118,25 @@ memsetxc:
> lmg %r0, %r15, GEN_LC_SW_INT_GRS
> .endm
>
> +/* Save registers on the stack, so we can have stacked interrupts. */
> + .macro SAVE_IRQ_REGS
> + slgfi %r15, 15 * 8
> + stmg %r0, %r14, 0(%r15)

So this is just making some space on the stack and storing r0 - r14, right?

Same is done for the floating point registers below.

Could you add a comment above slgfi and stmg and explain what they do?
A few words are enough.

> + slgfi %r15, 16 * 8
> + .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
> +
> + .macro RESTORE_IRQ_REGS
> + .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
> + ld \i, \i * 8(%r15)
> + .endr
> + algfi %r15, 16 * 8
> + lmg %r0, %r14, 0(%r15)
> + algfi %r15, 15 * 8
> + .endm
> +
> .section .text
> /*
> * load_reset calling convention:
> @@ -182,9 +201,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:
>

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]