⬢ DragonFlyBSD Kernel Audit
DF-4904 / fix.diff
← back to finding ↓ download raw
--- 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);