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__
26 #include <palacios/vm_guest.h>
30 struct v3_sym_interface {
35 uint32_t feature_flags;
37 uint_t pci_map_valid : 1;
38 uint32_t sym_call_enabled : 1;
39 } __attribute__((packed));
40 } __attribute__((packed));
45 uint32_t sym_call_active : 1;
46 } __attribute__((packed));
47 } __attribute__((packed));
49 uint64_t current_proc;
52 uint8_t pci_pt_map[(4 * 256) / 8]; // we're hardcoding this: (4 busses, 256 max devs)
57 } __attribute__((packed));
62 struct v3_sym_context {
63 struct v3_gprs vm_regs;
77 struct v3_sym_interface * sym_page;
80 uint64_t guest_pg_addr;
83 uint_t active : 1; // activated when symbiotic page MSR is written
84 uint_t sym_call_active : 1;
85 uint_t sym_call_returned : 1;
86 uint_t sym_call_error : 1;
87 } __attribute__((packed));
89 struct v3_sym_context old_ctx;
93 uint64_t sym_call_rip;
95 uint64_t sym_call_rsp;
100 int v3_init_sym_iface(struct guest_info * info);
103 typedef uint64_t sym_arg_t;
105 #define v3_sym_call0(info, call_num) \
106 v3_sym_call(info, call_num, 0, 0, 0, 0, 0)
107 #define v3_sym_call1(info, call_num, arg1) \
108 v3_sym_call(info, call_num, arg1, 0, 0, 0, 0)
109 #define v3_sym_call2(info, call_num, arg1, arg2) \
110 v3_sym_call(info, call_num, arg1, arg2, 0, 0, 0)
111 #define v3_sym_call3(info, call_num, arg1, arg2, arg3) \
112 v3_sym_call(info, call_num, arg1, arg2, arg3, 0, 0)
113 #define v3_sym_call4(info, call_num, arg1, arg2, arg3, arg4) \
114 v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, 0)
115 #define v3_sym_call5(info, call_num, arg1, arg2, arg3, arg4, arg5) \
116 v3_sym_call(info, call_num, arg1, arg2, arg3, arg4, arg5)
121 int v3_sym_map_pci_passthrough(struct guest_info * info, uint_t bus, uint_t dev, uint_t fn);
122 int v3_sym_unmap_pci_passthrough(struct guest_info * info, uint_t bus, uint_t dev, uint_t fn);
125 /* Symcall numbers */
126 #define SYMCALL_TEST 1
127 #define SYMCALL_MEM_LOOKUP 10
130 int v3_sym_call(struct guest_info * info,
131 uint64_t call_num, sym_arg_t * arg0,
132 sym_arg_t * arg1, sym_arg_t * arg2,
133 sym_arg_t * arg3, sym_arg_t * arg4);