xref: /openbmc/qemu/include/hw/ppc/spapr_nested.h (revision bb23bccebc7f99aa200fa27ff5c2056627951ae4)
1 #ifndef HW_SPAPR_NESTED_H
2 #define HW_SPAPR_NESTED_H
3 
4 #include "target/ppc/cpu.h"
5 
6 typedef struct SpaprMachineStateNested {
7     uint64_t ptcr;
8     uint8_t api;
9 #define NESTED_API_KVM_HV  1
10 #define NESTED_API_PAPR    2
11     bool capabilities_set;
12     uint32_t pvr_base;
13     GHashTable *guests;
14 } SpaprMachineStateNested;
15 
16 typedef struct SpaprMachineStateNestedGuest {
17     uint32_t pvr_logical;
18     unsigned long nr_vcpus;
19     struct SpaprMachineStateNestedGuestVcpu *vcpus;
20 } SpaprMachineStateNestedGuest;
21 
22 /* Nested PAPR API related macros */
23 #define H_GUEST_CAPABILITIES_COPY_MEM 0x8000000000000000
24 #define H_GUEST_CAPABILITIES_P9_MODE  0x4000000000000000
25 #define H_GUEST_CAPABILITIES_P10_MODE 0x2000000000000000
26 #define H_GUEST_CAP_VALID_MASK        (H_GUEST_CAPABILITIES_P10_MODE | \
27                                        H_GUEST_CAPABILITIES_P9_MODE)
28 #define H_GUEST_CAP_COPY_MEM_BMAP     0
29 #define H_GUEST_CAP_P9_MODE_BMAP      1
30 #define H_GUEST_CAP_P10_MODE_BMAP     2
31 #define PAPR_NESTED_GUEST_MAX         4096
32 #define H_GUEST_DELETE_ALL_FLAG       0x8000000000000000ULL
33 #define PAPR_NESTED_GUEST_VCPU_MAX    2048
34 
35 /*
36  * Register state for entering a nested guest with H_ENTER_NESTED.
37  * New member must be added at the end.
38  */
39 struct kvmppc_hv_guest_state {
40     uint64_t version;      /* version of this structure layout, must be first */
41     uint32_t lpid;
42     uint32_t vcpu_token;
43     /* These registers are hypervisor privileged (at least for writing) */
44     uint64_t lpcr;
45     uint64_t pcr;
46     uint64_t amor;
47     uint64_t dpdes;
48     uint64_t hfscr;
49     int64_t tb_offset;
50     uint64_t dawr0;
51     uint64_t dawrx0;
52     uint64_t ciabr;
53     uint64_t hdec_expiry;
54     uint64_t purr;
55     uint64_t spurr;
56     uint64_t ic;
57     uint64_t vtb;
58     uint64_t hdar;
59     uint64_t hdsisr;
60     uint64_t heir;
61     uint64_t asdr;
62     /* These are OS privileged but need to be set late in guest entry */
63     uint64_t srr0;
64     uint64_t srr1;
65     uint64_t sprg[4];
66     uint64_t pidr;
67     uint64_t cfar;
68     uint64_t ppr;
69     /* Version 1 ends here */
70     uint64_t dawr1;
71     uint64_t dawrx1;
72     /* Version 2 ends here */
73 };
74 
75 /* Latest version of hv_guest_state structure */
76 #define HV_GUEST_STATE_VERSION  2
77 
78 /* Linux 64-bit powerpc pt_regs struct, used by nested HV */
79 struct kvmppc_pt_regs {
80     uint64_t gpr[32];
81     uint64_t nip;
82     uint64_t msr;
83     uint64_t orig_gpr3;    /* Used for restarting system calls */
84     uint64_t ctr;
85     uint64_t link;
86     uint64_t xer;
87     uint64_t ccr;
88     uint64_t softe;        /* Soft enabled/disabled */
89     uint64_t trap;         /* Reason for being here */
90     uint64_t dar;          /* Fault registers */
91     uint64_t dsisr;        /* on 4xx/Book-E used for ESR */
92     uint64_t result;       /* Result of a system call */
93 };
94 
95 /*
96  * nested_ppc_state is used to save the host CPU state before switching it to
97  * the guest CPU state, to be restored on H_ENTER_NESTED exit.
98  */
99 struct nested_ppc_state {
100     uint64_t gpr[32];
101     uint64_t lr;
102     uint64_t ctr;
103     uint64_t cfar;
104     uint64_t msr;
105     uint64_t nip;
106     uint32_t cr;
107 
108     uint64_t xer;
109 
110     uint64_t lpcr;
111     uint64_t lpidr;
112     uint64_t pidr;
113     uint64_t pcr;
114     uint64_t dpdes;
115     uint64_t hfscr;
116     uint64_t srr0;
117     uint64_t srr1;
118     uint64_t sprg0;
119     uint64_t sprg1;
120     uint64_t sprg2;
121     uint64_t sprg3;
122     uint64_t ppr;
123 
124     int64_t tb_offset;
125     /* Nested PAPR API */
126     uint64_t amor;
127     uint64_t dawr0;
128     uint64_t dawrx0;
129     uint64_t ciabr;
130     uint64_t purr;
131     uint64_t spurr;
132     uint64_t ic;
133     uint64_t vtb;
134     uint64_t hdar;
135     uint64_t hdsisr;
136     uint64_t heir;
137     uint64_t asdr;
138     uint64_t dawr1;
139     uint64_t dawrx1;
140     uint64_t dexcr;
141     uint64_t hdexcr;
142     uint64_t hashkeyr;
143     uint64_t hashpkeyr;
144     ppc_vsr_t vsr[64] QEMU_ALIGNED(16);
145     uint64_t ebbhr;
146     uint64_t tar;
147     uint64_t ebbrr;
148     uint64_t bescr;
149     uint64_t iamr;
150     uint64_t amr;
151     uint64_t uamor;
152     uint64_t dscr;
153     uint64_t fscr;
154     uint64_t pspb;
155     uint64_t ctrl;
156     uint64_t vrsave;
157     uint64_t dar;
158     uint64_t dsisr;
159     uint64_t pmc1;
160     uint64_t pmc2;
161     uint64_t pmc3;
162     uint64_t pmc4;
163     uint64_t pmc5;
164     uint64_t pmc6;
165     uint64_t mmcr0;
166     uint64_t mmcr1;
167     uint64_t mmcr2;
168     uint64_t mmcra;
169     uint64_t sdar;
170     uint64_t siar;
171     uint64_t sier;
172     uint32_t vscr;
173     uint64_t fpscr;
174 };
175 
176 typedef struct SpaprMachineStateNestedGuestVcpu {
177     bool enabled;
178     struct nested_ppc_state state;
179 } SpaprMachineStateNestedGuestVcpu;
180 
181 void spapr_exit_nested(PowerPCCPU *cpu, int excp);
182 typedef struct SpaprMachineState SpaprMachineState;
183 bool spapr_get_pate_nested_hv(SpaprMachineState *spapr, PowerPCCPU *cpu,
184                               target_ulong lpid, ppc_v3_pate_t *entry);
185 uint8_t spapr_nested_api(SpaprMachineState *spapr);
186 #endif /* HW_SPAPR_NESTED_H */
187