[kvm-unit-tests PATCH v3 3/4] riscv: lib: Add SSE assembly entry handling
Clément Léger
cleger at rivosinc.com
Mon Nov 25 06:41:23 PST 2024
On 25/11/2024 15:26, Andrew Jones wrote:
> On Mon, Nov 25, 2024 at 03:13:01PM +0100, Clément Léger wrote:
>>
>>
>> On 25/11/2024 14:50, Andrew Jones wrote:
>>> On Mon, Nov 25, 2024 at 12:54:47PM +0100, Clément Léger wrote:
>>>> Add a SSE entry assembly code to handle SSE events. Events should be
>>>> registered with a struct sse_handler_arg containing a correct stack and
>>>> handler function.
>>>>
>>>> Signed-off-by: Clément Léger <cleger at rivosinc.com>
>>>> ---
>>>> riscv/Makefile | 1 +
>>>> lib/riscv/asm/sse.h | 16 +++++++
>>>> lib/riscv/sse-entry.S | 100 ++++++++++++++++++++++++++++++++++++++++
>>>> lib/riscv/asm-offsets.c | 9 ++++
>>>> 4 files changed, 126 insertions(+)
>>>> create mode 100644 lib/riscv/asm/sse.h
>>>> create mode 100644 lib/riscv/sse-entry.S
>>>>
>>>> diff --git a/riscv/Makefile b/riscv/Makefile
>>>> index 5b5e157c..c278ec5c 100644
>>>> --- a/riscv/Makefile
>>>> +++ b/riscv/Makefile
>>>> @@ -41,6 +41,7 @@ cflatobjs += lib/riscv/sbi.o
>>>> cflatobjs += lib/riscv/setjmp.o
>>>> cflatobjs += lib/riscv/setup.o
>>>> cflatobjs += lib/riscv/smp.o
>>>> +cflatobjs += lib/riscv/sse-entry.o
>>>> cflatobjs += lib/riscv/stack.o
>>>> cflatobjs += lib/riscv/timer.o
>>>> ifeq ($(ARCH),riscv32)
>>>> diff --git a/lib/riscv/asm/sse.h b/lib/riscv/asm/sse.h
>>>> new file mode 100644
>>>> index 00000000..557f6680
>>>> --- /dev/null
>>>> +++ b/lib/riscv/asm/sse.h
>>>> @@ -0,0 +1,16 @@
>>>> +/* SPDX-License-Identifier: GPL-2.0-only */
>>>> +#ifndef _ASMRISCV_SSE_H_
>>>> +#define _ASMRISCV_SSE_H_
>>>> +
>>>> +typedef void (*sse_handler_fn)(void *data, struct pt_regs *regs, unsigned int hartid);
>>>> +
>>>> +struct sse_handler_arg {
>>>> + unsigned long reg_tmp;
>>>> + sse_handler_fn handler;
>>>> + void *handler_data;
>>>> + void *stack;
>>>> +};
>>>
>>> It still feels wrong to put a test-specific struct definition in lib. It's
>>> test-specific, because the SSE register function doesn't define it
>>> (otherwise we'd put the definition in lib/riscv/asm/sbi.h with the rest of
>>> the defines that come straight from the spec). Now, if we foresee using
>>> sse_event_register() outside of SBI SSE testing, then it would make sense
>>> to come up with a common struct, but it doesn't look like we have plans
>>> for that now, and sse_event_register() isn't in lib/riscv/sbi.c yet.
>>>
>>>> +
>>>> +extern void sse_entry(void);
>>>> +
>>>> +#endif /* _ASMRISCV_SSE_H_ */
>>>> diff --git a/lib/riscv/sse-entry.S b/lib/riscv/sse-entry.S
>>>> new file mode 100644
>>>> index 00000000..f1244e17
>>>> --- /dev/null
>>>> +++ b/lib/riscv/sse-entry.S
>>>> @@ -0,0 +1,100 @@
>>>> +/* SPDX-License-Identifier: GPL-2.0-only */
>>>> +/*
>>>> + * SBI SSE entry code
>>>> + *
>>>> + * Copyright (C) 2024, Rivos Inc., Clément Léger <cleger at rivosinc.com>
>>>> + */
>>>> +#include <asm/asm.h>
>>>> +#include <asm/asm-offsets.h>
>>>> +#include <asm/csr.h>
>>>> +
>>>> +.global sse_entry
>>>> +sse_entry:
>>>
>>> sse_entry is also test-specific unless we export sse_event_register().
>>>
>>>> + /* Save stack temporarily */
>>>> + REG_S sp, SSE_REG_TMP(a7)
>>>> + /* Set entry stack */
>>>> + REG_L sp, SSE_HANDLER_STACK(a7)
>>>> +
>>>> + addi sp, sp, -(PT_SIZE)
>>>> + REG_S ra, PT_RA(sp)
>>>> + REG_S s0, PT_S0(sp)
>>>> + REG_S s1, PT_S1(sp)
>>>> + REG_S s2, PT_S2(sp)
>>>> + REG_S s3, PT_S3(sp)
>>>> + REG_S s4, PT_S4(sp)
>>>> + REG_S s5, PT_S5(sp)
>>>> + REG_S s6, PT_S6(sp)
>>>> + REG_S s7, PT_S7(sp)
>>>> + REG_S s8, PT_S8(sp)
>>>> + REG_S s9, PT_S9(sp)
>>>> + REG_S s10, PT_S10(sp)
>>>> + REG_S s11, PT_S11(sp)
>>>> + REG_S tp, PT_TP(sp)
>>>> + REG_S t0, PT_T0(sp)
>>>> + REG_S t1, PT_T1(sp)
>>>> + REG_S t2, PT_T2(sp)
>>>> + REG_S t3, PT_T3(sp)
>>>> + REG_S t4, PT_T4(sp)
>>>> + REG_S t5, PT_T5(sp)
>>>> + REG_S t6, PT_T6(sp)
>>>> + REG_S gp, PT_GP(sp)
>>>> + REG_S a0, PT_A0(sp)
>>>> + REG_S a1, PT_A1(sp)
>>>> + REG_S a2, PT_A2(sp)
>>>> + REG_S a3, PT_A3(sp)
>>>> + REG_S a4, PT_A4(sp)
>>>> + REG_S a5, PT_A5(sp)
>>>> + csrr a1, CSR_SEPC
>>>> + REG_S a1, PT_EPC(sp)
>>>> + csrr a2, CSR_SSTATUS
>>>> + REG_S a2, PT_STATUS(sp)
>>>> +
>>>> + REG_L a0, SSE_REG_TMP(a7)
>>>> + REG_S a0, PT_SP(sp)
>>>> +
>>>> + REG_L t0, SSE_HANDLER(a7)
>>>> + REG_L a0, SSE_HANDLER_DATA(a7)
>>>> + mv a1, sp
>>>> + mv a2, a6
>>>> + jalr t0
>>>> +
>>>> +
>>>> + REG_L a1, PT_EPC(sp)
>>>> + REG_L a2, PT_STATUS(sp)
>>>> + csrw CSR_SEPC, a1
>>>> + csrw CSR_SSTATUS, a2
>>>> +
>>>> + REG_L ra, PT_RA(sp)
>>>> + REG_L s0, PT_S0(sp)
>>>> + REG_L s1, PT_S1(sp)
>>>> + REG_L s2, PT_S2(sp)
>>>> + REG_L s3, PT_S3(sp)
>>>> + REG_L s4, PT_S4(sp)
>>>> + REG_L s5, PT_S5(sp)
>>>> + REG_L s6, PT_S6(sp)
>>>> + REG_L s7, PT_S7(sp)
>>>> + REG_L s8, PT_S8(sp)
>>>> + REG_L s9, PT_S9(sp)
>>>> + REG_L s10, PT_S10(sp)
>>>> + REG_L s11, PT_S11(sp)
>>>> + REG_L tp, PT_TP(sp)
>>>> + REG_L t0, PT_T0(sp)
>>>> + REG_L t1, PT_T1(sp)
>>>> + REG_L t2, PT_T2(sp)
>>>> + REG_L t3, PT_T3(sp)
>>>> + REG_L t4, PT_T4(sp)
>>>> + REG_L t5, PT_T5(sp)
>>>> + REG_L t6, PT_T6(sp)
>>>> + REG_L gp, PT_GP(sp)
>>>> + REG_L a0, PT_A0(sp)
>>>> + REG_L a1, PT_A1(sp)
>>>> + REG_L a2, PT_A2(sp)
>>>> + REG_L a3, PT_A3(sp)
>>>> + REG_L a4, PT_A4(sp)
>>>> + REG_L a5, PT_A5(sp)
>>>> +
>>>> + REG_L sp, PT_SP(sp)
>>>> +
>>>> + li a7, ASM_SBI_EXT_SSE
>>>> + li a6, ASM_SBI_EXT_SSE_COMPLETE
>>>> + ecall
>>>> diff --git a/lib/riscv/asm-offsets.c b/lib/riscv/asm-offsets.c
>>>> index 6c511c14..b3465eeb 100644
>>>> --- a/lib/riscv/asm-offsets.c
>>>> +++ b/lib/riscv/asm-offsets.c
>>>> @@ -3,7 +3,9 @@
>>>> #include <elf.h>
>>>> #include <asm/processor.h>
>>>> #include <asm/ptrace.h>
>>>> +#include <asm/sbi.h>
>>>> #include <asm/smp.h>
>>>> +#include <asm/sse.h>
>>>>
>>>> int main(void)
>>>> {
>>>> @@ -63,5 +65,12 @@ int main(void)
>>>> OFFSET(THREAD_INFO_HARTID, thread_info, hartid);
>>>> DEFINE(THREAD_INFO_SIZE, sizeof(struct thread_info));
>>>>
>>>> + OFFSET(SSE_REG_TMP, sse_handler_arg, reg_tmp);
>>>> + OFFSET(SSE_HANDLER, sse_handler_arg, handler);
>>>> + OFFSET(SSE_HANDLER_DATA, sse_handler_arg, handler_data);
>>>> + OFFSET(SSE_HANDLER_STACK, sse_handler_arg, stack);
>>>
>>> I think I prefer just hard coding the offsets in defines and then using
>>> static asserts to ensure they stay as expected. Below is a diff I applied
>>> which moves some stuff around. Let me know what you think.
>>>
>>> Thanks,
>>> drew
>>>
>>>> + DEFINE(ASM_SBI_EXT_SSE, SBI_EXT_SSE);
>>>> + DEFINE(ASM_SBI_EXT_SSE_COMPLETE, SBI_EXT_SSE_COMPLETE);
>>>> +
>>>> return 0;
>>>> }
>>>> --
>>>> 2.45.2
>>>>
>>>
>>> diff --git a/lib/riscv/asm-offsets.c b/lib/riscv/asm-offsets.c
>>> index b3465eebbaa2..402eb4d90a8e 100644
>>> --- a/lib/riscv/asm-offsets.c
>>> +++ b/lib/riscv/asm-offsets.c
>>> @@ -5,7 +5,6 @@
>>> #include <asm/ptrace.h>
>>> #include <asm/sbi.h>
>>> #include <asm/smp.h>
>>> -#include <asm/sse.h>
>>>
>>> int main(void)
>>> {
>>> @@ -65,10 +64,8 @@ int main(void)
>>> OFFSET(THREAD_INFO_HARTID, thread_info, hartid);
>>> DEFINE(THREAD_INFO_SIZE, sizeof(struct thread_info));
>>>
>>> - OFFSET(SSE_REG_TMP, sse_handler_arg, reg_tmp);
>>> - OFFSET(SSE_HANDLER, sse_handler_arg, handler);
>>> - OFFSET(SSE_HANDLER_DATA, sse_handler_arg, handler_data);
>>> - OFFSET(SSE_HANDLER_STACK, sse_handler_arg, stack);
>>> + DEFINE(ASM_SBI_EXT_HSM, SBI_EXT_HSM);
>>> + DEFINE(ASM_SBI_EXT_HSM_HART_STOP, SBI_EXT_HSM_HART_STOP);
>>> DEFINE(ASM_SBI_EXT_SSE, SBI_EXT_SSE);
>>> DEFINE(ASM_SBI_EXT_SSE_COMPLETE, SBI_EXT_SSE_COMPLETE);
>>>
>>> diff --git a/lib/riscv/asm/sse.h b/lib/riscv/asm/sse.h
>>> deleted file mode 100644
>>> index 557f6680e90c..000000000000
>>> --- a/lib/riscv/asm/sse.h
>>> +++ /dev/null
>>> @@ -1,16 +0,0 @@
>>> -/* SPDX-License-Identifier: GPL-2.0-only */
>>> -#ifndef _ASMRISCV_SSE_H_
>>> -#define _ASMRISCV_SSE_H_
>>> -
>>> -typedef void (*sse_handler_fn)(void *data, struct pt_regs *regs, unsigned int hartid);
>>> -
>>> -struct sse_handler_arg {
>>> - unsigned long reg_tmp;
>>> - sse_handler_fn handler;
>>> - void *handler_data;
>>> - void *stack;
>>> -};
>>> -
>>> -extern void sse_entry(void);
>>> -
>>> -#endif /* _ASMRISCV_SSE_H_ */
>>> diff --git a/lib/riscv/sse-entry.S b/lib/riscv/sse-entry.S
>>> deleted file mode 100644
>>> index f1244e17fe08..000000000000
>>> --- a/lib/riscv/sse-entry.S
>>> +++ /dev/null
>>> @@ -1,100 +0,0 @@
>>> -/* SPDX-License-Identifier: GPL-2.0-only */
>>> -/*
>>> - * SBI SSE entry code
>>> - *
>>> - * Copyright (C) 2024, Rivos Inc., Clément Léger <cleger at rivosinc.com>
>>> - */
>>> -#include <asm/asm.h>
>>> -#include <asm/asm-offsets.h>
>>> -#include <asm/csr.h>
>>> -
>>> -.global sse_entry
>>> -sse_entry:
>>> - /* Save stack temporarily */
>>> - REG_S sp, SSE_REG_TMP(a7)
>>> - /* Set entry stack */
>>> - REG_L sp, SSE_HANDLER_STACK(a7)
>>> -
>>> - addi sp, sp, -(PT_SIZE)
>>> - REG_S ra, PT_RA(sp)
>>> - REG_S s0, PT_S0(sp)
>>> - REG_S s1, PT_S1(sp)
>>> - REG_S s2, PT_S2(sp)
>>> - REG_S s3, PT_S3(sp)
>>> - REG_S s4, PT_S4(sp)
>>> - REG_S s5, PT_S5(sp)
>>> - REG_S s6, PT_S6(sp)
>>> - REG_S s7, PT_S7(sp)
>>> - REG_S s8, PT_S8(sp)
>>> - REG_S s9, PT_S9(sp)
>>> - REG_S s10, PT_S10(sp)
>>> - REG_S s11, PT_S11(sp)
>>> - REG_S tp, PT_TP(sp)
>>> - REG_S t0, PT_T0(sp)
>>> - REG_S t1, PT_T1(sp)
>>> - REG_S t2, PT_T2(sp)
>>> - REG_S t3, PT_T3(sp)
>>> - REG_S t4, PT_T4(sp)
>>> - REG_S t5, PT_T5(sp)
>>> - REG_S t6, PT_T6(sp)
>>> - REG_S gp, PT_GP(sp)
>>> - REG_S a0, PT_A0(sp)
>>> - REG_S a1, PT_A1(sp)
>>> - REG_S a2, PT_A2(sp)
>>> - REG_S a3, PT_A3(sp)
>>> - REG_S a4, PT_A4(sp)
>>> - REG_S a5, PT_A5(sp)
>>> - csrr a1, CSR_SEPC
>>> - REG_S a1, PT_EPC(sp)
>>> - csrr a2, CSR_SSTATUS
>>> - REG_S a2, PT_STATUS(sp)
>>> -
>>> - REG_L a0, SSE_REG_TMP(a7)
>>> - REG_S a0, PT_SP(sp)
>>> -
>>> - REG_L t0, SSE_HANDLER(a7)
>>> - REG_L a0, SSE_HANDLER_DATA(a7)
>>> - mv a1, sp
>>> - mv a2, a6
>>> - jalr t0
>>> -
>>> -
>>> - REG_L a1, PT_EPC(sp)
>>> - REG_L a2, PT_STATUS(sp)
>>> - csrw CSR_SEPC, a1
>>> - csrw CSR_SSTATUS, a2
>>> -
>>> - REG_L ra, PT_RA(sp)
>>> - REG_L s0, PT_S0(sp)
>>> - REG_L s1, PT_S1(sp)
>>> - REG_L s2, PT_S2(sp)
>>> - REG_L s3, PT_S3(sp)
>>> - REG_L s4, PT_S4(sp)
>>> - REG_L s5, PT_S5(sp)
>>> - REG_L s6, PT_S6(sp)
>>> - REG_L s7, PT_S7(sp)
>>> - REG_L s8, PT_S8(sp)
>>> - REG_L s9, PT_S9(sp)
>>> - REG_L s10, PT_S10(sp)
>>> - REG_L s11, PT_S11(sp)
>>> - REG_L tp, PT_TP(sp)
>>> - REG_L t0, PT_T0(sp)
>>> - REG_L t1, PT_T1(sp)
>>> - REG_L t2, PT_T2(sp)
>>> - REG_L t3, PT_T3(sp)
>>> - REG_L t4, PT_T4(sp)
>>> - REG_L t5, PT_T5(sp)
>>> - REG_L t6, PT_T6(sp)
>>> - REG_L gp, PT_GP(sp)
>>> - REG_L a0, PT_A0(sp)
>>> - REG_L a1, PT_A1(sp)
>>> - REG_L a2, PT_A2(sp)
>>> - REG_L a3, PT_A3(sp)
>>> - REG_L a4, PT_A4(sp)
>>> - REG_L a5, PT_A5(sp)
>>> -
>>> - REG_L sp, PT_SP(sp)
>>> -
>>> - li a7, ASM_SBI_EXT_SSE
>>> - li a6, ASM_SBI_EXT_SSE_COMPLETE
>>> - ecall
>>> diff --git a/riscv/Makefile b/riscv/Makefile
>>> index 81b75ad52411..62a2efc18492 100644
>>> --- a/riscv/Makefile
>>> +++ b/riscv/Makefile
>>> @@ -41,7 +41,6 @@ cflatobjs += lib/riscv/sbi.o
>>> cflatobjs += lib/riscv/setjmp.o
>>> cflatobjs += lib/riscv/setup.o
>>> cflatobjs += lib/riscv/smp.o
>>> -cflatobjs += lib/riscv/sse-entry.o
>>> cflatobjs += lib/riscv/stack.o
>>> cflatobjs += lib/riscv/timer.o
>>> ifeq ($(ARCH),riscv32)
>>> diff --git a/riscv/sbi-asm.S b/riscv/sbi-asm.S
>>> index 923c2ceca5db..5c50606e9940 100644
>>> --- a/riscv/sbi-asm.S
>>> +++ b/riscv/sbi-asm.S
>>> @@ -6,6 +6,7 @@
>>> */
>>> #define __ASSEMBLY__
>>> #include <asm/asm.h>
>>> +#include <asm/asm-offsets.h>
>>> #include <asm/csr.h>
>>>
>>> #include "sbi-tests.h"
>>> @@ -58,8 +59,8 @@ sbi_hsm_check:
>>> 7: lb t0, 0(t1)
>>> pause
>>> beqz t0, 7b
>>> - li a7, 0x48534d /* SBI_EXT_HSM */
>>> - li a6, 1 /* SBI_EXT_HSM_HART_STOP */
>>> + li a7, ASM_SBI_EXT_HSM
>>> + li a6, ASM_SBI_EXT_HSM_HART_STOP
>>> ecall
>>> 8: pause
>>> j 8b
>>> @@ -129,3 +130,94 @@ sbi_susp_resume:
>>> call longjmp
>>> 6: pause /* unreachable */
>>> j 6b
>>> +
>>> +.global sse_entry
>>> +sse_entry:
>>> + /* Save stack temporarily */
>>> + REG_S sp, SBI_SSE_REG_TMP(a7)
>>> + /* Set entry stack */
>>> + REG_L sp, SBI_SSE_HANDLER_STACK(a7)
>>> +
>>> + addi sp, sp, -(PT_SIZE)
>>> + REG_S ra, PT_RA(sp)
>>> + REG_S s0, PT_S0(sp)
>>> + REG_S s1, PT_S1(sp)
>>> + REG_S s2, PT_S2(sp)
>>> + REG_S s3, PT_S3(sp)
>>> + REG_S s4, PT_S4(sp)
>>> + REG_S s5, PT_S5(sp)
>>> + REG_S s6, PT_S6(sp)
>>> + REG_S s7, PT_S7(sp)
>>> + REG_S s8, PT_S8(sp)
>>> + REG_S s9, PT_S9(sp)
>>> + REG_S s10, PT_S10(sp)
>>> + REG_S s11, PT_S11(sp)
>>> + REG_S tp, PT_TP(sp)
>>> + REG_S t0, PT_T0(sp)
>>> + REG_S t1, PT_T1(sp)
>>> + REG_S t2, PT_T2(sp)
>>> + REG_S t3, PT_T3(sp)
>>> + REG_S t4, PT_T4(sp)
>>> + REG_S t5, PT_T5(sp)
>>> + REG_S t6, PT_T6(sp)
>>> + REG_S gp, PT_GP(sp)
>>> + REG_S a0, PT_A0(sp)
>>> + REG_S a1, PT_A1(sp)
>>> + REG_S a2, PT_A2(sp)
>>> + REG_S a3, PT_A3(sp)
>>> + REG_S a4, PT_A4(sp)
>>> + REG_S a5, PT_A5(sp)
>>> + csrr a1, CSR_SEPC
>>> + REG_S a1, PT_EPC(sp)
>>> + csrr a2, CSR_SSTATUS
>>> + REG_S a2, PT_STATUS(sp)
>>> +
>>> + REG_L a0, SBI_SSE_REG_TMP(a7)
>>> + REG_S a0, PT_SP(sp)
>>> +
>>> + REG_L t0, SBI_SSE_HANDLER(a7)
>>> + REG_L a0, SBI_SSE_HANDLER_DATA(a7)
>>> + mv a1, sp
>>> + mv a2, a6
>>> + jalr t0
>>> +
>>> +
>>> + REG_L a1, PT_EPC(sp)
>>> + REG_L a2, PT_STATUS(sp)
>>> + csrw CSR_SEPC, a1
>>> + csrw CSR_SSTATUS, a2
>>> +
>>> + REG_L ra, PT_RA(sp)
>>> + REG_L s0, PT_S0(sp)
>>> + REG_L s1, PT_S1(sp)
>>> + REG_L s2, PT_S2(sp)
>>> + REG_L s3, PT_S3(sp)
>>> + REG_L s4, PT_S4(sp)
>>> + REG_L s5, PT_S5(sp)
>>> + REG_L s6, PT_S6(sp)
>>> + REG_L s7, PT_S7(sp)
>>> + REG_L s8, PT_S8(sp)
>>> + REG_L s9, PT_S9(sp)
>>> + REG_L s10, PT_S10(sp)
>>> + REG_L s11, PT_S11(sp)
>>> + REG_L tp, PT_TP(sp)
>>> + REG_L t0, PT_T0(sp)
>>> + REG_L t1, PT_T1(sp)
>>> + REG_L t2, PT_T2(sp)
>>> + REG_L t3, PT_T3(sp)
>>> + REG_L t4, PT_T4(sp)
>>> + REG_L t5, PT_T5(sp)
>>> + REG_L t6, PT_T6(sp)
>>> + REG_L gp, PT_GP(sp)
>>> + REG_L a0, PT_A0(sp)
>>> + REG_L a1, PT_A1(sp)
>>> + REG_L a2, PT_A2(sp)
>>> + REG_L a3, PT_A3(sp)
>>> + REG_L a4, PT_A4(sp)
>>> + REG_L a5, PT_A5(sp)
>>> +
>>> + REG_L sp, PT_SP(sp)
>>> +
>>> + li a7, ASM_SBI_EXT_SSE
>>> + li a6, ASM_SBI_EXT_SSE_COMPLETE
>>> + ecall
>>> diff --git a/riscv/sbi-sse.c b/riscv/sbi-sse.c
>>> index a230c600a5a2..85521546838c 100644
>>> --- a/riscv/sbi-sse.c
>>> +++ b/riscv/sbi-sse.c
>>> @@ -16,12 +16,12 @@
>>> #include <asm/processor.h>
>>> #include <asm/sbi.h>
>>> #include <asm/setup.h>
>>> -#include <asm/sse.h>
>>>
>>> #include "sbi-tests.h"
>>>
>>> #define SSE_STACK_SIZE PAGE_SIZE
>>>
>>> +void sse_entry(void);
>>> void check_sse(void);
>>>
>>> struct sse_event_info {
>>> diff --git a/riscv/sbi-tests.h b/riscv/sbi-tests.h
>>> index ce129968fe99..163751ba9ca6 100644
>>> --- a/riscv/sbi-tests.h
>>> +++ b/riscv/sbi-tests.h
>>> @@ -33,4 +33,25 @@
>>> #define SBI_SUSP_TEST_HARTID (1 << 2)
>>> #define SBI_SUSP_TEST_MASK 7
>>>
>>> +#define SBI_SSE_REG_TMP 0
>>> +#define SBI_SSE_HANDLER 8
>>> +#define SBI_SSE_HANDLER_DATA 16
>>> +#define SBI_SSE_HANDLER_STACK 24
>>> +
>>> +#ifndef __ASSEMBLY__
>>> +
>>> +typedef void (*sse_handler_fn)(void *data, struct pt_regs *regs, unsigned int hartid);
>>> +
>>> +struct sse_handler_arg {
>>> + unsigned long reg_tmp;
>>> + sse_handler_fn handler;
>>> + void *handler_data;
>>> + void *stack;
>>> +};
>>> +_Static_assert(offsetof(struct sse_handler_arg, reg_tmp) == SBI_SSE_REG_TMP);
>>> +_Static_assert(offsetof(struct sse_handler_arg, handler) == SBI_SSE_HANDLER);
>>> +_Static_assert(offsetof(struct sse_handler_arg, handler_data) == SBI_SSE_HANDLER_DATA);
>>> +_Static_assert(offsetof(struct sse_handler_arg, stack) == SBI_SSE_HANDLER_STACK);
>>> +
>>
>> I'm not a huge fan but in the end, the result is the same and it suits
>> you ;)
>
> Ideally we'd have asm-offsets for test code so we don't have to choose
> between hard coding offsets and putting code in the library that doesn't
> belong there. I'm OK with deferring that work, though, by choosing hard
> coded offsets which we can check at compile time.
yeah, I took a look a asm-offset generation but it seems pretty
hardcoded for a signle asm-offsets.c file yet. Probably require much
more work to have multiples files but i'll take a look. In the meantime,
it makes sense to move that in riscv/ as you say. That per test
asm-offsets can be added later.
>
>> Let's go for it, I'll integrate that in the series (minus the HSM
>> stuff).
>
> I wouldn't complain if the HSM defines got slipped in with a "while at it
> change the HSM defines to ones provided by asm-offsets" type of comment
> in the commit message, but I can also add a patch on top which does that
> change myself.
No worries then, I'll add that !
>
> Thanks,
> drew
More information about the kvm-riscv
mailing list