GIMAllHv.cpp revision bc5cd42756b3f98351040bbfccc08dd9bacd103a
236b2935f217749893b7034e59da3e3568928acevboxsync/* $Id$ */
236b2935f217749893b7034e59da3e3568928acevboxsync/** @file
236b2935f217749893b7034e59da3e3568928acevboxsync * GIM - Guest Interface Manager, Microsoft Hyper-V, All Contexts.
236b2935f217749893b7034e59da3e3568928acevboxsync */
236b2935f217749893b7034e59da3e3568928acevboxsync
236b2935f217749893b7034e59da3e3568928acevboxsync/*
236b2935f217749893b7034e59da3e3568928acevboxsync * Copyright (C) 2014 Oracle Corporation
236b2935f217749893b7034e59da3e3568928acevboxsync *
236b2935f217749893b7034e59da3e3568928acevboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
236b2935f217749893b7034e59da3e3568928acevboxsync * available from http://www.virtualbox.org. This file is free software;
236b2935f217749893b7034e59da3e3568928acevboxsync * you can redistribute it and/or modify it under the terms of the GNU
236b2935f217749893b7034e59da3e3568928acevboxsync * General Public License (GPL) as published by the Free Software
236b2935f217749893b7034e59da3e3568928acevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
236b2935f217749893b7034e59da3e3568928acevboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
236b2935f217749893b7034e59da3e3568928acevboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
236b2935f217749893b7034e59da3e3568928acevboxsync */
236b2935f217749893b7034e59da3e3568928acevboxsync
236b2935f217749893b7034e59da3e3568928acevboxsync
236b2935f217749893b7034e59da3e3568928acevboxsync/*******************************************************************************
236b2935f217749893b7034e59da3e3568928acevboxsync* Header Files *
236b2935f217749893b7034e59da3e3568928acevboxsync*******************************************************************************/
236b2935f217749893b7034e59da3e3568928acevboxsync#define LOG_GROUP LOG_GROUP_GIM
236b2935f217749893b7034e59da3e3568928acevboxsync#include "GIMHvInternal.h"
236b2935f217749893b7034e59da3e3568928acevboxsync
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync#include <VBox/err.h>
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync#include <VBox/vmm/tm.h>
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync#include <VBox/vmm/vm.h>
236b2935f217749893b7034e59da3e3568928acevboxsync
236b2935f217749893b7034e59da3e3568928acevboxsyncDECLEXPORT(int) GIMHvHypercall(PVMCPU pVCpu, PCPUMCTX pCtx)
236b2935f217749893b7034e59da3e3568928acevboxsync{
236b2935f217749893b7034e59da3e3568928acevboxsync return VINF_SUCCESS;
236b2935f217749893b7034e59da3e3568928acevboxsync}
236b2935f217749893b7034e59da3e3568928acevboxsync
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsyncDECLEXPORT(int) GIMHvReadMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync{
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync NOREF(pRange);
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync switch (idMsr)
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync {
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync case MSR_GIM_HV_TIME_REF_COUNT:
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync {
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync /* Hyper-V reports the time in 100ns units. */
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync uint64_t u64Tsc = TMCpuTickGet(pVCpu);
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync uint64_t u64TscHz = TMCpuTicksPerSecond(pVCpu->CTX_SUFF(pVM));
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync uint64_t u64Tsc100Ns = u64TscHz / UINT64_C(10000000); /* 100 ns */
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync *puValue = (u64Tsc / u64Tsc100Ns);
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync return VINF_SUCCESS;
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync }
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync case MSR_GIM_HV_VP_INDEX:
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync *puValue = pVCpu->idCpu;
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync return VINF_SUCCESS;
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync default:
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync break;
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync }
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync LogRel(("GIMHvReadMsr: Unknown/invalid RdMsr %#RX32 -> #GP(0)\n", idMsr));
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync return VERR_CPUM_RAISE_GP_0;
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync}
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsyncDECLEXPORT(int) GIMHvWriteMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync{
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync LogRel(("GIMHvWriteMsr: Unknown/invalid WrMsr %#RX32 -> #GP(0)\n", idMsr));
bc5cd42756b3f98351040bbfccc08dd9bacd103avboxsync return VERR_CPUM_RAISE_GP_0;
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync}
5067a9619d7131c54d4ebb371d9dac91abdd34f6vboxsync