Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


reworked device IO hook framework
[palacios.git] / palacios / include / palacios / vmm_dev_mgr.h
1 /*
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.  
5  *
6  * The V3VEE Project is a joint project between Northwestern University
7  * and the University of New Mexico.  You can find out more at 
8  * http://www.v3vee.org
9  *
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.
13  *
14  * Author: Jack Lange <jarusl@cs.northwestern.edu>
15  *
16  * This is free software.  You are permitted to use,
17  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
18  */
19
20 #ifndef _VMM_DEV_MGR
21 #define _VMM_DEV_MGR
22
23 #ifdef __V3VEE__
24
25 #include <palacios/vmm_types.h>
26 #include <palacios/vmm_list.h>
27 #include <palacios/vmm_string.h>
28 #include <palacios/vmm_hashtable.h>
29 #include <palacios/vmm_config.h>
30
31
32 struct v3_vm_info;
33
34 struct v3_device_ops;
35
36
37 struct vm_device {
38     char name[32];
39   
40     void * private_data;
41
42     struct v3_device_ops * ops;
43
44     struct v3_vm_info * vm;
45
46     struct list_head dev_link;
47
48
49     uint_t num_io_hooks;
50     struct list_head io_hooks;
51 };
52
53
54 struct vmm_dev_mgr {
55     uint_t num_devs;
56     struct list_head dev_list;
57     struct hashtable * dev_table;
58
59     struct list_head blk_list;
60     struct hashtable * blk_table;
61
62     struct list_head net_list;
63     struct hashtable * net_table;
64
65     struct list_head char_list;
66     struct hashtable * char_table;
67
68     struct list_head console_list;
69     struct hashtable * console_table;
70
71 };
72
73 int v3_create_device(struct v3_vm_info * vm, const char * dev_name, v3_cfg_tree_t * cfg);
74
75
76 void v3_free_device(struct vm_device * dev);
77
78
79 struct vm_device * v3_find_dev(struct v3_vm_info * info, const char * dev_name);
80
81
82 // Registration of devices
83
84 //
85 // The following device manager functions should only be called
86 // when the guest is stopped
87 //
88
89
90
91 int v3_init_dev_mgr(struct v3_vm_info * vm);
92 int v3_dev_mgr_deinit(struct v3_vm_info * vm);
93
94
95
96
97
98
99 int v3_init_devices();
100
101
102 struct v3_device_ops {
103     int (*free)(struct vm_device *dev);
104
105
106     int (*reset)(struct vm_device *dev);
107
108     int (*start)(struct vm_device *dev);
109     int (*stop)(struct vm_device *dev);
110
111
112     //int (*save)(struct vm_device *dev, struct *iostream);
113     //int (*restore)(struct vm_device *dev, struct *iostream);
114 };
115
116
117
118
119
120
121 int v3_dev_hook_io(struct vm_device   * dev,
122                    ushort_t            port,
123                    int (*read)(struct guest_info * core, ushort_t port, void * dst, uint_t length, void * priv_data),
124                    int (*write)(struct guest_info * core, ushort_t port, void * src, uint_t length, void * priv_data));
125
126 int v3_dev_unhook_io(struct vm_device   *dev,
127                      ushort_t            port);
128
129
130 int v3_attach_device(struct v3_vm_info * vm, struct vm_device * dev);
131 int v3_detach_device(struct vm_device * dev);
132
133 struct vm_device * v3_allocate_device(char * name, struct v3_device_ops * ops, void * private_data);
134
135
136 struct v3_device_info {
137     char * name;
138     int (*init)(struct v3_vm_info * info, v3_cfg_tree_t * cfg);
139 };
140
141
142 #define device_register(name, init_dev_fn)                              \
143     static char _v3_device_name[] = name;                               \
144     static struct v3_device_info _v3_device                             \
145     __attribute__((__used__))                                           \
146         __attribute__((unused, __section__ ("_v3_devices"),             \
147                        aligned(sizeof(addr_t))))                        \
148         = {_v3_device_name , init_dev_fn};
149
150
151
152
153 void v3_print_dev_mgr(struct v3_vm_info * vm);
154
155
156 struct v3_dev_blk_ops {
157     uint64_t (*get_capacity)(void * private_data);
158     // Reads always operate on 2048 byte blocks
159     int (*read)(uint8_t * buf, uint64_t lba, uint64_t num_bytes, void * private_data);
160     int (*write)(uint8_t * buf, uint64_t lba, uint64_t num_bytes, void * private_data);
161 };
162
163 struct v3_dev_net_ops {
164     /* Backend implemented functions */
165     int (*send)(uint8_t * buf, uint32_t count, void * private_data, struct vm_device *dest_dev);
166     void (*start_rx)(void *back_data);
167     void (*stop_rx)(void *back_data);
168
169     /* Frontend implemented functions */
170     int (*recv)(uint8_t * buf, uint32_t count, void * frnt_data);
171     void (*poll)(struct v3_vm_info * vm, void * frnt_data);
172     void (*start_tx)(void * frnt_data);
173     void (*stop_tx)(void * frnt_data);
174
175     /* This is ugly... */
176     void * frontend_data; 
177 };
178
179 struct v3_dev_console_ops {
180
181 };
182
183 struct v3_dev_char_ops {
184     /* Backend implemented functions */
185     int (*write)(uint8_t * buf, uint64_t len, void * private_data);
186     //  int (*read)(uint8_t * buf, uint64_t len, void * private_data);
187
188     /* Frontend Implemented functions */
189     int (*push)(struct v3_vm_info * vm, uint8_t * buf, uint64_t len, void * private_data);
190 };
191
192
193 int v3_dev_add_blk_frontend(struct v3_vm_info * vm, 
194                             char * name, 
195                             int (*connect)(struct v3_vm_info * vm, 
196                                             void * frontend_data, 
197                                             struct v3_dev_blk_ops * ops, 
198                                             v3_cfg_tree_t * cfg, 
199                                             void * private_data), 
200                             void * priv_data);
201
202 int v3_dev_connect_blk(struct v3_vm_info * vm, 
203                        char * frontend_name, 
204                        struct v3_dev_blk_ops * ops, 
205                        v3_cfg_tree_t * cfg, 
206                        void * private_data);
207
208 int v3_dev_add_net_frontend(struct v3_vm_info * vm, 
209                             char * name, 
210                             int (*connect)(struct v3_vm_info * vm, 
211                                             void * frontend_data, 
212                                             struct v3_dev_net_ops * ops, 
213                                             v3_cfg_tree_t * cfg, 
214                                             void * private_data), 
215                             void * priv_data);
216
217 int v3_dev_connect_net(struct v3_vm_info * vm, 
218                        char * frontend_name, 
219                        struct v3_dev_net_ops * ops, 
220                        v3_cfg_tree_t * cfg, 
221                        void * private_data);
222
223
224 int v3_dev_add_char_frontend(struct v3_vm_info * vm, 
225                              char * name, 
226                              int (*connect)(struct v3_vm_info * vm, 
227                                             void * frontend_data, 
228                                             struct v3_dev_char_ops * ops, 
229                                             v3_cfg_tree_t * cfg, 
230                                             void * private_data,
231                                             void ** push_fn_arg), 
232                              void * priv_data);
233
234 int v3_dev_connect_char(struct v3_vm_info * vm, 
235                         char * frontend_name, 
236                         struct v3_dev_char_ops * ops, 
237                         v3_cfg_tree_t * cfg, 
238                         void * private_data, 
239                         void ** push_fn_arg);
240
241
242 #endif // ! __V3VEE__
243
244 #endif