mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
powerpc: Add space for HWCAP3/HWCAP4 in the TCB for future Power.
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> Reviewed-by: Peter Bergner <bergner@linux.ibm.com>
This commit is contained in:
parent
90bcc8721e
commit
93a739d4a1
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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() \
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user