We will have to fiddle with a bunch of assembly later on. In order to make this more readable, let's define some macros we can use then.
Signed-off-by: Alexander Graf <ag...@suse.de> --- arch/powerpc/include/asm/kvm_970_asm.h | 128 ++++++++++++++++++++++++++++++++ 1 files changed, 128 insertions(+), 0 deletions(-) create mode 100644 arch/powerpc/include/asm/kvm_970_asm.h diff --git a/arch/powerpc/include/asm/kvm_970_asm.h b/arch/powerpc/include/asm/kvm_970_asm.h new file mode 100644 index 0000000..9b715e2 --- /dev/null +++ b/arch/powerpc/include/asm/kvm_970_asm.h @@ -0,0 +1,128 @@ +/* + * 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 + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Copyright SUSE Linux Products GmbH 2009 + * + * Authors: Alexander Graf <ag...@suse.de> + */ + +#ifndef __ASM_KVM_970_ASM_H__ +#define __ASM_KVM_970_ASM_H__ + +#ifdef CONFIG_KVM_970_HANDLER + +#include <asm/ppc_asm.h> +#include <asm/kvm_asm.h> +#include <asm/reg.h> +#include <asm/page.h> +#include <asm/asm-offsets.h> +#include <asm/exception.h> + +#define ULONG_SIZE 8 +#define KVMPPC_HANDLE_EXIT .kvmppc_handle_exit + +.macro to_phys dest_reg, source_reg +#if PAGE_OFFSET == 0xc000000000000000 + clrldi \dest_reg, \source_reg, 2 +#else + #error Unknown PAGE_OFFSET +#endif +.endm + +.macro loadimm reg, imm + lis \reg, \...@highest + ori \reg, \reg, \...@higher + rldicr \reg, \reg, 32, 31 + oris \reg, \reg, \...@h + ori \reg, \reg, \...@l +.endm + +.macro DISABLE_INTERRUPTS + mfmsr r0 + rldicl r0,r0,48,1 + rotldi r0,r0,16 + mtmsrd r0,1 +.endm + +.macro setmagc reg + ori \reg, r13, 1 /* r3 = PACA | 1 */ + mtspr SPRN_SPRG3, \reg /* SPRG3 =PACA | 1 */ +.endm + +#define HOST_STACK_R1 (0 * ULONG_SIZE) +/* We need to keep some space here that the C function */ +/* we jump into later can clobber */ +#define HOST_STACK_LR (8 * ULONG_SIZE) +#define HOST_STACK_RUN (9 * ULONG_SIZE) +#define HOST_STACK_VCPU (10 * ULONG_SIZE) +#define HOST_STACK_R14 (14 * ULONG_SIZE) +#define HOST_STACK_R15 (15 * ULONG_SIZE) +#define HOST_STACK_R16 (16 * ULONG_SIZE) +#define HOST_STACK_R17 (17 * ULONG_SIZE) +#define HOST_STACK_R18 (18 * ULONG_SIZE) +#define HOST_STACK_R19 (19 * ULONG_SIZE) +#define HOST_STACK_R20 (20 * ULONG_SIZE) +#define HOST_STACK_R21 (21 * ULONG_SIZE) +#define HOST_STACK_R22 (22 * ULONG_SIZE) +#define HOST_STACK_R23 (23 * ULONG_SIZE) +#define HOST_STACK_R24 (24 * ULONG_SIZE) +#define HOST_STACK_R25 (25 * ULONG_SIZE) +#define HOST_STACK_R26 (26 * ULONG_SIZE) +#define HOST_STACK_R27 (27 * ULONG_SIZE) +#define HOST_STACK_R28 (28 * ULONG_SIZE) +#define HOST_STACK_R29 (29 * ULONG_SIZE) +#define HOST_STACK_R30 (30 * ULONG_SIZE) +#define HOST_STACK_R31 (31 * ULONG_SIZE) +#define HOST_STACK_MIN_SIZE (HOST_STACK_R31 + ULONG_SIZE) +#define HOST_STACK_SIZE (((HOST_STACK_MIN_SIZE + 15) / 16) * 16) /* Align. */ +#define VCPU_GPR(n) (VCPU_GPRS + (n * ULONG_SIZE)) + +.macro mfpaca tmp_reg, src_reg, offset, vcpu_reg + ld \tmp_reg, (PACA_EXMC+\offset)(r13) + std \tmp_reg, VCPU_GPR(\src_reg)(\vcpu_reg) +.endm + + +.macro DO_KVM intno + .if (\intno == PPC970_INTERRUPT_SYSTEM_RESET) || \ + (\intno == PPC970_INTERRUPT_MACHINE_CHECK) || \ + (\intno == PPC970_INTERRUPT_DATA_STORAGE) || \ + (\intno == PPC970_INTERRUPT_INST_STORAGE) || \ + (\intno == PPC970_INTERRUPT_DATA_SEGMENT) || \ + (\intno == PPC970_INTERRUPT_INST_SEGMENT) || \ + (\intno == PPC970_INTERRUPT_EXTERNAL) || \ + (\intno == PPC970_INTERRUPT_ALIGNMENT) || \ + (\intno == PPC970_INTERRUPT_PROGRAM) || \ + (\intno == PPC970_INTERRUPT_FP_UNAVAIL) || \ + (\intno == PPC970_INTERRUPT_DECREMENTER) || \ + (\intno == PPC970_INTERRUPT_SYSCALL) || \ + (\intno == PPC970_INTERRUPT_TRACE) || \ + (\intno == PPC970_INTERRUPT_PERFMON) || \ + (\intno == PPC970_INTERRUPT_ALTIVEC) || \ + (\intno == PPC970_INTERRUPT_VSX) + + b kvmppc_trampoline_\intno +kvmppc_resume_\intno: + + .endif +.endm + +#else + +.macro DO_KVM intno +.endm + +#endif /* CONFIG_KVM_970_HANDLER */ + +#endif /* __ASM_KVM_970_ASM_H__ */ -- 1.6.0.2 -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html