Skip to content

Commit

Permalink
make memory_mapper' & memory_translator' part of `vcpu_t'
Browse files Browse the repository at this point in the history
This will come in handy in `vmexit_handler' classes, when reading guest virtual memory is needed.
  • Loading branch information
wbenny committed Jul 24, 2019
1 parent b4087db commit 4404207
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 17 deletions.
26 changes: 26 additions & 0 deletions src/hvpp/hvpp/vcpu.cpp
Expand Up @@ -4,6 +4,7 @@
#include "lib/assert.h"
#include "lib/log.h"
#include "lib/mm.h"
#include "lib/cr3_guard.h"

#include <iterator> // std::end()

Expand Down Expand Up @@ -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
//
Expand Down
55 changes: 38 additions & 17 deletions src/hvpp/hvpp/vcpu.h
Expand Up @@ -6,6 +6,9 @@

#include "lib/error.h"

#include "lib/mm/memory_mapper.h"
#include "lib/mm/memory_translator.h"

#include <cstdint>

namespace hvpp {
Expand Down Expand Up @@ -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.
//
Expand Down Expand Up @@ -346,47 +360,54 @@ 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
{
//
// 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_;
};

}

0 comments on commit 4404207

Please sign in to comment.