26 #include <l4/sys/vcpu.h> 165 l4_vm_vmx_field_ptr(
void *vmcs,
unsigned field)
L4_NOTHROW;
349 case 3:
if (
sizeof(
l4_umword_t) == 8)
return 3;
else return 2;
398 l4_vm_vmx_field_offset(
void const *vmcs,
unsigned field)
L4_NOTHROW 404 return (
unsigned)offsets[field >> 10] * 64 + ((field & 0x3ff) << offsets[Si + (field >> 13)]);
409 l4_vm_vmx_field_ptr(
void *vmcs,
unsigned field)
L4_NOTHROW 411 return (
void *)((
char *)vmcs + l4_vm_vmx_field_offset(vmcs, field));
420 l4_vm_vmx_copy_state(
void const *vmcs,
void *_dst,
void const *_src)
L4_NOTHROW 424 unsigned offs = offsets[28] * 64;
425 unsigned size = offsets[29] * 64;
426 char *
const dst = (
char*)_dst + offs;
427 char const *
const src = (
char const *)_src + offs;
428 __builtin_memcpy(dst, src, size);
435 void **current_vmcs = (
void **)((
char *)vmcs + 8);
436 if (*current_vmcs != user_vmcs)
439 l4_vm_vmx_copy_state(vmcs, user_vmcs, vmcs);
447 void **current_vmcs = (
void **)((
char *)vmcs + 8);
448 if (*current_vmcs == user_vmcs)
451 if (*current_vmcs && *current_vmcs != user_vmcs)
454 *current_vmcs = user_vmcs;
455 l4_vm_vmx_copy_state(vmcs, vmcs, user_vmcs);
462 {
return *(
l4_umword_t*)(l4_vm_vmx_field_ptr(vmcs, field)); }
467 {
return *(
l4_uint16_t*)(l4_vm_vmx_field_ptr(vmcs, field)); }
472 {
return *(
l4_uint32_t*)(l4_vm_vmx_field_ptr(vmcs, field)); }
477 {
return *(
l4_uint64_t*)(l4_vm_vmx_field_ptr(vmcs, field)); }
496 { *(
l4_umword_t*)(l4_vm_vmx_field_ptr(vmcs, field)) = val; }
501 { *(
l4_uint16_t*)(l4_vm_vmx_field_ptr(vmcs, field)) = val; }
506 { *(
l4_uint32_t*)(l4_vm_vmx_field_ptr(vmcs, field)) = val; }
511 { *(
l4_uint64_t*)(l4_vm_vmx_field_ptr(vmcs, field)) = val; }
532 return caps[cap_msr & 0xf];
void l4_vm_vmx_ptr_load(void *vmcs, void *user_vmcs) L4_NOTHROW
Loads the user_vmcs as the current VMCS.
void l4_vm_vmx_write_nat(void *vmcs, unsigned field, l4_umword_t val) L4_NOTHROW
Write to a natural width VMCS field.
Default 1 bits in exit controls.
void l4_vm_vmx_write_32(void *vmcs, unsigned field, l4_uint32_t val) L4_NOTHROW
Write to a 32bit VMCS field.
unsigned short int l4_uint16_t
Unsigned 16bit value.
l4_uint16_t l4_vm_vmx_read_16(void *vmcs, unsigned field) L4_NOTHROW
Read a 16bit VMCS field.
Default 1 bits in processor-based controls.
L4_vm_vmx_dfl1_regs
Exported VMX capability registers (default to 1 bits).
unsigned l4_vm_vmx_field_order(unsigned field) L4_NOTHROW
Return length in power of two (bytes) of a VMCS field.
void l4_vm_vmx_write(void *vmcs, unsigned field, l4_uint64_t val) L4_NOTHROW
Write to an arbitrary VMCS field.
VMCS offset of system call flag mask MSR.
True pin-based control caps.
Offset where extended infos begin.
unsigned l4_vm_vmx_field_len(unsigned field) L4_NOTHROW
Return length in bytes of a VMCS field.
Total number of VMX capability registers.
l4_uint32_t l4_vm_vmx_read_32(void *vmcs, unsigned field) L4_NOTHROW
Read a 32bit VMCS field.
VMCS offset of system call target address MSR.
VMCS offset of extended control register XCR0.
Default 1 bits in pin-based controls.
void l4_vm_vmx_write_64(void *vmcs, unsigned field, l4_uint64_t val) L4_NOTHROW
Write to a 64bit VMCS field.
Default 1 bits in entry controls.
unsigned long l4_umword_t
Unsigned machine word.
void l4_vm_vmx_clear(void *vmcs, void *user_vmcs) L4_NOTHROW
Saves cached state from the kernel VMCS to the user VMCS.
l4_uint64_t l4_vm_vmx_get_caps(void const *vcpu_state, unsigned cap_msr) L4_NOTHROW
Get a capability register for VMX.
l4_uint64_t l4_vm_vmx_read(void *vmcs, unsigned field) L4_NOTHROW
Read any VMCS field.
l4_uint64_t l4_vm_vmx_read_64(void *vmcs, unsigned field) L4_NOTHROW
Read a 64bit VMCS field.
VMCS offset of IA32e mode system call target address MSR.
VMCS offset of IA32 mode system call target address MSR.
unsigned char l4_uint8_t
Unsigned 8bit value.
l4_umword_t l4_vm_vmx_read_nat(void *vmcs, unsigned field) L4_NOTHROW
Read a natural width VMCS field.
True processor based control caps.
l4_uint32_t l4_vm_vmx_get_caps_default1(void const *vcpu_state, unsigned cap_msr) L4_NOTHROW
Get a default to one capability register for VMX.
Total number of default on registers.
void l4_vm_vmx_write_16(void *vmcs, unsigned field, l4_uint16_t val) L4_NOTHROW
Write to a 16bit VMCS field.
VMCS offset of auxiliary TSC signature MSR.
unsigned long long l4_uint64_t
Unsigned 64bit value.
Processor based control 2 caps.
unsigned int l4_uint32_t
Unsigned 32bit value.
L4_vm_vmx_caps_regs
Exported VMX capability registers.
l4_uint32_t l4_vm_vmx_get_cr2_index(void const *vmcs) L4_NOTHROW
Get the VMCS field index of the virtual CR2 register.
#define L4_NOTHROW
Mark a function declaration and definition as never throwing an exception.
VMCS offset of GS base address swap target MSR.