2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
21 #ifndef __VMM_SYM_IFACE_H__
22 #define __VMM_SYM_IFACE_H__
28 struct v3_sym_interface {
32 uint32_t feature_flags;
34 uint_t pci_map_valid : 1;
35 uint32_t sym_call_enabled : 1;
36 } __attribute__((packed));
37 } __attribute__((packed));
42 uint32_t sym_call_active : 1;
43 } __attribute__((packed));
44 } __attribute__((packed));
46 uint64_t current_proc;
49 uint8_t pci_pt_map[(4 * 256) / 8]; // we're hardcoding this: (4 busses, 256 max devs)
51 } __attribute__((packed));
55 #include <palacios/vm_guest.h>
58 struct v3_sym_core_context {
59 struct v3_gprs vm_regs;
69 struct v3_symcall_state{
71 uint_t active : 1; // activated when symbiotic page MSR is written
72 uint_t sym_call_active : 1;
73 uint_t sym_call_returned : 1;
74 uint_t sym_call_error : 1;
75 } __attribute__((packed));
77 struct v3_sym_core_context old_ctx;
81 uint64_t sym_call_rip;
83 uint64_t sym_call_rsp;
90 struct v3_sym_interface * sym_page;
93 uint64_t guest_pg_addr;
95 struct v3_symcall_state * symcalls;
104 int v3_init_sym_iface(struct v3_vm_info * vm);
107 typedef uint64_t sym_arg_t;
109 #define v3_sym_call0(info, call_num) \
110 v3_sym_call(info, call_num, 0, 0, 0, 0, 0)
111 #define v3_sym_call1(info, call_num, arg1) \
112 v3_sym_call(info, call_num, arg1, 0, 0, 0, 0)
113 #define v3_sym_call2(info, call_num, arg1, arg2) \
114 v3_sym_call(info, call_num, arg1, arg2, 0, 0, 0)
115 #define v3_sym_call3(info, call_num, arg1, arg2, arg3) \
116 v3_sym_call(info, call_num, arg1, arg2, arg3, 0, 0)
117 #define v3_sym_call4(info, call_num, arg1, arg2, arg3, arg4) \
118 v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, 0)
119 #define v3_sym_call5(info, call_num, arg1, arg2, arg3, arg4, arg5) \
120 v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, arg5)
125 int v3_sym_map_pci_passthrough(struct v3_vm_info * vm, uint_t bus, uint_t dev, uint_t fn);
126 int v3_sym_unmap_pci_passthrough(struct v3_vm_info * vm, uint_t bus, uint_t dev, uint_t fn);
129 /* Symcall numbers */
130 #define SYMCALL_TEST 1
131 #define SYMCALL_MEM_LOOKUP 10
134 int v3_sym_call(struct guest_info * info,
135 uint64_t call_num, sym_arg_t * arg0,
136 sym_arg_t * arg1, sym_arg_t * arg2,
137 sym_arg_t * arg3, sym_arg_t * arg4);