diff --git a/repos/base-hw/include/spec/x86_64/cpu/vcpu_state_virtualization.h b/repos/base-hw/include/spec/x86_64/cpu/vcpu_state_virtualization.h index d4ae456ee6..87c414c6d1 100644 --- a/repos/base-hw/include/spec/x86_64/cpu/vcpu_state_virtualization.h +++ b/repos/base-hw/include/spec/x86_64/cpu/vcpu_state_virtualization.h @@ -14,9 +14,9 @@ #ifndef _INCLUDE__SPEC__PC__VM_STATE_H_ #define _INCLUDE__SPEC__PC__VM_STATE_H_ +#include /* x86 CPU state */ #include -#include namespace Genode { @@ -28,7 +28,8 @@ namespace Genode { struct Genode::Vm_data { - Board::Vmcb vmcb; + alignas(Genode::get_page_size()) + uint8_t vmcb[get_page_size()]; Genode::addr_t vmcb_phys_addr; Genode::Vcpu_state * vcpu_state; }; diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/board.h b/repos/base-hw/src/core/spec/x86_64/virtualization/board.h index c45c8cfc3c..28a20860d9 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/board.h +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/board.h @@ -61,8 +61,7 @@ namespace Kernel { struct Board::Vcpu_context { - Vcpu_context(unsigned id, void *vcpu_data_ptr, - Genode::addr_t context_phys_addr); + Vcpu_context(unsigned id, void *vcpu_data_ptr); void initialize_svm(Kernel::Cpu &cpu, void *table); void read_vcpu_state(Genode::Vcpu_state &state); void write_vcpu_state(Genode::Vcpu_state &state); diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/svm.cc b/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/svm.cc index 2a75043e7b..6e6f43a732 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/svm.cc +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/svm.cc @@ -24,14 +24,13 @@ using Kernel::Vm; using Board::Vmcb; -Vmcb::Vmcb(Genode::uint32_t id, Genode::addr_t addr) +Vmcb::Vmcb(Genode::uint32_t id) : Mmio((Genode::addr_t)this) { write(id); write(dummy_msrpm()); write(dummy_iopm()); - phys_addr = addr; /* * Set the guest PAT register to the default value. diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/vm.cc b/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/vm.cc index 51dead25fd..06367eaea2 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/kernel/vm.cc @@ -47,7 +47,7 @@ Vm::Vm(Irq::Pool & user_irq_pool, _state(*data.vcpu_state), _context(context), _id(id), - _vcpu_context(id.id, &data.vmcb, data.vmcb_phys_addr) + _vcpu_context(id.id, data.vmcb) { affinity(cpu); } @@ -78,7 +78,7 @@ void Vm::proceed(Cpu & cpu) * we can pop it later */ _vcpu_context.regs->trapno = _vcpu_context.vmcb.root_vmcb_phys; - Hypervisor::switch_world(_vcpu_context.vmcb.phys_addr, + Hypervisor::switch_world(_vcpu_context.vmcb.vm_data()->vmcb_phys_addr, (addr_t) &_vcpu_context.regs->r8, _vcpu_context.regs->fpu_context()); /* @@ -175,10 +175,9 @@ void Vm::_sync_from_vmm() } -Board::Vcpu_context::Vcpu_context(unsigned id, void *vcpu_data_ptr, - Genode::addr_t context_phys_addr) +Board::Vcpu_context::Vcpu_context(unsigned id, void *vcpu_data_ptr) : - vmcb(*Genode::construct_at(vcpu_data_ptr, id, context_phys_addr)), + vmcb(*Genode::construct_at(vcpu_data_ptr, id)), regs(1) { regs->trapno = TRAP_VMEXIT; diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/svm.h b/repos/base-hw/src/core/spec/x86_64/virtualization/svm.h index d21f950b06..1ac88f2d3e 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/svm.h +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/svm.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -76,7 +77,7 @@ struct Board::Vmcb_control_area struct Board::Vmcb_reserved_for_host { /* 64bit used by the inherited Mmio class here */ - Genode::addr_t phys_addr = 0U; + Genode::uint64_t _reserved[1]; Genode::addr_t root_vmcb_phys = 0U; }; static_assert(Board::Vmcb_control_area::total_size - @@ -143,7 +144,7 @@ struct alignas(Genode::get_page_size()) Board::Vmcb Asid_host = 0, }; - Vmcb(Genode::uint32_t id, Genode::addr_t addr = 0); + Vmcb(Genode::uint32_t id); void init(Genode::size_t cpu_id, void * table_ptr); static Vmcb & host_vmcb(Genode::size_t cpu_id); static Genode::addr_t dummy_msrpm(); @@ -154,6 +155,11 @@ struct alignas(Genode::get_page_size()) Board::Vmcb sizeof(Board::Vmcb_state_save_area) - Board::Vmcb_control_area::total_size]; + Genode::Vm_data * vm_data() + { + return reinterpret_cast(this); + } + /* * AMD Manual Vol. 2, Table B-1: VMCB Layout, Control Area */ diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/vm_session_component.cc b/repos/base-hw/src/core/spec/x86_64/virtualization/vm_session_component.cc index c065c50387..f32622b0fc 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/vm_session_component.cc @@ -116,7 +116,7 @@ Genode::addr_t Vm_session_component::_alloc_vm_data(Genode::addr_t ds_addr) Genode::Vm_data* vm_data = (Genode::Vm_data *) vm_data_ptr; vm_data->vcpu_state = (Genode::Vcpu_state *) ds_addr; - vm_data->vmcb_phys_addr = (addr_t)cma().phys_addr(&vm_data->vmcb); + vm_data->vmcb_phys_addr = (addr_t)cma().phys_addr(vm_data->vmcb); return (Genode::addr_t) vm_data_ptr; }