]> git.proxmox.com Git - mirror_qemu.git/blame - vl.h
update
[mirror_qemu.git] / vl.h
CommitLineData
fc01f7e7
FB
1/*
2 * QEMU System Emulator header
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#ifndef VL_H
25#define VL_H
26
67b915a5
FB
27/* we put basic includes here to avoid repeating them in device drivers */
28#include <stdlib.h>
29#include <stdio.h>
30#include <stdarg.h>
31#include <string.h>
32#include <inttypes.h>
8a7ddc38 33#include <time.h>
67b915a5
FB
34#include <ctype.h>
35#include <errno.h>
36#include <unistd.h>
37#include <fcntl.h>
38
39#ifndef O_LARGEFILE
40#define O_LARGEFILE 0
41#endif
40c3bac3
FB
42#ifndef O_BINARY
43#define O_BINARY 0
44#endif
67b915a5
FB
45
46#ifdef _WIN32
bfbc9133 47#define lseek64 _lseeki64
67b915a5 48#endif
8a7ddc38 49
16f62432
FB
50#include "cpu.h"
51
67b915a5
FB
52#ifndef glue
53#define xglue(x, y) x ## y
54#define glue(x, y) xglue(x, y)
55#define stringify(s) tostring(s)
56#define tostring(s) #s
57#endif
58
59#if defined(WORDS_BIGENDIAN)
60static inline uint32_t be32_to_cpu(uint32_t v)
61{
62 return v;
63}
64
65static inline uint16_t be16_to_cpu(uint16_t v)
66{
67 return v;
68}
69
165c6fc8
FB
70static inline uint32_t cpu_to_be32(uint32_t v)
71{
72 return v;
73}
74
75static inline uint16_t cpu_to_be16(uint16_t v)
76{
77 return v;
78}
79
67b915a5
FB
80static inline uint32_t le32_to_cpu(uint32_t v)
81{
82 return bswap32(v);
83}
84
85static inline uint16_t le16_to_cpu(uint16_t v)
86{
87 return bswap16(v);
88}
89
165c6fc8
FB
90static inline uint32_t cpu_to_le32(uint32_t v)
91{
92 return bswap32(v);
93}
94
95static inline uint16_t cpu_to_le16(uint16_t v)
96{
97 return bswap16(v);
98}
99
67b915a5 100#else
165c6fc8 101
67b915a5
FB
102static inline uint32_t be32_to_cpu(uint32_t v)
103{
104 return bswap32(v);
105}
106
107static inline uint16_t be16_to_cpu(uint16_t v)
108{
109 return bswap16(v);
110}
111
165c6fc8
FB
112static inline uint32_t cpu_to_be32(uint32_t v)
113{
114 return bswap32(v);
115}
116
117static inline uint16_t cpu_to_be16(uint16_t v)
118{
119 return bswap16(v);
120}
121
67b915a5
FB
122static inline uint32_t le32_to_cpu(uint32_t v)
123{
124 return v;
125}
126
127static inline uint16_t le16_to_cpu(uint16_t v)
128{
129 return v;
130}
165c6fc8
FB
131
132static inline uint32_t cpu_to_le32(uint32_t v)
133{
134 return v;
135}
136
137static inline uint16_t cpu_to_le16(uint16_t v)
138{
139 return v;
140}
67b915a5
FB
141#endif
142
143
33e3963e 144/* vl.c */
313aa567
FB
145extern int reset_requested;
146
c4b1fcc0
FB
147typedef void (IOPortWriteFunc)(void *opaque, uint32_t address, uint32_t data);
148typedef uint32_t (IOPortReadFunc)(void *opaque, uint32_t address);
313aa567 149
c4b1fcc0
FB
150int register_ioport_read(int start, int length, int size,
151 IOPortReadFunc *func, void *opaque);
152int register_ioport_write(int start, int length, int size,
153 IOPortWriteFunc *func, void *opaque);
80cabfad 154uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c);
313aa567 155
80cabfad
FB
156void hw_error(const char *fmt, ...);
157
158int load_image(const char *filename, uint8_t *addr);
159extern const char *bios_dir;
160
161void pstrcpy(char *buf, int buf_size, const char *str);
162char *pstrcat(char *buf, int buf_size, const char *s);
33e3963e 163
c4b1fcc0
FB
164int serial_open_device(void);
165
8a7ddc38
FB
166extern int vm_running;
167
168typedef void VMStopHandler(void *opaque, int reason);
169
170int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque);
171void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque);
172
173void vm_start(void);
174void vm_stop(int reason);
175
c20709aa
FB
176/* async I/O support */
177
178typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
179typedef int IOCanRWHandler(void *opaque);
180
181int qemu_add_fd_read_handler(int fd, IOCanRWHandler *fd_can_read,
182 IOReadHandler *fd_read, void *opaque);
183void qemu_del_fd_read_handler(int fd);
184
c4b1fcc0
FB
185/* network redirectors support */
186
187#define MAX_NICS 8
188
189typedef struct NetDriverState {
c20709aa 190 int index; /* index number in QEMU */
c4b1fcc0
FB
191 uint8_t macaddr[6];
192 char ifname[16];
c20709aa
FB
193 void (*send_packet)(struct NetDriverState *nd,
194 const uint8_t *buf, int size);
195 void (*add_read_packet)(struct NetDriverState *nd,
196 IOCanRWHandler *fd_can_read,
197 IOReadHandler *fd_read, void *opaque);
198 /* tun specific data */
199 int fd;
200 /* slirp specific data */
c4b1fcc0
FB
201} NetDriverState;
202
203extern int nb_nics;
204extern NetDriverState nd_table[MAX_NICS];
205
c20709aa
FB
206void qemu_send_packet(NetDriverState *nd, const uint8_t *buf, int size);
207void qemu_add_read_packet(NetDriverState *nd, IOCanRWHandler *fd_can_read,
208 IOReadHandler *fd_read, void *opaque);
8a7ddc38
FB
209
210/* timers */
211
212typedef struct QEMUClock QEMUClock;
213typedef struct QEMUTimer QEMUTimer;
214typedef void QEMUTimerCB(void *opaque);
215
216/* The real time clock should be used only for stuff which does not
217 change the virtual machine state, as it is run even if the virtual
218 machine is stopped. The real time clock has a frequency or 1000
219 Hz. */
220extern QEMUClock *rt_clock;
221
222/* Rge virtual clock is only run during the emulation. It is stopped
223 when the virtual machine is stopped. Virtual timers use a high
224 precision clock, usually cpu cycles (use ticks_per_sec). */
225extern QEMUClock *vm_clock;
226
227int64_t qemu_get_clock(QEMUClock *clock);
228
229QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque);
230void qemu_free_timer(QEMUTimer *ts);
231void qemu_del_timer(QEMUTimer *ts);
232void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time);
233int qemu_timer_pending(QEMUTimer *ts);
234
235extern int64_t ticks_per_sec;
236extern int pit_min_timer_count;
237
238void cpu_enable_ticks(void);
239void cpu_disable_ticks(void);
240
241/* VM Load/Save */
242
243typedef FILE QEMUFile;
244
245void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
246void qemu_put_byte(QEMUFile *f, int v);
247void qemu_put_be16(QEMUFile *f, unsigned int v);
248void qemu_put_be32(QEMUFile *f, unsigned int v);
249void qemu_put_be64(QEMUFile *f, uint64_t v);
250int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
251int qemu_get_byte(QEMUFile *f);
252unsigned int qemu_get_be16(QEMUFile *f);
253unsigned int qemu_get_be32(QEMUFile *f);
254uint64_t qemu_get_be64(QEMUFile *f);
255
256static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
257{
258 qemu_put_be64(f, *pv);
259}
260
261static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
262{
263 qemu_put_be32(f, *pv);
264}
265
266static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
267{
268 qemu_put_be16(f, *pv);
269}
270
271static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
272{
273 qemu_put_byte(f, *pv);
274}
275
276static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
277{
278 *pv = qemu_get_be64(f);
279}
280
281static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
282{
283 *pv = qemu_get_be32(f);
284}
285
286static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
287{
288 *pv = qemu_get_be16(f);
289}
290
291static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
292{
293 *pv = qemu_get_byte(f);
294}
295
296int64_t qemu_ftell(QEMUFile *f);
297int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence);
298
299typedef void SaveStateHandler(QEMUFile *f, void *opaque);
300typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
301
302int qemu_loadvm(const char *filename);
303int qemu_savevm(const char *filename);
304int register_savevm(const char *idstr,
305 int instance_id,
306 int version_id,
307 SaveStateHandler *save_state,
308 LoadStateHandler *load_state,
309 void *opaque);
310void qemu_get_timer(QEMUFile *f, QEMUTimer *ts);
311void qemu_put_timer(QEMUFile *f, QEMUTimer *ts);
c4b1fcc0 312
fc01f7e7
FB
313/* block.c */
314typedef struct BlockDriverState BlockDriverState;
315
c4b1fcc0
FB
316BlockDriverState *bdrv_new(const char *device_name);
317void bdrv_delete(BlockDriverState *bs);
318int bdrv_open(BlockDriverState *bs, const char *filename, int snapshot);
fc01f7e7
FB
319void bdrv_close(BlockDriverState *bs);
320int bdrv_read(BlockDriverState *bs, int64_t sector_num,
321 uint8_t *buf, int nb_sectors);
322int bdrv_write(BlockDriverState *bs, int64_t sector_num,
323 const uint8_t *buf, int nb_sectors);
324void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr);
33e3963e 325int bdrv_commit(BlockDriverState *bs);
77fef8c1 326void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size);
33e3963e 327
c4b1fcc0
FB
328#define BDRV_TYPE_HD 0
329#define BDRV_TYPE_CDROM 1
330#define BDRV_TYPE_FLOPPY 2
331
332void bdrv_set_geometry_hint(BlockDriverState *bs,
333 int cyls, int heads, int secs);
334void bdrv_set_type_hint(BlockDriverState *bs, int type);
335void bdrv_get_geometry_hint(BlockDriverState *bs,
336 int *pcyls, int *pheads, int *psecs);
337int bdrv_get_type_hint(BlockDriverState *bs);
338int bdrv_is_removable(BlockDriverState *bs);
339int bdrv_is_read_only(BlockDriverState *bs);
340int bdrv_is_inserted(BlockDriverState *bs);
341int bdrv_is_locked(BlockDriverState *bs);
342void bdrv_set_locked(BlockDriverState *bs, int locked);
343void bdrv_set_change_cb(BlockDriverState *bs,
344 void (*change_cb)(void *opaque), void *opaque);
345
346void bdrv_info(void);
347BlockDriverState *bdrv_find(const char *name);
348
313aa567
FB
349/* vga.c */
350
4fa0f5d2 351#define VGA_RAM_SIZE (4096 * 1024)
313aa567
FB
352
353typedef struct DisplayState {
354 uint8_t *data;
355 int linesize;
356 int depth;
357 void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
358 void (*dpy_resize)(struct DisplayState *s, int w, int h);
359 void (*dpy_refresh)(struct DisplayState *s);
360} DisplayState;
361
362static inline void dpy_update(DisplayState *s, int x, int y, int w, int h)
363{
364 s->dpy_update(s, x, y, w, h);
365}
366
367static inline void dpy_resize(DisplayState *s, int w, int h)
368{
369 s->dpy_resize(s, w, h);
370}
371
7138fcfb
FB
372int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base,
373 unsigned long vga_ram_offset, int vga_ram_size);
313aa567 374void vga_update_display(void);
59a983b9 375void vga_screen_dump(const char *filename);
313aa567
FB
376
377/* sdl.c */
378void sdl_display_init(DisplayState *ds);
379
5391d806
FB
380/* ide.c */
381#define MAX_DISKS 4
382
383extern BlockDriverState *bs_table[MAX_DISKS];
384
c4b1fcc0
FB
385void ide_init(int iobase, int iobase2, int irq,
386 BlockDriverState *hd0, BlockDriverState *hd1);
5391d806 387
27503323
FB
388/* oss.c */
389typedef enum {
390 AUD_FMT_U8,
391 AUD_FMT_S8,
392 AUD_FMT_U16,
393 AUD_FMT_S16
394} audfmt_e;
395
396void AUD_open (int rfreq, int rnchannels, audfmt_e rfmt);
397void AUD_reset (int rfreq, int rnchannels, audfmt_e rfmt);
398int AUD_write (void *in_buf, int size);
399void AUD_run (void);
400void AUD_adjust_estimate (int _leftover);
401int AUD_get_free (void);
402int AUD_get_live (void);
403int AUD_get_buffer_size (void);
404void AUD_init (void);
405
406/* dma.c */
16f62432 407typedef int (*DMA_transfer_handler) (void *opaque, target_ulong addr, int size);
27503323
FB
408int DMA_get_channel_mode (int nchan);
409void DMA_hold_DREQ (int nchan);
410void DMA_release_DREQ (int nchan);
16f62432 411void DMA_schedule(int nchan);
27503323
FB
412void DMA_run (void);
413void DMA_init (void);
414void DMA_register_channel (int nchan,
16f62432 415 DMA_transfer_handler transfer_handler, void *opaque);
27503323
FB
416
417/* sb16.c */
418void SB16_run (void);
419void SB16_init (void);
420
7138fcfb
FB
421/* fdc.c */
422#define MAX_FD 2
423extern BlockDriverState *fd_table[MAX_FD];
424
baca51fa
FB
425typedef struct fdctrl_t fdctrl_t;
426
427fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped,
428 uint32_t io_base,
429 BlockDriverState **fds);
430int fdctrl_get_drive_type(fdctrl_t *fdctrl, int drive_num);
7138fcfb 431
80cabfad
FB
432/* ne2000.c */
433
c4b1fcc0 434void ne2000_init(int base, int irq, NetDriverState *nd);
80cabfad
FB
435
436/* pckbd.c */
437
438void kbd_put_keycode(int keycode);
439
440#define MOUSE_EVENT_LBUTTON 0x01
441#define MOUSE_EVENT_RBUTTON 0x02
442#define MOUSE_EVENT_MBUTTON 0x04
443void kbd_mouse_event(int dx, int dy, int dz, int buttons_state);
444
445void kbd_init(void);
446
447/* mc146818rtc.c */
448
8a7ddc38 449typedef struct RTCState RTCState;
80cabfad 450
8a7ddc38
FB
451RTCState *rtc_init(int base, int irq);
452void rtc_set_memory(RTCState *s, int addr, int val);
453void rtc_set_date(RTCState *s, const struct tm *tm);
80cabfad
FB
454
455/* serial.c */
456
c4b1fcc0
FB
457typedef struct SerialState SerialState;
458
459extern SerialState *serial_console;
460
461SerialState *serial_init(int base, int irq, int fd);
462int serial_can_receive(SerialState *s);
463void serial_receive_byte(SerialState *s, int ch);
464void serial_receive_break(SerialState *s);
80cabfad
FB
465
466/* i8259.c */
467
468void pic_set_irq(int irq, int level);
469void pic_init(void);
c5df018e 470uint32_t pic_intack_read(CPUState *env);
c20709aa 471void pic_info(void);
80cabfad
FB
472
473/* i8254.c */
474
475#define PIT_FREQ 1193182
476
477typedef struct PITChannelState {
478 int count; /* can be 65536 */
479 uint16_t latched_count;
480 uint8_t rw_state;
481 uint8_t mode;
482 uint8_t bcd; /* not supported */
483 uint8_t gate; /* timer start */
484 int64_t count_load_time;
8a7ddc38
FB
485 /* irq handling */
486 int64_t next_transition_time;
487 QEMUTimer *irq_timer;
488 int irq;
80cabfad
FB
489} PITChannelState;
490
491extern PITChannelState pit_channels[3];
492
8a7ddc38 493void pit_init(int base, int irq);
80cabfad 494void pit_set_gate(PITChannelState *s, int val);
8a7ddc38 495int pit_get_out(PITChannelState *s, int64_t current_time);
80cabfad
FB
496int pit_get_out_edges(PITChannelState *s);
497
498/* pc.c */
499void pc_init(int ram_size, int vga_ram_size, int boot_device,
500 DisplayState *ds, const char **fd_filename, int snapshot,
501 const char *kernel_filename, const char *kernel_cmdline,
502 const char *initrd_filename);
503
c4b1fcc0
FB
504/* monitor.c */
505void monitor_init(void);
40c3bac3 506void term_printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
c4b1fcc0
FB
507void term_flush(void);
508void term_print_help(void);
509
8a7ddc38
FB
510/* gdbstub.c */
511
512#define DEFAULT_GDBSTUB_PORT 1234
513
514int gdbserver_start(int port);
515
fc01f7e7 516#endif /* VL_H */