Re: [kvm-unit-tests PATCH 3/4] s390x: Move SIE assembly into new file

Claudio Imbrenda
2024-07-25T14:40:49Z

On Thu, 18 Jul 2024 10:50:18 +0000
Janosch Frank <frankja@linux.ibm.com> wrote:

> In contrast to the other functions in cpu.S it's quite lengthy so
> let's split it off.
>
> Signed-off-by: Janosch Frank <frankja@linux.ibm.com>

Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>

> ---
> s390x/Makefile | 2 +-
> s390x/{cpu.S => cpu-sie.S} | 59 +----------------------------------
> s390x/cpu.S | 64 --------------------------------------
> 3 files changed, 2 insertions(+), 123 deletions(-)
> copy s390x/{cpu.S => cpu-sie.S} (56%)
>
> diff --git a/s390x/Makefile b/s390x/Makefile
> index 457b8455..ecf0bc7e 100644
> --- a/s390x/Makefile
> +++ b/s390x/Makefile
> @@ -119,7 +119,7 @@ cflatobjs += lib/s390x/fault.o
>
> OBJDIRS += lib/s390x
>
> -asmlib = $(TEST_DIR)/cstart64.o $(TEST_DIR)/cpu.o
> +asmlib = $(TEST_DIR)/cstart64.o $(TEST_DIR)/cpu.o $(TEST_DIR)/cpu-sie.o
>
> FLATLIBS = $(libcflat)
>
> diff --git a/s390x/cpu.S b/s390x/cpu-sie.S
> similarity index 56%
> copy from s390x/cpu.S
> copy to s390x/cpu-sie.S
> index 9155b044..9370b5c0 100644
> --- a/s390x/cpu.S
> +++ b/s390x/cpu-sie.S
> @@ -1,6 +1,6 @@
> /* SPDX-License-Identifier: GPL-2.0-only */
> /*
> - * s390x assembly library
> + * s390x SIE assembly library
> *
> * Copyright (c) 2019 IBM Corp.
> *
> @@ -8,59 +8,6 @@
> * Janosch Frank <frankja@linux.ibm.com>
> */
> #include <asm/asm-offsets.h>
> -#include <asm/sigp.h>
> -
> -#include "macros.S"
> -
> -/*
> - * load_reset calling convention:
> - * %r2 subcode (0 or 1)
> - */
> -.globl diag308_load_reset
> -diag308_load_reset:
> - SAVE_REGS_STACK
> - /* Backup current PSW mask, as we have to restore it on success */
> - epsw %r0, %r1
> - st %r0, GEN_LC_SW_INT_PSW
> - st %r1, GEN_LC_SW_INT_PSW + 4
> - /* Load reset psw mask (short psw, 64 bit) */
> - lg %r0, reset_psw
> - /* Load the success label address */
> - larl %r1, 0f
> - /* Or it to the mask */
> - ogr %r0, %r1
> - /* Store it at the reset PSW location (real 0x0) */
> - stg %r0, 0
> - stg %r15, GEN_LC_SW_INT_GRS + 15 * 8
> - /* Do the reset */
> - diag %r0,%r2,0x308
> - /* Failure path */
> - xgr %r2, %r2
> - br %r14
> - /* Success path */
> - /* load a cr0 that has the AFP control bit which enables all FPRs */
> -0: larl %r1, initial_cr0
> - lctlg %c0, %c0, 0(%r1)
> - lg %r15, GEN_LC_SW_INT_GRS + 15 * 8
> - RESTORE_REGS_STACK
> - lhi %r2, 1
> - larl %r0, 1f
> - stg %r0, GEN_LC_SW_INT_PSW + 8
> - lpswe GEN_LC_SW_INT_PSW
> -1: br %r14
> -
> -/* Sets up general registers and cr0 when a new cpu is brought online. */
> -.globl smp_cpu_setup_state
> -smp_cpu_setup_state:
> - xgr %r1, %r1
> - lmg %r0, %r15, GEN_LC_SW_INT_GRS
> - lctlg %c0, %c0, GEN_LC_SW_INT_CRS
> - /* We should only go once through cpu setup and not for every restart */
> - stg %r14, GEN_LC_RESTART_NEW_PSW + 8
> - larl %r14, 0f
> - lpswe GEN_LC_SW_INT_PSW
> - /* If the function returns, just loop here */
> -0: j 0
>
> /*
> * sie64a calling convention:
> @@ -125,7 +72,3 @@ sie_exit:
> .globl sie_exit_gregs
> sie_exit_gregs:
> br %r14
> -
> - .align 8
> -reset_psw:
> - .quad 0x0008000180000000
> diff --git a/s390x/cpu.S b/s390x/cpu.S
> index 9155b044..2ff4b8e1 100644
> --- a/s390x/cpu.S
> +++ b/s390x/cpu.S
> @@ -62,70 +62,6 @@ smp_cpu_setup_state:
> /* If the function returns, just loop here */
> 0: j 0
>
> -/*
> - * sie64a calling convention:
> - * %r2 pointer to sie control block
> - * %r3 guest register save area
> - */
> -.globl sie64a
> -sie64a:
> - # Save host grs, fprs, fpc
> - stmg %r0,%r14,SIE_SAVEAREA_HOST_GRS(%r3) # save kernel registers
> - .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
> - std \i, \i * 8 + SIE_SAVEAREA_HOST_FPRS(%r3)
> - .endr
> - stfpc SIE_SAVEAREA_HOST_FPC(%r3)
> -
> - stctg %c1, %c1, SIE_SAVEAREA_HOST_ASCE(%r3)
> - lctlg %c1, %c1, SIE_SAVEAREA_GUEST_ASCE(%r3)
> -
> - # Store scb and save_area pointer into stack frame
> - stg %r2,__SF_SIE_CONTROL(%r15) # save control block pointer
> - stg %r3,__SF_SIE_SAVEAREA(%r15) # save guest register save area
> -.globl sie_entry_gregs
> -sie_entry_gregs:
> - # Load guest's gprs, fprs and fpc
> - .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
> - ld \i, \i * 8 + SIE_SAVEAREA_GUEST_FPRS(%r3)
> - .endr
> - lfpc SIE_SAVEAREA_GUEST_FPC(%r3)
> - lmg %r0,%r13,SIE_SAVEAREA_GUEST_GRS(%r3)
> -
> - # Move scb ptr into r14 for the sie instruction
> - lg %r14,__SF_SIE_CONTROL(%r15)
> -
> -.globl sie_entry
> -sie_entry:
> - sie 0(%r14)
> - nopr 7
> - nopr 7
> - nopr 7
> -
> -.globl sie_exit
> -sie_exit:
> - # Load guest register save area
> - lg %r14,__SF_SIE_SAVEAREA(%r15)
> -
> - # Restore the host asce
> - lctlg %c1, %c1, SIE_SAVEAREA_HOST_ASCE(%r14)
> -
> - # Store guest's gprs, fprs and fpc
> - stmg %r0,%r13,SIE_SAVEAREA_GUEST_GRS(%r14) # save guest gprs 0-13
> - .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
> - std \i, \i * 8 + SIE_SAVEAREA_GUEST_FPRS(%r14)
> - .endr
> - stfpc SIE_SAVEAREA_GUEST_FPC(%r14)
> -
> - # Restore host's gprs, fprs and fpc
> - .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
> - ld \i, \i * 8 + SIE_SAVEAREA_HOST_FPRS(%r14)
> - .endr
> - lfpc SIE_SAVEAREA_HOST_FPC(%r14)
> - lmg %r0,%r14,SIE_SAVEAREA_HOST_GRS(%r14) # restore kernel registers
> -.globl sie_exit_gregs
> -sie_exit_gregs:
> - br %r14
> -
> .align 8
> reset_psw:
> .quad 0x0008000180000000