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) {
73 __asm__ __volatile__ (
75 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
76 : "0" (target), "2" (*ecx)
79 // 32 bit code compiled with -fPIC, cannot use ebx as an ouput reg. Fantastic.
80 __asm__ __volatile__ (
82 "movl %%edi, %%ebx\n\t"
84 "movl %%ebx, %%edi\n\t"
86 : "=a" (*eax), "=D" (*ebx), "=c" (*ecx), "=d" (*edx)
87 : "0" (target), "2" (*ecx)
94 static void __inline__ v3_set_msr(uint_t msr, uint_t high_byte, uint_t low_byte) {
95 __asm__ __volatile__ (
98 : "c" (msr), "d" (high_byte), "a" (low_byte)
106 static void __inline__ v3_get_msr(uint_t msr, uint_t * high_byte, uint_t * low_byte) {
107 __asm__ __volatile__ (
109 : "=d" (*high_byte), "=a" (*low_byte)
116 static void __inline__ v3_enable_ints() {
117 __asm__ __volatile__ ("sti");
120 static void __inline__ v3_disable_ints() {
121 __asm__ __volatile__ ("cli");
129 static addr_t __inline__ v3_irq_save() {
132 __asm__ __volatile__ ("pushf \n\t"
142 static void __inline__ v3_irq_restore(addr_t state) {
143 __asm__ __volatile__("pushl %0 \n\t"
153 static addr_t __inline__ v3_irq_save() {
156 __asm__ __volatile__ ("pushfq \n\t"
168 static void __inline__ v3_irq_restore(addr_t state) {
169 __asm__ __volatile__("pushq %0 \n\t"