diff --git a/src/hvpp/hvpp/vcpu.cpp b/src/hvpp/hvpp/vcpu.cpp index d7c9abc..aff5f57 100644 --- a/src/hvpp/hvpp/vcpu.cpp +++ b/src/hvpp/hvpp/vcpu.cpp @@ -4,6 +4,7 @@ #include "lib/assert.h" #include "lib/log.h" #include "lib/mm.h" +#include "lib/cr3_guard.h" #include // std::end() @@ -423,6 +424,31 @@ void vcpu_t::suppress_rip_adjust() noexcept suppress_rip_adjust_ = true; } +auto vcpu_t::guest_memory_mapper() noexcept -> mm::memory_mapper& +{ + return mapper_; +} + +auto vcpu_t::guest_memory_translator() noexcept -> mm::memory_translator& +{ + return translator_; +} + +auto vcpu_t::guest_va_to_pa(va_t guest_va) noexcept -> pa_t +{ + return translator_.va_to_pa(guest_va, ::detail::kernel_cr3(guest_cr3())); +} + +auto vcpu_t::guest_read_memory(va_t guest_va, void* buffer, size_t size, bool ignore_errors /* = false*/) noexcept -> va_t +{ + return translator_.read(guest_va, ::detail::kernel_cr3(guest_cr3()), buffer, size, ignore_errors); +} + +auto vcpu_t::guest_write_memory(va_t guest_va, const void* buffer, size_t size, bool ignore_errors /* = false*/) noexcept -> va_t +{ + return translator_.write(guest_va, ::detail::kernel_cr3(guest_cr3()), buffer, size, ignore_errors); +} + // // Private // diff --git a/src/hvpp/hvpp/vcpu.h b/src/hvpp/hvpp/vcpu.h index 1b2d1c6..e073e96 100644 --- a/src/hvpp/hvpp/vcpu.h +++ b/src/hvpp/hvpp/vcpu.h @@ -6,6 +6,9 @@ #include "lib/error.h" +#include "lib/mm/memory_mapper.h" +#include "lib/mm/memory_translator.h" + #include namespace hvpp { @@ -37,6 +40,17 @@ class vcpu_t final auto context() noexcept -> context_t&; void suppress_rip_adjust() noexcept; + // + // Guest helper methods. + // + + auto guest_memory_mapper() noexcept -> mm::memory_mapper&; + auto guest_memory_translator() noexcept -> mm::memory_translator&; + + auto guest_va_to_pa(va_t guest_va) noexcept -> pa_t; + auto guest_read_memory(va_t guest_va, void* buffer, size_t size, bool ignore_errors = false) noexcept -> va_t; + auto guest_write_memory(va_t guest_va, const void* buffer, size_t size, bool ignore_errors = false) noexcept -> va_t; + // // VMCS manipulation. Implementation is in vcpu.inl. // @@ -346,7 +360,7 @@ class vcpu_t final // If you reorder following three members (stack, exit context // and launch context), you have to edit offsets in vcpu.asm. // - stack_t stack_; + stack_t stack_; union { @@ -354,39 +368,46 @@ class vcpu_t final // As these two contexts are never used at the same time, // they can share the memory. // - context_t context_; - context_t launch_context_; + context_t context_; + context_t launch_context_; }; // // Various VMX structures. // Keep in mind they have "alignas(PAGE_SIZE)" specifier. // - vmx::vmcs_t vmxon_; - vmx::vmcs_t vmcs_; - vmx::msr_bitmap_t msr_bitmap_; - vmx::io_bitmap_t io_bitmap_; + vmx::vmcs_t vmxon_; + vmx::vmcs_t vmcs_; + vmx::msr_bitmap_t msr_bitmap_; + vmx::io_bitmap_t io_bitmap_; // // FXSAVE area - to keep SSE registers sane between VM-exits. // - fxsave_area_t fxsave_area_; + fxsave_area_t fxsave_area_; - vmexit_handler& handler_; - state state_; + vmexit_handler& handler_; + state state_; + + ept_t* ept_; + uint16_t ept_count_; + uint16_t ept_index_; + + // + // + // + mm::memory_mapper mapper_; + mm::memory_translator translator_; - ept_t* ept_; - uint16_t ept_count_; - uint16_t ept_index_; // // Pending interrupt queue (FIFO). // - interrupt_t pending_interrupt_[pending_interrupt_queue_size]; - uint8_t pending_interrupt_first_; - uint8_t pending_interrupt_count_; + interrupt_t pending_interrupt_[pending_interrupt_queue_size]; + uint8_t pending_interrupt_first_; + uint8_t pending_interrupt_count_; - bool suppress_rip_adjust_; + bool suppress_rip_adjust_; }; }