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/* Maximum number of threads per physical core */
  29#define MAX_SMT_THREADS         8
  30
  31/* Maximum number of subcores per physical core */
  32#define MAX_SUBCORES            4
  33
  34#ifdef __ASSEMBLY__
  35
  36#ifdef CONFIG_KVM_BOOK3S_HANDLER
  37
  38#include <asm/kvm_asm.h>
  39
  40.macro DO_KVM intno
  41        .if (\intno == BOOK3S_INTERRUPT_SYSTEM_RESET) || \
  42            (\intno == BOOK3S_INTERRUPT_MACHINE_CHECK) || \
  43            (\intno == BOOK3S_INTERRUPT_DATA_STORAGE) || \
  44            (\intno == BOOK3S_INTERRUPT_INST_STORAGE) || \
  45            (\intno == BOOK3S_INTERRUPT_DATA_SEGMENT) || \
  46            (\intno == BOOK3S_INTERRUPT_INST_SEGMENT) || \
  47            (\intno == BOOK3S_INTERRUPT_EXTERNAL) || \
  48            (\intno == BOOK3S_INTERRUPT_EXTERNAL_HV) || \
  49            (\intno == BOOK3S_INTERRUPT_ALIGNMENT) || \
  50            (\intno == BOOK3S_INTERRUPT_PROGRAM) || \
  51            (\intno == BOOK3S_INTERRUPT_FP_UNAVAIL) || \
  52            (\intno == BOOK3S_INTERRUPT_DECREMENTER) || \
  53            (\intno == BOOK3S_INTERRUPT_SYSCALL) || \
  54            (\intno == BOOK3S_INTERRUPT_TRACE) || \
  55            (\intno == BOOK3S_INTERRUPT_PERFMON) || \
  56            (\intno == BOOK3S_INTERRUPT_ALTIVEC) || \
  57            (\intno == BOOK3S_INTERRUPT_VSX)
  58
  59        b       kvmppc_trampoline_\intno
  60kvmppc_resume_\intno:
  61
  62        .endif
  63.endm
  64
  65#else
  66
  67.macro DO_KVM intno
  68.endm
  69
  70#endif /* CONFIG_KVM_BOOK3S_HANDLER */
  71
  72#else  /*__ASSEMBLY__ */
  73
  74struct kvmppc_vcore;
  75
  76/* Struct used for coordinating micro-threading (split-core) mode changes */
  77struct kvm_split_mode {
  78        unsigned long   rpr;
  79        unsigned long   pmmar;
  80        unsigned long   ldbar;
  81        u8              subcore_size;
  82        u8              do_nap;
  83        u8              napped[MAX_SMT_THREADS];
  84        struct kvmppc_vcore *master_vcs[MAX_SUBCORES];
  85};
  86
  87/*
  88 * This struct goes in the PACA on 64-bit processors.  It is used
  89 * to store host state that needs to be saved when we enter a guest
  90 * and restored when we exit, but isn't specific to any particular
  91 * guest or vcpu.  It also has some scratch fields used by the guest
  92 * exit code.
  93 */
  94struct kvmppc_host_state {
  95        ulong host_r1;
  96        ulong host_r2;
  97        ulong host_msr;
  98        ulong vmhandler;
  99        ulong scratch0;
 100        ulong scratch1;
 101        ulong scratch2;
 102        u8 in_guest;
 103        u8 restore_hid5;
 104        u8 napping;
 105
 106#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 107        u8 hwthread_req;
 108        u8 hwthread_state;
 109        u8 host_ipi;
 110        u8 ptid;
 111        struct kvm_vcpu *kvm_vcpu;
 112        struct kvmppc_vcore *kvm_vcore;
 113        unsigned long xics_phys;
 114        u32 saved_xirr;
 115        u64 dabr;
 116        u64 host_mmcr[7];       /* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER */
 117        u32 host_pmc[8];
 118        u64 host_purr;
 119        u64 host_spurr;
 120        u64 host_dscr;
 121        u64 dec_expires;
 122        struct kvm_split_mode *kvm_split_mode;
 123#endif
 124#ifdef CONFIG_PPC_BOOK3S_64
 125        u64 cfar;
 126        u64 ppr;
 127        u64 host_fscr;
 128#endif
 129};
 130
 131struct kvmppc_book3s_shadow_vcpu {
 132        bool in_use;
 133        ulong gpr[14];
 134        u32 cr;
 135        ulong xer;
 136        ulong ctr;
 137        ulong lr;
 138        ulong pc;
 139
 140        ulong shadow_srr1;
 141        ulong fault_dar;
 142        u32 fault_dsisr;
 143        u32 last_inst;
 144
 145#ifdef CONFIG_PPC_BOOK3S_32
 146        u32     sr[16];                 /* Guest SRs */
 147
 148        struct kvmppc_host_state hstate;
 149#endif
 150
 151#ifdef CONFIG_PPC_BOOK3S_64
 152        u8 slb_max;                     /* highest used guest slb entry */
 153        struct  {
 154                u64     esid;
 155                u64     vsid;
 156        } slb[64];                      /* guest SLB */
 157        u64 shadow_fscr;
 158#endif
 159};
 160
 161#endif /*__ASSEMBLY__ */
 162
 163/* Values for kvm_state */
 164#define KVM_HWTHREAD_IN_KERNEL  0
 165#define KVM_HWTHREAD_IN_IDLE    1
 166#define KVM_HWTHREAD_IN_KVM     2
 167
 168#endif /* __ASM_KVM_BOOK3S_ASM_H__ */
 169