diff options
| author | Daniil Baturin <daniil@baturin.org> | 2015-03-05 14:00:51 +0600 |
|---|---|---|
| committer | Daniil Baturin <daniil@baturin.org> | 2015-03-05 14:00:51 +0600 |
| commit | 257335197da3d6bb49d97515c82a5bb4a8fe1831 (patch) | |
| tree | 2c4a6475cbaa32188d766f03e8db6c5a6d3f1ff7 /src/hypervisor_check.adb | |
| parent | 4e6920f5a2b7b830e56a2b89c82a9e0c214f1d1a (diff) | |
| download | hvinfo-257335197da3d6bb49d97515c82a5bb4a8fe1831.tar.gz hvinfo-257335197da3d6bb49d97515c82a5bb4a8fe1831.zip | |
Initial import of barely working stuff.
Diffstat (limited to 'src/hypervisor_check.adb')
| -rw-r--r-- | src/hypervisor_check.adb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/hypervisor_check.adb b/src/hypervisor_check.adb new file mode 100644 index 0000000..6a68df0 --- /dev/null +++ b/src/hypervisor_check.adb @@ -0,0 +1,38 @@ +package body Hypervisor_Check is + + function CPUID (Arg : Unsigned_32) return CPUID_Registers is + eax, ebx, ecx, edx : Unsigned_32; + begin + Asm("cpuid", + Outputs => (Unsigned_32'Asm_Output ("=a", eax), + Unsigned_32'Asm_Output ("=b", ebx), + Unsigned_32'Asm_Output ("=c", ecx), + Unsigned_32'Asm_Output ("=d", edx)), + Inputs => Unsigned_32'Asm_Input ("a", Arg)); + return (eax, ebx, ecx, edx); + end CPUID; + + function String_of_U32 (Arg : Unsigned_32) return Unbounded_String is + Word : Unsigned_32; + Result : Unbounded_String; + begin + Word := Arg; + while Word > 0 loop + Append (Result, Character'Val (Word and 16#FF#)); + Word := Shift_Right (Word, 8); + end loop; + return Result; + end String_of_U32; + + function Get_Vendor_String return Unbounded_String is + Vendor_String : Unbounded_String; + Registers : CPUID_Registers; + begin + Registers := CPUID (Hypervisor_Leaf); + Vendor_String := String_of_U32 (Registers(2)) & + String_of_U32 (Registers(3)) & + String_of_U32 (Registers(4)); + return Vendor_String; + end Get_Vendor_String; + +end Hypervisor_Check; |
