Glibc 2.31 - time64 with 64-bit kernel and 32-bit userland

Adhemerval Zanella adhemerval.zanella@linaro.org
Mon Jan 18 21:22:04 GMT 2021



On 18/01/2021 17:35, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>>> Should we just undefined __NR_clock_gettime64 for 64-bit AArch64?
>>
>> No, this is armhf default binaries.  This situation is similar to
>> i686 running on x86_64 kernels.
> 
> It sure looks like it.  I wasn't aware that it's possible to run armhfp
> userspace on an AArch64 kernel.
> 
> What kind of hardware is needed for that?
> 
> (For some reason, Fedora builds its armhfp distribution in a virtualized
> environment.)

You need a hardware that supports ARMv8 on EL0, was described by 
Armv8-A architecture profile (page D13-3255):

EL3, bits [15:12]
          EL3 Exception level handling. Defined values are:

          0b0000      EL3 is not implemented.
          0b0001      EL3 can be executed in AArch64 state only.
          0b0010      EL3 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

EL2, bits [11:8]
          EL2 Exception level handling. Defined values are:

          0b0000      EL2 is not implemented.
          0b0001      EL2 can be executed in AArch64 state only.
          0b0010      EL2 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

EL1, bits [7:4]
          EL1 Exception level handling. Defined values are:

          0b0001      EL1 can be executed in AArch64 state only.
          0b0010      EL1 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

EL0, bits [3:0]
          EL0 Exception level handling. Defined values are:

          0b0001      EL0 can be executed in AArch64 state only.
          0b0010      EL0 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

And unfortunately there is no way to access this special register without
kernel support [2] even with 'cpuid' support (HWCAP_CPUID from hwcap) [3]
this information is masked away due security issues.

I don't know a easy way to find out without actually issuing a arm32 binary 
to find out if the chip does support A32 and T32 state.

The kernel also limits the compat syscall mechanism (A32 state running on
arm64 chip):

arch/arm64/Kconfig

1213 menuconfig COMPAT
1214         bool "Kernel support for 32-bit EL0"
1215         depends on ARM64_4K_PAGES || EXPERT
1216         select COMPAT_BINFMT_ELF if BINFMT_ELF
1217         select HAVE_UID16
1218         select OLD_SIGSUSPEND3
1219         select COMPAT_OLD_SIGACTION
1220         help
1221           This option enables support for a 32-bit EL0 running under a 64-bit
1222           kernel at EL1. AArch32-specific components such as system calls,
1223           the user helper functions, VFP support and the ptrace interface are
1224           handled appropriately by the kernel.
1225 
1226           If you use a page size other than 4KB (i.e, 16KB or 64KB), please be aware
1227           that you will only be able to execute AArch32 binaries that were compiled
1228           with page size aligned segments.

[1] https://developer.arm.com/documentation/ddi0487/latest/ 
[2] https://stackoverflow.com/questions/60071590/reading-armv8-a-registers-with-devmem-from-gnu-linux-shell
[3] https://www.kernel.org/doc/html/latest/arm64/cpu-feature-registers.html


More information about the Libc-help mailing list