changes of r1.39 was incomplete. only "examin/m" could handle 'q'.

added support 'r','x','z','d','u', and 'o' with 'q' modifier on 32bit arch.
This commit is contained in:
ryo 2019-09-12 09:20:23 +00:00
parent ab6186d7cf
commit 6e5e6fa958
3 changed files with 41 additions and 20 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: db_access.c,v 1.24 2019/08/23 14:48:50 kamil Exp $ */ /* $NetBSD: db_access.c,v 1.25 2019/09/12 09:20:23 ryo Exp $ */
/* /*
* Mach Operating System * Mach Operating System
@ -30,7 +30,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: db_access.c,v 1.24 2019/08/23 14:48:50 kamil Exp $"); __KERNEL_RCSID(0, "$NetBSD: db_access.c,v 1.25 2019/09/12 09:20:23 ryo Exp $");
#if defined(_KERNEL_OPT) #if defined(_KERNEL_OPT)
#include "opt_kgdb.h" #include "opt_kgdb.h"
@ -82,6 +82,26 @@ db_get_value(db_addr_t addr, size_t size, bool is_signed)
return (value); return (value);
} }
quad_t
db_get_qvalue(db_addr_t addr, size_t size, bool is_signed)
{
uint64_t data;
if (sizeof(db_expr_t) >= sizeof(quad_t) || size <= sizeof(db_expr_t)) {
if (is_signed)
return db_get_value(addr, size, true);
return (uint32_t)db_get_value(addr, size, false);
}
if (size != sizeof(data)) {
db_error("unnsupported size\n");
/*NOTREACHED*/
}
db_read_bytes(addr, sizeof(data), (char *)&data);
return data;
}
void void
db_put_value(db_addr_t addr, size_t size, db_expr_t value) db_put_value(db_addr_t addr, size_t size, db_expr_t value)
{ {

View File

@ -1,4 +1,4 @@
/* $NetBSD: db_access.h,v 1.13 2009/03/07 22:02:17 ad Exp $ */ /* $NetBSD: db_access.h,v 1.14 2019/09/12 09:20:23 ryo Exp $ */
/* /*
* Mach Operating System * Mach Operating System
@ -33,6 +33,7 @@
* Data access functions for debugger. * Data access functions for debugger.
*/ */
db_expr_t db_get_value(db_addr_t, size_t, bool); db_expr_t db_get_value(db_addr_t, size_t, bool);
quad_t db_get_qvalue(db_addr_t, size_t, bool);
void db_put_value(db_addr_t, size_t, db_expr_t); void db_put_value(db_addr_t, size_t, db_expr_t);
void db_read_bytes(db_addr_t, size_t, char *); void db_read_bytes(db_addr_t, size_t, char *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: db_examine.c,v 1.39 2019/09/10 09:32:05 ryo Exp $ */ /* $NetBSD: db_examine.c,v 1.40 2019/09/12 09:20:23 ryo Exp $ */
/* /*
* Mach Operating System * Mach Operating System
@ -30,7 +30,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: db_examine.c,v 1.39 2019/09/10 09:32:05 ryo Exp $"); __KERNEL_RCSID(0, "$NetBSD: db_examine.c,v 1.40 2019/09/12 09:20:23 ryo Exp $");
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
@ -70,7 +70,7 @@ static void
db_examine(db_addr_t addr, char *fmt, int count) db_examine(db_addr_t addr, char *fmt, int count)
{ {
int i, c; int i, c;
db_expr_t value; quad_t value;
int size; int size;
int width; int width;
int bytes; int bytes;
@ -103,7 +103,7 @@ db_examine(db_addr_t addr, char *fmt, int count)
break; break;
case 'q': /* quad-word */ case 'q': /* quad-word */
size = 8; size = 8;
width = 16; width = 24;
break; break;
case 'L': /* implementation maximum */ case 'L': /* implementation maximum */
size = sizeof value; size = sizeof value;
@ -114,27 +114,27 @@ db_examine(db_addr_t addr, char *fmt, int count)
break; break;
case 'p': case 'p':
size = sizeof(void *); size = sizeof(void *);
value = db_get_value(addr, size, true); value = db_get_value(addr, size, false);
addr += size; addr += size;
db_printf("= 0x%lx ", (long)value); db_printf("= 0x%lx ", (long)value);
db_printsym((db_addr_t)value, DB_STGY_ANY, db_printf); db_printsym((db_addr_t)value, DB_STGY_ANY, db_printf);
db_printf("\n"); db_printf("\n");
break; break;
case 'r': /* signed, current radix */ case 'r': /* signed, current radix */
value = db_get_value(addr, size, true); value = db_get_qvalue(addr, size, true);
addr += size; addr += size;
db_format_radix(tbuf, 24, value, false); db_format_radix(tbuf, 24, value, false);
db_printf("%-*s", width, tbuf); db_printf("%-*s", width, tbuf);
break; break;
case 'x': /* unsigned hex */ case 'x': /* unsigned hex */
value = db_get_value(addr, size, false); value = db_get_qvalue(addr, size, false);
addr += size; addr += size;
db_printf("%-*" DDB_EXPR_FMT "x", width, value); db_printf("%-*" PRIx64, width, value);
break; break;
case 'm': /* hex dump */ case 'm': /* hex dump */
/* /*
* Print off in chunks of size. Try to print 16 * Print off in chunks of size. Try to print 16
* bytes at a time into 4 columns. This * bytes at a time into 16/size columns. This
* loops modify's count extra times in order * loops modify's count extra times in order
* to get the nicely formatted lines. * to get the nicely formatted lines.
*/ */
@ -152,7 +152,7 @@ db_examine(db_addr_t addr, char *fmt, int count)
1, false); 1, false);
#endif #endif
db_printf( db_printf(
"%02" DDB_EXPR_FMT "x", "%02" PRIx64,
value); value);
bytes++; bytes++;
if (!(bytes % size)) if (!(bytes % size))
@ -174,25 +174,25 @@ db_examine(db_addr_t addr, char *fmt, int count)
db_printf("\n"); db_printf("\n");
break; break;
case 'z': /* signed hex */ case 'z': /* signed hex */
value = db_get_value(addr, size, true); value = db_get_qvalue(addr, size, true);
addr += size; addr += size;
db_format_hex(tbuf, 24, value, false); db_format_hex(tbuf, 24, value, false);
db_printf("%-*s", width, tbuf); db_printf("%-*s", width, tbuf);
break; break;
case 'd': /* signed decimal */ case 'd': /* signed decimal */
value = db_get_value(addr, size, true); value = db_get_qvalue(addr, size, true);
addr += size; addr += size;
db_printf("%-*" DDB_EXPR_FMT "d", width, value); db_printf("%-*" PRId64, width, value);
break; break;
case 'u': /* unsigned decimal */ case 'u': /* unsigned decimal */
value = db_get_value(addr, size, false); value = db_get_qvalue(addr, size, false);
addr += size; addr += size;
db_printf("%-*" DDB_EXPR_FMT "u", width, value); db_printf("%-*" PRIu64, width, value);
break; break;
case 'o': /* unsigned octal */ case 'o': /* unsigned octal */
value = db_get_value(addr, size, false); value = db_get_qvalue(addr, size, false);
addr += size; addr += size;
db_printf("%-*" DDB_EXPR_FMT "o", width, value); db_printf("%-*" PRIo64, width, value);
break; break;
case 'c': /* character */ case 'c': /* character */
value = db_get_value(addr, 1, false); value = db_get_value(addr, 1, false);