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 // avoid rbx on -FPIC - gcc likes to own rbx even on 64 bit PIC code
74 __asm__ __volatile__ (
76 "movq %%rdi, %%rbx\n\t"
78 "movq %%rbx, %%rdi\n\t"
80 : "=a" (*eax), "=D" (*ebx), "=c" (*ecx), "=d" (*edx)
81 : "0" (target), "2" (*ecx)
84 // 32 bit code compiled with -fPIC, cannot use ebx as an ouput reg. Fantastic.
85 __asm__ __volatile__ (
87 "movl %%edi, %%ebx\n\t"
89 "movl %%ebx, %%edi\n\t"
91 : "=a" (*eax), "=D" (*ebx), "=c" (*ecx), "=d" (*edx)
92 : "0" (target), "2" (*ecx)
99 static void __inline__ v3_set_msr(uint_t msr, uint_t high_byte, uint_t low_byte) {
100 __asm__ __volatile__ (
103 : "c" (msr), "d" (high_byte), "a" (low_byte)
111 static void __inline__ v3_get_msr(uint_t msr, uint_t * high_byte, uint_t * low_byte) {
112 __asm__ __volatile__ (
114 : "=d" (*high_byte), "=a" (*low_byte)
121 static void __inline__ v3_enable_ints() {
122 __asm__ __volatile__ ("sti");
125 static void __inline__ v3_disable_ints() {
126 __asm__ __volatile__ ("cli");
134 static addr_t __inline__ v3_irq_save() {
137 __asm__ __volatile__ ("pushf \n\t"
147 static void __inline__ v3_irq_restore(addr_t state) {
148 __asm__ __volatile__("pushl %0 \n\t"
158 static addr_t __inline__ v3_irq_save() {
161 __asm__ __volatile__ ("pushfq \n\t"
173 static void __inline__ v3_irq_restore(addr_t state) {
174 __asm__ __volatile__("pushq %0 \n\t"