Re: [kvm-unit-tests PATCH v2] arm64: Make vector_table and vector_stub weak symbols

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, May 23, 2023 at 02:53:25PM +0100, Nikos Nikoleris wrote:
> This changes allows a test to define and override the declared symbols,
> taking control of all or some execptions.
> 
> With the ability to override specific exception handlers, litmus7 [1] a
> tool used to generate c sources for a given memory model litmus test,
> can override the el1h_sync symbol to implement tests with explicit
> exception handlers. For example:
> 
> AArch64 LDRv0+I2V-dsb.ishst-once
> {
>   [PTE(x)]=(oa:PA(x),valid:0);
>   x=1;
> 
>   0:X1=x;
>   0:X3=PTE(x);
>   0:X2=(oa:PA(x),valid:1);
> }
>  P0          | P0.F           ;
> L0:          | ADD X8,X8,#1   ;
>  LDR W0,[X1] | STR X2,[X3]    ;
>              | DSB ISHST      ;
>              | ADR X9,L0      ;
>              | MSR ELR_EL1,X9 ;
>              | ERET           ;
> exists(0:X0=0 \/ 0:X8!=1)
> 
> In this test, a thread running in core P0 executes a load to a memory
> location x. The PTE of the virtual address x is initially invalid.  The
> execution of the load causes a synchronous EL1 exception which is
> handled by the code in P0.F. P0.F increments a counter which is
> maintained in X8, updates the PTE of x and makes it valid, executes a
> DSB ISHST and calls ERET which is expected to return and retry the
> execution of the load in P0:L0.
> 
> The postcondition checks if there is any execution where the load wasn't
> executed (X0 its destination register is not update), or that the P0.F
> handler was invoked more than once (the counter X8 is not 1).
> 
> For this tests, litmus7 needs to control the el1h_sync. Calling
> install_exception_handler() would be suboptimal because the
> vector_stub would wrap around the code of P0.F and perturb the test.
> 
> [1]: https://diy.inria.fr/doc/litmus.html
> 
> Signed-off-by: Nikos Nikoleris <nikos.nikoleris@xxxxxxx>
> ---
>  arm/cstart64.S | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/arm/cstart64.S b/arm/cstart64.S
> index e4ab7d06..eda0daa5 100644
> --- a/arm/cstart64.S
> +++ b/arm/cstart64.S
> @@ -275,8 +275,11 @@ exceptions_init:
>  /*
>   * Vector stubs
>   * Adapted from arch/arm64/kernel/entry.S
> + * Declare as weak to allow external tests to redefine and override a
> + * vector_stub.
>   */
>  .macro vector_stub, name, vec
> +.weak \name
>  \name:
>  	stp	 x0,  x1, [sp, #-S_FRAME_SIZE]!
>  	stp	 x2,  x3, [sp,  #16]
> @@ -369,7 +372,13 @@ vector_stub	el0_error_32, 15
>  	b	\label
>  .endm
>  
> +
> +/*
> + * Declare as weak to allow external tests to redefine and override the
> + * default vector table.
> + */
>  .align 11
> +.weak vector_table
>  vector_table:
>  	ventry	el1t_sync			// Synchronous EL1t
>  	ventry	el1t_irq			// IRQ EL1t
> -- 
> 2.25.1
>

Applied to arm/queue. Thanks!

https://gitlab.com/jones-drew/kvm-unit-tests/-/commits/arm/queue

drew



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux