SDL static config fix (Roman Zippel)
[qemu] / vl.h
diff --git a/vl.h b/vl.h
index 11d7aba..7fb81c8 100644 (file)
--- a/vl.h
+++ b/vl.h
 #ifndef VL_H
 #define VL_H
 
+/* we put basic includes here to avoid repeating them in device drivers */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <inttypes.h>
+#include <time.h>
+#include <ctype.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
+#endif
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#ifdef _WIN32
+#define lseek64 _lseeki64
+#endif
+
 #include "cpu.h"
 
+#ifndef glue
+#define xglue(x, y) x ## y
+#define glue(x, y) xglue(x, y)
+#define stringify(s)   tostring(s)
+#define tostring(s)    #s
+#endif
+
+#if defined(WORDS_BIGENDIAN)
+static inline uint32_t be32_to_cpu(uint32_t v)
+{
+    return v;
+}
+
+static inline uint16_t be16_to_cpu(uint16_t v)
+{
+    return v;
+}
+
+static inline uint32_t cpu_to_be32(uint32_t v)
+{
+    return v;
+}
+
+static inline uint16_t cpu_to_be16(uint16_t v)
+{
+    return v;
+}
+
+static inline uint32_t le32_to_cpu(uint32_t v)
+{
+    return bswap32(v);
+}
+
+static inline uint16_t le16_to_cpu(uint16_t v)
+{
+    return bswap16(v);
+}
+
+static inline uint32_t cpu_to_le32(uint32_t v)
+{
+    return bswap32(v);
+}
+
+static inline uint16_t cpu_to_le16(uint16_t v)
+{
+    return bswap16(v);
+}
+
+#else
+
+static inline uint32_t be32_to_cpu(uint32_t v)
+{
+    return bswap32(v);
+}
+
+static inline uint16_t be16_to_cpu(uint16_t v)
+{
+    return bswap16(v);
+}
+
+static inline uint32_t cpu_to_be32(uint32_t v)
+{
+    return bswap32(v);
+}
+
+static inline uint16_t cpu_to_be16(uint16_t v)
+{
+    return bswap16(v);
+}
+
+static inline uint32_t le32_to_cpu(uint32_t v)
+{
+    return v;
+}
+
+static inline uint16_t le16_to_cpu(uint16_t v)
+{
+    return v;
+}
+
+static inline uint32_t cpu_to_le32(uint32_t v)
+{
+    return v;
+}
+
+static inline uint16_t cpu_to_le16(uint16_t v)
+{
+    return v;
+}
+#endif
+
+
 /* vl.c */
 extern int reset_requested;
-extern int64_t ticks_per_sec;
-extern int pit_min_timer_count;
 
-typedef void (IOPortWriteFunc)(void *opaque, uint32_t address, uint32_t data);
-typedef uint32_t (IOPortReadFunc)(void *opaque, uint32_t address);
-
-int register_ioport_read(int start, int length, int size, 
-                         IOPortReadFunc *func, void *opaque);
-int register_ioport_write(int start, int length, int size, 
-                          IOPortWriteFunc *func, void *opaque);
-int64_t cpu_get_ticks(void);
 uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c);
 
 void hw_error(const char *fmt, ...);
@@ -51,28 +156,154 @@ char *pstrcat(char *buf, int buf_size, const char *s);
 
 int serial_open_device(void);
 
+extern int vm_running;
+
+typedef void VMStopHandler(void *opaque, int reason);
+
+int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque);
+void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque);
+
+void vm_start(void);
+void vm_stop(int reason);
+
+extern int audio_enabled;
+
+/* async I/O support */
+
+typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
+typedef int IOCanRWHandler(void *opaque);
+
+int qemu_add_fd_read_handler(int fd, IOCanRWHandler *fd_can_read, 
+                             IOReadHandler *fd_read, void *opaque);
+void qemu_del_fd_read_handler(int fd);
+
 /* network redirectors support */
 
 #define MAX_NICS 8
 
 typedef struct NetDriverState {
-    int fd;
+    int index; /* index number in QEMU */
     uint8_t macaddr[6];
     char ifname[16];
+    void (*send_packet)(struct NetDriverState *nd, 
+                        const uint8_t *buf, int size);
+    void (*add_read_packet)(struct NetDriverState *nd, 
+                            IOCanRWHandler *fd_can_read, 
+                            IOReadHandler *fd_read, void *opaque);
+    /* tun specific data */
+    int fd;
+    /* slirp specific data */
 } NetDriverState;
 
 extern int nb_nics;
 extern NetDriverState nd_table[MAX_NICS];
 
-void net_send_packet(NetDriverState *nd, const uint8_t *buf, int size);
+void qemu_send_packet(NetDriverState *nd, const uint8_t *buf, int size);
+void qemu_add_read_packet(NetDriverState *nd, IOCanRWHandler *fd_can_read, 
+                          IOReadHandler *fd_read, void *opaque);
 
-/* async I/O support */
+/* timers */
 
-typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
-typedef int IOCanRWHandler(void *opaque);
+typedef struct QEMUClock QEMUClock;
+typedef struct QEMUTimer QEMUTimer;
+typedef void QEMUTimerCB(void *opaque);
+
+/* The real time clock should be used only for stuff which does not
+   change the virtual machine state, as it is run even if the virtual
+   machine is stopped. The real time clock has a frequency or 1000
+   Hz. */
+extern QEMUClock *rt_clock;
+
+/* Rge virtual clock is only run during the emulation. It is stopped
+   when the virtual machine is stopped. Virtual timers use a high
+   precision clock, usually cpu cycles (use ticks_per_sec). */
+extern QEMUClock *vm_clock;
+
+int64_t qemu_get_clock(QEMUClock *clock);
+
+QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque);
+void qemu_free_timer(QEMUTimer *ts);
+void qemu_del_timer(QEMUTimer *ts);
+void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time);
+int qemu_timer_pending(QEMUTimer *ts);
+
+extern int64_t ticks_per_sec;
+extern int pit_min_timer_count;
+
+void cpu_enable_ticks(void);
+void cpu_disable_ticks(void);
+
+/* VM Load/Save */
+
+typedef FILE QEMUFile;
+
+void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
+void qemu_put_byte(QEMUFile *f, int v);
+void qemu_put_be16(QEMUFile *f, unsigned int v);
+void qemu_put_be32(QEMUFile *f, unsigned int v);
+void qemu_put_be64(QEMUFile *f, uint64_t v);
+int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
+int qemu_get_byte(QEMUFile *f);
+unsigned int qemu_get_be16(QEMUFile *f);
+unsigned int qemu_get_be32(QEMUFile *f);
+uint64_t qemu_get_be64(QEMUFile *f);
+
+static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
+{
+    qemu_put_be64(f, *pv);
+}
+
+static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
+{
+    qemu_put_be32(f, *pv);
+}
+
+static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
+{
+    qemu_put_be16(f, *pv);
+}
+
+static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
+{
+    qemu_put_byte(f, *pv);
+}
 
-int add_fd_read_handler(int fd, IOCanRWHandler *fd_can_read, 
-                        IOReadHandler *fd_read, void *opaque);
+static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
+{
+    *pv = qemu_get_be64(f);
+}
+
+static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
+{
+    *pv = qemu_get_be32(f);
+}
+
+static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
+{
+    *pv = qemu_get_be16(f);
+}
+
+static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
+{
+    *pv = qemu_get_byte(f);
+}
+
+int64_t qemu_ftell(QEMUFile *f);
+int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence);
+
+typedef void SaveStateHandler(QEMUFile *f, void *opaque);
+typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
+
+int qemu_loadvm(const char *filename);
+int qemu_savevm(const char *filename);
+int register_savevm(const char *idstr, 
+                    int instance_id, 
+                    int version_id,
+                    SaveStateHandler *save_state,
+                    LoadStateHandler *load_state,
+                    void *opaque);
+void qemu_get_timer(QEMUFile *f, QEMUTimer *ts);
+void qemu_put_timer(QEMUFile *f, QEMUTimer *ts);
 
 /* block.c */
 typedef struct BlockDriverState BlockDriverState;
@@ -110,6 +341,18 @@ void bdrv_set_change_cb(BlockDriverState *bs,
 void bdrv_info(void);
 BlockDriverState *bdrv_find(const char *name);
 
+/* ISA bus */
+
+extern target_phys_addr_t isa_mem_base;
+
+typedef void (IOPortWriteFunc)(void *opaque, uint32_t address, uint32_t data);
+typedef uint32_t (IOPortReadFunc)(void *opaque, uint32_t address);
+
+int register_ioport_read(int start, int length, int size, 
+                         IOPortReadFunc *func, void *opaque);
+int register_ioport_write(int start, int length, int size, 
+                          IOPortWriteFunc *func, void *opaque);
+
 /* vga.c */
 
 #define VGA_RAM_SIZE (4096 * 1024)
@@ -186,9 +429,12 @@ void SB16_init (void);
 #define MAX_FD 2
 extern BlockDriverState *fd_table[MAX_FD];
 
-void fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped, uint32_t base,
-                  BlockDriverState **fds);
-int fdctrl_get_drive_type(int drive_num);
+typedef struct fdctrl_t fdctrl_t;
+
+fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped, 
+                       uint32_t io_base,
+                       BlockDriverState **fds);
+int fdctrl_get_drive_type(fdctrl_t *fdctrl, int drive_num);
 
 /* ne2000.c */
 
@@ -207,16 +453,11 @@ void kbd_init(void);
 
 /* mc146818rtc.c */
 
-typedef struct RTCState {
-    uint8_t cmos_data[128];
-    uint8_t cmos_index;
-    int irq;
-} RTCState;
-
-extern RTCState rtc_state;
+typedef struct RTCState RTCState;
 
-void rtc_init(int base, int irq);
-void rtc_timer(void);
+RTCState *rtc_init(int base, int irq);
+void rtc_set_memory(RTCState *s, int addr, int val);
+void rtc_set_date(RTCState *s, const struct tm *tm);
 
 /* serial.c */
 
@@ -233,6 +474,8 @@ void serial_receive_break(SerialState *s);
 
 void pic_set_irq(int irq, int level);
 void pic_init(void);
+uint32_t pic_intack_read(CPUState *env);
+void pic_info(void);
 
 /* i8254.c */
 
@@ -246,14 +489,17 @@ typedef struct PITChannelState {
     uint8_t bcd; /* not supported */
     uint8_t gate; /* timer start */
     int64_t count_load_time;
-    int64_t count_last_edge_check_time;
+    /* irq handling */
+    int64_t next_transition_time;
+    QEMUTimer *irq_timer;
+    int irq;
 } PITChannelState;
 
 extern PITChannelState pit_channels[3];
 
-void pit_init(int base);
+void pit_init(int base, int irq);
 void pit_set_gate(PITChannelState *s, int val);
-int pit_get_out(PITChannelState *s);
+int pit_get_out(PITChannelState *s, int64_t current_time);
 int pit_get_out_edges(PITChannelState *s);
 
 /* pc.c */
@@ -262,10 +508,22 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device,
              const char *kernel_filename, const char *kernel_cmdline,
              const char *initrd_filename);
 
+/* ppc.c */
+void ppc_init (int ram_size, int vga_ram_size, int boot_device,
+              DisplayState *ds, const char **fd_filename, int snapshot,
+              const char *kernel_filename, const char *kernel_cmdline,
+              const char *initrd_filename);
+
 /* monitor.c */
 void monitor_init(void);
-void term_printf(const char *fmt, ...);
+void term_printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
 void term_flush(void);
 void term_print_help(void);
 
+/* gdbstub.c */
+
+#define DEFAULT_GDBSTUB_PORT 1234
+
+int gdbserver_start(int port);
+
 #endif /* VL_H */