Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Dec 2016 17:25:42 -0800
From:      John Baldwin <jhb@freebsd.org>
To:        src-committers@freebsd.org
Cc:        svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r310045 - head/sys/ddb
Message-ID:  <2285301.DAKmd1GIbI@ralph.baldwin.cx>
In-Reply-To: <201612140018.uBE0ICrE004686@repo.freebsd.org>
References:  <201612140018.uBE0ICrE004686@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday, December 14, 2016 12:18:12 AM John Baldwin wrote:
> 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.

I am somewhat unsure of why this worked on other architectures.  amd64
treated ~0 as 0xffffffff which when assigned to a 64-bit register was
zero-extended.  i386 also used 0xffffffff, but it used an unsigned comparison
(jae instead of jge).  The kernel linker API returns an unsigned long for
the diff, so I do think using db_addr_t for this type is probably the right
solution in the long term.

>   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).

Also, in case it wasn't clear, this fixes resolution of addresses to names
in MIPS64 stack traces in DDB as well as when using 'x', etc.

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2285301.DAKmd1GIbI>