Bean <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> > > * 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 > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel