[SOS] [QEMU][PATCH] 0.7.1 && port-e9

Christophe Lucas clucas at rotomalug.org
Mar 9 Aou 16:01:43 CEST 2005


Pour ceux qui veulent utiliser la version 0.7.1 de qemu et utiliser le
patch originel de David et Thomas pour utiliser le port e9. Ceci afin de logger
des informations lors de vos pérégrination et développement d'OS:
Voilà une mise à jour du patch pour la version 0.7.1 de qemu.
 
Depuis le net:
http://odie.mcom.fr/~clucas/kernel/stuff/qemu-0.7.1-port-e9.patch
 
				- Christophe (clucas at rotomalug.org)


 Makefile.target |    2 +-
 hw/pc.c         |    6 ++++++
 port_e9.c       |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 vl.c            |   36 ++++++++++++++++++++++++++++++++++--
 vl.h            |   12 ++++++++++++
 5 files changed, 104 insertions(+), 3 deletions(-)

Index: qemu-0.7.1-patched/Makefile.target
===================================================================
--- qemu-0.7.1-patched.orig/Makefile.target
+++ qemu-0.7.1-patched/Makefile.target
@@ -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)
Index: qemu-0.7.1-patched/vl.c
===================================================================
--- qemu-0.7.1-patched.orig/vl.c
+++ qemu-0.7.1-patched/vl.c
@@ -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;
@@ -2942,6 +2943,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,
@@ -3013,6 +3015,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 },
@@ -3116,6 +3119,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;
@@ -3157,12 +3162,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;
@@ -3499,6 +3509,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;
@@ -3744,6 +3763,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)
     
Index: qemu-0.7.1-patched/vl.h
===================================================================
--- qemu-0.7.1-patched.orig/vl.h
+++ qemu-0.7.1-patched/vl.h
@@ -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;
Index: qemu-0.7.1-patched/hw/pc.c
===================================================================
--- qemu-0.7.1-patched.orig/hw/pc.c
+++ qemu-0.7.1-patched/hw/pc.c
@@ -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) {
Index: qemu-0.7.1-patched/port_e9.c
===================================================================
--- /dev/null
+++ qemu-0.7.1-patched/port_e9.c
@@ -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;
+}
+


Plus d'informations sur la liste de diffusion Sos