mirror of
https://github.com/daeken/Zookeeper.git
synced 2024-05-15 11:29:33 -04:00
55 lines
1 KiB
C++
55 lines
1 KiB
C++
#pragma once
|
|
#include "Zookeeper.hpp"
|
|
|
|
enum HVReg {
|
|
EIP,
|
|
EFLAGS,
|
|
EAX, ECX, EDX, EBX,
|
|
ESI, EDI, ESP, EBP,
|
|
CS, SS, DS, ES, FS, GS,
|
|
IDT_BASE, IDT_LIMIT,
|
|
GDT_BASE, GDT_LIMIT,
|
|
LDTR, LDT_BASE, LDT_LIMIT, LDT_AR,
|
|
TR, TSS_BASE, TSS_LIMIT, TSS_AR,
|
|
CR0, CR1, CR2, CR3, CR4,
|
|
DR0, DR1, DR2, DR3, DR4, DR5, DR6, DR7,
|
|
TPR, XCR0
|
|
};
|
|
|
|
enum HVExitReason {
|
|
Ignore,
|
|
Unknown,
|
|
EntryFailed,
|
|
Interrupt,
|
|
Exception,
|
|
VmCall,
|
|
PortIO,
|
|
TripleFault,
|
|
Hlt
|
|
};
|
|
|
|
typedef struct exit {
|
|
HVExitReason reason;
|
|
uint32_t error_code;
|
|
uint32_t instruction_length;
|
|
uint32_t interrupt_no;
|
|
|
|
// Used for page faults
|
|
uint32_t address;
|
|
|
|
// Used for port IO
|
|
uint32_t port;
|
|
uint32_t port_size; // 8, 16, or 32 bits
|
|
bool port_direction; // true is OUT, false is IN
|
|
} exit_t;
|
|
|
|
class HV {
|
|
public:
|
|
virtual ~HV() = 0;
|
|
virtual void map_phys(void *memory, uint32_t base, uint32_t size) = 0;
|
|
virtual void invalidate_tlb() = 0;
|
|
virtual uint32_t reg(HVReg reg) = 0;
|
|
virtual void reg(HVReg reg, uint32_t val) = 0;
|
|
virtual exit_t enter() = 0;
|
|
};
|