From c92a973af73db7956f0bc6f9416a2be5b3857269 Mon Sep 17 00:00:00 2001 From: Tw Date: Tue, 24 Nov 2020 15:13:16 +0800 Subject: [PATCH] igt-gpu-tools: fix segment fault on resolve_half_to_float This patch fix segment fault because the ifunc resolver resolve_half_to_float() tries to call unbound global function igt_x86_features(). Fix issue #26671 Signed-off-by: Tw --- ...-loading-failure-in-resolve-function.patch | 63 +++++++++++++++++++ ...ing-failure-in-resolve-function.patch.args | 1 + 2 files changed, 64 insertions(+) create mode 100644 srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch create mode 100644 srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch.args diff --git a/srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch b/srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch new file mode 100644 index 000000000000..dc977190e92b --- /dev/null +++ b/srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch @@ -0,0 +1,63 @@ +diff --git a/lib/igt_halffloat.c b/lib/igt_halffloat.c +index 08ab05fc..e5e8a5bd 100644 +--- a/lib/igt_halffloat.c ++++ b/lib/igt_halffloat.c +@@ -24,6 +24,19 @@ + + #include + #include ++#include ++ ++#ifdef HAVE_CPUID_H ++#include ++#else ++#define __get_cpuid_max(x, y) 0 ++#define __cpuid(level, a, b, c, d) a = b = c = d = 0 ++#define __cpuid_count(level, count, a, b, c, d) a = b = c = d = 0 ++#endif ++ ++#ifndef bit_F16C ++#define bit_F16C (1 << 29) ++#endif + + #include "igt_halffloat.h" + #include "igt_x86.h" +@@ -182,6 +195,20 @@ static void half_to_float_f16c(const uint16_t *h, float *f, unsigned int num) + + #pragma GCC pop_options + ++static bool f16c_is_supported(void) ++{ ++ unsigned max = __get_cpuid_max(0, NULL); ++ unsigned eax, ebx, ecx, edx; ++ ++ if (max >= 1) { ++ __cpuid(1, eax, ebx, ecx, edx); ++ ++ if (ecx & bit_F16C) ++ return true; ++ } ++ return false; ++} ++ + static void float_to_half(const float *f, uint16_t *h, unsigned int num) + { + for (int i = 0; i < num; i++) +@@ -196,7 +223,7 @@ static void half_to_float(const uint16_t *h, float *f, unsigned int num) + + static void (*resolve_float_to_half(void))(const float *f, uint16_t *h, unsigned int num) + { +- if (igt_x86_features() & F16C) ++ if (f16c_is_supported()) + return float_to_half_f16c; + + return float_to_half; +@@ -207,7 +234,7 @@ void igt_float_to_half(const float *f, uint16_t *h, unsigned int num) + + static void (*resolve_half_to_float(void))(const uint16_t *h, float *f, unsigned int num) + { +- if (igt_x86_features() & F16C) ++ if (f16c_is_supported()) + return half_to_float_f16c; + + return half_to_float; diff --git a/srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch.args b/srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch.args new file mode 100644 index 000000000000..2eba1cb3c5ce --- /dev/null +++ b/srcpkgs/igt-gpu-tools/patches/i-g-t-Fix-global-symbol-loading-failure-in-resolve-function.patch.args @@ -0,0 +1 @@ +-Np1