#include <palacios/vmm_types.h>
#include <palacios/vmm_multiboot.h>
+struct v3_ros_event {
+ enum { ROS_NONE=0, ROS_PAGE_FAULT=1, ROS_SYSCALL=2 } event_type;
+ uint64_t last_ros_event_result; // valid when ROS_NONE
+ union {
+ struct { // valid when ROS_PAGE_FAULT
+ uint64_t rip;
+ uint64_t cr2;
+ enum {ROS_READ, ROS_WRITE} action;
+ } page_fault;
+ struct { // valid when ROS_SYSCALL
+ uint64_t args[8];
+ } syscall;
+ };
+};
+
+struct v3_ros_signal {
+ // swapped atomically at entry check (xchg)
+ // so only one core does entry
+ // code = 0 => no signal is pending
+ uint64_t code;
+
+ // ROS process context we inject to
+ // if any of these are zero, no injection happens
+ // it must be the case that the ROS is at CPL 3
+ // and in user-mode for injection to occur
+ uint64_t cr3;
+ uint64_t handler;
+ uint64_t stack;
+};
+
struct v3_vm_hvm {
uint8_t is_hvm;
uint32_t first_hrt_core;
uint64_t first_hrt_gpa;
- struct v3_cfg_file *hrt_file;
+ struct v3_cfg_file *hrt_file; // image provided via PAL file, if any
+ void *hrt_image; // image provided by ROS, if any
+ uint64_t hrt_image_size; // size of this image
uint64_t hrt_entry_addr;
+
enum { HRT_BLOB, HRT_ELF64, HRT_MBOOT2, HRT_MBOOT64 } hrt_type;
// The following parallel the content of mb_info_hrt_t in
enum {HRT_IDLE=0, HRT_CALL=1, HRT_PARCALL=2, HRT_SYNCSETUP=3, HRT_SYNC=4, HRT_SYNCTEARDOWN=5, HRT_MERGE=6} trans_state;
uint64_t trans_count;
+
+ // the ROS event to be handed back
+ struct v3_ros_event ros_event;
+
+ // user-level interrupt injection state for ROS
+ struct v3_ros_signal ros_signal;
+
};
struct v3_core_hvm {
int v3_setup_hvm_vm_for_boot(struct v3_vm_info *vm);
int v3_setup_hvm_hrt_core_for_boot(struct guest_info *core);
+// 0 is not a valid code
+int v3_hvm_signal_ros(struct v3_vm_info *vm, uint64_t code);
+
int v3_handle_hvm_reset(struct guest_info *core);
+int v3_handle_hvm_entry(struct guest_info *core);
+int v3_handle_hvm_exit(struct guest_info *core);
+
/*
HVM/HRT interaction is as follows:
- flags copied from the HRT's HRT tag (position independence,
page table model, offset, etc)
4. Downcalls:
- hypercall 0xf00df00d with arguments depending on operation
- with examples described below.
+ hypercall 0xf00d with arguments depending on operation
+ with examples described below. Some requests are only
+ allowed from an HRT core (or ROS core). rax is set to -1
+ on error.
5. Upcalls
- interrupt injected by VMM or a magic #PF
- communication via a shared memory page, contents below
+ (To HRT) interrupt injected by VMM or a magic #PF
+ info via a shared memory page, contents below
+ (To ROS) ROS *app* can set itself up to receive a
+ *user-level* "interrupt" manufactured by the VMM
+ our user library automates this, making it look
+ sort of like a signal handler
- Upcalls
+ Upcalls to HRT
Type of upcall is determined by the first 64 bits in the commm page
0x31 => Unmerge address space
return the ROS memory mapping to normal (physical/virtual identity)
- Downcalls
+ Downcalls from ROS or HRT
HVM_HCALL is the general hypercall number used to talk to the HVM
The first argument is the request number (below). The other arguments
0x1 => Reboot ROS
0x2 => Reboot HRT
0x3 => Reboot Both
- 0xf => Get HRT transaction state
+
+ 0x8 => Replace HRT image
+ pass in pointer (gva) and length of new image
+
+ 0xf => Get HRT transaction state and current ROS event
+ first argument is pointer to the ROS event state
+ to be filled out
+
+ 0x10 => ROS event request (HRT->ROS)
+ first argument is pointer where to write the ROS event state
+ 0x1f => ROS event completion (ROS->HRT)
+ first argument is the result code
0x20 => Invoke function (ROS->HRT)
first argument is pointer to structure describing call
release any address space merger and restore identity mapping
0x3f => Merge request complete (HRT->ROS)
+ 0x40 => Install user-mode interrupt/signal handler (ROS)
+ arg1 = handler, arg2 = stack
+
+ 0x41 => Signal ROS handler (HRT->ROS)
+ arg1 = number (must != 0)
+
+ Upcalls to ROS
+
+ (Currently all are application/HRT dependent)
+
*/