svn commit: r310045 - head/sys/ddb

John Baldwin jhb at FreeBSD.org
Wed Dec 14 00:18:13 UTC 2016


Author: jhb
Date: Wed Dec 14 00:18:12 2016
New Revision: 310045
URL: https://svnweb.freebsd.org/changeset/base/310045

Log:
  Use casts to force an unsigned comparison in db_search_symbol().
  
  On all of our platforms, db_expr_t is a signed integer while
  db_addr_t is an unsigned integer value.  db_search_symbol used variables
  of type db_expr_t to hold the current offset of the requested address from
  the "best" symbol found so far.  This value was initialized to '~0'.
  When a new symbol is found from a symbol table, the associated diff for the
  new symbol is compared against the existing value as 'if (newdiff < diff)'
  to determine if the new symbol had a smaller diff and was thus a closer
  match.
  
  On 64-bit MIPS, the '~0' was treated as a negative value (-1).  A lookup
  that found a perfect match of an address against a symbol returned a diff
  of 0.  However, in signed comparisons, 0 is not less than -1.  As a result,
  DDB on 64-bit MIPS never resolved any addresses to symbols.  Workaround
  this by using casts to force an unsigned comparison.
  
  Probably the diff returned from db_search_symbol() and X_db_search_symbol()
  should be changed to a db_addr_t instead of a db_expr_t as it is an
  unsigned value (and is an offset of an address, so should fit in the same
  size as an address).
  
  Sponsored by:	DARPA / AFRL

Modified:
  head/sys/ddb/db_sym.c

Modified: head/sys/ddb/db_sym.c
==============================================================================
--- head/sys/ddb/db_sym.c	Tue Dec 13 23:34:07 2016	(r310044)
+++ head/sys/ddb/db_sym.c	Wed Dec 14 00:18:12 2016	(r310045)
@@ -373,10 +373,10 @@ db_search_symbol(db_addr_t val, db_strat
 	register int	i;
 	c_db_sym_t	ret = C_DB_SYM_NULL, sym;
 
-	newdiff = diff = ~0;
+	newdiff = diff = val;
 	for (i = 0; i < db_nsymtab; i++) {
 	    sym = X_db_search_symbol(&db_symtabs[i], val, strategy, &newdiff);
-	    if (newdiff < diff) {
+	    if ((uintmax_t)newdiff < (uintmax_t)diff) {
 		db_last_symtab = &db_symtabs[i];
 		diff = newdiff;
 		ret = sym;


More information about the svn-src-head mailing list