Patch to enable the "port 0xe9" debugging facility in qemu (version 0.7.2). This input/output port is used extensively in SOS to ease debugging (the sos_bochs_printf family of functions). -- Thomas Petazzoni and Christophe Lucas diff -urpNX /usr/kernel/dontdiff qemu-0.7.2/hw/pc.c qemu-0.7.2-clucas/hw/pc.c --- qemu-0.7.2/hw/pc.c 2005-09-04 19:11:31.000000000 +0200 +++ qemu-0.7.2-clucas/hw/pc.c 2005-09-14 11:24:51.000000000 +0200 @@ -620,6 +620,12 @@ static void pc_init1(int ram_size, int v cmos_init(ram_size, boot_device, bs_table); + for(i=0 ; i +#include +#include + +#include "vl.h" + +static void port_e9_write(void *opaque, uint32_t address, uint32_t data) +{ + CharDriverState *chr; + chr = opaque; + + qemu_chr_write(chr, & data, 1); +} + +static uint32_t port_e9_read(void *opaque, uint32_t address) +{ + return 0xE9; +} + +CharDriverState *port_e9_init (CharDriverState *chr) +{ + register_ioport_write(0xe9, 1, 1, port_e9_write, chr); + register_ioport_read (0xe9, 1, 1, port_e9_read, chr); + + return chr; +} + diff -urpNX /usr/kernel/dontdiff qemu-0.7.2/vl.c qemu-0.7.2-clucas/vl.c --- qemu-0.7.2/vl.c 2005-09-04 19:11:31.000000000 +0200 +++ qemu-0.7.2-clucas/vl.c 2005-09-14 11:24:51.000000000 +0200 @@ -146,6 +146,7 @@ int graphic_depth = 15; int full_screen = 0; TextConsole *vga_console; CharDriverState *serial_hds[MAX_SERIAL_PORTS]; +CharDriverState *port_e9_hds[MAX_PORT_E9_PORTS]; CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; #ifdef TARGET_I386 int win2k_install_hack = 0; @@ -2969,6 +2970,7 @@ enum { QEMU_OPTION_monitor, QEMU_OPTION_serial, QEMU_OPTION_parallel, + QEMU_OPTION_port_e9, QEMU_OPTION_loadvm, QEMU_OPTION_full_screen, QEMU_OPTION_pidfile, @@ -3040,6 +3042,7 @@ const QEMUOption qemu_options[] = { { "monitor", 1, QEMU_OPTION_monitor }, { "serial", 1, QEMU_OPTION_serial }, { "parallel", 1, QEMU_OPTION_parallel }, + { "port-e9", 1, QEMU_OPTION_port_e9 }, { "loadvm", HAS_ARG, QEMU_OPTION_loadvm }, { "full-screen", 0, QEMU_OPTION_full_screen }, { "pidfile", HAS_ARG, QEMU_OPTION_pidfile }, @@ -3143,6 +3146,8 @@ int main(int argc, char **argv) char monitor_device[128]; char serial_devices[MAX_SERIAL_PORTS][128]; int serial_device_index; + char port_e9_devices[MAX_PORT_E9_PORTS][128]; + int port_e9_device_index; char parallel_devices[MAX_PARALLEL_PORTS][128]; int parallel_device_index; const char *loadvm = NULL; @@ -3184,12 +3189,17 @@ int main(int argc, char **argv) for(i = 1; i < MAX_SERIAL_PORTS; i++) serial_devices[i][0] = '\0'; serial_device_index = 0; - + pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "vc"); for(i = 1; i < MAX_PARALLEL_PORTS; i++) parallel_devices[i][0] = '\0'; parallel_device_index = 0; - + + pstrcpy(port_e9_devices[0], sizeof(port_e9_devices[0]), "vc"); + for(i = 1; i < MAX_PORT_E9_PORTS; i++) + port_e9_devices[i][0] = '\0'; + port_e9_device_index = 0; + nb_tun_fds = 0; net_if_type = -1; nb_nics = 1; @@ -3526,6 +3536,15 @@ int main(int argc, char **argv) sizeof(parallel_devices[0]), optarg); parallel_device_index++; break; + case QEMU_OPTION_port_e9: + if (port_e9_device_index >= MAX_PORT_E9_PORTS) { + fprintf(stderr, "qemu: too many port e9 ports\n"); + exit(1); + } + pstrcpy(port_e9_devices[port_e9_device_index], + sizeof(port_e9_devices[0]), optarg); + port_e9_device_index++; + break; case QEMU_OPTION_loadvm: loadvm = optarg; break; @@ -3771,6 +3790,19 @@ int main(int argc, char **argv) } } + for (i=0 ; i