X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_lowlevel.asm;h=8b22b5d1036061f787e54ccc17d3516a8c4b557c;hb=c2e660b41f69c603b0c47f7c7572a22a2f601a51;hp=4eab223dae2fb97f7c5be5618a2bc291fa87fbba;hpb=4f7c3b759e3889870c5b5e7d09b3ffcc168e5632;p=palacios.git diff --git a/palacios/src/palacios/vmm_lowlevel.asm b/palacios/src/palacios/vmm_lowlevel.asm index 4eab223..8b22b5d 100644 --- a/palacios/src/palacios/vmm_lowlevel.asm +++ b/palacios/src/palacios/vmm_lowlevel.asm @@ -1,6 +1,22 @@ ; -*- fundamental -*- -;; Northwestern University -;; (c) 2008, Jack Lange +;; +;; 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 @@ -15,7 +31,14 @@ EXPORT GetIDTR EXPORT GetTR +; CPUID functions +EXPORT cpuid_ecx +EXPORT cpuid_eax +EXPORT cpuid_edx +; Utility Functions +EXPORT Set_MSR +EXPORT Get_MSR @@ -71,6 +94,105 @@ GetTR: 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