[PATCH]:display/modify i/o port

Masahiro Adegawa adegawa at zerosoft.co.jp
Tue Oct 26 02:13:03 PDT 1999


hi,

I have 2 patchs about i/o port.

1st patch is a small bug fix.
2nd patch is added commands display/modify i/o port.
	iob             <port> [<contents>]  Display/Modify i/o port(8bit)
	iow             <port> [<contents>]  Display/Modify i/o port(16bit)
	iol             <port> [<contents>]  Display/Modify i/o port(32bit)
  ex.
	Entering kdb due to Keyboard Entry
	kdb> iob 0x378
	in : 0x378 = 0x00
	kdb> iob 0x378 0x23
	out : 0x378 = 0x23
	kdb> iob 0x378
	in : 0x378 = 0x23
	kdb> 

thanks, 



--- linux-2.2.12/arch/i386/kdb/kdb_io.c	Fri Aug 27 17:36:16 1999
+++ linux/arch/i386/kdb/kdb_io.c	Tue Oct 26 12:36:20 1999
@@ -46,7 +46,7 @@
 {
 	while (inb(KBD_STATUS_REG) & KBD_STAT_IBF)
 		;
-	outb(KBD_DATA_REG, byte);
+	outb(byte, KBD_DATA_REG);
 }
 
 static void
--- linux-2.2.12/arch/i386/kdb/kdb.c	Fri Aug 27 17:36:16 1999
+++ linux/arch/i386/kdb/kdb.c	Tue Oct 26 17:50:35 1999
@@ -21,6 +21,7 @@
 #endif
 #include <linux/kdb.h>
 #include <asm/system.h>
+#include <asm/io.h>
 #include "kdbsupport.h"
 
 int kdb_active = 0;
@@ -1082,6 +1083,85 @@
 
 	return 0;
 }
+/*
+ * kdb_io
+ *
+ *	This function implements the 'iob','iow' and 'iol' commands.
+ *
+ *	iob|iow|iol  [<addr arg> [<new value>]]
+ *
+ * Inputs:
+ *	argc	argument count
+ *	argv	argument vector
+ *	envp	environment vector
+ *	regs	registers at time kdb was entered.
+ * Outputs:
+ *	None.
+ * Returns:
+ *	zero for success, a kdb diagnostic if error
+ * Locking:
+ *	none.
+ * Remarks:
+ *	none.
+ */
+
+int
+kdb_io(int argc, const char **argv, const char **envp, struct pt_regs *regs)
+{
+	int diag;
+	unsigned long addr;
+	long 	      offset = 0;
+	unsigned long contents;
+	int nextarg;
+	int mod = 0;
+
+	if (argc == 0) {
+		return KDB_ARGCOUNT;
+	}
+
+	nextarg = 1;
+	diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs);
+	if (diag)
+		return diag;
+
+	if (nextarg <= argc) {
+		diag = kdbgetaddrarg(argc, argv, &nextarg, &contents, NULL, NULL, regs);
+		if (diag)
+			return diag;
+		mod = 1;
+		if (nextarg != argc + 1)
+			return KDB_ARGCOUNT;
+	}
+
+	/*
+	 * To prevent access of invalid addresses, check first.
+	 * Hmm...
+	 */
+
+	if (strcmp(argv[0], "iob") == 0) {
+		if (mod)
+			outb(contents, addr);
+		else
+			contents = inb(addr);
+		kdb_printf("%s : 0x%x = 0x%2.2x\n", mod?"out":"in", addr, contents);
+	}
+	if (strcmp(argv[0], "iow") == 0) {
+		if (mod)
+			outw(contents, addr);
+		else
+			contents = inw(addr);
+		kdb_printf("%s : 0x%x = 0x%4.4x\n", mod?"out":"in", addr, contents);
+	}
+	if (strcmp(argv[0], "iol") == 0) {
+		if (mod)
+			outl(contents, addr);
+		else
+			contents = inl(addr);
+		kdb_printf("%s : 0x%x = 0x%8.8x\n", mod?"out":"in", addr, contents);
+	}
+
+	return 0;
+}
 
 /*
  * kdb_go
@@ -1751,6 +1831,9 @@
 	kdb_register("cpu", kdb_cpu, "<cpunum>","Switch to new cpu", 0);
 #endif	/* __SMP__ */
 	kdb_register("ps", kdb_ps, "", 		"Display active task list", 0);
+	kdb_register("iob", kdb_io, "<port> [<contents>]", "Display/Modify i/o port(8bit)", 0);
+	kdb_register("iow", kdb_io, "<port> [<contents>]", "Display/Modify i/o port(16bit)", 0);
+	kdb_register("iol", kdb_io, "<port> [<contents>]", "Display/Modify i/o port(32bit)", 0);
 	kdb_register("reboot", kdb_reboot, "",  "Reboot the machine immediately", 0);
 }
 

-



More information about the kdb mailing list