#include <palacios/vmm_types.h>
+#define CPUID_FEATURE_IDS 0x80000001
+#define CPUID_EXT_FEATURE_IDS 0x80000001
+
+
#ifdef __V3_32BIT__
-void __inline__ v3_cpuid(uint_t target, addr_t * eax, addr_t * ebx, addr_t * ecx, addr_t * edx) {
+static void __inline__ v3_cpuid(uint_t target, addr_t * eax, addr_t * ebx, addr_t * ecx, addr_t * edx) {
__asm__ __volatile__ (
"pushl %%ebx\n\t"
"cpuid\n\t"
#elif __V3_64BIT__
-void __inline__ v3_cpuid(uint_t target, addr_t * eax, addr_t * ebx, addr_t * ecx, addr_t * edx) {
+static void __inline__ v3_cpuid(uint_t target, addr_t * eax, addr_t * ebx, addr_t * ecx, addr_t * edx) {
__asm__ __volatile__ (
"pushq %%rbx\n\t"
"cpuid\n\t"
#endif
-void __inline__ v3_set_msr(uint_t msr, uint_t high_byte, uint_t low_byte) {
+static void __inline__ v3_set_msr(uint_t msr, uint_t high_byte, uint_t low_byte) {
__asm__ __volatile__ (
"wrmsr"
:
-void __inline__ v3_get_msr(uint_t msr, uint_t * high_byte, uint_t * low_byte) {
+static void __inline__ v3_get_msr(uint_t msr, uint_t * high_byte, uint_t * low_byte) {
__asm__ __volatile__ (
"rdmsr"
: "=d" (*high_byte), "=a" (*low_byte)
-void __inline__ v3_enable_ints() {
+static void __inline__ v3_enable_ints() {
__asm__ __volatile__ ("sti");
}
-void __inline__ v3_disable_ints() {
+static void __inline__ v3_disable_ints() {
__asm__ __volatile__ ("cli");
}
+
+
+
+#ifdef __V3_32BIT__
+
+static addr_t __inline__ v3_irq_save() {
+ addr_t state;
+
+ __asm__ __volatile__ ("pushf \n\t"
+ "popl %0 \n\t"
+ "cli \n\t"
+ :"=g" (state)
+ :
+ :"memory"
+ );
+ return state;
+}
+
+static void __inline__ v3_irq_restore(addr_t state) {
+ __asm__ __volatile__("pushl %0 \n\t"
+ "popfl \n\t"
+ :
+ :"g" (state)
+ :"memory", "cc"
+ );
+}
+
+#elif __V3_64BIT__
+
+static addr_t __inline__ v3_irq_save() {
+ addr_t state;
+
+ __asm__ __volatile__ ("pushfq \n\t"
+ "popq %0 \n\t"
+ "cli \n\t"
+ :"=g" (state)
+ :
+ :"memory"
+ );
+
+ return state;
+}
+
+
+static void __inline__ v3_irq_restore(addr_t state) {
+ __asm__ __volatile__("pushq %0 \n\t"
+ "popfq \n\t"
+ :
+ :"g" (state)
+ :"memory", "cc"
+ );
+}
+
+#endif