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