0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @file
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * GVM - The Global VM Data.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2007-2013 Oracle Corporation
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * available from http://www.virtualbox.org. This file is free software;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * you can redistribute it and/or modify it under the terms of the GNU
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * General Public License (GPL) as published by the Free Software
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * The contents of this file may alternatively be used under the terms
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * of the Common Development and Distribution License Version 1.0
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution, in which case the provisions of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * CDDL are applicable instead of those of the GPL.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * You may elect to license modified versions of this file under the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * terms and conditions of either the GPL or the CDDL or both.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifndef ___VBox_vmm_uvm_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define ___VBox_vmm_uvm_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <VBox/types.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <iprt/assert.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Per virtual CPU ring-3 (user mode) data.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsynctypedef struct UVMCPU
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Pointer to the UVM structure. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync PUVM pUVM;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Pointer to the VM structure. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync PVM pVM;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Pointer to the VMCPU structure. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync PVMCPU pVCpu;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The virtual CPU ID. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTCPUID idCpu;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Alignment padding. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint8_t abAlignment0[HC_ARCH_BITS == 32 ? 16 : 4];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The VM internal data. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync union
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync {
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef ___VMInternal_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync struct VMINTUSERPERVMCPU s;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint8_t padding[512];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync } vm;
98427c0ab08697e468c26dc33ee9571308577867vboxsync
98427c0ab08697e468c26dc33ee9571308577867vboxsync /** The DBGF data. */
98427c0ab08697e468c26dc33ee9571308577867vboxsync union
98427c0ab08697e468c26dc33ee9571308577867vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync#ifdef ___DBGFInternal_h
98427c0ab08697e468c26dc33ee9571308577867vboxsync struct DBGFUSERPERVMCPU s;
98427c0ab08697e468c26dc33ee9571308577867vboxsync#endif
98427c0ab08697e468c26dc33ee9571308577867vboxsync uint8_t padding[64];
98427c0ab08697e468c26dc33ee9571308577867vboxsync } dbgf;
98427c0ab08697e468c26dc33ee9571308577867vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync} UVMCPU;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileMemberAlignment(UVMCPU, vm, 32);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * The ring-3 (user mode) VM structure.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This structure is similar to VM and GVM except that it resides in swappable
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * user memory. The main purpose is to assist bootstrapping, where it allows us
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * to start EMT much earlier and gives PDMLdr somewhere to put it's VMMR0 data.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * It is also a nice place to put big things that are user mode only.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsynctypedef struct UVM
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Magic / eye-catcher (UVM_MAGIC). */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t u32Magic;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The number of virtual CPUs. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t cCpus;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The ring-3 mapping of the shared VM structure. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync PVM pVM;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Pointer to the next VM.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * We keep a per process list of VM for the event that a process could
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * contain more than one VM.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @todo move this into vm.s!
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync struct UVM *pNext;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Pointer to the optional method table provided by the VMM user. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync PCVMM2USERMETHODS pVmm2UserMethods;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#if HC_ARCH_BITS == 32
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Align the next member on a 32 byte boundary. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint8_t abAlignment0[HC_ARCH_BITS == 32 ? 12 : 0];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The VM internal data. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync union
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync {
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef ___VMInternal_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync struct VMINTUSERPERVM s;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint8_t padding[512];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync } vm;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The MM data. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync union
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync {
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef ___MMInternal_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync struct MMUSERPERVM s;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint8_t padding[32];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync } mm;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The PDM data. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync union
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync {
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef ___PDMInternal_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync struct PDMUSERPERVM s;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
a0352d06ef77cf45a08eb08b4d65d570b7b294cbvboxsync uint8_t padding[256];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync } pdm;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** The STAM data. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync union
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync {
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef ___STAMInternal_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync struct STAMUSERPERVM s;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
36ac4f28a411bfbbf9bcb0f1e6c5cd2d4ae9f80evboxsync uint8_t padding[6880];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync } stam;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
98427c0ab08697e468c26dc33ee9571308577867vboxsync /** The DBGF data. */
98427c0ab08697e468c26dc33ee9571308577867vboxsync union
98427c0ab08697e468c26dc33ee9571308577867vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync#ifdef ___DBGFInternal_h
98427c0ab08697e468c26dc33ee9571308577867vboxsync struct DBGFUSERPERVM s;
98427c0ab08697e468c26dc33ee9571308577867vboxsync#endif
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync uint8_t padding[384];
98427c0ab08697e468c26dc33ee9571308577867vboxsync } dbgf;
98427c0ab08697e468c26dc33ee9571308577867vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /** Per virtual CPU data. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync UVMCPU aCpus[1];
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync} UVM;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileMemberAlignment(UVM, vm, 32);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileMemberAlignment(UVM, mm, 32);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileMemberAlignment(UVM, pdm, 32);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileMemberAlignment(UVM, stam, 32);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncAssertCompileMemberAlignment(UVM, aCpus, 32);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** The UVM::u32Magic value (Brad Mehldau). */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define UVM_MAGIC 0x19700823
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @def UVM_ASSERT_VALID_EXT_RETURN
d1d4bf58f99da14d0aaa7bcc728a359c8a7eb7bdvboxsync * Asserts a user mode VM handle is valid for external access.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
d1d4bf58f99da14d0aaa7bcc728a359c8a7eb7bdvboxsync#define UVM_ASSERT_VALID_EXT_RETURN(a_pUVM, a_rc) \
d1d4bf58f99da14d0aaa7bcc728a359c8a7eb7bdvboxsync AssertMsgReturn( RT_VALID_ALIGNED_PTR(a_pUVM, PAGE_SIZE) \
d1d4bf58f99da14d0aaa7bcc728a359c8a7eb7bdvboxsync && (a_pUVM)->u32Magic == UVM_MAGIC, \
d1d4bf58f99da14d0aaa7bcc728a359c8a7eb7bdvboxsync ("a_pUVM=%p u32Magic=%#x\n", (a_pUVM), \
d1d4bf58f99da14d0aaa7bcc728a359c8a7eb7bdvboxsync RT_VALID_ALIGNED_PTR(a_pUVM, PAGE_SIZE) ? (a_pUVM)->u32Magic : 0), \
d1d4bf58f99da14d0aaa7bcc728a359c8a7eb7bdvboxsync (a_rc))
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync/** @def UVM_ASSERT_VALID_EXT_RETURN
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync * Asserts a user mode VM handle is valid for external access.
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync */
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync#define UVM_ASSERT_VALID_EXT_RETURN_VOID(a_pUVM) \
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync AssertMsgReturnVoid( RT_VALID_ALIGNED_PTR(a_pUVM, PAGE_SIZE) \
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync && (a_pUVM)->u32Magic == UVM_MAGIC, \
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync ("a_pUVM=%p u32Magic=%#x\n", (a_pUVM), \
17d11b8f5a067c2ac0d8d2055fb0eca96199a048vboxsync RT_VALID_ALIGNED_PTR(a_pUVM, PAGE_SIZE) ? (a_pUVM)->u32Magic : 0))
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync