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_context {
59 struct v3_gprs vm_regs;
72 struct v3_sym_interface * sym_page;
75 uint64_t guest_pg_addr;
78 uint_t active : 1; // activated when symbiotic page MSR is written
79 uint_t sym_call_active : 1;
80 uint_t sym_call_returned : 1;
81 uint_t sym_call_error : 1;
82 } __attribute__((packed));
84 struct v3_sym_context old_ctx;
88 uint64_t sym_call_rip;
90 uint64_t sym_call_rsp;
101 int v3_init_sym_iface(struct guest_info * info);
104 typedef uint64_t sym_arg_t;
106 #define v3_sym_call0(info, call_num) \
107 v3_sym_call(info, call_num, 0, 0, 0, 0, 0)
108 #define v3_sym_call1(info, call_num, arg1) \
109 v3_sym_call(info, call_num, arg1, 0, 0, 0, 0)
110 #define v3_sym_call2(info, call_num, arg1, arg2) \
111 v3_sym_call(info, call_num, arg1, arg2, 0, 0, 0)
112 #define v3_sym_call3(info, call_num, arg1, arg2, arg3) \
113 v3_sym_call(info, call_num, arg1, arg2, arg3, 0, 0)
114 #define v3_sym_call4(info, call_num, arg1, arg2, arg3, arg4) \
115 v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, 0)
116 #define v3_sym_call5(info, call_num, arg1, arg2, arg3, arg4, arg5) \
117 v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, arg5)
122 int v3_sym_map_pci_passthrough(struct guest_info * info, uint_t bus, uint_t dev, uint_t fn);
123 int v3_sym_unmap_pci_passthrough(struct guest_info * info, uint_t bus, uint_t dev, uint_t fn);
126 /* Symcall numbers */
127 #define SYMCALL_TEST 1
128 #define SYMCALL_MEM_LOOKUP 10
131 int v3_sym_call(struct guest_info * info,
132 uint64_t call_num, sym_arg_t * arg0,
133 sym_arg_t * arg1, sym_arg_t * arg2,
134 sym_arg_t * arg3, sym_arg_t * arg4);