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
33 } __attribute__((packed));
34 } __attribute__((packed));
35 } __attribute__((packed));
39 uint32_t base_lo : 24;
46 uint8_t long_mode : 1;
48 uint8_t granularity : 1;
50 } __attribute__((packed));
52 struct sys_segment64 {
54 uint32_t base_lo : 24;
62 uint8_t granularity : 1;
63 uint64_t base_hi : 40;
65 } __attribute__((packed));
69 static void __inline__ v3_cpuid(uint32_t target,
70 uint32_t * eax, uint32_t * ebx,
71 uint32_t * ecx, uint32_t * edx) {
72 __asm__ __volatile__ (
74 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
75 : "0" (target), "2" (*ecx)
81 static void __inline__ v3_set_msr(uint_t msr, uint_t high_byte, uint_t low_byte) {
82 __asm__ __volatile__ (
85 : "c" (msr), "d" (high_byte), "a" (low_byte)
93 static void __inline__ v3_get_msr(uint_t msr, uint_t * high_byte, uint_t * low_byte) {
94 __asm__ __volatile__ (
96 : "=d" (*high_byte), "=a" (*low_byte)
103 static void __inline__ v3_enable_ints() {
104 __asm__ __volatile__ ("sti");
107 static void __inline__ v3_disable_ints() {
108 __asm__ __volatile__ ("cli");
116 static addr_t __inline__ v3_irq_save() {
119 __asm__ __volatile__ ("pushf \n\t"
129 static void __inline__ v3_irq_restore(addr_t state) {
130 __asm__ __volatile__("pushl %0 \n\t"
140 static addr_t __inline__ v3_irq_save() {
143 __asm__ __volatile__ ("pushfq \n\t"
155 static void __inline__ v3_irq_restore(addr_t state) {
156 __asm__ __volatile__("pushq %0 \n\t"