9bedaef3837bb056678dc8d140215ae43fca1729vboxsync/** @file
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * CPUM - CPU Monitor(/ Manager), Context Structures from v1.6 (saved state).
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync/*
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * Copyright (C) 2006-2012 Oracle Corporation
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync *
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * available from http://www.virtualbox.org. This file is free software;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * General Public License (GPL) as published by the Free Software
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync *
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * The contents of this file may alternatively be used under the terms
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * of the Common Development and Distribution License Version 1.0
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * VirtualBox OSE distribution, in which case the provisions of the
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * CDDL are applicable instead of those of the GPL.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync *
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * You may elect to license modified versions of this file under the
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * terms and conditions of either the GPL or the CDDL or both.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync#ifndef ___VBox_vmm_cpumctx_v1_6_h
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync#define ___VBox_vmm_cpumctx_v1_6_h
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync#include <iprt/x86.h>
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsyncRT_C_DECLS_BEGIN
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync/** @addgroup grp_cpum_ctx_v1_6 The CPUM Context Structures from v1.6
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @ingroup grp_cpum
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @{
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync#pragma pack(1)
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync/** IDTR from version 1.6 */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsynctypedef struct VBOXIDTR_VER1_6
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync{
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Size of the IDT. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint16_t cbIdt;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Address of the IDT. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t pIdt;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync} VBOXIDTR_VER1_6;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync#pragma pack()
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync#pragma pack(1)
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync/** GDTR from version 1.6 */
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsynctypedef struct VBOXGDTR_VER1_6
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync{
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync /** Size of the GDT. */
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync uint16_t cbGdt;
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync /** Address of the GDT. */
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync uint32_t pGdt;
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync} VBOXGDTR_VER1_6;
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync#pragma pack()
af1bec0a4ee736ec470cf9aa30a4b4adff66b93evboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync/**
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * Selector hidden registers, for version 1.6 saved state.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsynctypedef struct CPUMSELREGHID_VER1_6
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync{
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Base register. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t u32Base;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Limit (expanded). */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t u32Limit;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Flags.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * This is the high 32-bit word of the descriptor entry.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * Only the flags, dpl and type are used. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync X86DESCATTR Attr;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync} CPUMSELREGHID_VER1_6;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync/**
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * CPU context, for version 1.6 saved state.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @remarks PATM uses this, which is why it has to be here.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync# pragma pack(1)
9bedaef3837bb056678dc8d140215ae43fca1729vboxsynctypedef struct CPUMCTX_VER1_6
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync{
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** FPU state. (16-byte alignment)
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @todo This doesn't have to be in X86FXSTATE on CPUs without fxsr - we need a type for the
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * actual format or convert it (waste of time). */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync X86FXSTATE fpu;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** CPUMCTXCORE Part.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @{ */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t edi;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rdi;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rdi);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t esi;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rsi;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rsi);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t ebp;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rbp;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rbp);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t eax;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rax;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rax);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t ebx;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rbx;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rbx);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t edx;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rdx;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rdx);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t ecx;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rcx;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rcx);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** @note We rely on the exact layout, because we use lss esp, [] in the
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * switcher. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t esp;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL ss;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL ssPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /* Note: no overlap with esp here. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rsp_notused;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL gs;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL gsPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL fs;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL fsPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL es;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL esPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL ds;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL dsPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL cs;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL csPadding[3]; /**< 3 words to force 8 byte alignment for the remainder. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync X86EFLAGS eflags;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync X86RFLAGS rflags;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rflags);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync union
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync {
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t eip;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t rip;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync } CPUM_UNION_NAME(rip);
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r8;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r9;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r10;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r11;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r12;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r13;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r14;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t r15;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Hidden selector registers.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @{ */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 esHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 csHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 ssHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 dsHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 fsHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 gsHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** @} */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** @} */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Control registers.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @{ */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t cr0;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t cr2;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t cr3;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t cr4;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t cr8;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** @} */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Debug registers.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @{ */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr0;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr1;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr2;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr3;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr4; /**< @todo remove dr4 and dr5. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr5;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr6;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t dr7;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /* DR8-15 are currently not supported */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** @} */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Global Descriptor Table register. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync VBOXGDTR_VER1_6 gdtr;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint16_t gdtrPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t gdtrPadding64;/** @todo fix this hack */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Interrupt Descriptor Table register. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync VBOXIDTR_VER1_6 idtr;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint16_t idtrPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t idtrPadding64;/** @todo fix this hack */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** The task register.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * Only the guest context uses all the members. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL ldtr;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL ldtrPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** The task register.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * Only the guest context uses all the members. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL tr;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync RTSEL trPadding;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** The sysenter msr registers.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * This member is not used by the hypervisor context. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSYSENTER SysEnter;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** System MSRs.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @{ */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrEFER;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrSTAR;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrPAT;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrLSTAR;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrCSTAR;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrSFMASK;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrFSBASE;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrGSBASE;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint64_t msrKERNELGSBASE;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** @} */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** Hidden selector registers.
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync * @{ */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 ldtrHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync CPUMSELREGHID_VER1_6 trHid;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** @} */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync /** padding to get 32byte aligned size. */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync uint32_t padding[2];
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync} CPUMCTX_VER1_6;
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync# pragma pack()
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync/** @} */
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsyncRT_C_DECLS_END
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync#endif
9bedaef3837bb056678dc8d140215ae43fca1729vboxsync