On Tue, Sep 09, 2014 at 11:49:04PM +0100, Geoff Levand wrote: > Add the new hcall HVC_CALL_FUNC that allows execution of a function at EL2. > During CPU reset the CPU must be brought to the exception level it had on > entry to the kernel. The HVC_CALL_FUNC hcall will provide the mechanism > needed for this exception level switch. > > Signed-off-by: Geoff Levand <geoff at infradead.org> > --- > arch/arm64/include/asm/virt.h | 11 +++++++++++ > arch/arm64/kernel/hyp-stub.S | 10 ++++++++++ > 2 files changed, 21 insertions(+) > > diff --git a/arch/arm64/include/asm/virt.h b/arch/arm64/include/asm/virt.h > index 894fe53..b217fbc 100644 > --- a/arch/arm64/include/asm/virt.h > +++ b/arch/arm64/include/asm/virt.h > @@ -41,6 +41,17 @@ > > #define HVC_KVM_CALL_HYP 3 > > +/* > + * HVC_CALL_FUNC - Execute a function at EL2. > + * > + * @x0: Physical address of the funtion to be executed. > + * @x1: Passed as the first argument to @fn. > + * @x2: Passed as the second argument to @fn. > + * @x3: Passed as the third argument to @fn. > + */ > + > +#define HVC_CALL_FUNC 4 > + Can't we use the HVC_KVM_CALL_HYP for this as well? I thought we already added the code to the stub to do that in the last patch. Is there a difference between the two that I'm missing? > #ifndef __ASSEMBLY__ > > /* > diff --git a/arch/arm64/kernel/hyp-stub.S b/arch/arm64/kernel/hyp-stub.S > index 9ab5f70..a21cf51 100644 > --- a/arch/arm64/kernel/hyp-stub.S > +++ b/arch/arm64/kernel/hyp-stub.S > @@ -75,7 +75,17 @@ el1_sync: > 1: cmp x10, #HVC_SET_VECTORS > b.ne 1f > msr vbar_el2, x0 > + b 2f > > +1: cmp x10, #HVC_CALL_FUNC > + b.ne 1f > + mov x29, lr What's the contract for functions we call through the stub? If they can use all the caller-saved registers, then we need to stach the original LR before issuing the HVC. Otherwise we can stash it in x18 at EL2. Thanks, Mark.