213 lines
7.2 KiB
Diff
213 lines
7.2 KiB
Diff
|
|
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<MAX_PORT_E9_PORTS ; i++) {
|
|
+ if (port_e9_hds[i]) {
|
|
+ port_e9_init(port_e9_hds[i]);
|
|
+ }
|
|
+ }
|
|
+
|
|
/* must be done after all PCI devices are instanciated */
|
|
/* XXX: should be done in the Bochs BIOS */
|
|
if (pci_enabled) {
|
|
diff -urpNX /usr/kernel/dontdiff qemu-0.7.2/Makefile.target qemu-0.7.2-clucas/Makefile.target
|
|
--- qemu-0.7.2/Makefile.target 2005-09-04 19:11:31.000000000 +0200
|
|
+++ qemu-0.7.2-clucas/Makefile.target 2005-09-14 11:24:50.000000000 +0200
|
|
@@ -286,7 +286,7 @@ endif
|
|
ifeq ($(TARGET_BASE_ARCH), i386)
|
|
# Hardware support
|
|
VL_OBJS+= ide.o ne2000.o pckbd.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
|
|
-VL_OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pc.o
|
|
+VL_OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pc.o port_e9.o
|
|
VL_OBJS+= cirrus_vga.o mixeng.o apic.o parallel.o
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), ppc)
|
|
diff -urpNX /usr/kernel/dontdiff qemu-0.7.2/port_e9.c qemu-0.7.2-clucas/port_e9.c
|
|
--- qemu-0.7.2/port_e9.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ qemu-0.7.2-clucas/port_e9.c 2005-09-14 11:24:51.000000000 +0200
|
|
@@ -0,0 +1,51 @@
|
|
+/*
|
|
+ * QEMU Port 0xe9 hack
|
|
+ *
|
|
+ * Copyright (c) 2000-2004 E. Marty, the bochs team, D.Decotigny
|
|
+ *
|
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
+ * of this software and associated documentation files (the "Software"), to deal
|
|
+ * in the Software without restriction, including without limitation the rights
|
|
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
+ * copies of the Software, and to permit persons to whom the Software is
|
|
+ * furnished to do so, subject to the following conditions:
|
|
+ *
|
|
+ * The above copyright notice and this permission notice shall be included in
|
|
+ * all copies or substantial portions of the Software.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
+ * THE SOFTWARE.
|
|
+ */
|
|
+
|
|
+#include <stdio.h>
|
|
+#include <unistd.h>
|
|
+#include <inttypes.h>
|
|
+
|
|
+#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<MAX_PORT_E9_PORTS ; i++) {
|
|
+ if (port_e9_devices[i][0] != '\0') {
|
|
+ port_e9_hds[i] = qemu_chr_open(port_e9_devices[i]);
|
|
+ if (!port_e9_hds[i]) {
|
|
+ fprintf(stderr, "qemu: could not open port e9 device '%s'\n",
|
|
+ port_e9_devices[i]);
|
|
+ exit(1);
|
|
+ }
|
|
+ if (!strcmp(port_e9_devices[i], "vc"))
|
|
+ qemu_chr_printf(port_e9_hds[i], "port_e9_%d console\n", i);
|
|
+ }
|
|
+ }
|
|
+
|
|
/* setup cpu signal handlers for MMU / self modifying code handling */
|
|
#if !defined(CONFIG_SOFTMMU)
|
|
|
|
diff -urpNX /usr/kernel/dontdiff qemu-0.7.2/vl.h qemu-0.7.2-clucas/vl.h
|
|
--- qemu-0.7.2/vl.h 2005-09-04 19:11:31.000000000 +0200
|
|
+++ qemu-0.7.2-clucas/vl.h 2005-09-14 11:24:51.000000000 +0200
|
|
@@ -242,6 +242,15 @@ extern CharDriverState *serial_hds[MAX_S
|
|
|
|
extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
|
|
|
|
+/* port E9 ports */
|
|
+#define MAX_PORT_E9_PORTS 1
|
|
+
|
|
+#if (MAX_PORT_E9_PORTS != 1)
|
|
+ #error "No more than one port E9 is supported"
|
|
+#endif
|
|
+
|
|
+extern CharDriverState *port_e9_hds[MAX_PORT_E9_PORTS];
|
|
+
|
|
/* network redirectors support */
|
|
|
|
#define MAX_NICS 8
|
|
@@ -688,6 +697,9 @@ SerialState *serial_init(int base, int i
|
|
typedef struct ParallelState ParallelState;
|
|
ParallelState *parallel_init(int base, int irq, CharDriverState *chr);
|
|
|
|
+/* port-e9.c */
|
|
+CharDriverState *port_e9_init(CharDriverState *chr);
|
|
+
|
|
/* i8259.c */
|
|
|
|
typedef struct PicState2 PicState2;
|