]>
Commit | Line | Data |
---|---|---|
6b8a0537 NP |
1 | #ifndef HW_SPAPR_NESTED_H |
2 | #define HW_SPAPR_NESTED_H | |
3 | ||
6b8a0537 NP |
4 | #include "target/ppc/cpu.h" |
5 | ||
6 | /* | |
7 | * Register state for entering a nested guest with H_ENTER_NESTED. | |
8 | * New member must be added at the end. | |
9 | */ | |
10 | struct kvmppc_hv_guest_state { | |
11 | uint64_t version; /* version of this structure layout, must be first */ | |
12 | uint32_t lpid; | |
13 | uint32_t vcpu_token; | |
14 | /* These registers are hypervisor privileged (at least for writing) */ | |
15 | uint64_t lpcr; | |
16 | uint64_t pcr; | |
17 | uint64_t amor; | |
18 | uint64_t dpdes; | |
19 | uint64_t hfscr; | |
20 | int64_t tb_offset; | |
21 | uint64_t dawr0; | |
22 | uint64_t dawrx0; | |
23 | uint64_t ciabr; | |
24 | uint64_t hdec_expiry; | |
25 | uint64_t purr; | |
26 | uint64_t spurr; | |
27 | uint64_t ic; | |
28 | uint64_t vtb; | |
29 | uint64_t hdar; | |
30 | uint64_t hdsisr; | |
31 | uint64_t heir; | |
32 | uint64_t asdr; | |
33 | /* These are OS privileged but need to be set late in guest entry */ | |
34 | uint64_t srr0; | |
35 | uint64_t srr1; | |
36 | uint64_t sprg[4]; | |
37 | uint64_t pidr; | |
38 | uint64_t cfar; | |
39 | uint64_t ppr; | |
40 | /* Version 1 ends here */ | |
41 | uint64_t dawr1; | |
42 | uint64_t dawrx1; | |
43 | /* Version 2 ends here */ | |
44 | }; | |
45 | ||
46 | /* Latest version of hv_guest_state structure */ | |
47 | #define HV_GUEST_STATE_VERSION 2 | |
48 | ||
49 | /* Linux 64-bit powerpc pt_regs struct, used by nested HV */ | |
50 | struct kvmppc_pt_regs { | |
51 | uint64_t gpr[32]; | |
52 | uint64_t nip; | |
53 | uint64_t msr; | |
54 | uint64_t orig_gpr3; /* Used for restarting system calls */ | |
55 | uint64_t ctr; | |
56 | uint64_t link; | |
57 | uint64_t xer; | |
58 | uint64_t ccr; | |
59 | uint64_t softe; /* Soft enabled/disabled */ | |
60 | uint64_t trap; /* Reason for being here */ | |
61 | uint64_t dar; /* Fault registers */ | |
62 | uint64_t dsisr; /* on 4xx/Book-E used for ESR */ | |
63 | uint64_t result; /* Result of a system call */ | |
64 | }; | |
65 | ||
66 | /* | |
67 | * nested_ppc_state is used to save the host CPU state before switching it to | |
68 | * the guest CPU state, to be restored on H_ENTER_NESTED exit. | |
69 | */ | |
70 | struct nested_ppc_state { | |
71 | uint64_t gpr[32]; | |
72 | uint64_t lr; | |
73 | uint64_t ctr; | |
74 | uint64_t cfar; | |
75 | uint64_t msr; | |
76 | uint64_t nip; | |
77 | uint32_t cr; | |
78 | ||
79 | uint64_t xer; | |
80 | ||
81 | uint64_t lpcr; | |
82 | uint64_t lpidr; | |
83 | uint64_t pidr; | |
84 | uint64_t pcr; | |
85 | uint64_t dpdes; | |
86 | uint64_t hfscr; | |
87 | uint64_t srr0; | |
88 | uint64_t srr1; | |
89 | uint64_t sprg0; | |
90 | uint64_t sprg1; | |
91 | uint64_t sprg2; | |
92 | uint64_t sprg3; | |
93 | uint64_t ppr; | |
94 | ||
95 | int64_t tb_offset; | |
96 | }; | |
97 | ||
98 | void spapr_register_nested(void); | |
99 | void spapr_exit_nested(PowerPCCPU *cpu, int excp); | |
100 | ||
101 | #endif /* HW_SPAPR_NESTED_H */ |