Skip to content

Instantly share code, notes, and snippets.

@orangecms
Created August 23, 2025 21:02
Show Gist options
  • Save orangecms/d7a8a59ec9dc28b74a20da09ff2db3ec to your computer and use it in GitHub Desktop.
Save orangecms/d7a8a59ec9dc28b74a20da09ff2db3ec to your computer and use it in GitHub Desktop.
Go on Arm goes 💥
futexwakeup addr=0x547a08 returned -38
SIGSEGV: segmentation violation
PC=0x55e04 m=2 sigcode=1 addr=0x1006
goroutine 0 gp=0x14025a8 m=2 mp=0x142c808 [idle]:
runtime.futexwakeup(0x547a08, 0x1)
runtime/os_linux.go:100 +0x6c fp=0x1445f94 sp=0x1445f68 pc=0x55e04
runtime.notewakeup(0x547a08)
runtime/lock_futex.go:32 +0x60 fp=0x1445fa8 sp=0x1445f94 pc=0x2846c
runtime.startlockedm(0x1402128)
runtime/proc.go:3189 +0x78 fp=0x1445fb8 sp=0x1445fa8 pc=0x62688
runtime.schedule()
runtime/proc.go:4063 +0x74 fp=0x1445fd0 sp=0x1445fb8 pc=0x64c70
runtime.mstart1()
runtime/proc.go:1862 +0xd8 fp=0x1445fe0 sp=0x1445fd0 pc=0x6037c
runtime.mstart0()
runtime/proc.go:1808 +0x88 fp=0x1445ffc sp=0x1445fe0 pc=0x60288
runtime.mstart()
runtime/asm_arm.s:210 +0x8 fp=0x1446000 sp=0x1445ffc pc=0x9a494
goroutine 1 gp=0x1402128 m=nil [chan receive, locked to thread]:
runtime.gopark(0x35e7bc, 0x1446034, 0xe, 0x7, 0x2)
runtime/proc.go:435 +0xd8 fp=0x1428758 sp=0x1428744 pc=0x95da0
runtime.chanrecv(0x1446000, 0x0, 0x1)
runtime/chan.go:664 +0x3a4 fp=0x1428794 sp=0x1428758 pc=0x22b5c
runtime.chanrecv1(0x1446000, 0x0)
runtime/chan.go:506 +0x20 fp=0x14287a8 sp=0x1428794 pc=0x22788
runtime.gcenable()
runtime/mgc.go:206 +0xd0 fp=0x14287bc sp=0x14287a8 pc=0x34540
runtime.main()
runtime/proc.go:211 +0x13c fp=0x14287ec sp=0x14287bc pc=0x5c76c
runtime.goexit({})
runtime/asm_arm.s:884 +0x4 fp=0x14287ec sp=0x14287ec pc=0x9c0bc
goroutine 2 gp=0x14026c8 m=nil [runnable]:
runtime.forcegchelper()
runtime/proc.go:339 fp=0x1428fec sp=0x1428fec pc=0x5cc40
runtime.goexit({})
runtime/asm_arm.s:884 +0x4 fp=0x1428fec sp=0x1428fec pc=0x9c0bc
created by runtime.init.6 in goroutine 1
runtime/proc.go:336 +0x1c
goroutine 3 gp=0x14027e8 m=nil [runnable]:
runtime.gcenable.gowrap1()
runtime/mgc.go:204 fp=0x14297ec sp=0x14297ec pc=0x345e0
runtime.goexit({})
runtime/asm_arm.s:884 +0x4 fp=0x14297ec sp=0x14297ec pc=0x9c0bc
created by runtime.gcenable in goroutine 1
runtime/mgc.go:204 +0x74
goroutine 4 gp=0x1402908 m=nil [runnable]:
runtime.gcenable.gowrap2()
runtime/mgc.go:205 fp=0x1429fec sp=0x1429fec pc=0x3458c
runtime.goexit({})
runtime/asm_arm.s:884 +0x4 fp=0x1429fec sp=0x1429fec pc=0x9c0bc
created by runtime.gcenable in goroutine 1
runtime/mgc.go:205 +0xbc
trap 0xe
error 0x817
oldmask 0x0
r0 0x1006
r1 0x1006
r2 0x0
r3 0x1
r4 0x27
r5 0x0
r6 0x1
r7 0x4
r8 0x55340e
r9 0x0
r10 0x14025a8
fp 0xffffffa8
ip 0xa
sp 0x1445f68
lr 0x29184
pc 0x55e04
cpsr 0x60000010
fault 0x1006
@orangecms
Copy link
Author

orangecms commented Aug 24, 2025

TL;DR I had to enable CONFIG_COMPAT_32BIT_TIME for futexes to work.

I filed golang/go#75133 and a PR (linked to the issue) to implement the new syscall in Go.

In https://gist.github.com/orangecms/7f985ef19398544114599430b79868f7 I summarize how it went.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment