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