/[dynamips]/upstream/dynamips-0.2.7-RC2/vm.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /upstream/dynamips-0.2.7-RC2/vm.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (hide annotations)
Sat Oct 6 16:24:54 2007 UTC (12 years, 2 months ago) by dpavlin
File MIME type: text/plain
File size: 9936 byte(s)
dynamips-0.2.7-RC2

1 dpavlin 1 /*
2 dpavlin 7 * Cisco router simulation platform.
3 dpavlin 1 * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr)
4     *
5     * Virtual Machines.
6     */
7    
8     #ifndef __VM_H__
9     #define __VM_H__
10    
11     #include <pthread.h>
12    
13     #include "dynamips.h"
14     #include "memory.h"
15     #include "cpu.h"
16     #include "dev_vtty.h"
17    
18 dpavlin 7 #define VM_PAGE_SHIFT 12
19     #define VM_PAGE_SIZE (1 << VM_PAGE_SHIFT)
20     #define VM_PAGE_IMASK (VM_PAGE_SIZE - 1)
21     #define VM_PAGE_MASK (~(VM_PAGE_IMASK))
22    
23     /* Number of pages in chunk area */
24     #define VM_CHUNK_AREA_SIZE 256
25    
26     /* VM memory chunk */
27     typedef struct vm_chunk vm_chunk_t;
28     struct vm_chunk {
29     void *area;
30     u_int page_alloc,page_total;
31     vm_chunk_t *next;
32     };
33    
34     /* VM ghost pool entry */
35     typedef struct vm_ghost_image vm_ghost_image_t;
36     struct vm_ghost_image {
37     char *filename;
38     u_int ref_count;
39     int fd;
40     off_t file_size;
41     u_char *area_ptr;
42     vm_ghost_image_t *next;
43     };
44    
45     /* Maximum number of devices per VM */
46     #define VM_DEVICE_MAX (1 << 6)
47    
48     /* Size of the PCI bus pool */
49 dpavlin 1 #define VM_PCI_POOL_SIZE 32
50    
51     /* VM instance status */
52     enum {
53     VM_STATUS_HALTED = 0, /* VM is halted and no HW resources are used */
54     VM_STATUS_SHUTDOWN, /* Shutdown procedure engaged */
55     VM_STATUS_RUNNING, /* VM is running */
56     VM_STATUS_SUSPENDED, /* VM is suspended */
57     };
58    
59     /* VM types */
60     enum {
61     VM_TYPE_C7200 = 0,
62     VM_TYPE_C3600,
63 dpavlin 4 VM_TYPE_C2691,
64     VM_TYPE_C3725,
65     VM_TYPE_C3745,
66 dpavlin 7 VM_TYPE_C2600,
67 dpavlin 8 VM_TYPE_MSFC1,
68 dpavlin 7 VM_TYPE_PPC32_TEST,
69 dpavlin 1 };
70    
71 dpavlin 4 /* Ghost RAM status */
72     enum {
73     VM_GHOST_RAM_NONE = 0,
74     VM_GHOST_RAM_GENERATE,
75     VM_GHOST_RAM_USE,
76     };
77    
78 dpavlin 1 /* Timer IRQ check interval */
79     #define VM_TIMER_IRQ_CHECK_ITV 1000
80    
81     /* forward declarations */
82     typedef struct vm_obj vm_obj_t;
83    
84     /* Shutdown function prototype for an object */
85     typedef void *(*vm_shutdown_t)(vm_instance_t *vm,void *data);
86    
87     /* VM object, used to keep track of devices and various things */
88     struct vm_obj {
89     char *name;
90     void *data;
91     struct vm_obj *next,**pprev;
92     vm_shutdown_t shutdown;
93     };
94    
95     /* VM instance */
96     struct vm_instance {
97     char *name;
98     int type; /* C7200, C3600, ... */
99     int status; /* Instance status */
100     int instance_id; /* Instance Identifier */
101     char *lock_file; /* Lock file */
102 dpavlin 7 char *log_file; /* Log filename */
103     int log_file_enabled; /* Logging enabled */
104 dpavlin 1 u_int ram_size,rom_size; /* RAM and ROM size in Mb */
105     u_int iomem_size; /* IOMEM size in Mb */
106     u_int nvram_size; /* NVRAM size in Kb */
107     u_int pcmcia_disk_size[2]; /* PCMCIA disk0 and disk1 sizes (in Mb) */
108     u_int conf_reg,conf_reg_setup; /* Config register */
109     u_int clock_divisor; /* Clock Divisor (see cp0.c) */
110     u_int ram_mmap; /* Memory-mapped RAM ? */
111     u_int restart_ios; /* Restart IOS on reload ? */
112     u_int elf_machine_id; /* ELF machine identifier */
113     u_int exec_area_size; /* Size of execution area for CPU */
114     m_uint32_t ios_entry_point; /* IOS entry point */
115     char *ios_image; /* IOS image filename */
116     char *ios_config; /* IOS configuration file */
117     char *rom_filename; /* ROM filename */
118     char *sym_filename; /* Symbol filename */
119     FILE *lock_fd,*log_fd; /* Lock/Log file descriptors */
120     int debug_level; /* Debugging Level */
121     int jit_use; /* CPUs use JIT */
122 dpavlin 7 int sparse_mem; /* Use sparse virtual memory */
123 dpavlin 1
124 dpavlin 7 /* Memory chunks */
125     vm_chunk_t *chunks;
126    
127 dpavlin 1 /* Basic hardware: system CPU, PCI busses and PCI I/O space */
128     cpu_group_t *cpu_group;
129 dpavlin 7 cpu_gen_t *boot_cpu;
130 dpavlin 1 struct pci_bus *pci_bus[2];
131     struct pci_bus *pci_bus_pool[VM_PCI_POOL_SIZE];
132     struct pci_io_data *pci_io_space;
133    
134     /* Memory mapped devices */
135     struct vdevice *dev_list;
136 dpavlin 7 struct vdevice *dev_array[VM_DEVICE_MAX];
137 dpavlin 1
138 dpavlin 7 /* IRQ routing */
139     void (*set_irq)(vm_instance_t *vm,u_int irq);
140     void (*clear_irq)(vm_instance_t *vm,u_int irq);
141    
142 dpavlin 4 /* Filename for ghosted RAM */
143     char *ghost_ram_filename;
144    
145     /* Ghost RAM image handling */
146     int ghost_status;
147    
148 dpavlin 8 /* Timer IRQ interval check */
149     u_int timer_irq_check_itv;
150    
151 dpavlin 1 /* "idling" pointer counter */
152     m_uint64_t idle_pc;
153    
154 dpavlin 8 /* JIT block direct jumps */
155     int exec_blk_direct_jump;
156 dpavlin 1
157 dpavlin 8 /* IRQ idling preemption */
158     u_int irq_idle_preempt[256];
159    
160 dpavlin 1 /* Console and AUX port VTTY type and parameters */
161     int vtty_con_type,vtty_aux_type;
162     int vtty_con_tcp_port,vtty_aux_tcp_port;
163     vtty_serial_option_t vtty_con_serial_option,vtty_aux_serial_option;
164    
165     /* Virtual TTY for Console and AUX ports */
166     vtty_t *vtty_con,*vtty_aux;
167    
168     /* Space reserved in NVRAM by ROM monitor */
169     u_int nvram_rom_space;
170    
171     /* Extract and push IOS configuration */
172     ssize_t (*nvram_extract_config)(vm_instance_t *vm,char **buffer);
173     int (*nvram_push_config)(vm_instance_t *vm,char *buffer,size_t len);
174    
175 dpavlin 8 /* Chassis cookie (for c2600 and maybe other routers) */
176 dpavlin 7 m_uint16_t chassis_cookie[64];
177    
178 dpavlin 1 /* Specific hardware data */
179     void *hw_data;
180    
181     /* VM objects */
182     struct vm_obj *vm_object_list;
183     };
184    
185     #define VM_C7200(vm) ((c7200_t *)vm->hw_data)
186     #define VM_C3600(vm) ((c3600_t *)vm->hw_data)
187 dpavlin 4 #define VM_C2691(vm) ((c2691_t *)vm->hw_data)
188     #define VM_C3725(vm) ((c3725_t *)vm->hw_data)
189     #define VM_C3745(vm) ((c3745_t *)vm->hw_data)
190 dpavlin 7 #define VM_C2600(vm) ((c2600_t *)vm->hw_data)
191 dpavlin 8 #define VM_MSFC1(vm) ((msfc1_t *)vm->hw_data)
192 dpavlin 1
193     extern int vm_file_naming_type;
194    
195 dpavlin 7 /* Set an IRQ for a VM */
196     static inline void vm_set_irq(vm_instance_t *vm,u_int irq)
197     {
198     if (vm->set_irq != NULL)
199     vm->set_irq(vm,irq);
200     }
201    
202     /* Clear an IRQ for a VM */
203     static inline void vm_clear_irq(vm_instance_t *vm,u_int irq)
204     {
205     if (vm->clear_irq != NULL)
206     vm->clear_irq(vm,irq);
207     }
208    
209 dpavlin 1 /* Initialize a VM object */
210     void vm_object_init(vm_obj_t *obj);
211    
212     /* Add a VM object to an instance */
213     void vm_object_add(vm_instance_t *vm,vm_obj_t *obj);
214    
215     /* Remove a VM object from an instance */
216     void vm_object_remove(vm_instance_t *vm,vm_obj_t *obj);
217    
218     /* Find an object given its name */
219     vm_obj_t *vm_object_find(vm_instance_t *vm,char *name);
220    
221     /* Check that a mandatory object is present */
222     int vm_object_check(vm_instance_t *vm,char *name);
223    
224     /* Dump the object list of an instance */
225     void vm_object_dump(vm_instance_t *vm);
226    
227     /* Get VM type */
228     char *vm_get_type(vm_instance_t *vm);
229    
230 dpavlin 4 /* Get MAC address MSB */
231     u_int vm_get_mac_addr_msb(vm_instance_t *vm);
232    
233 dpavlin 1 /* Generate a filename for use by the instance */
234     char *vm_build_filename(vm_instance_t *vm,char *name);
235    
236     /* Check that an instance lock file doesn't already exist */
237     int vm_get_lock(vm_instance_t *vm);
238    
239     /* Erase lock file */
240     void vm_release_lock(vm_instance_t *vm,int erase);
241    
242     /* Log a message */
243     void vm_flog(vm_instance_t *vm,char *module,char *format,va_list ap);
244    
245     /* Log a message */
246     void vm_log(vm_instance_t *vm,char *module,char *format,...);
247    
248     /* Close the log file */
249     int vm_close_log(vm_instance_t *vm);
250    
251     /* Create the log file */
252     int vm_create_log(vm_instance_t *vm);
253    
254     /* Error message */
255     void vm_error(vm_instance_t *vm,char *format,...);
256    
257     /* Create a new VM instance */
258     vm_instance_t *vm_create(char *name,int instance_id,int machine_type);
259    
260     /* Shutdown hardware resources used by a VM */
261     int vm_hardware_shutdown(vm_instance_t *vm);
262    
263     /* Free resources used by a VM */
264     void vm_free(vm_instance_t *vm);
265    
266     /* Get an instance given a name */
267     vm_instance_t *vm_acquire(char *name);
268    
269     /* Release a VM (decrement reference count) */
270     int vm_release(vm_instance_t *vm);
271    
272 dpavlin 4 /* Initialize RAM */
273     int vm_ram_init(vm_instance_t *vm,m_uint64_t paddr);
274    
275 dpavlin 1 /* Initialize VTTY */
276     int vm_init_vtty(vm_instance_t *vm);
277    
278     /* Delete VTTY */
279     void vm_delete_vtty(vm_instance_t *vm);
280    
281     /* Bind a device to a virtual machine */
282     int vm_bind_device(vm_instance_t *vm,struct vdevice *dev);
283    
284     /* Unbind a device from a virtual machine */
285     int vm_unbind_device(vm_instance_t *vm,struct vdevice *dev);
286    
287     /* Map a device at the specified physical address */
288     int vm_map_device(vm_instance_t *vm,struct vdevice *dev,m_uint64_t base_addr);
289    
290     /* Set an IRQ for a VM */
291     void vm_set_irq(vm_instance_t *vm,u_int irq);
292    
293     /* Clear an IRQ for a VM */
294     void vm_clear_irq(vm_instance_t *vm,u_int irq);
295    
296     /* Suspend a VM instance */
297     int vm_suspend(vm_instance_t *vm);
298    
299     /* Resume a VM instance */
300     int vm_resume(vm_instance_t *vm);
301    
302     /* Stop an instance */
303     int vm_stop(vm_instance_t *vm);
304    
305     /* Monitor an instance periodically */
306     void vm_monitor(vm_instance_t *vm);
307    
308 dpavlin 7 /* Allocate an host page */
309     void *vm_alloc_host_page(vm_instance_t *vm);
310    
311     /* Free an host page */
312     void vm_free_host_page(vm_instance_t *vm,void *ptr);
313    
314     /* Get a ghost image */
315     int vm_ghost_image_get(char *filename,u_char **ptr,int *fd);
316    
317     /* Release a ghost image */
318     int vm_ghost_image_release(int fd);
319    
320 dpavlin 4 /* Open a VM file and map it in memory */
321     int vm_mmap_open_file(vm_instance_t *vm,char *name,
322     u_char **ptr,off_t *fsize);
323    
324     /* Open/Create a VM file and map it in memory */
325     int vm_mmap_create_file(vm_instance_t *vm,char *name,size_t len,u_char **ptr);
326    
327     /* Close a memory mapped file */
328     int vm_mmap_close_file(int fd,u_char *ptr,size_t len);
329    
330 dpavlin 1 /* Save the Cisco IOS configuration from NVRAM */
331     int vm_ios_save_config(vm_instance_t *vm);
332    
333     /* Set Cisco IOS image to use */
334     int vm_ios_set_image(vm_instance_t *vm,char *ios_image);
335    
336     /* Unset a Cisco IOS configuration file */
337     void vm_ios_unset_config(vm_instance_t *vm);
338    
339     /* Set Cisco IOS configuration file to use */
340     int vm_ios_set_config(vm_instance_t *vm,char *ios_config);
341    
342     /* Extract IOS configuration from NVRAM and write it to a file */
343     int vm_nvram_extract_config(vm_instance_t *vm,char *filename);
344    
345     /* Read an IOS configuraton from a file and push it to NVRAM */
346     int vm_nvram_push_config(vm_instance_t *vm,char *filename);
347    
348     /* Save general VM configuration into the specified file */
349     void vm_save_config(vm_instance_t *vm,FILE *fd);
350    
351     #endif

  ViewVC Help
Powered by ViewVC 1.1.26