[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: New command dump
From: |
Marco Gerards |
Subject: |
Re: New command dump |
Date: |
Sat, 10 Nov 2007 18:38:52 +0100 |
User-agent: |
Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) |
Bean <address@hidden> writes:
Hi,
> I have written a new command dump, it can hex dump content of file or memory.
Great!
> usage:
>
> dump [-s skip] [-n length] { FILE | (mem) }
>
> The output look just like command hexdump.
>
> If you use (mem) as filename, it will dump physical memory instead of
> file. when dumping memory, the default length is 256, but when dumping
> normal file, the default length is the whole file.
>
> Inside grub2, modules can call function dump directly:
>
> void dump(unsigned long base,char* buf, int len);
>
> --
> Bean
>
> 2007-08-03 Bean <address@hidden>
>
> * conf/common.rmk (pkgdata_MODULES): Add dump.mod.
> (dump_mod_SOURCES): New variable.
> (dump_mod_CFLAGS): Likewise.
> (dump_mod_LDFLAGS): Likewise.
>
> * include/grub/dump.h: New file.
>
> * commands/dump.c: New file.
I think we should commit this soon! Can you please add it to grub-emu
as well?
> Index: conf/common.rmk
> ===================================================================
> RCS file: /sources/grub/grub2/conf/common.rmk,v
> retrieving revision 1.16
> diff -u -p -r1.16 common.rmk
> --- conf/common.rmk 2 Aug 2007 19:12:52 -0000 1.16
> +++ conf/common.rmk 3 Aug 2007 14:59:55 -0000
> @@ -199,7 +199,7 @@ lvm_mod_LDFLAGS = $(COMMON_LDFLAGS)
> pkgdata_MODULES += hello.mod boot.mod terminal.mod ls.mod \
> cmp.mod cat.mod help.mod font.mod search.mod \
> loopback.mod configfile.mod \
> - terminfo.mod test.mod blocklist.mod
> + terminfo.mod test.mod blocklist.mod dump.mod
>
> # For hello.mod.
> hello_mod_SOURCES = hello/hello.c
> @@ -276,6 +276,11 @@ blocklist_mod_SOURCES = commands/blockli
> blocklist_mod_CFLAGS = $(COMMON_CFLAGS)
> blocklist_mod_LDFLAGS = $(COMMON_LDFLAGS)
>
> +# For blocklist.mod.
> +dump_mod_SOURCES = commands/dump.c
> +dump_mod_CFLAGS = $(COMMON_CFLAGS)
> +dump_mod_LDFLAGS = $(COMMON_LDFLAGS)
> +
> # Misc.
> pkgdata_MODULES += gzio.mod elf.mod
>
> Index: include/grub/dump.h
> ===================================================================
> RCS file: /sources/grub/grub2/include/grub/dump.h,v
> diff -Nu include/grub/dump.h
> --- /dev/null 2007-08-03 21:55:33.600000000 +0800
> +++ include/grub/dump.h 2007-08-03 18:27:57.000000000 +0800
> @@ -0,0 +1,25 @@
> +/* dump.h - prototypes for dump */
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2007 Free Software Foundation, Inc.
> + *
> + * GRUB is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * GRUB is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef GRUB_DUMP_H
> +#define GRUB_DUMP_H 1
> +
> +void dump(unsigned long bse,char* buf,int len);
> +
> +#endif /* ! GRUB_DUMP_H */
> Index: commands/dump.c
> ===================================================================
> RCS file: /sources/grub/grub2/commands/dump.c,v
> diff -Nu commands/dump.c
> --- /dev/null 2007-08-03 21:55:33.600000000 +0800
> +++ commands/dump.c 2007-08-03 23:00:48.000000000 +0800
> @@ -0,0 +1,144 @@
> +/* dump.c - command to dump the contents of a file or memory */
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2007 Free Software Foundation, Inc.
> + *
> + * GRUB is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * GRUB is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/normal.h>
> +#include <grub/dl.h>
> +#include <grub/arg.h>
> +#include <grub/file.h>
> +#include <grub/disk.h>
> +#include <grub/misc.h>
> +#include <grub/gzio.h>
> +#include <grub/dump.h>
> +
> +static const struct grub_arg_option options[] = {
> + {"skip", 's', 0, "skip offset bytes from the beginning of file.", 0,
> + ARG_TYPE_INT},
> + {"length", 'n', 0, "read only length bytes", 0, ARG_TYPE_INT},
> + {0, 0, 0, 0, 0, 0}
> +};
> +
> +void
> +dump (unsigned long bse, char *buf, int len)
Can you please use another name, this is a not static. Not being
static is not a problem to me, having access from other modules to
this one for debugging might be useful sometimes.
> +{
> + int pos;
> + char line[80];
> +
> + while (len > 0)
> + {
> + int cnt, i;
> +
> + pos = grub_sprintf (line, "%08lx ", bse);
> + cnt = 16;
> + if (cnt > len)
> + cnt = len;
> +
> + for (i = 0; i < cnt; i++)
> + {
> + pos += grub_sprintf (&line[pos], "%02x ", (unsigned char) buf[i]);
> + if ((i & 7) == 7)
> + line[pos++] = ' ';
> + }
> +
> + for (; i < 16; i++)
> + {
> + pos += grub_sprintf (&line[pos], " ");
> + if ((i & 7) == 7)
> + line[pos++] = ' ';
> + }
> +
> + line[pos++] = '|';
> +
> + for (i = 0; i < cnt; i++)
> + line[pos++] = ((buf[i] >= 32) && (buf[i] < 127)) ? buf[i] : '.';
> +
> + line[pos++] = '|';
> +
> + line[pos] = 0;
> +
> + grub_printf ("%s\n", line);
> +
> + bse += 16;
> + buf += 16;
> + len -= cnt;
> + }
> +}
> +
> +static grub_err_t
> +grub_cmd_dump (struct grub_arg_list *state, int argc, char **args)
> +{
> + grub_file_t file;
> + char buf[GRUB_DISK_SECTOR_SIZE];
> + grub_ssize_t size, length;
> + unsigned long skip;
> + int is_file;
> +
> + if (argc != 1)
> + return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
> +
> + skip = (state[0].set) ? grub_strtoul (state[0].arg, 0, 0) : 0;
> + length = (state[1].set) ? grub_strtoul (state[1].arg, 0, 0) : 0;
> +
> + is_file = (grub_strcmp (args[0], "(mem)"));
> + if ((!is_file) && (!length))
> + length = 256;
> +
> + if (is_file)
> + {
> + file = grub_gzfile_open (args[0], 1);
> + if (!file)
> + return 0;
> +
> + file->offset = skip;
> +
> + while ((size = grub_file_read (file, buf, sizeof (buf))) > 0)
> + {
> + unsigned long len;
> +
> + len = ((length) && (size > length)) ? length : size;
> + dump (skip, buf, len);
> + skip += len;
> + if (length)
> + {
> + length -= len;
> + if (!length)
> + break;
> + }
> + }
> +
> + grub_file_close (file);
> + }
> + else
> + dump (skip, (char *) skip, length);
> +
> + return 0;
> +}
> +
> +
> +GRUB_MOD_INIT (dump)
> +{
> + (void) mod; /* To stop warning. */
> + grub_register_command ("dump", grub_cmd_dump, GRUB_COMMAND_FLAG_BOTH,
> + "dump [ -s offset ] [-n length] { FILE | (mem) }",
> + "Dump the contents of a file or memory.", options);
> +}
> +
> +GRUB_MOD_FINI (dump)
> +{
> + grub_unregister_command ("dump");
> +}
>
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel
- Re: New command dump,
Marco Gerards <=