drm2, i915kms cause instant lock-up

Konstantin Belousov kostikbel at gmail.com
Wed Feb 22 06:08:08 UTC 2017


On Tue, Feb 21, 2017 at 09:32:42PM -0800, Steve Kargl wrote:
> Well, I found the guilty commit.  r313934 breaks loading
> either i915kms.ko or drm2.ko on a Dell Latitude D530 laptop.
> details below.
> 
> I'll also note that starting at r313902 or so, after 
> loading i915kms.ko console output on vt is slooooooow.
> A simply 'time ls /usr/bin' reports 6.27 real, 4.00 user,
> and 1.08 sys, but the drawing on screen takes more than
> 30 seconds.  One can painfully watch each line of output
> be rastered across the screen.
> 
> Kib you can read the details below.  If you need more info,
> ping me.  I did notice that i686_mem.c used constants of the
> form 0xffffULL prior to the merge into x86_mem.c.  You now
> use 0xfffUL.  I have no idea whether this is related to 
> cause.

Well, yes, I found two instances more of such bugs, one seems to be innocent,
and another might be the issue.  Please try this on top of r313934 or
the latest HEAD.

diff --git a/sys/x86/x86/x86_mem.c b/sys/x86/x86/x86_mem.c
index 8e93883863a..d639224f840 100644
--- a/sys/x86/x86/x86_mem.c
+++ b/sys/x86/x86/x86_mem.c
@@ -260,7 +260,7 @@ x86_mrfetch(struct mem_range_softc *sc)
 
 		/* Compute the range from the mask. Ick. */
 		mrd->mr_len = (~(msrv & mtrr_physmask) &
-		    (mtrr_physmask | 0xfffL)) + 1;
+		    (mtrr_physmask | 0xfffLL)) + 1;
 		if (!mrvalid(mrd->mr_base, mrd->mr_len))
 			mrd->mr_flags |= MDF_BOGUS;
 
@@ -638,7 +638,7 @@ x86_mrinit(struct mem_range_softc *sc)
 	 * Determine the size of the PhysMask and PhysBase fields in
 	 * the variable range MTRRs.
 	 */
-	mtrr_physmask = (((uint64_t)1 << cpu_maxphyaddr) - 1) & ~0xfffUL;
+	mtrr_physmask = (((uint64_t)1 << cpu_maxphyaddr) - 1) & ~0xfffULL;
 
 	/* If fixed MTRRs supported and enabled. */
 	if ((mtrrcap & MTRR_CAP_FIXED) && (mtrrdef & MTRR_DEF_FIXED_ENABLE)) {


More information about the freebsd-current mailing list