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