From: Jack Lange Date: Mon, 20 Oct 2008 21:40:04 +0000 (-0500) Subject: moved vmm_lowlevel.asm to C header file vmm_lowlevel.h X-Git-Tag: 1.0^2~40 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=773e6e7d212b3ece194cd0e75a383db7d2b9a2b1 moved vmm_lowlevel.asm to C header file vmm_lowlevel.h --- diff --git a/palacios/build/Makefile b/palacios/build/Makefile index 6f4cc20..0918964 100644 --- a/palacios/build/Makefile +++ b/palacios/build/Makefile @@ -254,7 +254,7 @@ ALL_TARGETS := vmm vm_kernel -VMM_ASM_SRCS := svm_lowlevel.asm vmm_lowlevel.asm\ +VMM_ASM_SRCS := svm_lowlevel.asm\ # vmx_lowlevel.asm VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o) diff --git a/palacios/include/palacios/vmm_lowlevel.h b/palacios/include/palacios/vmm_lowlevel.h new file mode 100644 index 0000000..4719cce --- /dev/null +++ b/palacios/include/palacios/vmm_lowlevel.h @@ -0,0 +1,70 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + +#include + + +#ifdef __V3_32BIT__ + +void __inline__ v3_cpuid(uint_t target, uint_t * eax, uint_t * ebx, uint_t * ecx, uint_t * edx) { + __asm__ __volatile__ ( + "pushl %%ebx\n\t" + "cpuid\n\t" + "movl %%ebx, %%esi\n\t" + "popl %%ebx\n\t" + : "=a" (*eax), "=S" (*ebx), "=c" (*ecx), "=d" (*edx) + : "a" (target) + ); + return; +} + + + + +void __inline__ v3_set_msr(uint_t msr, uint_t high_byte, uint_t low_byte) { + __asm__ __volatile__ ( + "wrmsr" + : + : "c" (msr), "d" (high_byte), "a" (low_byte) + ); + + +} + + + +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) + : "c" (msr) + ); +} + + + +void __inline__ v3_enable_ints() { + __asm__ __volatile__ ("sti"); +} + +void __inline__ v3_disable_ints() { + __asm__ __volatile__ ("cli"); +} + +#endif diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index a8a980a..e59e96a 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -34,14 +34,11 @@ #include #include +#include -extern uint_t cpuid_ecx(uint_t op); -extern uint_t cpuid_edx(uint_t op); -extern void Get_MSR(uint_t MSR, uint_t * high_byte, uint_t * low_byte); -extern void Set_MSR(uint_t MSR, uint_t high_byte, uint_t low_byte); extern uint_t launch_svm(vmcb_t * vmcb_addr); extern void safe_svm_launch(vmcb_t * vmcb_addr, struct v3_gprs * gprs); @@ -51,8 +48,6 @@ extern void CLGI(); extern uint_t Get_CR3(); -extern void DisableInts(); -extern void EnableInts(); @@ -310,7 +305,7 @@ static int start_svm_guest(struct guest_info *info) { ullong_t tmp_tsc; - EnableInts(); + v3_enable_ints(); CLGI(); // PrintDebug("SVM Entry to rip=%x...\n", info->rip); @@ -382,31 +377,29 @@ int v3_is_svm_capable() { #if 1 // Dinda - - uint_t ret; uint_t vm_cr_low = 0, vm_cr_high = 0; + uint_t eax = 0, ebx = 0, ecx = 0, edx = 0; - - ret = cpuid_ecx(CPUID_FEATURE_IDS); + v3_cpuid(CPUID_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - PrintDebug("CPUID_FEATURE_IDS_ecx=0x%x\n",ret); + PrintDebug("CPUID_FEATURE_IDS_ecx=0x%x\n", ecx); - if ((ret & CPUID_FEATURE_IDS_ecx_svm_avail) == 0) { + if ((ecx & CPUID_FEATURE_IDS_ecx_svm_avail) == 0) { PrintDebug("SVM Not Available\n"); return 0; } else { - Get_MSR(SVM_VM_CR_MSR, &vm_cr_high, &vm_cr_low); + v3_get_msr(SVM_VM_CR_MSR, &vm_cr_high, &vm_cr_low); - PrintDebug("SVM_VM_CR_MSR = 0x%x 0x%x\n",vm_cr_high,vm_cr_low); + PrintDebug("SVM_VM_CR_MSR = 0x%x 0x%x\n", vm_cr_high, vm_cr_low); if ((vm_cr_low & SVM_VM_CR_MSR_svmdis) == 1) { PrintDebug("SVM is available but is disabled.\n"); - ret = cpuid_edx(CPUID_SVM_REV_AND_FEATURE_IDS); + v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - PrintDebug("CPUID_FEATURE_IDS_edx=0x%x\n",ret); + PrintDebug("CPUID_FEATURE_IDS_edx=0x%x\n", edx); - if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml) == 0) { + if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml) == 0) { PrintDebug("SVM BIOS Disabled, not unlockable\n"); } else { PrintDebug("SVM is locked with a key\n"); @@ -416,11 +409,11 @@ int v3_is_svm_capable() { } else { PrintDebug("SVM is available and enabled.\n"); - ret = cpuid_edx(CPUID_SVM_REV_AND_FEATURE_IDS); + v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - PrintDebug("CPUID_FEATURE_IDS_edx=0x%x\n",ret); + PrintDebug("CPUID_FEATURE_IDS_edx=0x%x\n", edx); - if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 0) { + if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 0) { PrintDebug("SVM Nested Paging not supported\n"); } else { PrintDebug("SVM Nested Paging supported\n"); @@ -432,24 +425,24 @@ int v3_is_svm_capable() { } #else - - uint_t ret = cpuid_ecx(CPUID_FEATURE_IDS); + uint_t eax = 0, ebx = 0, ecx = 0, edx = 0; uint_t vm_cr_low = 0, vm_cr_high = 0; + v3_cpuid(CPUID_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - if ((ret & CPUID_FEATURE_IDS_ecx_svm_avail) == 0) { + if ((ecx & CPUID_FEATURE_IDS_ecx_svm_avail) == 0) { PrintDebug("SVM Not Available\n"); return 0; } - Get_MSR(SVM_VM_CR_MSR, &vm_cr_high, &vm_cr_low); + v3_get_msr(SVM_VM_CR_MSR, &vm_cr_high, &vm_cr_low); - PrintDebug("SVM_VM_CR_MSR = 0x%x 0x%x\n",vm_cr_high,vm_cr_low); + PrintDebug("SVM_VM_CR_MSR = 0x%x 0x%x\n", vm_cr_high, vm_cr_low); // this part is clearly wrong, since the np bit is in // edx, not ecx - if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 1) { + if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 1) { PrintDebug("Nested Paging not supported\n"); } else { PrintDebug("Nested Paging supported\n"); @@ -460,9 +453,9 @@ int v3_is_svm_capable() { return 1; } - ret = cpuid_edx(CPUID_SVM_REV_AND_FEATURE_IDS); + v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml) == 0) { + if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml) == 0) { PrintDebug("SVM BIOS Disabled, not unlockable\n"); } else { PrintDebug("SVM is locked with a key\n"); @@ -475,13 +468,13 @@ int v3_is_svm_capable() { } static int has_svm_nested_paging() { - uint32_t ret; + uint_t eax = 0, ebx = 0, ecx = 0, edx = 0; - ret = cpuid_edx(CPUID_SVM_REV_AND_FEATURE_IDS); + v3_cpuid(CPUID_SVM_REV_AND_FEATURE_IDS, &eax, &ebx, &ecx, &edx); - //PrintDebug("CPUID_FEATURE_IDS_edx=0x%x\n",ret); + //PrintDebug("CPUID_FEATURE_IDS_edx=0x%x\n", edx); - if ((ret & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 0) { + if ((edx & CPUID_SVM_REV_AND_FEATURE_IDS_edx_np) == 0) { PrintDebug("SVM Nested Paging not supported\n"); return 0; } else { @@ -499,9 +492,9 @@ void v3_init_SVM(struct v3_ctrl_ops * vmm_ops) { // Enable SVM on the CPU - Get_MSR(EFER_MSR, &(msr.e_reg.high), &(msr.e_reg.low)); + v3_get_msr(EFER_MSR, &(msr.e_reg.high), &(msr.e_reg.low)); msr.e_reg.low |= EFER_MSR_svm_enable; - Set_MSR(EFER_MSR, 0, msr.e_reg.low); + v3_set_msr(EFER_MSR, 0, msr.e_reg.low); PrintDebug("SVM Enabled\n"); @@ -516,7 +509,7 @@ void v3_init_SVM(struct v3_ctrl_ops * vmm_ops) { msr.r_reg = (addr_t)host_state; PrintDebug("Host State being saved at %x\n", (addr_t)host_state); - Set_MSR(SVM_VM_HSAVE_PA_MSR, msr.e_reg.high, msr.e_reg.low); + v3_set_msr(SVM_VM_HSAVE_PA_MSR, msr.e_reg.high, msr.e_reg.low); diff --git a/palacios/src/palacios/svm_lowlevel.asm b/palacios/src/palacios/svm_lowlevel.asm index ac646b2..f12e140 100644 --- a/palacios/src/palacios/svm_lowlevel.asm +++ b/palacios/src/palacios/svm_lowlevel.asm @@ -31,11 +31,6 @@ SVM_SUCCESS equ 0x00000000 -EXPORT exit_test - -EXTERN handle_svm_exit - -EXPORT launch_svm EXPORT safe_svm_launch EXPORT STGI @@ -126,27 +121,6 @@ STGI: -; I think its safe to say that there are some pretty serious register issues... -align 8 -launch_svm: - push ebp - mov ebp, esp - pusha - - mov eax, [ebp + 8] - vmrun -; db 00fh, 001h, 0d8h - popa - pop ebp - ret - - - - -exit_test: - mov cr4, eax - ret - ;; Need to check this.. ;; save_svm_launch(rax, struct guest_gprs * regs) diff --git a/palacios/src/palacios/vmm_lowlevel.asm b/palacios/src/palacios/vmm_lowlevel.asm deleted file mode 100644 index 8b22b5d..0000000 --- a/palacios/src/palacios/vmm_lowlevel.asm +++ /dev/null @@ -1,201 +0,0 @@ -; -*- fundamental -*- -;; -;; This file is part of the Palacios Virtual Machine Monitor developed -;; by the V3VEE Project with funding from the United States National -;; Science Foundation and the Department of Energy. -;; -;; The V3VEE Project is a joint project between Northwestern University -;; and the University of New Mexico. You can find out more at -;; http://www.v3vee.org -;; -;; Copyright (c) 2008, Jack Lange -;; Copyright (c) 2008, The V3VEE Project -;; All rights reserved. -;; -;; Author: Jack Lange -;; -;; This is free software. You are permitted to use, -;; redistribute, and modify it as specified in the file "V3VEE_LICENSE" -;; - -%ifndef VMM_ASM -%define VMM_ASM - -%include "vmm_symbol.asm" - -EXPORT DisableInts -EXPORT EnableInts - -EXPORT GetGDTR -EXPORT GetIDTR -EXPORT GetTR - - -; CPUID functions -EXPORT cpuid_ecx -EXPORT cpuid_eax -EXPORT cpuid_edx - -; Utility Functions -EXPORT Set_MSR -EXPORT Get_MSR - - - -align 8 -DisableInts: - cli - ret - - -align 8 -EnableInts: - sti - ret - -align 8 -GetGDTR: - push ebp - mov ebp, esp - pusha - mov ebx, [ebp + 8] - sgdt [ebx] - - popa - pop ebp - ret - - -align 8 -GetIDTR: - push ebp - mov ebp, esp - pusha - - mov ebx, [ebp + 8] - sidt [ebx] - - popa - pop ebp - ret - - - -align 8 -GetTR: - push ebp - mov ebp, esp - pusha - mov ebx, [ebp + 8] - str [ebx] - - popa - pop ebp - ret - - -; -; cpuid_edx - return the edx register from cpuid -; -align 8 -cpuid_edx: - push ebp - mov ebp, esp - push edx - push ecx - push ebx - - mov eax, [ebp + 8] - cpuid - mov eax, edx - - pop ebx - pop ecx - pop edx - pop ebp - ret - - -; -; cpuid_ecx - return the ecx register from cpuid -; -align 8 -cpuid_ecx: - push ebp - mov ebp, esp - push edx - push ecx - push ebx - - mov eax, [ebp + 8] - cpuid - mov eax, ecx - - pop ebx - pop ecx - pop edx - pop ebp - ret - -; -; cpuid_eax - return the eax register from cpuid -; -align 8 -cpuid_eax: - push ebp - mov ebp, esp - push edx - push ecx - push ebx - - mov eax, [esp+4] - cpuid - - pop ebx - pop ecx - pop edx - pop ebp - ret - -; -; Set_MSR - Set the value of a given MSR -; -align 8 -Set_MSR: - push ebp - mov ebp, esp - pusha - mov eax, [ebp+16] - mov edx, [ebp+12] - mov ecx, [ebp+8] - wrmsr - popa - pop ebp - ret - - - -; -; Get_MSR - Get the value of a given MSR -; void Get_MSR(int MSR, void * high_byte, void * low_byte); -; -align 8 -Get_MSR: - push ebp - mov ebp, esp - pusha - mov ecx, [ebp+8] - rdmsr - mov ebx, [ebp+12] - mov [ebx], edx - mov ebx, [ebp+16] - mov [ebx], eax - popa - pop ebp - ret - - - - - -%endif