2015-09-29 21:06:48 |
Newell Jensen |
description |
strace shows you what is going on. The relevant code is in libfreeipmi/locate/ipmi-locate-dmidecode.c, where it is trolling through /dev/mem.
ubuntu@cvm1:~$ dmesg
ubuntu@cvm1:~$ sudo strace -f ipmi-locate
execve("/usr/sbin/ipmi-locate", ["ipmi-locate"], [/* 14 vars */]) = 0
brk(0) = 0xffffaea81000
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7ca000
faccessat(AT_FDCWD, "/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=39330, ...}) = 0
mmap(NULL, 39330, PROT_READ, MAP_PRIVATE, 3, 0) = 0xffff8a7c0000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/libfreeipmi.so.12", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\200\361\21\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=4443888, ...}) = 0
mmap(NULL, 4507696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a356000
mprotect(0xffff8a5eb000, 65536, PROT_NONE) = 0
mmap(0xffff8a5fb000, 1736704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x295000) = 0xffff8a5fb000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\250\16\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1275592, ...}) = 0
mmap(NULL, 1348480, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a20c000
mprotect(0xffff8a33d000, 61440, PROT_NONE) = 0
mmap(0xffff8a34c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x130000) = 0xffff8a34c000
mmap(0xffff8a352000, 13184, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xffff8a352000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libgcrypt.so.11", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\300~\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=474496, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7bf000
mmap(NULL, 473688, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a198000
mmap(0xffff8a208000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0xffff8a208000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\240R\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=588696, ...}) = 0
mmap(NULL, 651944, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a0f8000
mprotect(0xffff8a187000, 61440, PROT_NONE) = 0
mmap(0xffff8a196000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8e000) = 0xffff8a196000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libgpg-error.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\0\n\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18312, ...}) = 0
mmap(NULL, 82008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a0e3000
mprotect(0xffff8a0e6000, 65536, PROT_NONE) = 0
mmap(0xffff8a0f6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xffff8a0f6000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7be000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0e2000
mprotect(0xffff8a34c000, 16384, PROT_READ) = 0
mprotect(0xffff8a0f6000, 4096, PROT_READ) = 0
mprotect(0xffff8a196000, 4096, PROT_READ) = 0
mprotect(0xffff8a208000, 4096, PROT_READ) = 0
mprotect(0xffff8a5fb000, 339968, PROT_READ) = 0
mprotect(0xffff8a7e4000, 4096, PROT_READ) = 0
mprotect(0xffff8a7ce000, 4096, PROT_READ) = 0
munmap(0xffff8a7c0000, 39330) = 0
brk(0) = 0xffffaea81000
brk(0xffffaeaa2000) = 0xffffaeaa2000
getrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM64_INFINITY}) = 0
setrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM64_INFINITY}) = 0
getuid() = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0d2000
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing KCS device using DMIDECO"..., 45Probing KCS device using DMIDECODE... FAILED
) = 45
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing SMIC device using DMIDEC"..., 46Probing SMIC device using DMIDECODE... FAILED
) = 46
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing BT device using DMIDECOD"..., 44Probing BT device using DMIDECODE... FAILED
) = 44
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing SSIF device using DMIDEC"..., 46Probing SSIF device using DMIDECODE... FAILED
) = 46
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/dev/mem", O_RDONLY|O_SYNC) = 3
mmap(NULL, 65536, PROT_READ, MAP_PRIVATE, 3, 0xf0000) = 0xffff8a0c2000
close(3) = 0
--- SIGBUS {si_signo=SIGBUS, si_code=SI_USER, si_pid=18446744071730634752, si_uid=65535} ---
+++ killed by SIGBUS (core dumped) +++
ubuntu@cvm1:~$ dmesg
[61820.238001] Unhandled fault: synchronous external abort (0x92000210) at 0x0000ffff8a0c2000
ubuntu@cvm1:~$ |
ipmi-locate throws a synchronous external abort error on Cavium Thunder crb ARM64 hardware.
A fix for this is needed because other programs, such as MAAS (where it was first noticed), rely upon it.
strace shows you what is going on. The relevant code is in libfreeipmi/locate/ipmi-locate-dmidecode.c, where it is trolling through /dev/mem.
ubuntu@cvm1:~$ dmesg
ubuntu@cvm1:~$ sudo strace -f ipmi-locate
execve("/usr/sbin/ipmi-locate", ["ipmi-locate"], [/* 14 vars */]) = 0
brk(0) = 0xffffaea81000
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7ca000
faccessat(AT_FDCWD, "/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=39330, ...}) = 0
mmap(NULL, 39330, PROT_READ, MAP_PRIVATE, 3, 0) = 0xffff8a7c0000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/libfreeipmi.so.12", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\200\361\21\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=4443888, ...}) = 0
mmap(NULL, 4507696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a356000
mprotect(0xffff8a5eb000, 65536, PROT_NONE) = 0
mmap(0xffff8a5fb000, 1736704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x295000) = 0xffff8a5fb000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\250\16\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1275592, ...}) = 0
mmap(NULL, 1348480, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a20c000
mprotect(0xffff8a33d000, 61440, PROT_NONE) = 0
mmap(0xffff8a34c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x130000) = 0xffff8a34c000
mmap(0xffff8a352000, 13184, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xffff8a352000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libgcrypt.so.11", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\300~\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=474496, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7bf000
mmap(NULL, 473688, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a198000
mmap(0xffff8a208000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0xffff8a208000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\240R\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=588696, ...}) = 0
mmap(NULL, 651944, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a0f8000
mprotect(0xffff8a187000, 61440, PROT_NONE) = 0
mmap(0xffff8a196000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8e000) = 0xffff8a196000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libgpg-error.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\0\n\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18312, ...}) = 0
mmap(NULL, 82008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a0e3000
mprotect(0xffff8a0e6000, 65536, PROT_NONE) = 0
mmap(0xffff8a0f6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xffff8a0f6000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7be000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0e2000
mprotect(0xffff8a34c000, 16384, PROT_READ) = 0
mprotect(0xffff8a0f6000, 4096, PROT_READ) = 0
mprotect(0xffff8a196000, 4096, PROT_READ) = 0
mprotect(0xffff8a208000, 4096, PROT_READ) = 0
mprotect(0xffff8a5fb000, 339968, PROT_READ) = 0
mprotect(0xffff8a7e4000, 4096, PROT_READ) = 0
mprotect(0xffff8a7ce000, 4096, PROT_READ) = 0
munmap(0xffff8a7c0000, 39330) = 0
brk(0) = 0xffffaea81000
brk(0xffffaeaa2000) = 0xffffaeaa2000
getrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM64_INFINITY}) = 0
setrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM64_INFINITY}) = 0
getuid() = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0d2000
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing KCS device using DMIDECO"..., 45Probing KCS device using DMIDECODE... FAILED
) = 45
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing SMIC device using DMIDEC"..., 46Probing SMIC device using DMIDECODE... FAILED
) = 46
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing BT device using DMIDECOD"..., 44Probing BT device using DMIDECODE... FAILED
) = 44
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing SSIF device using DMIDEC"..., 46Probing SSIF device using DMIDECODE... FAILED
) = 46
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/dev/mem", O_RDONLY|O_SYNC) = 3
mmap(NULL, 65536, PROT_READ, MAP_PRIVATE, 3, 0xf0000) = 0xffff8a0c2000
close(3) = 0
--- SIGBUS {si_signo=SIGBUS, si_code=SI_USER, si_pid=18446744071730634752, si_uid=65535} ---
+++ killed by SIGBUS (core dumped) +++
ubuntu@cvm1:~$ dmesg
[61820.238001] Unhandled fault: synchronous external abort (0x92000210) at 0x0000ffff8a0c2000
ubuntu@cvm1:~$
[Test Case]
To reproduce this bug, you will need:
1. Have access to Cavium Thunder crb arm64 hardware (I have not tested this on other arm64 systems but those could work as well) and have Ubuntu with ipmi-locate installed.
2. Run the strace command as shown above.
[Regression Potential]
Although unlikely, if any regressions were to manifest it would most likely be with/without ARM systems and how these C preprocessor directives are compiled into or out of the binaries. Both x86 and arm64 systems have been tested with the patch and no regressions surfaced. |
|
2015-09-29 21:15:31 |
Newell Jensen |
description |
ipmi-locate throws a synchronous external abort error on Cavium Thunder crb ARM64 hardware.
A fix for this is needed because other programs, such as MAAS (where it was first noticed), rely upon it.
strace shows you what is going on. The relevant code is in libfreeipmi/locate/ipmi-locate-dmidecode.c, where it is trolling through /dev/mem.
ubuntu@cvm1:~$ dmesg
ubuntu@cvm1:~$ sudo strace -f ipmi-locate
execve("/usr/sbin/ipmi-locate", ["ipmi-locate"], [/* 14 vars */]) = 0
brk(0) = 0xffffaea81000
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7ca000
faccessat(AT_FDCWD, "/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=39330, ...}) = 0
mmap(NULL, 39330, PROT_READ, MAP_PRIVATE, 3, 0) = 0xffff8a7c0000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/libfreeipmi.so.12", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\200\361\21\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=4443888, ...}) = 0
mmap(NULL, 4507696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a356000
mprotect(0xffff8a5eb000, 65536, PROT_NONE) = 0
mmap(0xffff8a5fb000, 1736704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x295000) = 0xffff8a5fb000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\250\16\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1275592, ...}) = 0
mmap(NULL, 1348480, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a20c000
mprotect(0xffff8a33d000, 61440, PROT_NONE) = 0
mmap(0xffff8a34c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x130000) = 0xffff8a34c000
mmap(0xffff8a352000, 13184, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xffff8a352000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libgcrypt.so.11", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\300~\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=474496, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7bf000
mmap(NULL, 473688, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a198000
mmap(0xffff8a208000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0xffff8a208000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\240R\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=588696, ...}) = 0
mmap(NULL, 651944, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a0f8000
mprotect(0xffff8a187000, 61440, PROT_NONE) = 0
mmap(0xffff8a196000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8e000) = 0xffff8a196000
close(3) = 0
faccessat(AT_FDCWD, "/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/aarch64-linux-gnu/libgpg-error.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\0\n\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18312, ...}) = 0
mmap(NULL, 82008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xffff8a0e3000
mprotect(0xffff8a0e6000, 65536, PROT_NONE) = 0
mmap(0xffff8a0f6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xffff8a0f6000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a7be000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0e2000
mprotect(0xffff8a34c000, 16384, PROT_READ) = 0
mprotect(0xffff8a0f6000, 4096, PROT_READ) = 0
mprotect(0xffff8a196000, 4096, PROT_READ) = 0
mprotect(0xffff8a208000, 4096, PROT_READ) = 0
mprotect(0xffff8a5fb000, 339968, PROT_READ) = 0
mprotect(0xffff8a7e4000, 4096, PROT_READ) = 0
mprotect(0xffff8a7ce000, 4096, PROT_READ) = 0
munmap(0xffff8a7c0000, 39330) = 0
brk(0) = 0xffffaea81000
brk(0xffffaeaa2000) = 0xffffaeaa2000
getrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM64_INFINITY}) = 0
setrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM64_INFINITY}) = 0
getuid() = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0d2000
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing KCS device using DMIDECO"..., 45Probing KCS device using DMIDECODE... FAILED
) = 45
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing SMIC device using DMIDEC"..., 46Probing SMIC device using DMIDECODE... FAILED
) = 46
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing BT device using DMIDECOD"..., 44Probing BT device using DMIDECODE... FAILED
) = 44
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/firmware/efi/systab", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0400, st_size=4096, ...}) = 0
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff8a0c2000
read(3, "ACPI20=0xffea16000\n", 4096) = 19
read(3, "", 4096) = 0
close(3) = 0
munmap(0xffff8a0c2000, 65536) = 0
write(1, "Probing SSIF device using DMIDEC"..., 46Probing SSIF device using DMIDECODE... FAILED
) = 46
write(1, "\n", 1
) = 1
openat(AT_FDCWD, "/dev/mem", O_RDONLY|O_SYNC) = 3
mmap(NULL, 65536, PROT_READ, MAP_PRIVATE, 3, 0xf0000) = 0xffff8a0c2000
close(3) = 0
--- SIGBUS {si_signo=SIGBUS, si_code=SI_USER, si_pid=18446744071730634752, si_uid=65535} ---
+++ killed by SIGBUS (core dumped) +++
ubuntu@cvm1:~$ dmesg
[61820.238001] Unhandled fault: synchronous external abort (0x92000210) at 0x0000ffff8a0c2000
ubuntu@cvm1:~$
[Test Case]
To reproduce this bug, you will need:
1. Have access to Cavium Thunder crb arm64 hardware (I have not tested this on other arm64 systems but those could work as well) and have Ubuntu with ipmi-locate installed.
2. Run the strace command as shown above.
[Regression Potential]
Although unlikely, if any regressions were to manifest it would most likely be with/without ARM systems and how these C preprocessor directives are compiled into or out of the binaries. Both x86 and arm64 systems have been tested with the patch and no regressions surfaced. |
ipmi-locate throws a synchronous external abort error on Cavium Thunder crb ARM64 hardware.
A fix for this is needed because other programs, such as MAAS (where it was first noticed), rely upon it. The strace log (see attached below) shows the error.
[Test Case]
To reproduce this bug, you will need:
1. Have access to Cavium Thunder crb arm64 hardware (I have not tested this on other arm64 systems but those could work as well) and have Ubuntu with ipmi-locate installed.
2. Run the strace command as shown above.
[Regression Potential]
Although unlikely, if any regressions were to manifest it would most likely be with/without ARM systems and how these C preprocessor directives are compiled into or out of the binaries. Both x86 and arm64 systems have been tested with the patch and no regressions surfaced. |
|