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.


integrated new configuration system
[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
161 };
162
163 struct v3_dev_console_ops {
164
165 };
166
167 int v3_dev_add_blk_frontend(struct guest_info * info, 
168                             char * name, 
169                             int (*connect)(struct guest_info * info, 
170                                             void * frontend_data, 
171                                             struct v3_dev_blk_ops * ops, 
172                                             v3_cfg_tree_t * cfg, 
173                                             void * private_data), 
174                             void * priv_data);
175 int v3_dev_connect_blk(struct guest_info * info, 
176                        char * frontend_name, 
177                        struct v3_dev_blk_ops * ops, 
178                        v3_cfg_tree_t * cfg, 
179                        void * private_data);
180
181 int v3_dev_add_net_frontend(struct guest_info * info, 
182                             char * name, 
183                             int (*connect)(struct guest_info * info, 
184                                             void * frontend_data, 
185                                             struct v3_dev_net_ops * ops, 
186                                             v3_cfg_tree_t * cfg, 
187                                             void * private_data), 
188                             void * priv_data);
189 int v3_dev_connect_net(struct guest_info * info, 
190                        char * frontend_name, 
191                        struct v3_dev_net_ops * ops, 
192                        v3_cfg_tree_t * cfg, 
193                        void * private_data);
194
195
196 #endif // ! __V3VEE__
197
198 #endif