Community
cancel
Showing results for 
Search instead for 
Did you mean: 
Highlighted
26 Views

CPUID check and CR0 check

Hi all
I'm checking if VMX is supported on the processor and if I'm using paged-protected memory model, and enabling VMX operations.
So this is my asm snippet:
__asm {
mov eax, 1
cpuid
and ecx, 0x20
mov supported, ecx
}
__asm {
mov eax, cr0
and eax, 0x80000000
mov pgMode, eax
mov eax, cr0
and eax, 1
mov ppMode, eax
}
__asm {
or cr4, 0x2000
}
Could it work? (I do checks outside the inline with the boolead values supported, ppMode, pgMode)
Another thing: "ensure that CR4 value supports all the CR4 fixed bits reported inIA_32_VMX_CR4_FIXED" what does it means? (I know what fixed bits are, but how to check the support?)
Thanks!
0 Kudos
2 Replies
Highlighted
Valued Contributor II
26 Views

Hi all
I'm checking if VMX is supported on the processor and if I'm using paged-protected memory model, and enabling VMX operations.
So this is my asm snippet:

__asm {
mov eax, 1
cpuid
and ecx, 0x20
mov supported, ecx
}

[SergeyK] Yes, it will work. A value 1 means thatthe CPU supports VMX (Virtual Machine Extensions )
technology.

__asm {
mov eax, cr0
and eax, 0x80000000
mov pgMode, eax
mov eax, cr0
and eax, 1
mov ppMode, eax
}

[SergeyK] Yes, it will workat priviledge level 0 only. An application cannot read or load the control
registers at priviledge levels 1, 2 and 3, and if executed at these levels an exception
'0xC0000096: Privileged instruction' will be raised.

__asm {
or cr4, 0x2000
}

Could it work? (I do checks outside the inline with the boolead values supported, ppMode, pgMode)
Another thing: "ensure that CR4 value supports all the CR4 fixed bits reported inIA_32_VMX_CR4_FIXED" what does it means? (I know what fixed bits are, but how to check the support?)
Thanks!

0 Kudos
Highlighted
Valued Contributor II
26 Views

There is some support for reading and writing of CRx registers with intrinsic functions declaredin 'intrin.h' header file:

...
__MACHINEX64(unsigned __int64 __readcr0(void))
__MACHINEX64(unsigned __int64 __readcr2(void))
__MACHINEX64(unsigned __int64 __readcr3(void))
__MACHINEX64(unsigned __int64 __readcr4(void))
__MACHINEX64(unsigned __int64 __readcr8(void))
__MACHINEIA32(unsigned long __readcr0(void))
__MACHINEIA32(unsigned long __readcr2(void))
__MACHINEIA32(unsigned long __readcr3(void))
__MACHINEIA32(unsigned long __readcr4(void))
__MACHINEIA32(unsigned long __readcr8(void))

__MACHINEX64(void __writecr0(unsigned __int64))
__MACHINEX64(void __writecr3(unsigned __int64))
__MACHINEX64(void __writecr4(unsigned __int64))
__MACHINEX64(void __writecr8(unsigned __int64))
__MACHINEIA32(void __writecr0(unsigned))
__MACHINEIA32(void __writecr3(unsigned))
__MACHINEIA32(void __writecr4(unsigned))
__MACHINEIA32(void __writecr8(unsigned))
...

0 Kudos