On 25.06.2012, at 14:26, Mihai Caraman wrote: > Add bookehv interrupt handling support for 64-bit hosts. Change common stack > layout to refer PPC_LR_STKOFF kernel constant. Dispatch the 64-bit execution > flow to the existing kvm_handler_common asm macro. Update input register > values documentation. > Only the bolted version of TLB miss exception handlers is supported now. > > Signed-off-by: Mihai Caraman <mihai.caraman@xxxxxxxxxxxxx> > --- > arch/powerpc/include/asm/kvm_booke_hv_asm.h | 12 +++- > arch/powerpc/kvm/bookehv_interrupts.S | 120 +++++++++++++++++++++++++-- > 2 files changed, 122 insertions(+), 10 deletions(-) > > diff --git a/arch/powerpc/include/asm/kvm_booke_hv_asm.h b/arch/powerpc/include/asm/kvm_booke_hv_asm.h > index 30a600f..8be6f87 100644 > --- a/arch/powerpc/include/asm/kvm_booke_hv_asm.h > +++ b/arch/powerpc/include/asm/kvm_booke_hv_asm.h > @@ -1,5 +1,5 @@ > /* > - * Copyright 2010-2011 Freescale Semiconductor, Inc. > + * Copyright 2010-2012 Freescale Semiconductor, Inc. > * > * This program is free software; you can redistribute it and/or modify > * it under the terms of the GNU General Public License, version 2, as > @@ -17,6 +17,7 @@ > * there are no exceptions for which we fall through directly to > * the normal host handler. > * > + * 32-bit host > * Expected inputs (normal exceptions): > * SCRATCH0 = saved r10 > * r10 = thread struct > @@ -33,6 +34,15 @@ > * *(r8 + GPR9) = saved r9 > * *(r8 + GPR10) = saved r10 (r10 not yet clobbered) > * *(r8 + GPR11) = saved r11 > + * > + * 64-bit host > + * Expected inputs (exception types GEN/DBG/CRIT/MC): > + * r13 = PACA_POINTER > + * r10 = saved CR > + * SPRN_SPRG_##type##_SCRATCH = saved r13 > + * *(r13 + PACA_EX##type + EX_R10) = saved r10 > + * *(r13 + PACA_EX##type + EX_R11) = saved r11 > + * Only the bolted version of TLB miss exception handlers is supported now. > */ > .macro DO_KVM intno srr1 > #ifdef CONFIG_KVM_BOOKE_HV > diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S > index dff8ed4..04097de 100644 > --- a/arch/powerpc/kvm/bookehv_interrupts.S > +++ b/arch/powerpc/kvm/bookehv_interrupts.S > @@ -12,10 +12,11 @@ > * along with this program; if not, write to the Free Software > * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > * > - * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. > + * Copyright (C) 2010-2012 Freescale Semiconductor, Inc. > * > * Author: Varun Sethi <varun.sethi@xxxxxxxxxxxxx> > * Author: Scott Wood <scotwood@xxxxxxxxxxxxx> > + * Author: Mihai Caraman <mihai.caraman@xxxxxxxxxxxxx> > * > * This file is derived from arch/powerpc/kvm/booke_interrupts.S > */ > @@ -30,7 +31,11 @@ > #include <asm/bitsperlong.h> > #include <asm/thread_info.h> > > +#ifdef CONFIG_64BIT > +#include <asm/exception-64e.h> > +#else > #include "../kernel/head_booke.h" /* for THREAD_NORMSAVE() */ > +#endif > > #define LONGBYTES (BITS_PER_LONG / 8) > > @@ -38,20 +43,21 @@ > #define VCPU_GUEST_SPRG(n) (VCPU_GUEST_SPRGS + (n * LONGBYTES)) > > /* The host stack layout: */ > -#define HOST_R1 (0 * LONGBYTES) /* Implied by stwu. */ > -#define HOST_CALLEE_LR (1 * LONGBYTES) > -#define HOST_RUN (2 * LONGBYTES) /* struct kvm_run */ > +#define HOST_R1 0 /* Implied by stwu. */ > +#define HOST_CALLEE_LR PPC_LR_STKOFF > +#define HOST_RUN (HOST_CALLEE_LR + LONGBYTES) > /* > * r2 is special: it holds 'current', and it made nonvolatile in the > * kernel with the -ffixed-r2 gcc option. > */ > -#define HOST_R2 (3 * LONGBYTES) > -#define HOST_CR (4 * LONGBYTES) > -#define HOST_NV_GPRS (5 * LONGBYTES) > +#define HOST_R2 (HOST_RUN + LONGBYTES) > +#define HOST_CR (HOST_R2 + LONGBYTES) > +#define HOST_NV_GPRS (HOST_CR + LONGBYTES) > #define HOST_NV_GPR(n) (HOST_NV_GPRS + ((n - 14) * LONGBYTES)) > #define HOST_MIN_STACK_SIZE (HOST_NV_GPR(31) + LONGBYTES) > #define HOST_STACK_SIZE ((HOST_MIN_STACK_SIZE + 15) & ~15) /* Align. */ > -#define HOST_STACK_LR (HOST_STACK_SIZE + LONGBYTES) /* In caller stack frame. */ > +/* LR in caller stack frame. */ > +#define HOST_STACK_LR (HOST_STACK_SIZE + PPC_LR_STKOFF) > > #define NEED_EMU 0x00000001 /* emulation -- save nv regs */ > #define NEED_DEAR 0x00000002 /* save faulting DEAR */ > @@ -202,6 +208,102 @@ > b kvmppc_resume_host > .endm > > +#ifdef CONFIG_64BIT > +/* > + * For input register values, see arch/powerpc/include/asm/kvm_booke_hv_asm.h > + */ > +.macro kvm_handler intno scratch, paca_ex, ex_r10, ex_r11, srr0, srr1, flags > + _GLOBAL(kvmppc_handler_\intno\()_\srr1) Is this code so vastly different from the 32bit variant that they can't be the same with a few simple ifdef's here and there? Alex -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html