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.


Updated devices to remove vm_device dependencies.
[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 typedef void * v3_dev_data_t;
37
38 struct vm_device;
39
40 struct vm_device {
41     char name[32];
42   
43     void * private_data;
44
45     struct v3_device_ops * ops;
46
47     struct v3_vm_info * vm;
48
49     struct list_head dev_link;
50
51
52     uint_t num_io_hooks;
53     struct list_head io_hooks;
54 };
55
56
57 struct vmm_dev_mgr {
58     uint_t num_devs;
59     struct list_head dev_list;
60     struct hashtable * dev_table;
61
62     struct list_head blk_list;
63     struct hashtable * blk_table;
64
65     struct list_head net_list;
66     struct hashtable * net_table;
67
68     struct list_head char_list;
69     struct hashtable * char_table;
70
71     struct list_head cons_list;
72     struct hashtable * cons_table;
73
74 };
75
76 int v3_create_device(struct v3_vm_info * vm, const char * dev_name, v3_cfg_tree_t * cfg);
77
78
79 void v3_free_device(struct vm_device * dev);
80
81
82 struct vm_device * v3_find_dev(struct v3_vm_info * info, const char * dev_name);
83
84
85 // Registration of devices
86
87 //
88 // The following device manager functions should only be called
89 // when the guest is stopped
90 //
91
92
93
94 int v3_init_dev_mgr(struct v3_vm_info * vm);
95 int v3_dev_mgr_deinit(struct v3_vm_info * vm);
96
97
98
99
100
101
102 int v3_init_devices();
103
104
105 struct v3_device_ops {
106     int (*free)(struct vm_device * dev);
107
108     //int (*save)(struct vm_device *dev, struct *iostream);
109     //int (*restore)(struct vm_device *dev, struct *iostream);
110 };
111
112
113
114
115
116
117 int v3_dev_hook_io(struct vm_device   * dev,
118                    ushort_t            port,
119                    int (*read)(struct guest_info * core, ushort_t port, void * dst, uint_t length, void * priv_data),
120                    int (*write)(struct guest_info * core, ushort_t port, void * src, uint_t length, void * priv_data));
121
122 int v3_dev_unhook_io(struct vm_device   * dev,
123                      ushort_t            port);
124
125
126 int v3_attach_device(struct v3_vm_info * vm, struct vm_device * dev);
127 int v3_detach_device(struct vm_device * dev);
128
129 struct vm_device * v3_allocate_device(char * name, struct v3_device_ops * ops, void * private_data);
130
131
132 struct v3_device_info {
133     char * name;
134     int (*init)(struct v3_vm_info * info, v3_cfg_tree_t * cfg);
135 };
136
137
138 #define device_register(name, init_dev_fn)                              \
139     static char _v3_device_name[] = name;                               \
140     static struct v3_device_info _v3_device                             \
141     __attribute__((__used__))                                           \
142         __attribute__((unused, __section__ ("_v3_devices"),             \
143                        aligned(sizeof(addr_t))))                        \
144         = {_v3_device_name , init_dev_fn};
145
146
147
148
149 void v3_print_dev_mgr(struct v3_vm_info * vm);
150
151
152 struct v3_dev_blk_ops {
153     uint64_t (*get_capacity)(void * private_data);
154     // Reads always operate on 2048 byte blocks
155     int (*read)(uint8_t * buf, uint64_t lba, uint64_t num_bytes, void * private_data);
156     int (*write)(uint8_t * buf, uint64_t lba, uint64_t num_bytes, void * private_data);
157 };
158
159 struct v3_dev_net_ops {
160     /* Backend implemented functions */
161     int (*send)(uint8_t * buf, uint32_t count, void * private_data);
162     void (*start_rx)(void * back_data);
163     void (*stop_rx)(void * back_data);
164
165     /* Frontend implemented functions */
166     int (*recv)(uint8_t * buf, uint32_t count, void * frnt_data);
167     void (*poll)(struct v3_vm_info * vm, void * frnt_data);
168     void (*start_tx)(void * frnt_data);
169     void (*stop_tx)(void * frnt_data);
170
171     /* This is ugly... */
172     void * frontend_data; 
173 };
174
175 struct v3_dev_console_ops {
176     int (*update_screen)(uint_t x, uint_t y, uint_t length, uint8_t * fb_data, void * private_data);
177     int (*update_cursor)(uint_t x, uint_t y, void * private_data);
178     int (*scroll)(int rows, void * private_data);
179
180     /* frontend implemented functions */
181     int (*get_screen)(uint_t x, uint_t y, uint_t length, void * frontend_data);
182     void * push_fn_arg;
183 };
184
185 struct v3_dev_char_ops {
186     /* Backend implemented functions */
187     int (*write)(uint8_t * buf, uint64_t len, void * private_data);
188     //  int (*read)(uint8_t * buf, uint64_t len, void * private_data);
189
190     /* Frontend Implemented functions */
191     int (*push)(struct v3_vm_info * vm, uint8_t * buf, uint64_t len, void * private_data);
192 };
193
194
195 int v3_dev_add_blk_frontend(struct v3_vm_info * vm, 
196                             char * name, 
197                             int (*connect)(struct v3_vm_info * vm, 
198                                             void * frontend_data, 
199                                             struct v3_dev_blk_ops * ops, 
200                                             v3_cfg_tree_t * cfg, 
201                                             void * private_data), 
202                             void * priv_data);
203
204 int v3_dev_connect_blk(struct v3_vm_info * vm, 
205                        char * frontend_name, 
206                        struct v3_dev_blk_ops * ops, 
207                        v3_cfg_tree_t * cfg, 
208                        void * private_data);
209
210 int v3_dev_add_net_frontend(struct v3_vm_info * vm, 
211                             char * name, 
212                             int (*connect)(struct v3_vm_info * vm, 
213                                             void * frontend_data, 
214                                             struct v3_dev_net_ops * ops, 
215                                             v3_cfg_tree_t * cfg, 
216                                             void * private_data), 
217                             void * priv_data);
218
219 int v3_dev_connect_net(struct v3_vm_info * vm, 
220                        char * frontend_name, 
221                        struct v3_dev_net_ops * ops, 
222                        v3_cfg_tree_t * cfg, 
223                        void * private_data);
224
225
226
227
228 int v3_dev_add_console_frontend(struct v3_vm_info * vm, 
229                                 char * name, 
230                                 int (*connect)(struct v3_vm_info * vm, 
231                                                void * frontend_data, 
232                                                struct v3_dev_console_ops * ops, 
233                                                v3_cfg_tree_t * cfg, 
234                                                void * private_data), 
235                                 void * priv_data);
236
237 int v3_dev_connect_console(struct v3_vm_info * vm, 
238                            char * frontend_name, 
239                            struct v3_dev_console_ops * ops, 
240                            v3_cfg_tree_t * cfg, 
241                            void * private_data);
242
243
244
245 int v3_dev_add_char_frontend(struct v3_vm_info * vm, 
246                              char * name, 
247                              int (*connect)(struct v3_vm_info * vm, 
248                                             void * frontend_data, 
249                                             struct v3_dev_char_ops * ops, 
250                                             v3_cfg_tree_t * cfg, 
251                                             void * private_data,
252                                             void ** push_fn_arg), 
253                              void * priv_data);
254
255 int v3_dev_connect_char(struct v3_vm_info * vm, 
256                         char * frontend_name, 
257                         struct v3_dev_char_ops * ops, 
258                         v3_cfg_tree_t * cfg, 
259                         void * private_data, 
260                         void ** push_fn_arg);
261
262
263 #endif // ! __V3VEE__
264
265 #endif