linux/arch/powerpc/include/asm/kvm_book3s_asm.h
<<
>>
Prefs
   1/*
   2 * This program is free software; you can redistribute it and/or modify
   3 * it under the terms of the GNU General Public License, version 2, as
   4 * published by the Free Software Foundation.
   5 *
   6 * This program is distributed in the hope that it will be useful,
   7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
   8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   9 * GNU General Public License for more details.
  10 *
  11 * You should have received a copy of the GNU General Public License
  12 * along with this program; if not, write to the Free Software
  13 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  14 *
  15 * Copyright SUSE Linux Products GmbH 2009
  16 *
  17 * Authors: Alexander Graf <agraf@suse.de>
  18 */
  19
  20#ifndef __ASM_KVM_BOOK3S_ASM_H__
  21#define __ASM_KVM_BOOK3S_ASM_H__
  22
  23/* XICS ICP register offsets */
  24#define XICS_XIRR               4
  25#define XICS_MFRR               0xc
  26#define XICS_IPI                2       /* interrupt source # for IPIs */
  27
  28#ifdef __ASSEMBLY__
  29
  30#ifdef CONFIG_KVM_BOOK3S_HANDLER
  31
  32#include <asm/kvm_asm.h>
  33
  34.macro DO_KVM intno
  35        .if (\intno == BOOK3S_INTERRUPT_SYSTEM_RESET) || \
  36            (\intno == BOOK3S_INTERRUPT_MACHINE_CHECK) || \
  37            (\intno == BOOK3S_INTERRUPT_DATA_STORAGE) || \
  38            (\intno == BOOK3S_INTERRUPT_INST_STORAGE) || \
  39            (\intno == BOOK3S_INTERRUPT_DATA_SEGMENT) || \
  40            (\intno == BOOK3S_INTERRUPT_INST_SEGMENT) || \
  41            (\intno == BOOK3S_INTERRUPT_EXTERNAL) || \
  42            (\intno == BOOK3S_INTERRUPT_EXTERNAL_HV) || \
  43            (\intno == BOOK3S_INTERRUPT_ALIGNMENT) || \
  44            (\intno == BOOK3S_INTERRUPT_PROGRAM) || \
  45            (\intno == BOOK3S_INTERRUPT_FP_UNAVAIL) || \
  46            (\intno == BOOK3S_INTERRUPT_DECREMENTER) || \
  47            (\intno == BOOK3S_INTERRUPT_SYSCALL) || \
  48            (\intno == BOOK3S_INTERRUPT_TRACE) || \
  49            (\intno == BOOK3S_INTERRUPT_PERFMON) || \
  50            (\intno == BOOK3S_INTERRUPT_ALTIVEC) || \
  51            (\intno == BOOK3S_INTERRUPT_VSX)
  52
  53        b       kvmppc_trampoline_\intno
  54kvmppc_resume_\intno:
  55
  56        .endif
  57.endm
  58
  59#else
  60
  61.macro DO_KVM intno
  62.endm
  63
  64#endif /* CONFIG_KVM_BOOK3S_HANDLER */
  65
  66#else  /*__ASSEMBLY__ */
  67
  68/*
  69 * This struct goes in the PACA on 64-bit processors.  It is used
  70 * to store host state that needs to be saved when we enter a guest
  71 * and restored when we exit, but isn't specific to any particular
  72 * guest or vcpu.  It also has some scratch fields used by the guest
  73 * exit code.
  74 */
  75struct kvmppc_host_state {
  76        ulong host_r1;
  77        ulong host_r2;
  78        ulong host_msr;
  79        ulong vmhandler;
  80        ulong scratch0;
  81        ulong scratch1;
  82        ulong scratch2;
  83        u8 in_guest;
  84        u8 restore_hid5;
  85        u8 napping;
  86
  87#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
  88        u8 hwthread_req;
  89        u8 hwthread_state;
  90        u8 host_ipi;
  91        u8 ptid;
  92        struct kvm_vcpu *kvm_vcpu;
  93        struct kvmppc_vcore *kvm_vcore;
  94        unsigned long xics_phys;
  95        u32 saved_xirr;
  96        u64 dabr;
  97        u64 host_mmcr[7];       /* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER */
  98        u32 host_pmc[8];
  99        u64 host_purr;
 100        u64 host_spurr;
 101        u64 host_dscr;
 102        u64 dec_expires;
 103#endif
 104#ifdef CONFIG_PPC_BOOK3S_64
 105        u64 cfar;
 106        u64 ppr;
 107        u64 host_fscr;
 108#endif
 109};
 110
 111struct kvmppc_book3s_shadow_vcpu {
 112        bool in_use;
 113        ulong gpr[14];
 114        u32 cr;
 115        u32 xer;
 116        ulong ctr;
 117        ulong lr;
 118        ulong pc;
 119
 120        ulong shadow_srr1;
 121        ulong fault_dar;
 122        u32 fault_dsisr;
 123        u32 last_inst;
 124
 125#ifdef CONFIG_PPC_BOOK3S_32
 126        u32     sr[16];                 /* Guest SRs */
 127
 128        struct kvmppc_host_state hstate;
 129#endif
 130
 131#ifdef CONFIG_PPC_BOOK3S_64
 132        u8 slb_max;                     /* highest used guest slb entry */
 133        struct  {
 134                u64     esid;
 135                u64     vsid;
 136        } slb[64];                      /* guest SLB */
 137        u64 shadow_fscr;
 138#endif
 139};
 140
 141#endif /*__ASSEMBLY__ */
 142
 143/* Values for kvm_state */
 144#define KVM_HWTHREAD_IN_KERNEL  0
 145#define KVM_HWTHREAD_IN_NAP     1
 146#define KVM_HWTHREAD_IN_KVM     2
 147
 148#endif /* __ASM_KVM_BOOK3S_ASM_H__ */
 149