xref: /qemu/include/hw/ppc/spapr_nested.h (revision 6b8a0537)
16b8a0537SNicholas Piggin #ifndef HW_SPAPR_NESTED_H
26b8a0537SNicholas Piggin #define HW_SPAPR_NESTED_H
36b8a0537SNicholas Piggin 
46b8a0537SNicholas Piggin #include "qemu/osdep.h"
56b8a0537SNicholas Piggin #include "target/ppc/cpu.h"
66b8a0537SNicholas Piggin 
76b8a0537SNicholas Piggin /*
86b8a0537SNicholas Piggin  * Register state for entering a nested guest with H_ENTER_NESTED.
96b8a0537SNicholas Piggin  * New member must be added at the end.
106b8a0537SNicholas Piggin  */
116b8a0537SNicholas Piggin struct kvmppc_hv_guest_state {
126b8a0537SNicholas Piggin     uint64_t version;      /* version of this structure layout, must be first */
136b8a0537SNicholas Piggin     uint32_t lpid;
146b8a0537SNicholas Piggin     uint32_t vcpu_token;
156b8a0537SNicholas Piggin     /* These registers are hypervisor privileged (at least for writing) */
166b8a0537SNicholas Piggin     uint64_t lpcr;
176b8a0537SNicholas Piggin     uint64_t pcr;
186b8a0537SNicholas Piggin     uint64_t amor;
196b8a0537SNicholas Piggin     uint64_t dpdes;
206b8a0537SNicholas Piggin     uint64_t hfscr;
216b8a0537SNicholas Piggin     int64_t tb_offset;
226b8a0537SNicholas Piggin     uint64_t dawr0;
236b8a0537SNicholas Piggin     uint64_t dawrx0;
246b8a0537SNicholas Piggin     uint64_t ciabr;
256b8a0537SNicholas Piggin     uint64_t hdec_expiry;
266b8a0537SNicholas Piggin     uint64_t purr;
276b8a0537SNicholas Piggin     uint64_t spurr;
286b8a0537SNicholas Piggin     uint64_t ic;
296b8a0537SNicholas Piggin     uint64_t vtb;
306b8a0537SNicholas Piggin     uint64_t hdar;
316b8a0537SNicholas Piggin     uint64_t hdsisr;
326b8a0537SNicholas Piggin     uint64_t heir;
336b8a0537SNicholas Piggin     uint64_t asdr;
346b8a0537SNicholas Piggin     /* These are OS privileged but need to be set late in guest entry */
356b8a0537SNicholas Piggin     uint64_t srr0;
366b8a0537SNicholas Piggin     uint64_t srr1;
376b8a0537SNicholas Piggin     uint64_t sprg[4];
386b8a0537SNicholas Piggin     uint64_t pidr;
396b8a0537SNicholas Piggin     uint64_t cfar;
406b8a0537SNicholas Piggin     uint64_t ppr;
416b8a0537SNicholas Piggin     /* Version 1 ends here */
426b8a0537SNicholas Piggin     uint64_t dawr1;
436b8a0537SNicholas Piggin     uint64_t dawrx1;
446b8a0537SNicholas Piggin     /* Version 2 ends here */
456b8a0537SNicholas Piggin };
466b8a0537SNicholas Piggin 
476b8a0537SNicholas Piggin /* Latest version of hv_guest_state structure */
486b8a0537SNicholas Piggin #define HV_GUEST_STATE_VERSION  2
496b8a0537SNicholas Piggin 
506b8a0537SNicholas Piggin /* Linux 64-bit powerpc pt_regs struct, used by nested HV */
516b8a0537SNicholas Piggin struct kvmppc_pt_regs {
526b8a0537SNicholas Piggin     uint64_t gpr[32];
536b8a0537SNicholas Piggin     uint64_t nip;
546b8a0537SNicholas Piggin     uint64_t msr;
556b8a0537SNicholas Piggin     uint64_t orig_gpr3;    /* Used for restarting system calls */
566b8a0537SNicholas Piggin     uint64_t ctr;
576b8a0537SNicholas Piggin     uint64_t link;
586b8a0537SNicholas Piggin     uint64_t xer;
596b8a0537SNicholas Piggin     uint64_t ccr;
606b8a0537SNicholas Piggin     uint64_t softe;        /* Soft enabled/disabled */
616b8a0537SNicholas Piggin     uint64_t trap;         /* Reason for being here */
626b8a0537SNicholas Piggin     uint64_t dar;          /* Fault registers */
636b8a0537SNicholas Piggin     uint64_t dsisr;        /* on 4xx/Book-E used for ESR */
646b8a0537SNicholas Piggin     uint64_t result;       /* Result of a system call */
656b8a0537SNicholas Piggin };
666b8a0537SNicholas Piggin 
676b8a0537SNicholas Piggin /*
686b8a0537SNicholas Piggin  * nested_ppc_state is used to save the host CPU state before switching it to
696b8a0537SNicholas Piggin  * the guest CPU state, to be restored on H_ENTER_NESTED exit.
706b8a0537SNicholas Piggin  */
716b8a0537SNicholas Piggin struct nested_ppc_state {
726b8a0537SNicholas Piggin     uint64_t gpr[32];
736b8a0537SNicholas Piggin     uint64_t lr;
746b8a0537SNicholas Piggin     uint64_t ctr;
756b8a0537SNicholas Piggin     uint64_t cfar;
766b8a0537SNicholas Piggin     uint64_t msr;
776b8a0537SNicholas Piggin     uint64_t nip;
786b8a0537SNicholas Piggin     uint32_t cr;
796b8a0537SNicholas Piggin 
806b8a0537SNicholas Piggin     uint64_t xer;
816b8a0537SNicholas Piggin 
826b8a0537SNicholas Piggin     uint64_t lpcr;
836b8a0537SNicholas Piggin     uint64_t lpidr;
846b8a0537SNicholas Piggin     uint64_t pidr;
856b8a0537SNicholas Piggin     uint64_t pcr;
866b8a0537SNicholas Piggin     uint64_t dpdes;
876b8a0537SNicholas Piggin     uint64_t hfscr;
886b8a0537SNicholas Piggin     uint64_t srr0;
896b8a0537SNicholas Piggin     uint64_t srr1;
906b8a0537SNicholas Piggin     uint64_t sprg0;
916b8a0537SNicholas Piggin     uint64_t sprg1;
926b8a0537SNicholas Piggin     uint64_t sprg2;
936b8a0537SNicholas Piggin     uint64_t sprg3;
946b8a0537SNicholas Piggin     uint64_t ppr;
956b8a0537SNicholas Piggin 
966b8a0537SNicholas Piggin     int64_t tb_offset;
976b8a0537SNicholas Piggin };
986b8a0537SNicholas Piggin 
996b8a0537SNicholas Piggin void spapr_register_nested(void);
1006b8a0537SNicholas Piggin void spapr_exit_nested(PowerPCCPU *cpu, int excp);
1016b8a0537SNicholas Piggin 
1026b8a0537SNicholas Piggin #endif /* HW_SPAPR_NESTED_H */
103