#include <ppc/exception.h>
#ifndef _VEMULATION_H_
#define _VEMULATION_H_
typedef union vmm_vector_register_t {
unsigned long i[4];
unsigned short s[8];
unsigned char b[16];
} vmm_vector_register_t;
typedef union vmm_fp_register_t {
double d;
unsigned long i[2];
unsigned short s[4];
unsigned char b[8];
} vmm_fp_register_t;
typedef struct vmm_regs32_t {
unsigned long ppcPC;
unsigned long ppcMSR;
unsigned long ppcGPRs[32];
unsigned long ppcCR;
unsigned long ppcXER;
unsigned long ppcLR;
unsigned long ppcCTR;
unsigned long ppcMQ;
unsigned long ppcVRSave;
unsigned long ppcRsrvd0A0[40];
} vmm_regs32_t;
#pragma pack(4)
typedef struct vmm_regs64_t {
unsigned long long ppcPC;
unsigned long long ppcMSR;
unsigned long long ppcGPRs[32];
unsigned long long ppcXER;
unsigned long long ppcLR;
unsigned long long ppcCTR;
unsigned long ppcCR;
unsigned long ppcVRSave;
unsigned long ppcRsvd130[4];
} vmm_regs64_t;
#pragma pack()
#pragma pack(4)
typedef union vmm_regs_t {
vmm_regs32_t ppcRegs32;
vmm_regs64_t ppcRegs64;
} vmm_regs_t;
#pragma pack()
#pragma pack(4)
typedef struct vmm_processor_state_t {
vmm_regs_t ppcRegs;
vmm_vector_register_t ppcVRs[32];
vmm_vector_register_t ppcVSCR;
vmm_fp_register_t ppcFPRs[32];
vmm_fp_register_t ppcFPSCR;
unsigned long ppcReserved2[2];
} vmm_processor_state_t;
#pragma pack()
typedef unsigned long vmm_return_code_t;
typedef unsigned long vmm_thread_index_t;
#define vmmTInum 0x000000FF
#define vmmTIadsp 0x0000FF00
typedef unsigned long vmm_adsp_id_t;
enum {
kVmmCurMajorVersion = 0x0001,
kVmmCurMinorVersion = 0x0007,
kVmmMinMajorVersion = 0x0001,
};
#define kVmmCurrentVersion ((kVmmCurMajorVersion << 16) | kVmmCurMinorVersion)
typedef unsigned long vmm_features_t;
enum {
kVmmFeature_LittleEndian = 0x00000001,
kVmmFeature_Stop = 0x00000002,
kVmmFeature_ExtendedMapping = 0x00000004,
kVmmFeature_ListMapping = 0x00000008,
kVmmFeature_FastAssist = 0x00000010,
kVmmFeature_XA = 0x00000020,
kVmmFeature_SixtyFourBit = 0x00000040,
kVmmFeature_MultAddrSpace = 0x00000080,
kVmmFeature_GuestShadowAssist = 0x00000100,
kVmmFeature_GlobalMappingAssist = 0x00000200,
kVmmFeature_HostShadowAssist = 0x00000400,
kVmmFeature_MultAddrSpaceAssist = 0x00000800,
};
#define kVmmCurrentFeatures (kVmmFeature_LittleEndian | kVmmFeature_Stop | kVmmFeature_ExtendedMapping \
| kVmmFeature_ListMapping | kVmmFeature_FastAssist | kVmmFeature_XA \
| kVmmFeature_GuestShadowAssist)
enum {
vmm64Bit = 0x80000000,
vmmGSA = 0x40000000,
vmmGMA = 0x20000000,
};
#define kVmmSupportedSetXA (vmm64Bit | vmmGSA | vmmGMA)
typedef unsigned long vmm_version_t;
typedef struct vmm_ret_parms32_t {
unsigned long return_params[4];
} vmm_ret_parms32_t;
typedef struct vmm_ret_parms64_t {
unsigned long long return_params[4];
} vmm_ret_parms64_t;
#pragma pack(4)
typedef union vmm_ret_parms_t {
vmm_ret_parms64_t vmmrp64;
vmm_ret_parms32_t vmmrp32;
unsigned int retgas[11];
} vmm_ret_parms_t;
#pragma pack()
#pragma pack(4)
typedef struct vmm_fastassist_state32_t {
unsigned long fastassist_dispatch;
unsigned long fastassist_refcon;
unsigned long fastassist_dispatch_code;
unsigned long fastassist_parameter[5];
unsigned long guest_register[8];
unsigned long guest_pc;
unsigned long guest_msr;
unsigned long fastassist_intercepts;
unsigned long fastassist_reserved1;
} vmm_fastassist_state32_t;
typedef struct vmm_fastassist_state64_t {
unsigned long long fastassist_dispatch;
unsigned long long fastassist_refcon;
unsigned long long fastassist_dispatch_code;
unsigned long long fastassist_parameter[5];
unsigned long long guest_register[8];
unsigned long long guest_pc;
unsigned long long guest_msr;
unsigned long fastassist_intercepts;
unsigned long fastassist_reserved1;
} vmm_fastassist_state64_t;
typedef union vmm_fastassist_state_t {
vmm_fastassist_state64_t vmmfs64;
vmm_fastassist_state32_t vmmfs32;
} vmm_fastassist_state_t;
#pragma pack()
#pragma pack(4)
typedef struct vmm_state_page_t {
vmm_version_t interface_version;
vmm_thread_index_t thread_index;
unsigned int vmmStat;
unsigned int vmmCntrl;
#define vmmFloatLoad 0x80000000
#define vmmFloatLoadb 0
#define vmmVectLoad 0x40000000
#define vmmVectLoadb 1
#define vmmVectVRall 0x20000000
#define vmmVectVRallb 2
#define vmmVectVAss 0x10000000
#define vmmVectVAssb 3
#define vmmXStart 0x08000000
#define vmmXStartb 4
#define vmmKey 0x04000000
#define vmmKeyb 5
#define vmmFamEna 0x02000000
#define vmmFamEnab 6
#define vmmFamSet 0x01000000
#define vmmFamSetb 7
vmm_return_code_t return_code;
vmm_ret_parms_t vmmRet;
vmm_processor_state_t vmm_proc_state;
vmm_fastassist_state_t vmm_fastassist_state;
} vmm_state_page_t;
#pragma pack()
#pragma pack(4)
typedef struct vmm_comm_page_t {
union {
vmm_state_page_t vmcpState;
unsigned int vmcpPad[768];
} vmcpfirst;
unsigned int vmcpComm[256];
} vmm_comm_page_t;
#pragma pack()
enum {
kVmmGetVersion = 0,
kVmmvGetFeatures,
kVmmInitContext,
kVmmTearDownContext,
kVmmTearDownAll,
kVmmMapPage,
kVmmGetPageMapping,
kVmmUnmapPage,
kVmmUnmapAllPages,
kVmmGetPageDirtyFlag,
kVmmGetFloatState,
kVmmGetVectorState,
kVmmSetTimer,
kVmmGetTimer,
kVmmExecuteVM,
kVmmProtectPage,
kVmmMapExecute,
kVmmProtectExecute,
kVmmMapList,
kVmmUnmapList,
kvmmExitToHost,
kvmmResumeGuest,
kvmmGetGuestRegister,
kvmmSetGuestRegister,
kVmmActivateXA,
kVmmDeactivateXA,
kVmmGetXA,
kVmmMapPage64,
kVmmGetPageMapping64,
kVmmUnmapPage64,
kVmmGetPageDirtyFlag64,
kVmmProtectPage64,
kVmmMapExecute64,
kVmmProtectExecute64,
kVmmMapList64,
kVmmUnmapList64,
kVmmMaxAddr,
kVmmSetGuestMemory,
kVmmPurgeLocal,
};
#define kVmmReturnNull 0
#define kVmmBogusContext 1
#define kVmmStopped 2
#define kVmmReturnDataPageFault 3
#define kVmmReturnInstrPageFault 4
#define kVmmReturnAlignmentFault 6
#define kVmmReturnProgramException 7
#define kVmmReturnSystemCall 12
#define kVmmReturnTraceException 13
#define kVmmAltivecAssist 22
#define kVmmInvalidAddress 0x1000
#define kVmmInvalidAdSpace 0x1001
#define kVmmProtXtnd 0x00000008
#define kVmmProtNARW (kVmmProtXtnd | 0x00000000)
#define kVmmProtRORW (kVmmProtXtnd | 0x00000001)
#define kVmmProtRWRW (kVmmProtXtnd | 0x00000002)
#define kVmmProtRORO (kVmmProtXtnd | 0x00000003)
typedef struct vmmMList {
unsigned int vmlva;
unsigned int vmlava;
} vmmMList;
typedef struct vmmMList64 {
unsigned long long vmlva;
unsigned long long vmlava;
} vmmMList64;
typedef struct vmmUMList {
unsigned int vmlava;
} vmmUMList;
typedef struct vmmUMList64 {
unsigned long long vmlava;
} vmmUMList64;
#define vmmlFlgs 0x00000FFF
#define vmmlProt 0x00000007
#define vmmlAdID 0x000003F0
#define vmmlGlob 0x00000400
#define vmmlRsvd 0x00000800
#define kVmmMaxContexts 32
#define kVmmMaxUnmapPages 64
#define kVmmMaxMapPages 64
#pragma pack(4)
typedef struct vmmCntrlEntry {
unsigned int vmmFlags;
#define vmmInUse 0x80000000
#define vmmInUseb 0
#define vmmFloatCngd 0x40000000
#define vmmFloatCngdb 1
#define vmmVectCngd 0x20000000
#define vmmVectCngdb 2
#define vmmTimerPop 0x10000000
#define vmmTimerPopb 3
#define vmmFAMmode 0x04000000
#define vmmFAMmodeb 5
#define vmmXStop 0x00800000
#define vmmXStopb 8
#define vmmSpfSave 0x000000FF
#define vmmSpfSaveb 24
unsigned int vmmXAFlgs;
vmm_state_page_t *vmmContextKern;
ppnum_t vmmContextPhys;
vmm_state_page_t *vmmContextUser;
facility_context vmmFacCtx;
pmap_t vmmPmap;
uint64_t vmmTimer;
unsigned int vmmFAMintercept;
} vmmCntrlEntry;
#pragma pack()
#pragma pack(4)
typedef struct vmmCntrlTable {
unsigned int vmmGFlags;
#define vmmLastAdSp 0xFF
addr64_t vmmLastMap;
vmmCntrlEntry vmmc[kVmmMaxContexts];
pmap_t vmmAdsp[kVmmMaxContexts];
} vmmCntrlTable;
#pragma pack()
extern void vmm_execute_vm(thread_t act, vmm_thread_index_t index);
extern kern_return_t vmm_tear_down_context(thread_t act, vmm_thread_index_t index);
extern kern_return_t vmm_get_float_state(thread_t act, vmm_thread_index_t index);
extern kern_return_t vmm_get_vector_state(thread_t act, vmm_thread_index_t index);
extern kern_return_t vmm_set_timer(thread_t act, vmm_thread_index_t index, unsigned int timerhi, unsigned int timerlo);
extern kern_return_t vmm_get_timer(thread_t act, vmm_thread_index_t index);
extern void vmm_tear_down_all(thread_t act);
extern kern_return_t vmm_map_page(thread_t act, vmm_thread_index_t hindex, addr64_t cva,
addr64_t ava, vm_prot_t prot);
extern vmm_return_code_t vmm_map_execute(thread_t act, vmm_thread_index_t hindex, addr64_t cva,
addr64_t ava, vm_prot_t prot);
extern kern_return_t vmm_protect_page(thread_t act, vmm_thread_index_t hindex, addr64_t va,
vm_prot_t prot);
extern vmm_return_code_t vmm_protect_execute(thread_t act, vmm_thread_index_t hindex, addr64_t va,
vm_prot_t prot);
extern addr64_t vmm_get_page_mapping(thread_t act, vmm_thread_index_t index,
addr64_t va);
extern kern_return_t vmm_unmap_page(thread_t act, vmm_thread_index_t index, addr64_t va);
extern void vmm_unmap_all_pages(thread_t act, vmm_thread_index_t index);
extern boolean_t vmm_get_page_dirty_flag(thread_t act, vmm_thread_index_t index,
addr64_t va, unsigned int reset);
extern kern_return_t vmm_activate_XA(thread_t act, vmm_thread_index_t index, unsigned int xaflags);
extern kern_return_t vmm_deactivate_XA(thread_t act, vmm_thread_index_t index, unsigned int xaflags);
extern unsigned int vmm_get_XA(thread_t act, vmm_thread_index_t index);
extern int vmm_get_features(struct savearea *);
extern int vmm_get_version(struct savearea *);
extern int vmm_init_context(struct savearea *);
extern int vmm_dispatch(struct savearea *);
extern int vmm_exit(thread_t act, struct savearea *);
extern void vmm_force_exit(thread_t act, struct savearea *);
extern int vmm_stop_vm(struct savearea *save);
extern void vmm_timer_pop(thread_t act);
extern void vmm_interrupt(ReturnHandler *rh, thread_t act);
extern kern_return_t vmm_map_list(thread_t act, vmm_thread_index_t index, unsigned int cnt, unsigned int flavor);
extern kern_return_t vmm_unmap_list(thread_t act, vmm_thread_index_t index, unsigned int cnt, unsigned int flavor);
extern vmm_return_code_t vmm_resume_guest(vmm_thread_index_t index, unsigned long pc,
unsigned long vmmCntrl, unsigned long vmmCntrMaskl);
extern vmm_return_code_t vmm_exit_to_host(vmm_thread_index_t index);
extern unsigned long vmm_get_guest_register(vmm_thread_index_t index, unsigned long reg_index);
extern vmm_return_code_t vmm_set_guest_register(vmm_thread_index_t index, unsigned long reg_index, unsigned long reg_value);
extern addr64_t vmm_max_addr(thread_t act);
extern kern_return_t vmm_set_guest_memory(thread_t act, vmm_thread_index_t index, addr64_t base, addr64_t extent);
extern kern_return_t vmm_purge_local(thread_t act, vmm_thread_index_t index);
#endif