diff options
author | caiyinyu <caiyinyu@loongson.cn> | 2023-09-15 17:35:19 +0800 |
---|---|---|
committer | caiyinyu <caiyinyu@loongson.cn> | 2023-09-19 09:11:49 +0800 |
commit | a53451559dc9cce765ea5bcbb92c4007e058e92b (patch) | |
tree | 4d5b3261a97e362cb36da87962b99a9799a5dc7c /sysdeps/unix/sysv/linux | |
parent | 5bc9b3a1f6a003f6456f717b590615ea98e2d6fb (diff) | |
download | glibc-a53451559dc9cce765ea5bcbb92c4007e058e92b.tar.gz glibc-a53451559dc9cce765ea5bcbb92c4007e058e92b.tar.xz glibc-a53451559dc9cce765ea5bcbb92c4007e058e92b.zip |
LoongArch: Add glibc.cpu.hwcap support.
Key Points: 1. On lasx & lsx platforms, We must use _dl_runtime_{profile, resolve}_{lsx, lasx} to save vector registers. 2. Via "tunables", users can choose str/mem_{lasx,lsx,unaligned} functions with `export GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,...`. Note: glibc.cpu.hwcaps doesn't affect _dl_runtime_{profile, resolve}_{lsx, lasx} selection. Usage Notes: 1. Only valid inputs: LASX, LSX, UAL. Case-sensitive, comma-separated, no spaces. 2. Example: `export GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,UAL` turns on LASX & UAL. Unmentioned features turn off. With default ifunc: lasx > lsx > unaligned > aligned > generic, effect is: lasx > unaligned > aligned > generic; lsx off. 3. Incorrect GLIBC_TUNABLES settings will show error messages. For example: On lsx platforms, you cannot enable lasx features. If you do that, you will get error messages. 4. Valid input examples: - GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX: lasx > aligned > generic. - GLIBC_TUNABLES=glibc.cpu.hwcaps=LSX,UAL: lsx > unaligned > aligned > generic. - GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,UAL,LASX,UAL,LSX,LASX,UAL: Repetitions allowed but not recommended. Results in: lasx > lsx > unaligned > aligned > generic.
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/loongarch/cpu-features.c | 29 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/loongarch/cpu-features.h | 18 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c | 60 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c | 21 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/loongarch/libc-start.c | 34 |
5 files changed, 158 insertions, 4 deletions
diff --git a/sysdeps/unix/sysv/linux/loongarch/cpu-features.c b/sysdeps/unix/sysv/linux/loongarch/cpu-features.c new file mode 100644 index 0000000000..1290c4ce9f --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/cpu-features.c @@ -0,0 +1,29 @@ +/* Initialize CPU feature data. LoongArch64 version. + This file is part of the GNU C Library. + Copyright (C) 2023 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <cpu-features.h> +#include <elf/dl-hwcaps.h> +#include <elf/dl-tunables.h> +extern void TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *) attribute_hidden; + +static inline void +init_cpu_features (struct cpu_features *cpu_features) +{ + GLRO (dl_larch_cpu_features).hwcap = GLRO (dl_hwcap); + TUNABLE_GET (glibc, cpu, hwcaps, tunable_val_t *, TUNABLE_CALLBACK (set_hwcaps)); +} diff --git a/sysdeps/unix/sysv/linux/loongarch/cpu-features.h b/sysdeps/unix/sysv/linux/loongarch/cpu-features.h index d1a280a5ee..450963cebc 100644 --- a/sysdeps/unix/sysv/linux/loongarch/cpu-features.h +++ b/sysdeps/unix/sysv/linux/loongarch/cpu-features.h @@ -19,13 +19,23 @@ #ifndef _CPU_FEATURES_LOONGARCH64_H #define _CPU_FEATURES_LOONGARCH64_H +#include <stdint.h> #include <sys/auxv.h> -#define SUPPORT_UAL (GLRO (dl_hwcap) & HWCAP_LOONGARCH_UAL) -#define SUPPORT_LSX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LSX) -#define SUPPORT_LASX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LASX) +struct cpu_features + { + uint64_t hwcap; + }; +/* Get a pointer to the CPU features structure. */ +extern const struct cpu_features *_dl_larch_get_cpu_features (void) + __attribute__ ((pure)); + +#define SUPPORT_UAL (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_UAL) +#define SUPPORT_LSX (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_LSX) +#define SUPPORT_LASX (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_LASX) +#define RTLD_SUPPORT_LSX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LSX) +#define RTLD_SUPPORT_LASX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LASX) #define INIT_ARCH() #endif /* _CPU_FEATURES_LOONGARCH64_H */ - diff --git a/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c b/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c new file mode 100644 index 0000000000..6217fda983 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c @@ -0,0 +1,60 @@ +/* Data for LoongArch64 version of processor capability information. + Linux version. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* If anything should be added here check whether the size of each string + is still ok with the given array size. + + All the #ifdefs in the definitions are quite irritating but + necessary if we want to avoid duplicating the information. There + are three different modes: + + - PROCINFO_DECL is defined. This means we are only interested in + declarations. + + - PROCINFO_DECL is not defined: + + + if SHARED is defined the file is included in an array + initializer. The .element = { ... } syntax is needed. + + + if SHARED is not defined a normal array initialization is + needed. + */ + +#ifndef PROCINFO_CLASS +# define PROCINFO_CLASS +#endif + +#if !IS_IN (ldconfig) +# if !defined PROCINFO_DECL && defined SHARED + ._dl_larch_cpu_features +# else +PROCINFO_CLASS struct cpu_features _dl_larch_cpu_features +# endif +# ifndef PROCINFO_DECL += { } +# endif +# if !defined SHARED || defined PROCINFO_DECL +; +# else +, +# endif +#endif + +#undef PROCINFO_DECL +#undef PROCINFO_CLASS diff --git a/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c b/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c new file mode 100644 index 0000000000..455fd71abc --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c @@ -0,0 +1,21 @@ +/* Operating system support for run-time dynamic linker. LoongArch version. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <sysdeps/loongarch/cpu-tunables.c> +#include <sysdeps/unix/sysv/linux/dl-sysdep.c> diff --git a/sysdeps/unix/sysv/linux/loongarch/libc-start.c b/sysdeps/unix/sysv/linux/loongarch/libc-start.c new file mode 100644 index 0000000000..f1346ece0a --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/libc-start.c @@ -0,0 +1,34 @@ +/* Override csu/libc-start.c on LoongArch64. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef SHARED + +/* Mark symbols hidden in static PIE for early self relocation to work. */ +# if BUILD_PIE_DEFAULT +# pragma GCC visibility push(hidden) +# endif + +# include <ldsodefs.h> +# include <cpu-features.c> + +extern struct cpu_features _dl_larch_cpu_features; + +# define ARCH_INIT_CPU_FEATURES() init_cpu_features (&_dl_larch_cpu_features) + +#endif +#include <csu/libc-start.c> |