linux/arch/powerpc/include/asm/kvm_book3s_asm.h
<<
>>
Prefs
   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
  52kvmppc_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
  66struct kvmppc_vcore;
  67
  68/* Struct used for coordinating micro-threading (split-core) mode changes */
  69struct 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};
  78
  79/*
  80 * This struct goes in the PACA on 64-bit processors.  It is used
  81 * to store host state that needs to be saved when we enter a guest
  82 * and restored when we exit, but isn't specific to any particular
  83 * guest or vcpu.  It also has some scratch fields used by the guest
  84 * exit code.
  85 */
  86struct kvmppc_host_state {
  87        ulong host_r1;
  88        ulong host_r2;
  89        ulong host_msr;
  90        ulong vmhandler;
  91        ulong scratch0;
  92        ulong scratch1;
  93        ulong scratch2;
  94        u8 in_guest;
  95        u8 restore_hid5;
  96        u8 napping;
  97
  98#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
  99        u8 hwthread_req;
 100        u8 hwthread_state;
 101        u8 host_ipi;
 102        u8 ptid;                /* thread number within subcore when split */
 103        u8 fake_suspend;
 104        struct kvm_vcpu *kvm_vcpu;
 105        struct kvmppc_vcore *kvm_vcore;
 106        void __iomem *xics_phys;
 107        void __iomem *xive_tima_phys;
 108        void __iomem *xive_tima_virt;
 109        u32 saved_xirr;
 110        u64 dabr;
 111        u64 host_mmcr[10];      /* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER, MMCR3, SIER2/3 */
 112        u32 host_pmc[8];
 113        u64 host_purr;
 114        u64 host_spurr;
 115        u64 host_dscr;
 116        u64 dec_expires;
 117        struct kvm_split_mode *kvm_split_mode;
 118#endif
 119#ifdef CONFIG_PPC_BOOK3S_64
 120        u64 cfar;
 121        u64 ppr;
 122        u64 host_fscr;
 123#endif
 124};
 125
 126struct kvmppc_book3s_shadow_vcpu {
 127        bool in_use;
 128        ulong gpr[14];
 129        u32 cr;
 130        ulong xer;
 131        ulong ctr;
 132        ulong lr;
 133        ulong pc;
 134
 135        ulong shadow_srr1;
 136        ulong fault_dar;
 137        u32 fault_dsisr;
 138        u32 last_inst;
 139
 140#ifdef CONFIG_PPC_BOOK3S_32
 141        u32     sr[16];                 /* Guest SRs */
 142
 143        struct kvmppc_host_state hstate;
 144#endif
 145
 146#ifdef CONFIG_PPC_BOOK3S_64
 147        u8 slb_max;                     /* highest used guest slb entry */
 148        struct  {
 149                u64     esid;
 150                u64     vsid;
 151        } slb[64];                      /* guest SLB */
 152        u64 shadow_fscr;
 153#endif
 154};
 155
 156#endif /*__ASSEMBLY__ */
 157
 158/* Values for kvm_state */
 159#define KVM_HWTHREAD_IN_KERNEL  0
 160#define KVM_HWTHREAD_IN_IDLE    1
 161#define KVM_HWTHREAD_IN_KVM     2
 162
 163#endif /* __ASM_KVM_BOOK3S_ASM_H__ */
 164