From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Thomas Munro <thomas(dot)munro(at)gmail(dot)com> |
Cc: | Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Bastien Roucariès <rouca(at)debian(dot)org>, pgsql-bugs(at)lists(dot)postgresql(dot)org |
Subject: | Re: Detection of hadware feature => please do not use signal |
Date: | 2024-11-23 22:02:34 |
Message-ID: | 865773.1732399354@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
I wrote:
> But that developer.arm.com page seems pretty definitive. Tomorrow
> I'll have a go at spinning up a 32-bit NetBSD installation and test
> it. Thanks for the research!
Conclusions:
1. Unsurprisingly, a 64-bit kernel exposes machdep.cpuN.cpu_id but
not machdep.id_isar; a 32-bit kernel the reverse.
2. 32-bit userland does not provide <aarch64/armreg.h>. (So I did
not try to use the ID_AA64ISAR0_EL1_CRC32 macro: we'd have had to
hard-code the field position anyway for 32-bit.)
3. It doesn't look to me like NetBSD really supports 32-bit userland
under a 64-bit kernel. Maybe it'd kind of work, but utilities like
cpuctl seem to be built for only one of the kernel APIs.
So I end up proposing the attached. If we do somehow find ourselves
running 32-bit with a 64-bit kernel, this will report "no CRC"
because the sysctl call will fail. I don't think it's worth
sweating over that case.
BTW, I found out that by default we'll build a software-CRC-only
implementation on 32-bit ARM NetBSD, at least in the "generic"
eabihf build:
checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=... no
checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc... no
checking which CRC-32C implementation to use... slicing-by-8
It turns out that -march=armv8-a+crc would work, except:
configure:17624: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc
configure:17648: ccache gcc -o conftest -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wshadow=compatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -O2 -march=armv8-a+crc -Wl,-z,now -Wl,-z,relro conftest.c -lz -ledit -lcurses -lpthread -lexecinfo -lrt -lm >&5
cc1: error: '-mfloat-abi=hard': selected processor lacks an FPU
If you force it with a compatible -mfpu switch (I used -mfpu=neon)
then you get a build with runtime CRC check, and all seems to work.
I did not try very hard to determine what the default -mfpu is here
or why -march=armv8-a+crc overrides whatever the default is. This
probably means that no end user is going to see any benefit from this
exercise, because they are not likely to try adding -mfpu by itself.
If they add "-march=armv8-a+crc -mfpu=whatever" to CFLAGS manually
then configure will deem that a runtime check is not required, so this
code still doesn't get exercised.
tl;dr: a lot of time spent on a probably-useless exercise. Still,
now that we've got the code we may as well commit it. The configure
issue was there all along.
regards, tom lane
Attachment | Content-Type | Size |
---|---|---|
v2-netbsd-arm-crc-detection.patch | text/x-diff | 2.0 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Thomas Munro | 2024-11-23 23:50:09 | Re: Detection of hadware feature => please do not use signal |
Previous Message | Bruce Momjian | 2024-11-23 17:50:53 | Re: BUG #18711: Attempting a connection with a database name longer than 63 characters now fails |