Message ID | 1370451727-26826-5-git-send-email-stefano.stabellini@eu.citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, 2013-06-05 at 18:02 +0100, Stefano Stabellini wrote: > Changes in v4: > - build the entire arch/arm/xen directory under arch/arm64, ifdef > hypercall.S appropriately. This is probably the best (or equal first) of a bunch of bad options :-/ > + * The Xen hypercall calling convention is very similar to the ARM/ARM64 > + * procedure calling convention: the first paramter is passed in r0/x0, "parameter" > + * the second in r1/x1, the third in r2/x2 and the fourth in r3/x3. > + * Considering that Xen hypercalls have 5 arguments at most, the fifth > + * paramter is always passed in r4/x4, differently from the ARM > + * procedure calling convention of using the stack for that case. and "parameter" again. Strictly speaking the fifth argument handling only differs from the 32-bit PCS, not the 64-bit one. Splitting hairs a bit there. If you fix the typo and clarify the fifth argument or not as you wish: Acked-by: Ian Campbell <ian.campbell@citrix.com> Ian.
On Thu, Jun 06, 2013 at 10:03:39AM +0100, Ian Campbell wrote: > On Wed, 2013-06-05 at 18:02 +0100, Stefano Stabellini wrote: > > + * the second in r1/x1, the third in r2/x2 and the fourth in r3/x3. > > + * Considering that Xen hypercalls have 5 arguments at most, the fifth > > + * paramter is always passed in r4/x4, differently from the ARM > > + * procedure calling convention of using the stack for that case. > > and "parameter" again. > > Strictly speaking the fifth argument handling only differs from the > 32-bit PCS, not the 64-bit one. Splitting hairs a bit there. I agree, just add "the fifth in x4" without "differently from ...", it's not relevant. You can also remove references to r? registers, they are only called x?.
On Thu, 2013-06-06 at 10:27 +0100, Catalin Marinas wrote: > On Thu, Jun 06, 2013 at 10:03:39AM +0100, Ian Campbell wrote: > > On Wed, 2013-06-05 at 18:02 +0100, Stefano Stabellini wrote: > > > + * the second in r1/x1, the third in r2/x2 and the fourth in r3/x3. > > > + * Considering that Xen hypercalls have 5 arguments at most, the fifth > > > + * paramter is always passed in r4/x4, differently from the ARM > > > + * procedure calling convention of using the stack for that case. > > > > and "parameter" again. > > > > Strictly speaking the fifth argument handling only differs from the > > 32-bit PCS, not the 64-bit one. Splitting hairs a bit there. > > I agree, just add "the fifth in x4" without "differently from ...", it's > not relevant. Works for me. > You can also remove references to r? registers, they are only called x?. This is documenting both the Aarch32 and AArch64 conventions. Ian.
On Wed, Jun 05, 2013 at 06:02:06PM +0100, Stefano Stabellini wrote: > diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S > index 199cb2d..114b356 100644 > --- a/arch/arm/xen/hypercall.S > +++ b/arch/arm/xen/hypercall.S > @@ -31,51 +31,93 @@ > */ > > /* > - * The Xen hypercall calling convention is very similar to the ARM > - * procedure calling convention: the first paramter is passed in r0, the > - * second in r1, the third in r2 and the fourth in r3. Considering that > - * Xen hypercalls have 5 arguments at most, the fifth paramter is passed > - * in r4, differently from the procedure calling convention of using the > - * stack for that case. > + * The Xen hypercall calling convention is very similar to the ARM/ARM64 > + * procedure calling convention: the first paramter is passed in r0/x0, > + * the second in r1/x1, the third in r2/x2 and the fourth in r3/x3. > + * Considering that Xen hypercalls have 5 arguments at most, the fifth > + * paramter is always passed in r4/x4, differently from the ARM > + * procedure calling convention of using the stack for that case. > * > - * The hypercall number is passed in r12. > + * The hypercall number is passed in r12/x16. > * > - * The return value is in r0. > + * The return value is in r0/x0. > * > - * The hvc ISS is required to be 0xEA1, that is the Xen specific ARM > - * hypercall tag. > + * The hvc ISS is required to be 0xEA1, that is the Xen specific > + * ARM/ARM64 hypercall tag. > */ > > #include <linux/linkage.h> > #include <asm/assembler.h> > -#include <asm/opcodes-virt.h> > #include <xen/interface/xen.h> > > > #define XEN_IMM 0xEA1 > > + > +#ifdef CONFIG_ARM > + > +#include <asm/opcodes-virt.h> > + > +ENTRY(privcmd_call) > + stmdb sp!, {r4} > + mov r12, r0 > + mov r0, r1 > + mov r1, r2 > + mov r2, r3 > + ldr r3, [sp, #8] > + ldr r4, [sp, #4] > + __HVC(XEN_IMM) > + ldm sp!, {r4} > + mov pc, lr > +ENDPROC(privcmd_call); > + > #define HYPERCALL_SIMPLE(hypercall) \ > ENTRY(HYPERVISOR_##hypercall) \ > mov r12, #__HYPERVISOR_##hypercall; \ > - __HVC(XEN_IMM); \ > - mov pc, lr; \ > + __HVC(XEN_IMM); \ > + mov pc, lr; \ > +ENDPROC(HYPERVISOR_##hypercall) > + > +#define HYPERCALL5(hypercall) \ > +ENTRY(HYPERVISOR_##hypercall) \ > + stmdb sp!, {r4} \ > + ldr r4, [sp, #4] \ > + mov r12, #__HYPERVISOR_##hypercall; \ > + __HVC(XEN_IMM); \ > + ldm sp!, {r4} \ > + mov pc, lr \ > ENDPROC(HYPERVISOR_##hypercall) > > +#else /* ARM64 specific code below */ > + > +ENTRY(privcmd_call) > + mov x16, x0 > + mov x0, x1 > + mov x1, x2 > + mov x2, x3 > + mov x3, x4 > + mov x4, x5 > + hvc XEN_IMM > + ret > +ENDPROC(privcmd_call); Ah, thanks to Ian for pointing out, I missed the fact that you merged the hypercall.S files. Please don't. It's a different assembly syntax.
diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S index 199cb2d..114b356 100644 --- a/arch/arm/xen/hypercall.S +++ b/arch/arm/xen/hypercall.S @@ -31,51 +31,93 @@ */ /* - * The Xen hypercall calling convention is very similar to the ARM - * procedure calling convention: the first paramter is passed in r0, the - * second in r1, the third in r2 and the fourth in r3. Considering that - * Xen hypercalls have 5 arguments at most, the fifth paramter is passed - * in r4, differently from the procedure calling convention of using the - * stack for that case. + * The Xen hypercall calling convention is very similar to the ARM/ARM64 + * procedure calling convention: the first paramter is passed in r0/x0, + * the second in r1/x1, the third in r2/x2 and the fourth in r3/x3. + * Considering that Xen hypercalls have 5 arguments at most, the fifth + * paramter is always passed in r4/x4, differently from the ARM + * procedure calling convention of using the stack for that case. * - * The hypercall number is passed in r12. + * The hypercall number is passed in r12/x16. * - * The return value is in r0. + * The return value is in r0/x0. * - * The hvc ISS is required to be 0xEA1, that is the Xen specific ARM - * hypercall tag. + * The hvc ISS is required to be 0xEA1, that is the Xen specific + * ARM/ARM64 hypercall tag. */ #include <linux/linkage.h> #include <asm/assembler.h> -#include <asm/opcodes-virt.h> #include <xen/interface/xen.h> #define XEN_IMM 0xEA1 + +#ifdef CONFIG_ARM + +#include <asm/opcodes-virt.h> + +ENTRY(privcmd_call) + stmdb sp!, {r4} + mov r12, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + ldr r3, [sp, #8] + ldr r4, [sp, #4] + __HVC(XEN_IMM) + ldm sp!, {r4} + mov pc, lr +ENDPROC(privcmd_call); + #define HYPERCALL_SIMPLE(hypercall) \ ENTRY(HYPERVISOR_##hypercall) \ mov r12, #__HYPERVISOR_##hypercall; \ - __HVC(XEN_IMM); \ - mov pc, lr; \ + __HVC(XEN_IMM); \ + mov pc, lr; \ +ENDPROC(HYPERVISOR_##hypercall) + +#define HYPERCALL5(hypercall) \ +ENTRY(HYPERVISOR_##hypercall) \ + stmdb sp!, {r4} \ + ldr r4, [sp, #4] \ + mov r12, #__HYPERVISOR_##hypercall; \ + __HVC(XEN_IMM); \ + ldm sp!, {r4} \ + mov pc, lr \ ENDPROC(HYPERVISOR_##hypercall) +#else /* ARM64 specific code below */ + +ENTRY(privcmd_call) + mov x16, x0 + mov x0, x1 + mov x1, x2 + mov x2, x3 + mov x3, x4 + mov x4, x5 + hvc XEN_IMM + ret +ENDPROC(privcmd_call); + +#define HYPERCALL_SIMPLE(hypercall) \ +ENTRY(HYPERVISOR_##hypercall) \ + mov x16, #__HYPERVISOR_##hypercall; \ + hvc XEN_IMM; \ + ret; \ +ENDPROC(HYPERVISOR_##hypercall) + +#define HYPERCALL5 HYPERCALL_SIMPLE +#endif + + #define HYPERCALL0 HYPERCALL_SIMPLE #define HYPERCALL1 HYPERCALL_SIMPLE #define HYPERCALL2 HYPERCALL_SIMPLE #define HYPERCALL3 HYPERCALL_SIMPLE #define HYPERCALL4 HYPERCALL_SIMPLE -#define HYPERCALL5(hypercall) \ -ENTRY(HYPERVISOR_##hypercall) \ - stmdb sp!, {r4} \ - ldr r4, [sp, #4] \ - mov r12, #__HYPERVISOR_##hypercall; \ - __HVC(XEN_IMM); \ - ldm sp!, {r4} \ - mov pc, lr \ -ENDPROC(HYPERVISOR_##hypercall) .text @@ -89,15 +131,3 @@ HYPERCALL2(memory_op); HYPERCALL2(physdev_op); HYPERCALL3(vcpu_op); -ENTRY(privcmd_call) - stmdb sp!, {r4} - mov r12, r0 - mov r0, r1 - mov r1, r2 - mov r2, r3 - ldr r3, [sp, #8] - ldr r4, [sp, #4] - __HVC(XEN_IMM) - ldm sp!, {r4} - mov pc, lr -ENDPROC(privcmd_call); diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 56b3f6d..b5d6ada 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -182,6 +182,16 @@ config HW_PERF_EVENTS source "mm/Kconfig" +config XEN_DOM0 + def_bool y + depends on XEN + +config XEN + bool "Xen guest support on ARM64 (EXPERIMENTAL)" + depends on ARM64 && OF + help + Say Y if you want to run Linux in a Virtual Machine on Xen on ARM64. + endmenu menu "Boot options" diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index c95c5cb..4b298aa 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -37,6 +37,7 @@ TEXT_OFFSET := 0x00080000 export TEXT_OFFSET GZFLAGS core-y += arch/arm64/kernel/ arch/arm64/mm/ +core-$(CONFIG_XEN) += arch/arm/xen/ libs-y := arch/arm64/lib/ $(libs-y) libs-y += $(LIBGCC)