X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_sym_iface.h;h=94b47ec693f191febd50913027db18d9f1980f08;hp=5fcb69ab696b93492305748714ecd60e6ed82c86;hb=ed8feff1d5dd6bf028cd5ba0960ec125505d7597;hpb=1cd2958b5eb63b2ac63ced17447ba3b45c43f51a diff --git a/palacios/include/palacios/vmm_sym_iface.h b/palacios/include/palacios/vmm_sym_iface.h index 5fcb69a..94b47ec 100644 --- a/palacios/include/palacios/vmm_sym_iface.h +++ b/palacios/include/palacios/vmm_sym_iface.h @@ -23,7 +23,7 @@ #ifdef __V3VEE__ - +#include @@ -34,35 +34,100 @@ struct v3_sym_interface { union { uint32_t feature_flags; struct { - uint_t cur_proc_valid : 1; - uint_t proc_list_valid : 1; + uint_t pci_map_valid : 1; + uint32_t sym_call_enabled : 1; + } __attribute__((packed)); + } __attribute__((packed)); + + union { + uint32_t state_flags; + struct { + uint32_t sym_call_active : 1; } __attribute__((packed)); } __attribute__((packed)); - addr_t current_proc; - addr_t proc_list; + 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; - uint8_t pci_pt_map[256 / 8]; } __attribute__((packed)); + + +struct v3_sym_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; + uint8_t cpl; +}; + + + struct v3_sym_state { struct v3_sym_interface * sym_page; addr_t sym_page_pa; - uint_t active; uint64_t guest_pg_addr; + 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); + + void * private_data; + }; 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_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); +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); + +int v3_activate_sym_call(struct guest_info * info); #endif