Commit dff354e7 authored by Daniel Black's avatar Daniel Black

MDEV-34825: my_cpu.h - non-glibc ism for POWER

Taking both the FreeBSD[1] and Alpine[1] patch concepts;

provide non-GLIBC definations for HMT_*.

Provide FreeBSD ASM base for __ppc_get_timebase.
On alternately use __builtin_ppc_get_timebase which is described
on https://gcc.gnu.org/onlinedocs/gcc/Basic-PowerPC-Built-in-Functions-Available-on-all-Configurations.html
an not depended on glibc/musl.

[1] https://github.com/freebsd/freebsd-ports/blob/15d22e1c70da81aaa5751ad0d82f92e9451c4d81/databases/mariadb106-server/files/patch-include_my__cpu.h
[2] https://gitlab.alpinelinux.org/alpine/aports/-/blob/master/main/mariadb/ppc-remove-glibc-dep.patch
parent e9b70e59
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
*/ */
#ifdef _ARCH_PWR8 #ifdef _ARCH_PWR8
#ifdef __GLIBC__
#include <sys/platform/ppc.h> #include <sys/platform/ppc.h>
/* Very low priority */ /* Very low priority */
#define HMT_very_low() __ppc_set_ppr_very_low() #define HMT_very_low() __ppc_set_ppr_very_low()
...@@ -37,6 +38,18 @@ ...@@ -37,6 +38,18 @@
#define HMT_medium_high() __ppc_set_ppr_med_high() #define HMT_medium_high() __ppc_set_ppr_med_high()
/* High priority */ /* High priority */
#define HMT_high() asm volatile("or 3,3,3") #define HMT_high() asm volatile("or 3,3,3")
#else /* GLIBC */
#if defined(__FreeBSD__)
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
#define HMT_very_low() __asm__ volatile ("or 31,31,31")
#define HMT_low() __asm__ volatile ("or 1,1,1")
#define HMT_medium_low() __asm__ volatile ("or 6,6,6")
#define HMT_medium() __asm__ volatile ("or 2,2,2")
#define HMT_medium_high() __asm__ volatile ("or 5,5,5")
#define HMT_high() asm volatile("or 3,3,3")
#endif /* GLIBC */
#else #else
#define HMT_very_low() #define HMT_very_low()
#define HMT_low() #define HMT_low()
...@@ -81,7 +94,13 @@ static inline void MY_RELAX_CPU(void) ...@@ -81,7 +94,13 @@ static inline void MY_RELAX_CPU(void)
__asm__ __volatile__ ("pause"); __asm__ __volatile__ ("pause");
#endif #endif
#elif defined(_ARCH_PWR8) #elif defined(_ARCH_PWR8)
__ppc_get_timebase(); #ifdef __FreeBSD__
uint64_t __tb;
__asm__ volatile ("mfspr %0, 268" : "=r" (__tb));
#else
/* Changed from __ppc_get_timebase for musl compatibility */
__builtin_ppc_get_timebase();
#endif
#elif defined __GNUC__ && (defined __arm__ || defined __aarch64__) #elif defined __GNUC__ && (defined __arm__ || defined __aarch64__)
/* Mainly, prevent the compiler from optimizing away delay loops */ /* Mainly, prevent the compiler from optimizing away delay loops */
#ifdef _aarch64_ #ifdef _aarch64_
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment