grub-devel
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]