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
> 

Reply via email to