public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power.
@ 2023-12-05 12:38 Manjunath Matti
  2023-12-05 12:38 ` [PATCH v2 2/2] powerpc: Add HWCAP3/HWCAP4 data to TCB for Power Architecture Manjunath Matti
  2023-12-13 23:45 ` [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power Peter Bergner
  0 siblings, 2 replies; 6+ messages in thread
From: Manjunath Matti @ 2023-12-05 12:38 UTC (permalink / raw)
  To: libc-alpha; +Cc: bergner, fweimer, Manjunath Matti

This patch reserves space for HWCAP3/HWCAP4 in the TCB of powerpc.
These hardware capabilities bits will be used by future Power
architectures.

Versioned symbol '__parse_hwcap_3_4_and_convert_at_platform' advertises
the availability of the new HWCAP3/HWCAP4 data in the TCB.

This is an ABI change for GLIBC 2.39.

Suggested-by: Peter Bergner <bergner@linux.ibm.com>
---
 sysdeps/powerpc/Versions                            |  5 +++++
 sysdeps/powerpc/hwcapinfo.c                         |  5 +++++
 sysdeps/powerpc/nptl/tcb-offsets.sym                |  1 +
 sysdeps/powerpc/nptl/tls.h                          | 13 ++++++++++++-
 .../unix/sysv/linux/powerpc/powerpc32/ld.abilist    |  1 +
 .../unix/sysv/linux/powerpc/powerpc64/be/ld.abilist |  1 +
 .../unix/sysv/linux/powerpc/powerpc64/le/ld.abilist |  1 +
 7 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/sysdeps/powerpc/Versions b/sysdeps/powerpc/Versions
index cca8fd2fc5..575f7317bf 100644
--- a/sysdeps/powerpc/Versions
+++ b/sysdeps/powerpc/Versions
@@ -24,4 +24,9 @@ ld {
     # and AT_PLATFORM data should be stored into the TCB.
     __parse_hwcap_and_convert_at_platform;
   }
+  GLIBC_2.39 {
+    # Symbol used to version control when the ABI started to specify that
+    # HWCAP3 and HWCAP4 are stored in the TCB.
+    __parse_hwcap_3_4_and_convert_at_platform;
+  }
 }
diff --git a/sysdeps/powerpc/hwcapinfo.c b/sysdeps/powerpc/hwcapinfo.c
index f2c473c556..a4d5aa1fa6 100644
--- a/sysdeps/powerpc/hwcapinfo.c
+++ b/sysdeps/powerpc/hwcapinfo.c
@@ -70,11 +70,14 @@ __tcb_parse_hwcap_and_convert_at_platform (void)
   /* Consolidate both HWCAP and HWCAP2 into a single doubleword so that
      we can read both in a single load later.  */
   __tcb.hwcap = (h1 << 32) | (h2 & 0xffffffff);
+  __tcb.hwcap_extn = 0x0;
 
 }
 #if IS_IN (rtld)
 versioned_symbol (ld, __tcb_parse_hwcap_and_convert_at_platform, \
 		  __parse_hwcap_and_convert_at_platform, GLIBC_2_23);
+versioned_symbol (ld, __tcb_parse_hwcap_and_convert_at_platform, \
+		  __parse_hwcap_3_4_and_convert_at_platform, GLIBC_2_39);
 #endif
 
 /* Export __parse_hwcap_and_convert_at_platform in libc.a.  This is used by
@@ -83,4 +86,6 @@ versioned_symbol (ld, __tcb_parse_hwcap_and_convert_at_platform, \
 #ifndef SHARED
 weak_alias (__tcb_parse_hwcap_and_convert_at_platform, \
 	    __parse_hwcap_and_convert_at_platform);
+weak_alias (__tcb_parse_hwcap_and_convert_at_platform, \
+	    __parse_hwcap_3_4_and_convert_at_platform);
 #endif
diff --git a/sysdeps/powerpc/nptl/tcb-offsets.sym b/sysdeps/powerpc/nptl/tcb-offsets.sym
index 4c01615ad0..9b29fe8d1a 100644
--- a/sysdeps/powerpc/nptl/tcb-offsets.sym
+++ b/sysdeps/powerpc/nptl/tcb-offsets.sym
@@ -26,3 +26,4 @@ TCB_AT_PLATFORM			(offsetof (tcbhead_t, at_platform) - TLS_TCB_OFFSET - sizeof(t
 PADDING				(offsetof (tcbhead_t, padding) - TLS_TCB_OFFSET - sizeof(tcbhead_t))
 #endif
 TCB_HWCAP			(offsetof (tcbhead_t, hwcap) - TLS_TCB_OFFSET - sizeof (tcbhead_t))
+TCB_HWCAP_EXTN			(offsetof (tcbhead_t, hwcap_extn) - TLS_TCB_OFFSET - sizeof (tcbhead_t))
diff --git a/sysdeps/powerpc/nptl/tls.h b/sysdeps/powerpc/nptl/tls.h
index a668798181..3f8eca57b5 100644
--- a/sysdeps/powerpc/nptl/tls.h
+++ b/sysdeps/powerpc/nptl/tls.h
@@ -64,6 +64,9 @@
    are private.  */
 typedef struct
 {
+  /* Reservation for HWCAP3 and HWCAP4 data.  To be accessed by GCC in
+     __builtin_cpu_supports(), so it is a part of the public ABI.  */
+  uint64_t hwcap_extn;
   /* Reservation for HWCAP data.  To be accessed by GCC in
      __builtin_cpu_supports(), so it is a part of public ABI.  */
   uint64_t hwcap;
@@ -138,6 +141,7 @@ typedef struct
   ({ 									      \
     __thread_register = (void *) (tcbp) + TLS_TCB_OFFSET;		      \
     THREAD_SET_HWCAP (__tcb.hwcap);					      \
+    THREAD_SET_HWCAP_EXTN (__tcb.hwcap_extn);				      \
     THREAD_SET_AT_PLATFORM (__tcb.at_platform);				      \
     true;								      \
   })
@@ -147,6 +151,8 @@ typedef struct
     void *tp = (void *) (pd) + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE;	      \
     (((tcbhead_t *) ((char *) tp - TLS_TCB_OFFSET))[-1].hwcap) =	      \
       THREAD_GET_HWCAP ();						      \
+    (((tcbhead_t *) ((char *) tp - TLS_TCB_OFFSET))[-1].hwcap_extn) =	      \
+      THREAD_GET_HWCAP_EXTN ();						      \
     (((tcbhead_t *) ((char *) tp - TLS_TCB_OFFSET))[-1].at_platform) =	      \
       THREAD_GET_AT_PLATFORM ();
 
@@ -189,12 +195,17 @@ typedef struct
 		     + TLS_PRE_TCB_SIZE))[-1].pointer_guard		      \
      = THREAD_GET_POINTER_GUARD())
 
-/* hwcap field in TCB head.  */
+/* hwcap & hwcap_extn fields in TCB head.  */
 # define THREAD_GET_HWCAP() \
     (((tcbhead_t *) ((char *) __thread_register				      \
 		     - TLS_TCB_OFFSET))[-1].hwcap)
+# define THREAD_GET_HWCAP_EXTN() \
+    (((tcbhead_t *) ((char *) __thread_register				      \
+		     - TLS_TCB_OFFSET))[-1].hwcap_extn)
 # define THREAD_SET_HWCAP(value) \
     (THREAD_GET_HWCAP () = (value))
+# define THREAD_SET_HWCAP_EXTN(value) \
+    (THREAD_GET_HWCAP_EXTN () = (value))
 
 /* at_platform field in TCB head.  */
 # define THREAD_GET_AT_PLATFORM() \
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist
index 5a68aeb9ee..b1073f0942 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist
@@ -8,3 +8,4 @@ GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
 GLIBC_2.35 __rseq_offset D 0x4
 GLIBC_2.35 __rseq_size D 0x4
+GLIBC_2.39 __parse_hwcap_3_4_and_convert_at_platform F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
index 21f472e674..40942a2cc6 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist
@@ -8,3 +8,4 @@ GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
 GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
+GLIBC_2.39 __parse_hwcap_3_4_and_convert_at_platform F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
index 9c9c40450d..01f2694a4d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist
@@ -8,3 +8,4 @@ GLIBC_2.34 __rtld_version_placeholder F
 GLIBC_2.35 __rseq_flags D 0x4
 GLIBC_2.35 __rseq_offset D 0x8
 GLIBC_2.35 __rseq_size D 0x4
+GLIBC_2.39 __parse_hwcap_3_4_and_convert_at_platform F
-- 
2.39.3


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 2/2] powerpc: Add HWCAP3/HWCAP4 data to TCB for Power Architecture.
  2023-12-05 12:38 [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power Manjunath Matti
@ 2023-12-05 12:38 ` Manjunath Matti
  2023-12-13 23:47   ` Peter Bergner
  2023-12-13 23:45 ` [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power Peter Bergner
  1 sibling, 1 reply; 6+ messages in thread
From: Manjunath Matti @ 2023-12-05 12:38 UTC (permalink / raw)
  To: libc-alpha; +Cc: bergner, fweimer, Manjunath Matti

This patch adds a new feature for powerpc.  In order to get faster
access to the HWCAP3/HWCAP4 masks, similar to HWCAP/HWCAP2 (i.e. for
implementing __builtin_cpu_supports() in GCC) without the overhead of
reading them from the auxiliary vector, we now reserve space for them
in the TCB.

This is an ABI change for GLIBC 2.39.

Suggested-by: Peter Bergner <bergner@linux.ibm.com>
---
 elf/dl-diagnostics.c                          |  2 +
 elf/dl-support.c                              |  2 +
 elf/elf.h                                     |  4 ++
 sysdeps/generic/ldsodefs.h                    |  2 +
 sysdeps/powerpc/dl-procinfo.c                 |  6 ++-
 sysdeps/powerpc/dl-procinfo.h                 | 52 +++++++++++++------
 sysdeps/powerpc/hwcapinfo.c                   | 11 ++--
 sysdeps/unix/sysv/linux/dl-parse_auxv.h       |  2 +
 sysdeps/unix/sysv/linux/dl-sysdep.c           |  2 +
 .../unix/sysv/linux/powerpc/cpu-features.c    |  2 +
 .../unix/sysv/linux/powerpc/cpu-features.h    |  2 +
 sysdeps/unix/sysv/linux/powerpc/libc-start.c  |  6 +++
 12 files changed, 74 insertions(+), 19 deletions(-)

diff --git a/elf/dl-diagnostics.c b/elf/dl-diagnostics.c
index d742cf0a99..68bd521253 100644
--- a/elf/dl-diagnostics.c
+++ b/elf/dl-diagnostics.c
@@ -235,6 +235,8 @@ _dl_print_diagnostics (char **environ)
   _dl_diagnostics_print_labeled_value ("dl_hwcap", GLRO (dl_hwcap));
   _dl_diagnostics_print_labeled_value ("dl_hwcap_important", HWCAP_IMPORTANT);
   _dl_diagnostics_print_labeled_value ("dl_hwcap2", GLRO (dl_hwcap2));
+  _dl_diagnostics_print_labeled_value ("dl_hwcap3", GLRO (dl_hwcap3));
+  _dl_diagnostics_print_labeled_value ("dl_hwcap4", GLRO (dl_hwcap4));
   _dl_diagnostics_print_labeled_string
     ("dl_hwcaps_subdirs", _dl_hwcaps_subdirs);
   _dl_diagnostics_print_labeled_value
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 837fa1c836..ff9560ce72 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -158,6 +158,8 @@ const ElfW(Phdr) *_dl_phdr;
 size_t _dl_phnum;
 uint64_t _dl_hwcap;
 uint64_t _dl_hwcap2;
+uint64_t _dl_hwcap3;
+uint64_t _dl_hwcap4;
 
 enum dso_sort_algorithm _dl_dso_sort_algo;
 
diff --git a/elf/elf.h b/elf/elf.h
index 5c1c1972d1..4f7cb7385f 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -1234,6 +1234,10 @@ typedef struct
 #define AT_RSEQ_FEATURE_SIZE	27	/* rseq supported feature size.  */
 #define AT_RSEQ_ALIGN	28		/* rseq allocation alignment.  */
 
+/* More machine-dependent hints about processor capabilities.  */
+#define AT_HWCAP3	29		/* extension of AT_HWCAP.  */
+#define AT_HWCAP4	30		/* extension of AT_HWCAP.  */
+
 #define AT_EXECFN	31		/* Filename of executable.  */
 
 /* Pointer to the global system page used for system calls and other
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 9b50ddd09f..4c7b60d8e1 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -646,6 +646,8 @@ struct rtld_global_ro
   /* Mask for more hardware capabilities that are available on some
      platforms.  */
   EXTERN uint64_t _dl_hwcap2;
+  EXTERN uint64_t _dl_hwcap3;
+  EXTERN uint64_t _dl_hwcap4;
 
   EXTERN enum dso_sort_algorithm _dl_dso_sort_algo;
 
diff --git a/sysdeps/powerpc/dl-procinfo.c b/sysdeps/powerpc/dl-procinfo.c
index 6b9dad24d8..376a4b6118 100644
--- a/sysdeps/powerpc/dl-procinfo.c
+++ b/sysdeps/powerpc/dl-procinfo.c
@@ -38,6 +38,10 @@
        needed.
   */
 
+/* The total number of available bits (including those prior to
+   _DL_HWCAP_FIRST).  Some of these bits might not be used.  */
+#define _DL_HWCAP_COUNT         128
+
 #ifndef PROCINFO_CLASS
 # define PROCINFO_CLASS
 #endif
@@ -61,7 +65,7 @@ PROCINFO_CLASS struct cpu_features _dl_powerpc_cpu_features
 #if !defined PROCINFO_DECL && defined SHARED
   ._dl_powerpc_cap_flags
 #else
-PROCINFO_CLASS const char _dl_powerpc_cap_flags[64][15]
+PROCINFO_CLASS const char _dl_powerpc_cap_flags[_DL_HWCAP_COUNT][15]
 #endif
 #ifndef PROCINFO_DECL
 = {
diff --git a/sysdeps/powerpc/dl-procinfo.h b/sysdeps/powerpc/dl-procinfo.h
index 641eb54380..f8c2a52c31 100644
--- a/sysdeps/powerpc/dl-procinfo.h
+++ b/sysdeps/powerpc/dl-procinfo.h
@@ -22,16 +22,17 @@
 #include <ldsodefs.h>
 #include <sysdep.h>	/* This defines the PPC_FEATURE[2]_* macros.  */
 
-/* The total number of available bits (including those prior to
-   _DL_HWCAP_FIRST).  Some of these bits might not be used.  */
-#define _DL_HWCAP_COUNT		64
+/* Feature masks are all 32-bits in size.  */
+#define _DL_HWCAP_SIZE		32
 
-/* Features started at bit 31 and decremented as new features were added.  */
-#define _DL_HWCAP_LAST		31
+/* AT_HWCAP2 feature strings follow the AT_HWCAP feature strings.  */
+#define _DL_HWCAP2_OFFSET	_DL_HWCAP_SIZE
 
-/* AT_HWCAP2 features started at bit 31 and decremented as new features were
-   added.  HWCAP2 feature bits start at bit 0.  */
-#define _DL_HWCAP2_LAST		31
+/* AT_HWCAP3 feature strings follow the AT_HWCAP2 feature strings.  */
+#define _DL_HWCAP3_OFFSET	(_DL_HWCAP2_OFFSET + _DL_HWCAP_SIZE)
+
+/* AT_HWCAP4 feature strings follow the AT_HWCAP3 feature strings.  */
+#define _DL_HWCAP4_OFFSET	(_DL_HWCAP3_OFFSET + _DL_HWCAP_SIZE)
 
 /* These bits influence library search.  */
 #define HWCAP_IMPORTANT		(PPC_FEATURE_HAS_ALTIVEC \
@@ -187,21 +188,42 @@ _dl_procinfo (unsigned int type, unsigned long int word)
     case AT_HWCAP:
       _dl_printf ("AT_HWCAP:            ");
 
-      for (int i = 0; i <= _DL_HWCAP_LAST; ++i)
+      for (int i = 0; i < _DL_HWCAP_SIZE; ++i)
        if (word & (1 << i))
          _dl_printf (" %s", _dl_hwcap_string (i));
       break;
     case AT_HWCAP2:
       {
-       unsigned int offset = _DL_HWCAP_LAST + 1;
 
        _dl_printf ("AT_HWCAP2:           ");
 
-        /* We have to go through them all because the kernel added the
-          AT_HWCAP2 features starting with the high bits.  */
-       for (int i = 0; i <= _DL_HWCAP2_LAST; ++i)
-         if (word & (1 << i))
-           _dl_printf (" %s", _dl_hwcap_string (offset + i));
+       /* We have to go through them all because the kernel added the
+	  AT_HWCAP2 features starting with the high bits.  */
+       for (int i = 0; i < _DL_HWCAP_SIZE; ++i)
+	 if (word & (1 << i))
+	   _dl_printf (" %s", _dl_hwcap_string (_DL_HWCAP2_OFFSET + i));
+       break;
+      }
+    case AT_HWCAP3:
+      {
+       _dl_printf ("AT_HWCAP3:           ");
+
+       /* We have to go through them all because the kernel added the
+	  AT_HWCAP3 features starting with the high bits.  */
+       for (int i = 0; i < _DL_HWCAP_SIZE; ++i)
+	 if (word & (1 << i))
+	   _dl_printf (" %s", _dl_hwcap_string (_DL_HWCAP3_OFFSET + i));
+       break;
+      }
+    case AT_HWCAP4:
+      {
+       _dl_printf ("AT_HWCAP4:           ");
+
+       /* We have to go through them all because the kernel added the
+	  AT_HWCAP4 features starting with the high bits.  */
+       for (int i = 0; i <= _DL_HWCAP_SIZE; ++i)
+	 if (word & (1 << i))
+	   _dl_printf (" %s", _dl_hwcap_string (_DL_HWCAP4_OFFSET + i));
        break;
       }
     case AT_L1I_CACHEGEOMETRY:
diff --git a/sysdeps/powerpc/hwcapinfo.c b/sysdeps/powerpc/hwcapinfo.c
index a4d5aa1fa6..9db9fa2c18 100644
--- a/sysdeps/powerpc/hwcapinfo.c
+++ b/sysdeps/powerpc/hwcapinfo.c
@@ -31,7 +31,7 @@ void
 __tcb_parse_hwcap_and_convert_at_platform (void)
 {
 
-  uint64_t h1, h2;
+  uint64_t h1, h2, h3, h4;
 
   /* Read AT_PLATFORM string from auxv and convert it to a number.  */
   __tcb.at_platform = _dl_string_platform (GLRO (dl_platform));
@@ -39,6 +39,8 @@ __tcb_parse_hwcap_and_convert_at_platform (void)
   /* Read HWCAP and HWCAP2 from auxv.  */
   h1 = GLRO (dl_hwcap);
   h2 = GLRO (dl_hwcap2);
+  h3 = GLRO (dl_hwcap3);
+  h4 = GLRO (dl_hwcap4);
 
   /* hwcap contains only the latest supported ISA, the code checks which is
      and fills the previous supported ones.  */
@@ -64,13 +66,16 @@ __tcb_parse_hwcap_and_convert_at_platform (void)
   else if (h1 & PPC_FEATURE_POWER5)
     h1 |= PPC_FEATURE_POWER4;
 
-  uint64_t array_hwcaps[] = { h1, h2 };
+  uint64_t array_hwcaps[] = { h1, h2, h3, h4 };
   init_cpu_features (&GLRO(dl_powerpc_cpu_features), array_hwcaps);
 
   /* Consolidate both HWCAP and HWCAP2 into a single doubleword so that
      we can read both in a single load later.  */
   __tcb.hwcap = (h1 << 32) | (h2 & 0xffffffff);
-  __tcb.hwcap_extn = 0x0;
+
+  /* Consolidate both HWCAP3 and HWCAP4 into a single doubleword so that
+     we can read both in a single load later.  */
+  __tcb.hwcap_extn = (h3 << 32) | (h4 & 0xffffffff);
 
 }
 #if IS_IN (rtld)
diff --git a/sysdeps/unix/sysv/linux/dl-parse_auxv.h b/sysdeps/unix/sysv/linux/dl-parse_auxv.h
index cf5e81bf2c..74e95814cd 100644
--- a/sysdeps/unix/sysv/linux/dl-parse_auxv.h
+++ b/sysdeps/unix/sysv/linux/dl-parse_auxv.h
@@ -47,6 +47,8 @@ void _dl_parse_auxv (ElfW(auxv_t) *av, dl_parse_auxv_t auxv_values)
   GLRO(dl_platform) = (void *) auxv_values[AT_PLATFORM];
   GLRO(dl_hwcap) = auxv_values[AT_HWCAP];
   GLRO(dl_hwcap2) = auxv_values[AT_HWCAP2];
+  GLRO(dl_hwcap3) = auxv_values[AT_HWCAP3];
+  GLRO(dl_hwcap4) = auxv_values[AT_HWCAP4];
   GLRO(dl_clktck) = auxv_values[AT_CLKTCK];
   GLRO(dl_fpu_control) = auxv_values[AT_FPUCW];
   _dl_random = (void *) auxv_values[AT_RANDOM];
diff --git a/sysdeps/unix/sysv/linux/dl-sysdep.c b/sysdeps/unix/sysv/linux/dl-sysdep.c
index 1b3dd869b5..e497206602 100644
--- a/sysdeps/unix/sysv/linux/dl-sysdep.c
+++ b/sysdeps/unix/sysv/linux/dl-sysdep.c
@@ -197,6 +197,8 @@ _dl_show_auxv (void)
 	  [AT_SYSINFO_EHDR - 2] =	{ "SYSINFO_EHDR:      0x", hex },
 	  [AT_RANDOM - 2] =		{ "RANDOM:            0x", hex },
 	  [AT_HWCAP2 - 2] =		{ "HWCAP2:            0x", hex },
+	  [AT_HWCAP3 - 2] =		{ "HWCAP3:            0x", hex },
+	  [AT_HWCAP4 - 2] =		{ "HWCAP4:            0x", hex },
 	  [AT_MINSIGSTKSZ - 2] =	{ "MINSIGSTKSZ:       ", dec },
 	  [AT_L1I_CACHESIZE - 2] =	{ "L1I_CACHESIZE:     ", dec },
 	  [AT_L1I_CACHEGEOMETRY - 2] =	{ "L1I_CACHEGEOMETRY: 0x", hex },
diff --git a/sysdeps/unix/sysv/linux/powerpc/cpu-features.c b/sysdeps/unix/sysv/linux/powerpc/cpu-features.c
index 7c6e20e702..7c39e97cc6 100644
--- a/sysdeps/unix/sysv/linux/powerpc/cpu-features.c
+++ b/sysdeps/unix/sysv/linux/powerpc/cpu-features.c
@@ -113,6 +113,8 @@ init_cpu_features (struct cpu_features *cpu_features, uint64_t hwcaps[])
      which are set by __tcb_parse_hwcap_and_convert_at_platform.  */
   cpu_features->hwcap = hwcaps[0];
   cpu_features->hwcap2 = hwcaps[1];
+  cpu_features->hwcap3 = hwcaps[2];
+  cpu_features->hwcap4 = hwcaps[3];
   /* Default is to use aligned memory access on optimized function unless
      tunables is enable, since for this case user can explicit disable
      unaligned optimizations.  */
diff --git a/sysdeps/unix/sysv/linux/powerpc/cpu-features.h b/sysdeps/unix/sysv/linux/powerpc/cpu-features.h
index e5fce88e5e..e7bdca9994 100644
--- a/sysdeps/unix/sysv/linux/powerpc/cpu-features.h
+++ b/sysdeps/unix/sysv/linux/powerpc/cpu-features.h
@@ -26,6 +26,8 @@ struct cpu_features
   bool use_cached_memopt;
   unsigned long int hwcap;
   unsigned long int hwcap2;
+  unsigned long int hwcap3;
+  unsigned long int hwcap4;
 };
 
 static const char hwcap_names[] = {
diff --git a/sysdeps/unix/sysv/linux/powerpc/libc-start.c b/sysdeps/unix/sysv/linux/powerpc/libc-start.c
index b6aec4615d..34b9bc7c8f 100644
--- a/sysdeps/unix/sysv/linux/powerpc/libc-start.c
+++ b/sysdeps/unix/sysv/linux/powerpc/libc-start.c
@@ -87,6 +87,12 @@ __libc_start_main_impl (int argc, char **argv,
       case AT_HWCAP2:
 	_dl_hwcap2 = (unsigned long int) av->a_un.a_val;
 	break;
+      case AT_HWCAP3:
+	_dl_hwcap3 = (unsigned long int) av->a_un.a_val;
+	break;
+      case AT_HWCAP4:
+	_dl_hwcap4 = (unsigned long int) av->a_un.a_val;
+	break;
       case AT_PLATFORM:
 	_dl_platform = (void *) av->a_un.a_val;
 	break;
-- 
2.39.3


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power.
  2023-12-05 12:38 [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power Manjunath Matti
  2023-12-05 12:38 ` [PATCH v2 2/2] powerpc: Add HWCAP3/HWCAP4 data to TCB for Power Architecture Manjunath Matti
@ 2023-12-13 23:45 ` Peter Bergner
  2023-12-14 23:05   ` Rajalakshmi Srinivasaraghavan
  1 sibling, 1 reply; 6+ messages in thread
From: Peter Bergner @ 2023-12-13 23:45 UTC (permalink / raw)
  To: Manjunath Matti, libc-alpha; +Cc: fweimer

On 12/5/23 6:38 AM, Manjunath Matti wrote:
> This patch reserves space for HWCAP3/HWCAP4 in the TCB of powerpc.
> These hardware capabilities bits will be used by future Power
> architectures.
> 
> Versioned symbol '__parse_hwcap_3_4_and_convert_at_platform' advertises
> the availability of the new HWCAP3/HWCAP4 data in the TCB.
> 
> This is an ABI change for GLIBC 2.39.
> 
> Suggested-by: Peter Bergner <bergner@linux.ibm.com>
> ---
>  sysdeps/powerpc/Versions                            |  5 +++++
>  sysdeps/powerpc/hwcapinfo.c                         |  5 +++++
>  sysdeps/powerpc/nptl/tcb-offsets.sym                |  1 +
>  sysdeps/powerpc/nptl/tls.h                          | 13 ++++++++++++-
>  .../unix/sysv/linux/powerpc/powerpc32/ld.abilist    |  1 +
>  .../unix/sysv/linux/powerpc/powerpc64/be/ld.abilist |  1 +
>  .../unix/sysv/linux/powerpc/powerpc64/le/ld.abilist |  1 +
>  7 files changed, 26 insertions(+), 1 deletion(-)

LGTM.

Reviewed-by: Peter Bergner <bergner@linux.ibm.com>

Peter

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] powerpc: Add HWCAP3/HWCAP4 data to TCB for Power Architecture.
  2023-12-05 12:38 ` [PATCH v2 2/2] powerpc: Add HWCAP3/HWCAP4 data to TCB for Power Architecture Manjunath Matti
@ 2023-12-13 23:47   ` Peter Bergner
  2024-03-19 23:50     ` Peter Bergner
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Bergner @ 2023-12-13 23:47 UTC (permalink / raw)
  To: Manjunath Matti, libc-alpha; +Cc: fweimer

On 12/5/23 6:38 AM, Manjunath Matti wrote:
> This patch adds a new feature for powerpc.  In order to get faster
> access to the HWCAP3/HWCAP4 masks, similar to HWCAP/HWCAP2 (i.e. for
> implementing __builtin_cpu_supports() in GCC) without the overhead of
> reading them from the auxiliary vector, we now reserve space for them
> in the TCB.
> 
> This is an ABI change for GLIBC 2.39.
> 
> Suggested-by: Peter Bergner <bergner@linux.ibm.com>
> ---
>  elf/dl-diagnostics.c                          |  2 +
>  elf/dl-support.c                              |  2 +
>  elf/elf.h                                     |  4 ++
>  sysdeps/generic/ldsodefs.h                    |  2 +
>  sysdeps/powerpc/dl-procinfo.c                 |  6 ++-
>  sysdeps/powerpc/dl-procinfo.h                 | 52 +++++++++++++------
>  sysdeps/powerpc/hwcapinfo.c                   | 11 ++--
>  sysdeps/unix/sysv/linux/dl-parse_auxv.h       |  2 +
>  sysdeps/unix/sysv/linux/dl-sysdep.c           |  2 +
>  .../unix/sysv/linux/powerpc/cpu-features.c    |  2 +
>  .../unix/sysv/linux/powerpc/cpu-features.h    |  2 +
>  sysdeps/unix/sysv/linux/powerpc/libc-start.c  |  6 +++
>  12 files changed, 74 insertions(+), 19 deletions(-)

LGTM.  The only catch is that this patch is dependent on the associated
kernel patch that adds the AT_HWCAP3 and AT_HWCAP4 getting upstream so
glibc can rely on their values.  I'm still working on upstreaming that.

Reviewed-by: Peter Bergner <bergner@linux.ibm.com>

Peter



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power.
  2023-12-13 23:45 ` [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power Peter Bergner
@ 2023-12-14 23:05   ` Rajalakshmi Srinivasaraghavan
  0 siblings, 0 replies; 6+ messages in thread
From: Rajalakshmi Srinivasaraghavan @ 2023-12-14 23:05 UTC (permalink / raw)
  To: libc-alpha


On 12/13/23 5:45 PM, Peter Bergner wrote:
> On 12/5/23 6:38 AM, Manjunath Matti wrote:
>> This patch reserves space for HWCAP3/HWCAP4 in the TCB of powerpc.
>> These hardware capabilities bits will be used by future Power
>> architectures.
>>
>> Versioned symbol '__parse_hwcap_3_4_and_convert_at_platform' advertises
>> the availability of the new HWCAP3/HWCAP4 data in the TCB.
>>
>> This is an ABI change for GLIBC 2.39.
>>
>> Suggested-by: Peter Bergner <bergner@linux.ibm.com>
>> ---
>>   sysdeps/powerpc/Versions                            |  5 +++++
>>   sysdeps/powerpc/hwcapinfo.c                         |  5 +++++
>>   sysdeps/powerpc/nptl/tcb-offsets.sym                |  1 +
>>   sysdeps/powerpc/nptl/tls.h                          | 13 ++++++++++++-
>>   .../unix/sysv/linux/powerpc/powerpc32/ld.abilist    |  1 +
>>   .../unix/sysv/linux/powerpc/powerpc64/be/ld.abilist |  1 +
>>   .../unix/sysv/linux/powerpc/powerpc64/le/ld.abilist |  1 +
>>   7 files changed, 26 insertions(+), 1 deletion(-)
> LGTM.
>
> Reviewed-by: Peter Bergner <bergner@linux.ibm.com>
>
> Peter

Thanks Peter for the review. I will merge the first patch.

Since the second patch depends on the kernel patch, we can review and 
merge that later.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] powerpc: Add HWCAP3/HWCAP4 data to TCB for Power Architecture.
  2023-12-13 23:47   ` Peter Bergner
@ 2024-03-19 23:50     ` Peter Bergner
  0 siblings, 0 replies; 6+ messages in thread
From: Peter Bergner @ 2024-03-19 23:50 UTC (permalink / raw)
  To: Manjunath Matti, libc-alpha; +Cc: fweimer

On 12/13/23 5:47 PM, Peter Bergner wrote:
> On 12/5/23 6:38 AM, Manjunath Matti wrote:
>> This patch adds a new feature for powerpc.  In order to get faster
>> access to the HWCAP3/HWCAP4 masks, similar to HWCAP/HWCAP2 (i.e. for
>> implementing __builtin_cpu_supports() in GCC) without the overhead of
>> reading them from the auxiliary vector, we now reserve space for them
>> in the TCB.
>>
>> This is an ABI change for GLIBC 2.39.
>>
>> Suggested-by: Peter Bergner <bergner@linux.ibm.com>
>> ---
>>  elf/dl-diagnostics.c                          |  2 +
>>  elf/dl-support.c                              |  2 +
>>  elf/elf.h                                     |  4 ++
>>  sysdeps/generic/ldsodefs.h                    |  2 +
>>  sysdeps/powerpc/dl-procinfo.c                 |  6 ++-
>>  sysdeps/powerpc/dl-procinfo.h                 | 52 +++++++++++++------
>>  sysdeps/powerpc/hwcapinfo.c                   | 11 ++--
>>  sysdeps/unix/sysv/linux/dl-parse_auxv.h       |  2 +
>>  sysdeps/unix/sysv/linux/dl-sysdep.c           |  2 +
>>  .../unix/sysv/linux/powerpc/cpu-features.c    |  2 +
>>  .../unix/sysv/linux/powerpc/cpu-features.h    |  2 +
>>  sysdeps/unix/sysv/linux/powerpc/libc-start.c  |  6 +++
>>  12 files changed, 74 insertions(+), 19 deletions(-)
> 
> LGTM.  The only catch is that this patch is dependent on the associated
> kernel patch that adds the AT_HWCAP3 and AT_HWCAP4 getting upstream so
> glibc can rely on their values.  I'm still working on upstreaming that.

The kernel patch this is dependent on has finally reached Linus's tree,
so I have pushed this patch.

Peter


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-03-19 23:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-05 12:38 [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power Manjunath Matti
2023-12-05 12:38 ` [PATCH v2 2/2] powerpc: Add HWCAP3/HWCAP4 data to TCB for Power Architecture Manjunath Matti
2023-12-13 23:47   ` Peter Bergner
2024-03-19 23:50     ` Peter Bergner
2023-12-13 23:45 ` [PATCH v2 1/2] powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power Peter Bergner
2023-12-14 23:05   ` Rajalakshmi Srinivasaraghavan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).