Re: linux-3.10+: unable to boot 31bit builds

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 20, 2014 at 09:15:45PM -0500, Mike Frysinger wrote:
> since linux-3.10, i can no longer boot when CONFIG_64BIT=n.  using the config
> that works on 3.9.11, i've tried 3.10, 3.11, 3.12, and 3.13 and they all blow
> up on boot.  the crash from 3.13 is below.  see attached config.

CONFIG_64BIT=n is not really well *cough* tested. Is there any reason why you
don't use a 64 bit kernel with config compat turned on?
That should work, since I also use a complete 32 bit user space distro with
a 64 bit compat kernel.

Anyway,

> oddly, i tried enabling extended debugging options under Lock Debugging and
> the system does boot.  but then some things run oddly at runtime like the

With lockdep the lockref code won't use the cmpxchg64 on 32 bit which is
completely broken.


> statfs64() syscall returning errors (using `df` -- same binary works under 
> older kernels).

Ok, I'll look into that later.

> ------------[ cut here ]------------
> Kernel BUG at 0029abd6 [verbose debug info unavailable]
> specification exception: 0006 [#1] SMP
> Modules linked in:
> CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.13.0 #4
> task: 005a16c8 ti: 00592000 task.ti: 00592000
> Krnl PSW : 070ce000 8029abd6 (lockref_get+0x3e/0x9c)
>            R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:2 PM:0
> Krnl GPRS: 00000000 00000002 00000001 00000000
>            00000000 00000001 78f05a60 00000000
>            004b6b7e 00400000 78f05a60 78e01870
>            78e018c0 0041c038 00593e28 00593e08
> Krnl Code: 8029abcc: a71a0001           ahi     %r1,1
>            8029abd0: 1852               lr      %r5,%r2
>           #8029abd2: bb40f064           cds     %r4,%r0,100(%r15)
>           >8029abd6: 1943               cr      %r4,%r3

Yep, that's a compare and swap on not proper aligned address on
the stack. Which indicates that our cmpxhg64 on 32 bit is broken
in multiple ways.

The patch below will fix this crash, but not the statfs issue.

diff --git a/arch/s390/include/asm/cmpxchg.h b/arch/s390/include/asm/cmpxchg.h
index 0f636cbdf342..6650a9064a8c 100644
--- a/arch/s390/include/asm/cmpxchg.h
+++ b/arch/s390/include/asm/cmpxchg.h
@@ -185,11 +185,12 @@ static inline unsigned long long __cmpxchg64(void *ptr,
 {
 	register_pair rp_old = {.pair = old};
 	register_pair rp_new = {.pair = new};
+	unsigned long long *ullptr = ptr;
 
 	asm volatile(
 		"	cds	%0,%2,%1"
-		: "+&d" (rp_old), "=Q" (ptr)
-		: "d" (rp_new), "Q" (ptr)
+		: "+&d" (rp_old), "+Q" (*ullptr)
+		: "d" (rp_new)
 		: "memory", "cc");
 	return rp_old.pair;
 }

--
To unsubscribe from this list: send the line "unsubscribe linux-s390" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Kernel Development]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Info]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Linux Media]     [Device Mapper]

  Powered by Linux