220#if L4_MWORD_BITS == 32
222#elif L4_MWORD_BITS == 64
225 #error Unsupported machine word size.
602 unsigned size = (field >> 13) & 0x03U;
625 unsigned index = field & 0x3feU;
626 unsigned size = (field >> 13) & 0x03U;
627 unsigned group = (field >> 10) & 0x03U;
629 unsigned shifted_index = index << vmcs->offset_table.index_shifts[size];
631 if (shifted_index >= (
unsigned)vmcs->offset_table.limits[size][group] * 64)
634 return (
unsigned)vmcs->offset_table.offsets[size][group] * 64
642 unsigned offset = l4_vm_vmx_field_offset(vmcs, field);
646 return (
void *)(vmcs->values + offset);
659 *offset = l4_vm_vmx_field_offset(vmcs, field);
663 return (
void *)(vmcs->values + *offset);
676 vmcs->dirty_bitmap[offset / 8] |= 1U << (offset % 8);
688 unsigned base_offset = vmcs->offset_table.base_offset * 64;
689 unsigned size = vmcs->offset_table.size * 64;
691 void *dst = _dst + base_offset;
692 void const *src = _src + base_offset;
693 __builtin_memcpy(dst, src, size);
704 if (*current_vmcs_ptr != dest_vmcs)
708 l4_vm_vmx_copy_values(vmcs, dest_vmcs->values, vmcs->values);
711 __builtin_memcpy(dest_vmcs->dirty_bitmap, vmcs->dirty_bitmap,
714 *current_vmcs_ptr = 0;
725 if (*current_vmcs_ptr == src_vmcs)
728 if (*current_vmcs_ptr && *current_vmcs_ptr != src_vmcs)
731 *current_vmcs_ptr = src_vmcs;
734 l4_vm_vmx_copy_values(vmcs, vmcs->values, src_vmcs->values);
737 __builtin_memcpy(vmcs->dirty_bitmap, src_vmcs->dirty_bitmap,
789 unsigned size = (field >> 13) & 0x03U;
809 = (
l4_umword_t *)l4_vm_vmx_field_ptr_offset(vmcs, field, &offset);
811 if ((ptr) && (*ptr != val))
814 l4_vm_vmx_offset_dirty(vmcs, offset);
825 = (
l4_uint16_t *)l4_vm_vmx_field_ptr_offset(vmcs, field, &offset);
827 if ((ptr) && (*ptr != val))
830 l4_vm_vmx_offset_dirty(vmcs, offset);
841 = (
l4_uint32_t *)l4_vm_vmx_field_ptr_offset(vmcs, field, &offset);
843 if ((ptr) && (*ptr != val))
846 l4_vm_vmx_offset_dirty(vmcs, offset);
857 = (
l4_uint64_t *)l4_vm_vmx_field_ptr_offset(vmcs, field, &offset);
859 if ((ptr) && (*ptr != val))
862 l4_vm_vmx_offset_dirty(vmcs, offset);
871 unsigned size = (field >> 13) & 0x03U;
887 return vcpu_state->infos.caps[caps_reg];
895 return vcpu_state->infos.dfl1[dfl1_reg];
902 return vmcs->cr2_index;
910 vmcs->vmcs = vmcs_cap;
unsigned long l4_umword_t
Unsigned machine word.
unsigned char l4_uint8_t
Unsigned 8bit value.
unsigned int l4_uint32_t
Unsigned 32bit value.
unsigned short int l4_uint16_t
Unsigned 16bit value.
unsigned long long l4_uint64_t
Unsigned 64bit value.
unsigned long l4_cap_idx_t
Capability selector type.
@ L4_CAP_MASK
Mask to get only the relevant bits of an l4_cap_idx_t.
@ L4_VCPU_OFFSET_EXT_INFOS
Offset where extended infos begin.
@ L4_VCPU_OFFSET_EXT_STATE
Offset where extended state begins.
void l4_vm_vmx_write_nat(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field, l4_umword_t val) L4_NOTHROW
Write to a natural-width software VMCS field.
void l4_vm_vmx_write(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field, l4_uint64_t val) L4_NOTHROW
Write to an arbitrary software VMCS field.
l4_umword_t l4_vm_vmx_read_nat(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field) L4_NOTHROW
Read a natural-width software VMCS field.
L4_vm_vmx_sw_fields
Additional (software-defined) VMCS fields.
l4_uint64_t l4_vm_vmx_read_64(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field) L4_NOTHROW
Read a 64-bit software VMCS field.
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_ptr_load(l4_vm_vmx_vcpu_vmcs_t *vmcs, l4_vm_vmx_vcpu_vmcs_t *src_vmcs) L4_NOTHROW
Load the content from a different software VMCS to the software VMCS.
l4_cap_idx_t l4_vm_vmx_get_hw_vmcs(l4_vm_vmx_vcpu_vmcs_t *vmcs) L4_NOTHROW
Get the vCPU context (i.e.
l4_uint32_t l4_vm_vmx_get_cr2_index(l4_vm_vmx_vcpu_vmcs_t const *vmcs) L4_NOTHROW
Get the software VMCS field index of the virtual CR2 register.
l4_uint16_t l4_vm_vmx_read_16(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field) L4_NOTHROW
Read a 16-bit software VMCS field.
void l4_vm_vmx_write_64(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field, l4_uint64_t val) L4_NOTHROW
Write to a 64-bit software VMCS field.
void l4_vm_vmx_write_16(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field, l4_uint16_t val) L4_NOTHROW
Write to a 16-bit software VMCS field.
l4_uint64_t l4_vm_vmx_read(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field) L4_NOTHROW
Read any software VMCS field.
void l4_vm_vmx_set_hw_vmcs(l4_vm_vmx_vcpu_vmcs_t *vmcs, l4_cap_idx_t vmcs_cap) L4_NOTHROW
Associate the software VMCS with a vCPU context, i.e.
l4_uint32_t l4_vm_vmx_get_caps_default1(l4_vm_vmx_vcpu_state_t const *vcpu_state, enum L4_vm_vmx_dfl1_regs dfl1_reg) L4_NOTHROW
Get a default to one capability register for VMX.
unsigned l4_vm_vmx_field_len(unsigned field) L4_NOTHROW
Return length in bytes of a VMCS field.
L4_vm_vmx_caps_regs
Exported VMX capability registers.
L4_vm_vmx_vmcs_sizes
Sizes of software VMCS members.
l4_uint64_t l4_vm_vmx_get_caps(l4_vm_vmx_vcpu_state_t const *vcpu_state, enum L4_vm_vmx_caps_regs caps_reg) L4_NOTHROW
Get a capability register for VMX.
l4_uint32_t l4_vm_vmx_read_32(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field) L4_NOTHROW
Read a 32-bit software VMCS field.
void l4_vm_vmx_write_32(l4_vm_vmx_vcpu_vmcs_t *vmcs, unsigned field, l4_uint32_t val) L4_NOTHROW
Write to a 32-bit software VMCS field.
L4_vm_vmx_dfl1_regs
Exported VMX capability registers (default to 1 bits).
void l4_vm_vmx_clear(l4_vm_vmx_vcpu_vmcs_t *vmcs, l4_vm_vmx_vcpu_vmcs_t *dest_vmcs) L4_NOTHROW
Save the content from the software VMCS to a different software VMCS.
@ L4_VM_VMX_VMCS_MSR_LSTAR
VMCS offset of IA32e mode system call target address MSR.
@ L4_VM_VMX_VMCS_NAT_ARG3
Custom argument passed from kernel to user space.
@ L4_VM_VMX_VMCS_MSR_STAR
VMCS offset of system call target address MSR.
@ L4_VM_VMX_VMCS_CR2
Software VMCS offset for CR2.
@ L4_VM_VMX_VMCS_XCR0
VMCS offset of extended control register XCR0.
@ L4_VM_VMX_VMCS_MSR_TSC_AUX
VMCS offset of auxiliary TSC signature MSR.
@ L4_VM_VMX_VMCS_NAT_ARG1
Custom argument passed from kernel to user space.
@ L4_VM_VMX_VMCS_MSR_KERNEL_GS_BASE
VMCS offset of GS base address swap target MSR.
@ L4_VM_VMX_VMCS_NAT_ARG0
Custom argument passed from kernel to user space.
@ L4_VM_VMX_VMCS_NAT_ARG2
Custom argument passed from kernel to user space.
@ L4_VM_VMX_VMCS_MSR_SYSCALL_MASK
VMCS offset of system call flag mask MSR.
@ L4_VM_VMX_VMCS_MSR_CSTAR
VMCS offset of IA32 mode system call target address MSR.
@ L4_VM_VMX_TRUE_PROCBASED_CTLS_REG
True processor based control caps.
@ L4_VM_VMX_MISC_REG
Misc caps.
@ L4_VM_VMX_PROCBASED_CTLS2_REG
Processor based control 2 caps.
@ L4_VM_VMX_EPT_VPID_CAP_REG
EPT and VPID caps.
@ L4_VM_VMX_CR4_FIXED1_REG
Fixed to 1 bits of CR4.
@ L4_VM_VMX_NUM_CAPS_REGS
Total number of VMX capability registers.
@ L4_VM_VMX_CR4_FIXED0_REG
Fixed to 0 bits of CR4.
@ L4_VM_VMX_TRUE_ENTRY_CTLS_REG
True entry control caps.
@ L4_VM_VMX_NESTED_REVISION
Nested VMCS revision.
@ L4_VM_VMX_CR0_FIXED1_REG
Fixed to 1 bits of CR0.
@ L4_VM_VMX_CR0_FIXED0_REG
Fixed to 0 bits of CR0.
@ L4_VM_VMX_VMCS_ENUM_REG
VMCS enumeration info.
@ L4_VM_VMX_TRUE_EXIT_CTLS_REG
True exit control caps.
@ L4_VM_VMX_TRUE_PINBASED_CTLS_REG
True pin-based control caps.
@ L4_VM_VMX_BASIC_REG
Basic VMX capabilities.
@ L4_VM_VMX_VMCS_SIZE_VALUES
Size of the software VMCS values member.
@ L4_VM_VMX_VMCS_SIZE_DIRTY_BITMAP
Size of the software VMCS dirty bitmap member.
@ L4_VM_VMX_ENTRY_CTLS_DFL1_REG
Default 1 bits in entry controls.
@ L4_VM_VMX_EXIT_CTLS_DFL1_REG
Default 1 bits in exit controls.
@ L4_VM_VMX_PINBASED_CTLS_DFL1_REG
Default 1 bits in pin-based controls.
@ L4_VM_VMX_NUM_DFL1_REGS
Total number of default on registers.
@ L4_VM_VMX_PROCBASED_CTLS_DFL1_REG
Default 1 bits in processor-based controls.
#define L4_NOTHROW
Mark a function declaration and definition as never throwing an exception.
#define L4_INLINE
L4 Inline function attribute.
l4_uint64_t caps[L4_VM_VMX_NUM_CAPS_REGS]
Exported VMX capability registers. See L4_vm_vmx_caps_regs.
l4_uint32_t dfl1[L4_VM_VMX_NUM_DFL1_REGS]
Exported VMX capability registers (default to 1 bits).
Software VMCS field offset table.