root/arch/powerpc/include/asm/kvm_book3s_asm.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  *
   4  * Copyright SUSE Linux Products GmbH 2009
   5  *
   6  * Authors: Alexander Graf <agraf@suse.de>
   7  */
   8 
   9 #ifndef __ASM_KVM_BOOK3S_ASM_H__
  10 #define __ASM_KVM_BOOK3S_ASM_H__
  11 
  12 /* XICS ICP register offsets */
  13 #define XICS_XIRR               4
  14 #define XICS_MFRR               0xc
  15 #define XICS_IPI                2       /* interrupt source # for IPIs */
  16 
  17 /* LPIDs we support with this build -- runtime limit may be lower */
  18 #define KVMPPC_NR_LPIDS                 (LPID_RSVD + 1)
  19 
  20 /* Maximum number of threads per physical core */
  21 #define MAX_SMT_THREADS         8
  22 
  23 /* Maximum number of subcores per physical core */
  24 #define MAX_SUBCORES            4
  25 
  26 #ifdef __ASSEMBLY__
  27 
  28 #ifdef CONFIG_KVM_BOOK3S_HANDLER
  29 
  30 #include <asm/kvm_asm.h>
  31 
  32 .macro DO_KVM intno
  33         .if (\intno == BOOK3S_INTERRUPT_SYSTEM_RESET) || \
  34             (\intno == BOOK3S_INTERRUPT_MACHINE_CHECK) || \
  35             (\intno == BOOK3S_INTERRUPT_DATA_STORAGE) || \
  36             (\intno == BOOK3S_INTERRUPT_INST_STORAGE) || \
  37             (\intno == BOOK3S_INTERRUPT_DATA_SEGMENT) || \
  38             (\intno == BOOK3S_INTERRUPT_INST_SEGMENT) || \
  39             (\intno == BOOK3S_INTERRUPT_EXTERNAL) || \
  40             (\intno == BOOK3S_INTERRUPT_EXTERNAL_HV) || \
  41             (\intno == BOOK3S_INTERRUPT_ALIGNMENT) || \
  42             (\intno == BOOK3S_INTERRUPT_PROGRAM) || \
  43             (\intno == BOOK3S_INTERRUPT_FP_UNAVAIL) || \
  44             (\intno == BOOK3S_INTERRUPT_DECREMENTER) || \
  45             (\intno == BOOK3S_INTERRUPT_SYSCALL) || \
  46             (\intno == BOOK3S_INTERRUPT_TRACE) || \
  47             (\intno == BOOK3S_INTERRUPT_PERFMON) || \
  48             (\intno == BOOK3S_INTERRUPT_ALTIVEC) || \
  49             (\intno == BOOK3S_INTERRUPT_VSX)
  50 
  51         b       kvmppc_trampoline_\intno
  52 kvmppc_resume_\intno:
  53 
  54         .endif
  55 .endm
  56 
  57 #else
  58 
  59 .macro DO_KVM intno
  60 .endm
  61 
  62 #endif /* CONFIG_KVM_BOOK3S_HANDLER */
  63 
  64 #else  /*__ASSEMBLY__ */
  65 
  66 struct kvmppc_vcore;
  67 
  68 /* Struct used for coordinating micro-threading (split-core) mode changes */
  69 struct kvm_split_mode {
  70         unsigned long   rpr;
  71         unsigned long   pmmar;
  72         unsigned long   ldbar;
  73         u8              subcore_size;
  74         u8              do_nap;
  75         u8              napped[MAX_SMT_THREADS];
  76         struct kvmppc_vcore *vc[MAX_SUBCORES];
  77         /* Bits for changing lpcr on P9 */
  78         unsigned long   lpcr_req;
  79         unsigned long   lpidr_req;
  80         unsigned long   host_lpcr;
  81         u32             do_set;
  82         u32             do_restore;
  83         union {
  84                 u32     allphases;
  85                 u8      phase[4];
  86         } lpcr_sync;
  87 };
  88 
  89 /*
  90  * This struct goes in the PACA on 64-bit processors.  It is used
  91  * to store host state that needs to be saved when we enter a guest
  92  * and restored when we exit, but isn't specific to any particular
  93  * guest or vcpu.  It also has some scratch fields used by the guest
  94  * exit code.
  95  */
  96 struct kvmppc_host_state {
  97         ulong host_r1;
  98         ulong host_r2;
  99         ulong host_msr;
 100         ulong vmhandler;
 101         ulong scratch0;
 102         ulong scratch1;
 103         ulong scratch2;
 104         u8 in_guest;
 105         u8 restore_hid5;
 106         u8 napping;
 107 
 108 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 109         u8 hwthread_req;
 110         u8 hwthread_state;
 111         u8 host_ipi;
 112         u8 ptid;                /* thread number within subcore when split */
 113         u8 tid;                 /* thread number within whole core */
 114         u8 fake_suspend;
 115         struct kvm_vcpu *kvm_vcpu;
 116         struct kvmppc_vcore *kvm_vcore;
 117         void __iomem *xics_phys;
 118         void __iomem *xive_tima_phys;
 119         void __iomem *xive_tima_virt;
 120         u32 saved_xirr;
 121         u64 dabr;
 122         u64 host_mmcr[7];       /* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER */
 123         u32 host_pmc[8];
 124         u64 host_purr;
 125         u64 host_spurr;
 126         u64 host_dscr;
 127         u64 dec_expires;
 128         struct kvm_split_mode *kvm_split_mode;
 129 #endif
 130 #ifdef CONFIG_PPC_BOOK3S_64
 131         u64 cfar;
 132         u64 ppr;
 133         u64 host_fscr;
 134 #endif
 135 };
 136 
 137 struct kvmppc_book3s_shadow_vcpu {
 138         bool in_use;
 139         ulong gpr[14];
 140         u32 cr;
 141         ulong xer;
 142         ulong ctr;
 143         ulong lr;
 144         ulong pc;
 145 
 146         ulong shadow_srr1;
 147         ulong fault_dar;
 148         u32 fault_dsisr;
 149         u32 last_inst;
 150 
 151 #ifdef CONFIG_PPC_BOOK3S_32
 152         u32     sr[16];                 /* Guest SRs */
 153 
 154         struct kvmppc_host_state hstate;
 155 #endif
 156 
 157 #ifdef CONFIG_PPC_BOOK3S_64
 158         u8 slb_max;                     /* highest used guest slb entry */
 159         struct  {
 160                 u64     esid;
 161                 u64     vsid;
 162         } slb[64];                      /* guest SLB */
 163         u64 shadow_fscr;
 164 #endif
 165 };
 166 
 167 #endif /*__ASSEMBLY__ */
 168 
 169 /* Values for kvm_state */
 170 #define KVM_HWTHREAD_IN_KERNEL  0
 171 #define KVM_HWTHREAD_IN_IDLE    1
 172 #define KVM_HWTHREAD_IN_KVM     2
 173 
 174 #endif /* __ASM_KVM_BOOK3S_ASM_H__ */

/* [<][>][^][v][top][bottom][index][help] */