Hypervisor and Memory Management
Core Functions
init()
Initializes the hypervisor for all processor cores.
Returns: vmxroot_error_t
Example:
ScyHV::vmxroot_error_t result = Styx::init();
if (result == STY_SUCCESS) {
std::cout << "Hypervisor initialized successfully" << std::endl;
}
initPTB()
Initializes the Page Table Base.
Returns: bool
Example:
if (Styx::initPTB()) {
std::cout << "Page Table Base initialized successfully" << std::endl;
}
my_dtb()
Retrieves the current Directory Table Base.
Returns: guest_phys_t
Example:
ScyHV::guest_phys_t dtb = Styx::my_dtb();
std::cout << "Current DTB: 0x" << std::hex << dtb << std::endl;
Memory Operations
translate(guest_virt_t virt_addr)
Translates a guest virtual address to a guest physical address.
Parameters:
virt_addr
: Guest virtual address
Returns: guest_phys_t
Example:
ScyHV::guest_virt_t virt_addr = 0x7FFE0000;
ScyHV::guest_phys_t phys_addr = Styx::translate(virt_addr);
std::cout << "Physical address: 0x" << std::hex << phys_addr << std::endl;
read_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size)
Reads from physical memory.
Parameters:
phys_addr
: Physical address to read frombuffer
: Buffer to store read datasize
: Number of bytes to read
Returns: vmxroot_error_t
Example:
char buffer[1024];
ScyHV::guest_phys_t phys_addr = 0x1000;
ScyHV::vmxroot_error_t result = Styx::read_phys(phys_addr, (ScyHV::guest_virt_t)buffer, sizeof(buffer));
if (result == STY_SUCCESS) {
std::cout << "Read successful" << std::endl;
}
write_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size)
Writes to physical memory.
Parameters:
phys_addr
: Physical address to write tobuffer
: Buffer containing data to writesize
: Number of bytes to write
Returns: vmxroot_error_t
Example:
char data[] = "Hello, World!";
ScyHV::guest_phys_t phys_addr = 0x2000;
ScyHV::vmxroot_error_t result = Styx::write_phys(phys_addr, (ScyHV::guest_virt_t)data, strlen(data));
if (result == STY_SUCCESS) {
std::cout << "Write successful" << std::endl;
}
read_km(void* dst, void* src, size_t size)
Reads from kernel memory.
Parameters:
dst
: Destination buffersrc
: Source address in kernel memorysize
: Number of bytes to read
Example:
char buffer[1024];
void* kernel_addr = (void*)0xFFFF8000000000;
Styx::read_km(buffer, kernel_addr, sizeof(buffer));
write_km(void* dst, void* src, size_t size)
Writes to kernel memory.
Parameters:
dst
: Destination address in kernel memorysrc
: Source buffersize
: Number of bytes to write
Example:
char data[] = "Kernel data";
void* kernel_addr = (void*)0xFFFF8000001000;
Styx::write_km(kernel_addr, data, strlen(data));
copy_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, guest_phys_t dirbase_dest, guest_virt_t virt_dest, u64 size)
Copies memory between virtual addresses.
Parameters:
dirbase_src
: Source directory basevirt_src
: Source virtual addressdirbase_dest
: Destination directory basevirt_dest
: Destination virtual addresssize
: Number of bytes to copy
Returns: vmxroot_error_t
Example:
ScyHV::guest_phys_t src_dirbase = 0x1000;
ScyHV::guest_virt_t src_virt = 0x7FFE0000;
ScyHV::guest_phys_t dest_dirbase = 0x2000;
ScyHV::guest_virt_t dest_virt = 0x7FFF0000;
ScyHV::u64 size = 1024;
ScyHV::vmxroot_error_t result = Styx::copy_virt(src_dirbase, src_virt, dest_dirbase, dest_virt, size);
if (result == STY_SUCCESS) {
std::cout << "Virtual memory copy successful" << std::endl;
}
Last updated