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.


Update on the virtio net
[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 guest_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 guest_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 console_list;
66     struct hashtable * console_table;
67
68 };
69
70
71
72
73 int v3_create_device(struct guest_info * info, const char * dev_name, v3_cfg_tree_t * cfg);
74 void v3_free_device(struct vm_device * dev);
75
76
77 struct vm_device * v3_find_dev(struct guest_info * info, const char * dev_name);
78
79
80 // Registration of devices
81
82 //
83 // The following device manager functions should only be called
84 // when the guest is stopped
85 //
86
87
88
89 int v3_init_dev_mgr(struct guest_info * info);
90 int v3_dev_mgr_deinit(struct guest_info * info);
91
92
93
94
95 int v3_init_devices();
96
97
98 struct v3_device_ops {
99     int (*free)(struct vm_device *dev);
100
101
102     int (*reset)(struct vm_device *dev);
103
104     int (*start)(struct vm_device *dev);
105     int (*stop)(struct vm_device *dev);
106
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)(ushort_t port, void * dst, uint_t length, struct vm_device * dev),
120                    int (*write)(ushort_t port, void * src, uint_t length, struct vm_device * dev));
121
122 int v3_dev_unhook_io(struct vm_device   *dev,
123                      ushort_t            port);
124
125
126 int v3_attach_device(struct guest_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 guest_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 guest_info * info);
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     int (*send)(uint8_t * buf, uint32_t count, void * private_data, struct vm_device *dest_dev);
161     int (*receive)(uint8_t * buf, uint32_t count, void * private_data, struct vm_device *src_dev);
162
163 };
164
165 struct v3_dev_console_ops {
166
167 };
168
169 int v3_dev_add_blk_frontend(struct guest_info * info, 
170                             char * name, 
171                             int (*connect)(struct guest_info * info, 
172                                             void * frontend_data, 
173                                             struct v3_dev_blk_ops * ops, 
174                                             v3_cfg_tree_t * cfg, 
175                                             void * private_data), 
176                             void * priv_data);
177 int v3_dev_connect_blk(struct guest_info * info, 
178                        char * frontend_name, 
179                        struct v3_dev_blk_ops * ops, 
180                        v3_cfg_tree_t * cfg, 
181                        void * private_data);
182
183 int v3_dev_add_net_frontend(struct guest_info * info, 
184                             char * name, 
185                             int (*connect)(struct guest_info * info, 
186                                             void * frontend_data, 
187                                             struct v3_dev_net_ops * ops, 
188                                             v3_cfg_tree_t * cfg, 
189                                             void * private_data), 
190                             void * priv_data);
191 int v3_dev_connect_net(struct guest_info * info, 
192                        char * frontend_name, 
193                        struct v3_dev_net_ops * ops, 
194                        v3_cfg_tree_t * cfg, 
195                        void * private_data);
196
197
198 #endif // ! __V3VEE__
199
200 #endif