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 *vc[MAX_SUBCORES];
  85        /* Bits for changing lpcr on P9 */
  86        unsigned long   lpcr_req;
  87        unsigned long   lpidr_req;
  88        unsigned long   host_lpcr;
  89        u32             do_set;
  90        u32             do_restore;
  91        union {
  92                u32     allphases;
  93                u8      phase[4];
  94        } lpcr_sync;
  95};
  96
  97/*
  98 * This struct goes in the PACA on 64-bit processors.  It is used
  99 * to store host state that needs to be saved when we enter a guest
 100 * and restored when we exit, but isn't specific to any particular
 101 * guest or vcpu.  It also has some scratch fields used by the guest
 102 * exit code.
 103 */
 104struct kvmppc_host_state {
 105        ulong host_r1;
 106        ulong host_r2;
 107        ulong host_msr;
 108        ulong vmhandler;
 109        ulong scratch0;
 110        ulong scratch1;
 111        ulong scratch2;
 112        u8 in_guest;
 113        u8 restore_hid5;
 114        u8 napping;
 115
 116#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 117        u8 hwthread_req;
 118        u8 hwthread_state;
 119        u8 host_ipi;
 120        u8 ptid;                /* thread number within subcore when split */
 121        u8 tid;                 /* thread number within whole core */
 122        u8 fake_suspend;
 123        struct kvm_vcpu *kvm_vcpu;
 124        struct kvmppc_vcore *kvm_vcore;
 125        void __iomem *xics_phys;
 126        void __iomem *xive_tima_phys;
 127        void __iomem *xive_tima_virt;
 128        u32 saved_xirr;
 129        u64 dabr;
 130        u64 host_mmcr[7];       /* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER */
 131        u32 host_pmc[8];
 132        u64 host_purr;
 133        u64 host_spurr;
 134        u64 host_dscr;
 135        u64 dec_expires;
 136        struct kvm_split_mode *kvm_split_mode;
 137#endif
 138#ifdef CONFIG_PPC_BOOK3S_64
 139        u64 cfar;
 140        u64 ppr;
 141        u64 host_fscr;
 142#endif
 143};
 144
 145struct kvmppc_book3s_shadow_vcpu {
 146        bool in_use;
 147        ulong gpr[14];
 148        u32 cr;
 149        ulong xer;
 150        ulong ctr;
 151        ulong lr;
 152        ulong pc;
 153
 154        ulong shadow_srr1;
 155        ulong fault_dar;
 156        u32 fault_dsisr;
 157        u32 last_inst;
 158
 159#ifdef CONFIG_PPC_BOOK3S_32
 160        u32     sr[16];                 /* Guest SRs */
 161
 162        struct kvmppc_host_state hstate;
 163#endif
 164
 165#ifdef CONFIG_PPC_BOOK3S_64
 166        u8 slb_max;                     /* highest used guest slb entry */
 167        struct  {
 168                u64     esid;
 169                u64     vsid;
 170        } slb[64];                      /* guest SLB */
 171        u64 shadow_fscr;
 172#endif
 173};
 174
 175#endif /*__ASSEMBLY__ */
 176
 177/* Values for kvm_state */
 178#define KVM_HWTHREAD_IN_KERNEL  0
 179#define KVM_HWTHREAD_IN_IDLE    1
 180#define KVM_HWTHREAD_IN_KVM     2
 181
 182#endif /* __ASM_KVM_BOOK3S_ASM_H__ */
 183