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