On Tue, Mar 01, 2016 at 11:58:57PM +0100, Martin Pieuchot wrote:
> As explained previously I'm implementing an instrumentation system based
> on ddb(4) and relying on breakpoints to execute kernel probes.
>
> For debugging purposes I need a way to dump the content of the registers
> when a breakpoint-not-for-ddb(4) fired. So I hacked the "show regs" to
> dump the registers at a specified address if one was given.
>
> I'd like to put this in, any objection? Comment?
>
> While here I merged db_print.c into db_command.c, I'm making some room
> before adding new files ;)
>
> If I get any ok I'll update the manual.
>
Can you give an example of how this would be used and what the output
would look like?
-ml
> Index: ddb/db_command.c
> ===================================================================
> RCS file: /cvs/src/sys/ddb/db_command.c,v
> retrieving revision 1.68
> diff -u -p -r1.68 db_command.c
> --- ddb/db_command.c 25 Jan 2016 14:30:30 -0000 1.68
> +++ ddb/db_command.c 1 Mar 2016 22:28:26 -0000
> @@ -43,12 +43,14 @@
> #include <uvm/uvm_extern.h>
> #include <machine/db_machdep.h> /* type definitions */
>
> +#include <ddb/db_access.h>
> #include <ddb/db_lex.h>
> #include <ddb/db_output.h>
> #include <ddb/db_command.h>
> #include <ddb/db_break.h>
> #include <ddb/db_watch.h>
> #include <ddb/db_run.h>
> +#include <ddb/db_sym.h>
> #include <ddb/db_variables.h>
> #include <ddb/db_interface.h>
> #include <ddb/db_extern.h>
> @@ -788,4 +790,41 @@ db_stack_trace_cmd(db_expr_t addr, boole
> char *modif)
> {
> db_stack_trace_print(addr, have_addr, count, modif, db_printf);
> +}
> +
> +void
> +db_show_regs(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
> +{
> + struct db_variable *regp;
> + db_regs_t *regs;
> + db_expr_t value, offset;
> + char *name;
> + char fmt[28];
> +
> + if (have_addr)
> + regs = (db_regs_t *)addr;
> + else
> + regs = &ddb_regs;
> +
> + for (regp = db_regs; regp < db_eregs; regp++) {
> + if (have_addr) {
> + value = db_get_value(addr, sizeof(long), 0);
> + addr += sizeof(long);
> + } else {
> + db_read_variable(regp, &value);
> + }
> +
> + db_printf("%-12s%s", regp->name, db_format(fmt, sizeof(fmt),
> + (long)value, DB_FORMAT_N, 1, sizeof(long) * 3));
> + db_find_xtrn_sym_and_offset((db_addr_t)value, &name, &offset);
> + if (name != NULL && offset <= db_maxoff && offset != value) {
> + db_printf("\t%s", name);
> + if (offset != 0) {
> + db_printf("+%s", db_format(fmt, sizeof(fmt),
> + (long)offset, DB_FORMAT_R, 1, 0));
> + }
> + }
> + db_printf("\n");
> + }
> + db_print_loc_and_inst(PC_REGS(regs));
> }
> Index: ddb/db_print.c
> ===================================================================
> RCS file: /cvs/src/sys/ddb/db_print.c,v
> retrieving revision 1.16
> diff -u -p -r1.16 db_print.c
> --- ddb/db_print.c 25 Jan 2016 14:30:30 -0000 1.16
> +++ ddb/db_print.c 1 Mar 2016 22:23:06 -0000
> @@ -1,69 +0,0 @@
> -/* $OpenBSD: db_print.c,v 1.16 2016/01/25 14:30:30 mpi Exp $ */
> -/* $NetBSD: db_print.c,v 1.5 1996/02/05 01:57:11 christos Exp $ */
> -
> -/*
> - * Mach Operating System
> - * Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University
> - * All Rights Reserved.
> - *
> - * Permission to use, copy, modify and distribute this software and its
> - * documentation is hereby granted, provided that both the copyright
> - * notice and this permission notice appear in all copies of the
> - * software, derivative works or modified versions, and any portions
> - * thereof, and that both notices appear in supporting documentation.
> - *
> - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
> - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
> - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
> - *
> - * Carnegie Mellon requests users of this software to return to
> - *
> - * Software Distribution Coordinator or [email protected]
> - * School of Computer Science
> - * Carnegie Mellon University
> - * Pittsburgh PA 15213-3890
> - *
> - * any improvements or extensions that they make and grant Carnegie Mellon
> - * the rights to redistribute these changes.
> - *
> - * Author: David B. Golub, Carnegie Mellon University
> - * Date: 7/90
> - */
> -
> -/*
> - * Miscellaneous printing.
> - */
> -#include <sys/param.h>
> -#include <sys/systm.h>
> -
> -#include <machine/db_machdep.h>
> -
> -#include <ddb/db_variables.h>
> -#include <ddb/db_sym.h>
> -#include <ddb/db_output.h>
> -#include <ddb/db_extern.h>
> -
> -/*ARGSUSED*/
> -void
> -db_show_regs(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
> -{
> - struct db_variable *regp;
> - db_expr_t value, offset;
> - char * name;
> - char tmpfmt[28];
> -
> - for (regp = db_regs; regp < db_eregs; regp++) {
> - db_read_variable(regp, &value);
> - db_printf("%-12s%s", regp->name, db_format(tmpfmt, sizeof tmpfmt,
> - (long)value, DB_FORMAT_N, 1, sizeof(long) * 3));
> - db_find_xtrn_sym_and_offset((db_addr_t)value, &name, &offset);
> - if (name != 0 && offset <= db_maxoff && offset != value) {
> - db_printf("\t%s", name);
> - if (offset != 0)
> - db_printf("+%s", db_format(tmpfmt, sizeof tmpfmt,
> - (long)offset, DB_FORMAT_R, 1, 0));
> - }
> - db_printf("\n");
> - }
> - db_print_loc_and_inst(PC_REGS(DDB_REGS));
> -}
> Index: conf/files
> ===================================================================
> RCS file: /cvs/src/sys/conf/files,v
> retrieving revision 1.613
> diff -u -p -r1.613 files
> --- conf/files 1 Mar 2016 16:43:08 -0000 1.613
> +++ conf/files 1 Mar 2016 22:24:49 -0000
> @@ -601,7 +601,6 @@ file ddb/db_hangman.c ddb
> file ddb/db_input.c ddb
> file ddb/db_lex.c ddb
> file ddb/db_output.c ddb
> -file ddb/db_print.c ddb
> file ddb/db_run.c ddb | kgdb
> file ddb/db_struct.c ddb & ddb_struct
> file ddb/db_sym.c ddb
>