DF-4904 / fix.diff
--- a/sys/dev/powermng/powernow/powernow.c +++ b/sys/dev/powermng/powernow/powernow.c @@ -228,7 +228,7 @@ { unsigned int i; uint64_t status; - uint32_t val; + int32_t val; /* DF-4904: signed so (val > 0) clamp works */ int cfid , cvid, fid = 0, vid = 0; int rvo; struct k8pnow_cpu_state *cstate; @@ -258,6 +258,9 @@ * up. */ while (cvid > vid) { + /* DF-4904: signed math + clamp: the old uint32_t val made + * (val > 0) unable to catch the underflow when + * cvid < (1 << mvs), sending 0xFFFFFFxx to the MSR. */ val = cvid - (1 << cstate->mvs); WRITE_FIDVID(cfid, (val > 0) ? val : 0, 1ULL); READ_PENDING_WAIT(status); |