2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #include <palacios/vmm_types.h>
23 #define CPUID_FEATURE_IDS 0x00000001
24 #define CPUID_EXT_FEATURE_IDS 0x80000001
28 static void __inline__ v3_cpuid(uint32_t target,
29 uint32_t * eax, uint32_t * ebx,
30 uint32_t * ecx, uint32_t * edx) {
31 __asm__ __volatile__ (
33 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
34 : "0" (target), "2" (*ecx)
40 static void __inline__ v3_set_msr(uint_t msr, uint_t high_byte, uint_t low_byte) {
41 __asm__ __volatile__ (
44 : "c" (msr), "d" (high_byte), "a" (low_byte)
52 static void __inline__ v3_get_msr(uint_t msr, uint_t * high_byte, uint_t * low_byte) {
53 __asm__ __volatile__ (
55 : "=d" (*high_byte), "=a" (*low_byte)
62 static void __inline__ v3_enable_ints() {
63 __asm__ __volatile__ ("sti");
66 static void __inline__ v3_disable_ints() {
67 __asm__ __volatile__ ("cli");
75 static addr_t __inline__ v3_irq_save() {
78 __asm__ __volatile__ ("pushf \n\t"
88 static void __inline__ v3_irq_restore(addr_t state) {
89 __asm__ __volatile__("pushl %0 \n\t"
99 static addr_t __inline__ v3_irq_save() {
102 __asm__ __volatile__ ("pushfq \n\t"
114 static void __inline__ v3_irq_restore(addr_t state) {
115 __asm__ __volatile__("pushq %0 \n\t"