X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_sym_iface.h;h=ddda44731754c64b970c1a3f05f6031d4b6bc3db;hb=f1e6da297651aadbc037f1635a82f41285a0a424;hp=94b47ec693f191febd50913027db18d9f1980f08;hpb=ed8feff1d5dd6bf028cd5ba0960ec125505d7597;p=palacios.git diff --git a/palacios/include/palacios/vmm_sym_iface.h b/palacios/include/palacios/vmm_sym_iface.h index 94b47ec..ddda447 100644 --- a/palacios/include/palacios/vmm_sym_iface.h +++ b/palacios/include/palacios/vmm_sym_iface.h @@ -23,111 +23,128 @@ #ifdef __V3VEE__ -#include -struct v3_sym_interface { +struct v3_sym_global_page { uint64_t magic; - union { uint32_t feature_flags; struct { - uint_t pci_map_valid : 1; - uint32_t sym_call_enabled : 1; + uint_t pci_map_valid : 1; } __attribute__((packed)); } __attribute__((packed)); + + uint8_t pci_pt_map[(4 * 256) / 8]; // we're hardcoding this: (4 busses, 256 max devs) + +} __attribute__((packed)); + +struct v3_sym_local_page { + uint64_t magic; union { uint32_t state_flags; struct { uint32_t sym_call_active : 1; + uint32_t sym_call_enabled : 1; } __attribute__((packed)); } __attribute__((packed)); - - uint64_t current_proc; - uint64_t proc_list; - - uint8_t pci_pt_map[(4 * 256) / 8]; // we're hardcoding this: (4 busses, 256 max devs) - - - uint64_t sym_call_rip; - uint64_t sym_call_cs; - uint64_t sym_call_rsp; - uint64_t sym_call_gs; - uint64_t sym_call_ret_fn; - } __attribute__((packed)); +#include -struct v3_sym_context { +struct v3_sym_cpu_context { struct v3_gprs vm_regs; struct v3_segment cs; struct v3_segment ss; uint64_t gs_base; uint64_t fs_base; uint64_t rip; + uint64_t flags; uint8_t cpl; }; +struct v3_symcall_state { + struct { + uint_t sym_call_active : 1; + uint_t sym_call_returned : 1; + uint_t sym_call_error : 1; + } __attribute__((packed)); + struct v3_sym_cpu_context old_ctx; -struct v3_sym_state { - - struct v3_sym_interface * sym_page; - addr_t sym_page_pa; + int sym_call_errno; - uint64_t guest_pg_addr; + uint64_t sym_call_rip; + uint64_t sym_call_cs; + uint64_t sym_call_rsp; + uint64_t sym_call_gs; + uint64_t sym_call_fs; +}; + +struct v3_sym_global_state { + struct v3_sym_global_page * sym_page; + + addr_t global_page_pa; + uint64_t global_guest_pa; + + int active; // activated when symbiotic page MSR is written +}; - struct { - uint_t active : 1; - uint_t call_pending : 1; - uint_t call_active : 1; - } __attribute__((packed)); - struct v3_sym_context old_ctx; - uint64_t args[6]; - int (*notifier)(struct guest_info * info, void * private_data); +struct v3_sym_local_state { + struct v3_sym_local_page * local_page; - void * private_data; + addr_t local_page_pa; + uint64_t local_guest_pa; + struct v3_symcall_state symcall_state; + + int active; // activated when symbiotic page MSR is written }; -int v3_init_sym_iface(struct guest_info * info); -#define v3_sym_call0(info, call_num, cb, priv) \ - v3_sym_call(info, call_num, 0, 0, 0, 0, 0, cb, priv) -#define v3_sym_call1(info, call_num, arg1, cb, priv) \ - v3_sym_call(info, call_num, arg1, 0, 0, 0, 0, cb, priv) -#define v3_sym_call2(info, call_num, arg1, arg2, cb, priv) \ - v3_sym_call(info, call_num, arg1, arg2, 0, 0, 0, cb, priv) -#define v3_sym_call3(info, call_num, arg1, arg2, arg3, cb, priv) \ - v3_sym_call(info, call_num, arg1, arg2, arg3, 0, 0, cb, priv) -#define v3_sym_call4(info, call_num, arg1, arg2, arg3, arg4, cb, priv) \ - v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, 0, cb, priv) -#define v3_sym_call5(info, call_num, arg1, arg2, arg3, arg4, arg5, cb, priv) \ - v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, arg5, cb, priv) + +int v3_init_sym_iface(struct v3_vm_info * vm); +int v3_init_sym_core(struct guest_info * core); + +typedef uint64_t sym_arg_t; + +#define v3_sym_call0(info, call_num) \ + v3_sym_call(info, call_num, 0, 0, 0, 0, 0) +#define v3_sym_call1(info, call_num, arg1) \ + v3_sym_call(info, call_num, arg1, 0, 0, 0, 0) +#define v3_sym_call2(info, call_num, arg1, arg2) \ + v3_sym_call(info, call_num, arg1, arg2, 0, 0, 0) +#define v3_sym_call3(info, call_num, arg1, arg2, arg3) \ + v3_sym_call(info, call_num, arg1, arg2, arg3, 0, 0) +#define v3_sym_call4(info, call_num, arg1, arg2, arg3, arg4) \ + v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, 0) +#define v3_sym_call5(info, call_num, arg1, arg2, arg3, arg4, arg5) \ + v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, arg5) + +int v3_sym_map_pci_passthrough(struct v3_vm_info * vm, uint_t bus, uint_t dev, uint_t fn); +int v3_sym_unmap_pci_passthrough(struct v3_vm_info * vm, uint_t bus, uint_t dev, uint_t fn); -int v3_sym_map_pci_passthrough(struct guest_info * info, uint_t bus, uint_t dev, uint_t fn); -int v3_sym_unmap_pci_passthrough(struct guest_info * info, uint_t bus, uint_t dev, uint_t fn); +/* Symcall numbers */ +#define SYMCALL_TEST 1 +#define SYMCALL_MEM_LOOKUP 10 +/* ** */ int v3_sym_call(struct guest_info * info, - uint64_t arg0, uint64_t arg1, - uint64_t arg2, uint64_t arg3, - uint64_t arg4, uint64_t arg5, - int (*notifier)(struct guest_info * info, void * private_data), - void * private_data); + uint64_t call_num, sym_arg_t * arg0, + sym_arg_t * arg1, sym_arg_t * arg2, + sym_arg_t * arg3, sym_arg_t * arg4); -int v3_activate_sym_call(struct guest_info * info); #endif