[Bug 207068] hwpmc wrap around/sign extension

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Wed Feb 10 00:26:24 UTC 2016


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207068

            Bug ID: 207068
           Summary: hwpmc wrap around/sign extension
           Product: Base System
           Version: 10.2-STABLE
          Hardware: amd64
                OS: Any
            Status: New
          Keywords: hwpmc
          Severity: Affects Some People
          Priority: ---
         Component: kern
          Assignee: freebsd-bugs at FreeBSD.org
          Reporter: joss.upton at yahoo.com
                CC: freebsd-amd64 at FreeBSD.org, joss.upton at yahoo.com
                CC: freebsd-amd64 at FreeBSD.org

hwpmc_intel writes the old value of a counter back to the counter value
register during a context switch in.  However, those registers ignore the upper
32 bits (EDX) and instead sign extended to the register width based on EAX[31].
 This is the behavior on all machines not supporting "full width writes"
(indicated by CPUID2_PDCM being set && and IA32_PERF_CAPABILITIES(0x345) &
FW_WRITE(bit 13) being set).

If full width writes are supported, full-width aliases for IA32_PMCn exist
0x400 MSRs higher (e.g. IA32_PMC0 == 0xC1 and IA32_A_PMC0 = 0x4C1).

This affects processes monitoring CPU_CLK for processes running more than a
second or two.  Using this counter quickly runs into a "negative increment"
assertion in hwpmc_mod.c because of the sign extension.  Attached is the least
invasive patch I could come up with and it's against 10.2-R.

It also fixes a few debugging PMCDBGs and adjusts the size of
PMC_DEFAULT_DEBUG_FLAGS to match the size of the structure.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the freebsd-amd64 mailing list