1 #ifndef HW_SPAPR_NESTED_H
2 #define HW_SPAPR_NESTED_H
4 #include "target/ppc/cpu.h"
6 typedef struct SpaprMachineStateNested
{
9 #define NESTED_API_KVM_HV 1
10 bool capabilities_set
;
13 } SpaprMachineStateNested
;
15 typedef struct SpaprMachineStateNestedGuest
{
17 unsigned long nr_vcpus
;
18 struct SpaprMachineStateNestedGuestVcpu
*vcpus
;
19 } SpaprMachineStateNestedGuest
;
21 /* Nested PAPR API related macros */
22 #define H_GUEST_CAPABILITIES_COPY_MEM 0x8000000000000000
23 #define H_GUEST_CAPABILITIES_P9_MODE 0x4000000000000000
24 #define H_GUEST_CAPABILITIES_P10_MODE 0x2000000000000000
25 #define H_GUEST_CAP_VALID_MASK (H_GUEST_CAPABILITIES_P10_MODE | \
26 H_GUEST_CAPABILITIES_P9_MODE)
27 #define H_GUEST_CAP_COPY_MEM_BMAP 0
28 #define H_GUEST_CAP_P9_MODE_BMAP 1
29 #define H_GUEST_CAP_P10_MODE_BMAP 2
30 #define PAPR_NESTED_GUEST_MAX 4096
31 #define H_GUEST_DELETE_ALL_FLAG 0x8000000000000000ULL
32 #define PAPR_NESTED_GUEST_VCPU_MAX 2048
35 * Register state for entering a nested guest with H_ENTER_NESTED.
36 * New member must be added at the end.
38 struct kvmppc_hv_guest_state
{
39 uint64_t version
; /* version of this structure layout, must be first */
42 /* These registers are hypervisor privileged (at least for writing) */
61 /* These are OS privileged but need to be set late in guest entry */
68 /* Version 1 ends here */
71 /* Version 2 ends here */
74 /* Latest version of hv_guest_state structure */
75 #define HV_GUEST_STATE_VERSION 2
77 /* Linux 64-bit powerpc pt_regs struct, used by nested HV */
78 struct kvmppc_pt_regs
{
82 uint64_t orig_gpr3
; /* Used for restarting system calls */
87 uint64_t softe
; /* Soft enabled/disabled */
88 uint64_t trap
; /* Reason for being here */
89 uint64_t dar
; /* Fault registers */
90 uint64_t dsisr
; /* on 4xx/Book-E used for ESR */
91 uint64_t result
; /* Result of a system call */
95 * nested_ppc_state is used to save the host CPU state before switching it to
96 * the guest CPU state, to be restored on H_ENTER_NESTED exit.
98 struct nested_ppc_state
{
126 typedef struct SpaprMachineStateNestedGuestVcpu
{
128 struct nested_ppc_state state
;
129 } SpaprMachineStateNestedGuestVcpu
;
131 void spapr_exit_nested(PowerPCCPU
*cpu
, int excp
);
132 typedef struct SpaprMachineState SpaprMachineState
;
133 bool spapr_get_pate_nested_hv(SpaprMachineState
*spapr
, PowerPCCPU
*cpu
,
134 target_ulong lpid
, ppc_v3_pate_t
*entry
);
135 uint8_t spapr_nested_api(SpaprMachineState
*spapr
);
136 #endif /* HW_SPAPR_NESTED_H */