]>
Commit | Line | Data |
---|---|---|
1 | #ifndef SYSEMU_H | |
2 | #define SYSEMU_H | |
3 | /* Misc. things related to the system emulator. */ | |
4 | ||
5 | #include "qemu-common.h" | |
6 | #include "qemu-option.h" | |
7 | #include "qemu-queue.h" | |
8 | #include "qemu-timer.h" | |
9 | #include "qdict.h" | |
10 | #include "qerror.h" | |
11 | ||
12 | #ifdef _WIN32 | |
13 | #include <windows.h> | |
14 | #endif | |
15 | ||
16 | /* vl.c */ | |
17 | extern const char *bios_name; | |
18 | ||
19 | #define QEMU_FILE_TYPE_BIOS 0 | |
20 | #define QEMU_FILE_TYPE_KEYMAP 1 | |
21 | char *qemu_find_file(int type, const char *name); | |
22 | ||
23 | extern int vm_running; | |
24 | extern const char *qemu_name; | |
25 | extern uint8_t qemu_uuid[]; | |
26 | int qemu_uuid_parse(const char *str, uint8_t *uuid); | |
27 | #define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" | |
28 | ||
29 | typedef struct vm_change_state_entry VMChangeStateEntry; | |
30 | typedef void VMChangeStateHandler(void *opaque, int running, int reason); | |
31 | ||
32 | VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb, | |
33 | void *opaque); | |
34 | void qemu_del_vm_change_state_handler(VMChangeStateEntry *e); | |
35 | ||
36 | void vm_start(void); | |
37 | void vm_stop(int reason); | |
38 | ||
39 | uint64_t ram_bytes_remaining(void); | |
40 | uint64_t ram_bytes_transferred(void); | |
41 | uint64_t ram_bytes_total(void); | |
42 | ||
43 | int64_t cpu_get_ticks(void); | |
44 | void cpu_enable_ticks(void); | |
45 | void cpu_disable_ticks(void); | |
46 | ||
47 | void qemu_system_reset_request(void); | |
48 | void qemu_system_shutdown_request(void); | |
49 | void qemu_system_powerdown_request(void); | |
50 | int qemu_shutdown_requested(void); | |
51 | int qemu_reset_requested(void); | |
52 | int qemu_powerdown_requested(void); | |
53 | extern qemu_irq qemu_system_powerdown; | |
54 | void qemu_system_reset(void); | |
55 | ||
56 | void do_savevm(Monitor *mon, const QDict *qdict); | |
57 | int load_vmstate(Monitor *mon, const char *name); | |
58 | void do_delvm(Monitor *mon, const QDict *qdict); | |
59 | void do_info_snapshots(Monitor *mon); | |
60 | ||
61 | void qemu_announce_self(void); | |
62 | ||
63 | void main_loop_wait(int timeout); | |
64 | ||
65 | int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable, | |
66 | int shared); | |
67 | int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f); | |
68 | int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f); | |
69 | void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f); | |
70 | int qemu_loadvm_state(QEMUFile *f); | |
71 | ||
72 | void qemu_errors_to_file(FILE *fp); | |
73 | void qemu_errors_to_mon(Monitor *mon); | |
74 | void qemu_errors_to_previous(void); | |
75 | void qemu_error(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); | |
76 | void qemu_error_internal(const char *file, int linenr, const char *func, | |
77 | const char *fmt, ...) | |
78 | __attribute__ ((format(printf, 4, 5))); | |
79 | ||
80 | #define qemu_error_new(fmt, ...) \ | |
81 | qemu_error_internal(__FILE__, __LINE__, __func__, fmt, ## __VA_ARGS__) | |
82 | ||
83 | #ifdef _WIN32 | |
84 | /* Polling handling */ | |
85 | ||
86 | /* return TRUE if no sleep should be done afterwards */ | |
87 | typedef int PollingFunc(void *opaque); | |
88 | ||
89 | int qemu_add_polling_cb(PollingFunc *func, void *opaque); | |
90 | void qemu_del_polling_cb(PollingFunc *func, void *opaque); | |
91 | ||
92 | /* Wait objects handling */ | |
93 | typedef void WaitObjectFunc(void *opaque); | |
94 | ||
95 | int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); | |
96 | void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); | |
97 | #endif | |
98 | ||
99 | /* SLIRP */ | |
100 | void do_info_slirp(Monitor *mon); | |
101 | ||
102 | typedef enum DisplayType | |
103 | { | |
104 | DT_DEFAULT, | |
105 | DT_CURSES, | |
106 | DT_SDL, | |
107 | DT_VNC, | |
108 | DT_NOGRAPHIC, | |
109 | } DisplayType; | |
110 | ||
111 | extern int autostart; | |
112 | extern int bios_size; | |
113 | ||
114 | typedef enum { | |
115 | VGA_NONE, VGA_STD, VGA_CIRRUS, VGA_VMWARE, VGA_XENFB | |
116 | } VGAInterfaceType; | |
117 | ||
118 | extern int vga_interface_type; | |
119 | #define cirrus_vga_enabled (vga_interface_type == VGA_CIRRUS) | |
120 | #define std_vga_enabled (vga_interface_type == VGA_STD) | |
121 | #define xenfb_enabled (vga_interface_type == VGA_XENFB) | |
122 | #define vmsvga_enabled (vga_interface_type == VGA_VMWARE) | |
123 | ||
124 | extern int graphic_width; | |
125 | extern int graphic_height; | |
126 | extern int graphic_depth; | |
127 | extern uint8_t irq0override; | |
128 | extern DisplayType display_type; | |
129 | extern const char *keyboard_layout; | |
130 | extern int win2k_install_hack; | |
131 | extern int rtc_td_hack; | |
132 | extern int alt_grab; | |
133 | extern int ctrl_grab; | |
134 | extern int usb_enabled; | |
135 | extern int smp_cpus; | |
136 | extern int max_cpus; | |
137 | extern int cursor_hide; | |
138 | extern int graphic_rotate; | |
139 | extern int no_quit; | |
140 | extern int semihosting_enabled; | |
141 | extern int old_param; | |
142 | extern int boot_menu; | |
143 | extern QEMUClock *rtc_clock; | |
144 | ||
145 | #define MAX_NODES 64 | |
146 | extern int nb_numa_nodes; | |
147 | extern uint64_t node_mem[MAX_NODES]; | |
148 | extern uint64_t node_cpumask[MAX_NODES]; | |
149 | ||
150 | #define MAX_OPTION_ROMS 16 | |
151 | extern const char *option_rom[MAX_OPTION_ROMS]; | |
152 | extern int nb_option_roms; | |
153 | ||
154 | #ifdef NEED_CPU_H | |
155 | #if defined(TARGET_SPARC) || defined(TARGET_PPC) | |
156 | #define MAX_PROM_ENVS 128 | |
157 | extern const char *prom_envs[MAX_PROM_ENVS]; | |
158 | extern unsigned int nb_prom_envs; | |
159 | #endif | |
160 | #endif | |
161 | ||
162 | typedef enum { | |
163 | IF_NONE, | |
164 | IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN, | |
165 | IF_COUNT | |
166 | } BlockInterfaceType; | |
167 | ||
168 | typedef enum { | |
169 | BLOCK_ERR_REPORT, BLOCK_ERR_IGNORE, BLOCK_ERR_STOP_ENOSPC, | |
170 | BLOCK_ERR_STOP_ANY | |
171 | } BlockInterfaceErrorAction; | |
172 | ||
173 | #define BLOCK_SERIAL_STRLEN 20 | |
174 | ||
175 | typedef struct DriveInfo { | |
176 | BlockDriverState *bdrv; | |
177 | char *id; | |
178 | const char *devaddr; | |
179 | BlockInterfaceType type; | |
180 | int bus; | |
181 | int unit; | |
182 | QemuOpts *opts; | |
183 | BlockInterfaceErrorAction on_read_error; | |
184 | BlockInterfaceErrorAction on_write_error; | |
185 | char serial[BLOCK_SERIAL_STRLEN + 1]; | |
186 | QTAILQ_ENTRY(DriveInfo) next; | |
187 | } DriveInfo; | |
188 | ||
189 | #define MAX_IDE_DEVS 2 | |
190 | #define MAX_SCSI_DEVS 7 | |
191 | #define MAX_DRIVES 32 | |
192 | ||
193 | extern QTAILQ_HEAD(drivelist, DriveInfo) drives; | |
194 | extern QTAILQ_HEAD(driveoptlist, DriveOpt) driveopts; | |
195 | ||
196 | extern DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit); | |
197 | extern DriveInfo *drive_get_by_id(const char *id); | |
198 | extern int drive_get_max_bus(BlockInterfaceType type); | |
199 | extern void drive_uninit(DriveInfo *dinfo); | |
200 | extern const char *drive_get_serial(BlockDriverState *bdrv); | |
201 | ||
202 | extern BlockInterfaceErrorAction drive_get_on_error( | |
203 | BlockDriverState *bdrv, int is_read); | |
204 | ||
205 | BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type); | |
206 | ||
207 | extern QemuOpts *drive_add(const char *file, const char *fmt, ...); | |
208 | extern DriveInfo *drive_init(QemuOpts *arg, void *machine, int *fatal_error); | |
209 | ||
210 | /* device-hotplug */ | |
211 | ||
212 | DriveInfo *add_init_drive(const char *opts); | |
213 | ||
214 | /* pci-hotplug */ | |
215 | void pci_device_hot_add_print(Monitor *mon, const QObject *data); | |
216 | void pci_device_hot_add(Monitor *mon, const QDict *qdict, QObject **ret_data); | |
217 | void drive_hot_add(Monitor *mon, const QDict *qdict); | |
218 | void pci_device_hot_remove(Monitor *mon, const char *pci_addr); | |
219 | void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict, | |
220 | QObject **ret_data); | |
221 | ||
222 | /* serial ports */ | |
223 | ||
224 | #define MAX_SERIAL_PORTS 4 | |
225 | ||
226 | extern CharDriverState *serial_hds[MAX_SERIAL_PORTS]; | |
227 | ||
228 | /* parallel ports */ | |
229 | ||
230 | #define MAX_PARALLEL_PORTS 3 | |
231 | ||
232 | extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; | |
233 | ||
234 | /* virtio consoles */ | |
235 | ||
236 | #define MAX_VIRTIO_CONSOLES 1 | |
237 | ||
238 | extern CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES]; | |
239 | ||
240 | #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR) | |
241 | ||
242 | #ifdef HAS_AUDIO | |
243 | struct soundhw { | |
244 | const char *name; | |
245 | const char *descr; | |
246 | int enabled; | |
247 | int isa; | |
248 | union { | |
249 | int (*init_isa) (qemu_irq *pic); | |
250 | int (*init_pci) (PCIBus *bus); | |
251 | } init; | |
252 | }; | |
253 | ||
254 | extern struct soundhw soundhw[]; | |
255 | #endif | |
256 | ||
257 | void do_usb_add(Monitor *mon, const QDict *qdict); | |
258 | void do_usb_del(Monitor *mon, const QDict *qdict); | |
259 | void usb_info(Monitor *mon); | |
260 | ||
261 | void register_devices(void); | |
262 | ||
263 | #endif |