[PATCH]:display/modify i/o port
Scott Lurndal
slurn at griffin.engr.sgi.com
Tue Oct 26 10:53:32 PDT 1999
> hi,
>
> I have 2 patchs about i/o port.
>
> 1st patch is a small bug fix.
Oops. Good catch.
> 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>
This is fine, but as part of the december release of KDB I've been
splitting it into architecture dependent and architecture independent
parts. These commands best fit as architecture dependent - so they
should probably be done in a new source file.
Thanks,
scott
>
> 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