VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp@ 5999

Last change on this file since 5999 was 5999, checked in by vboxsync, 17 years ago

The Giant CDDL Dual-License Header Change.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.1 KB
Line 
1/* $Id: CPUMR0.cpp 5999 2007-12-07 15:05:06Z vboxsync $ */
2/** @file
3 * CPUM - Host Context Ring 0.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*******************************************************************************
20* Header Files *
21*******************************************************************************/
22#define LOG_GROUP LOG_GROUP_CPUM
23#include <VBox/cpum.h>
24#include "CPUMInternal.h"
25#include <VBox/vm.h>
26#include <VBox/x86.h>
27#include <VBox/err.h>
28#include <VBox/log.h>
29#include <iprt/assert.h>
30#include <iprt/asm.h>
31
32
33
34
35/**
36 * Does Ring-0 CPUM initialization.
37 *
38 * This is mainly to check that the Host CPU mode is compatible
39 * with VBox.
40 *
41 * @returns VBox status code.
42 * @param pVM The VM to operate on.
43 */
44CPUMR0DECL(int) CPUMR0Init(PVM pVM)
45{
46 LogFlow(("CPUMR0Init: %p\n", pVM));
47
48 /*
49 * Check CR0 & CR4 flags.
50 */
51 uint32_t u32CR0 = ASMGetCR0();
52 if ((u32CR0 & (X86_CR0_PE | X86_CR0_PG)) != (X86_CR0_PE | X86_CR0_PG)) /* a bit paranoid perhaps.. */
53 {
54 Log(("CPUMR0Init: PE or PG not set. cr0=%#x\n", u32CR0));
55 return VERR_UNSUPPORTED_CPU_MODE;
56 }
57
58 /*
59 * Check for sysenter if it's used.
60 */
61 if (ASMHasCpuId())
62 {
63 uint32_t u32CpuVersion;
64 uint32_t u32Dummy;
65 uint32_t u32Features;
66 ASMCpuId(1, &u32CpuVersion, &u32Dummy, &u32Dummy, &u32Features);
67 uint32_t u32Family = u32CpuVersion >> 8;
68 uint32_t u32Model = (u32CpuVersion >> 4) & 0xF;
69 uint32_t u32Stepping = u32CpuVersion & 0xF;
70
71 /*
72 * Intel docs claim you should test both the flag and family, model & stepping.
73 * Some Pentium Pro cpus have the SEP cpuid flag set, but don't support it.
74 */
75 if ( (u32Features & X86_CPUID_FEATURE_EDX_SEP)
76 && !(u32Family == 6 && u32Model < 3 && u32Stepping < 3))
77 {
78 /*
79 * Read the MSR and see if it's in use or not.
80 */
81 uint32_t u32 = ASMRdMsr_Low(MSR_IA32_SYSENTER_CS);
82 if (u32)
83 {
84 pVM->cpum.s.fUseFlags |= CPUM_USE_SYSENTER;
85 Log(("CPUMR0Init: host uses sysenter cs=%08x%08x\n", ASMRdMsr_High(MSR_IA32_SYSENTER_CS), u32));
86 }
87 }
88
89 /** @todo check for AMD and syscall!!!!!! */
90 }
91
92
93 /*
94 * Check if debug registers are armed.
95 */
96 uint32_t u32DR7 = ASMGetDR7();
97 if (u32DR7 & X86_DR7_ENABLED_MASK)
98 {
99 pVM->cpum.s.fUseFlags |= CPUM_USE_DEBUG_REGS_HOST;
100 Log(("CPUMR0Init: host uses debug registers (dr7=%x)\n", u32DR7));
101 }
102
103 return VINF_SUCCESS;
104}
105
106
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette