Date: Wed, 14 Dec 2016 00:18:12 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r310045 - head/sys/ddb Message-ID: <201612140018.uBE0ICrE004686@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612140018.uBE0ICrE004686>