pmaports/hybris/libhybris/0002-tests-Regression-test-for-EGL-glibc-TLS-conflict.patch

75 lines
2.6 KiB
Diff

From dd95903bd734aed6407f682aa843a293814d2ec5 Mon Sep 17 00:00:00 2001
From: Richard Braakman <richard.braakman@jollamobile.com>
Date: Wed, 1 Nov 2017 23:35:31 +0300
Subject: [PATCH 2/3] [tests] Regression test for EGL-glibc TLS conflict bionic
and glibc have different layouts for TLS space. Since libEGL used a bionic
slot directly (in inlined code), libhybris's hooks didn't translate it
properly and libEGL ended up overwriting some unrelated thread-local values
in glibc.
The problem only showed up when linking with libGLESv2 (which
pulls in libEGL), not when linking with libEGL directly. That's
why the test was added to test_glesv2.c
---
hybris/tests/test_hwcomposer.cpp | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/hybris/tests/test_hwcomposer.cpp b/hybris/tests/test_hwcomposer.cpp
index 68917db..695291e 100644
--- a/hybris/tests/test_hwcomposer.cpp
+++ b/hybris/tests/test_hwcomposer.cpp
@@ -32,6 +32,23 @@
#include <malloc.h>
#include <sync/sync.h>
+/* Regression test: make sure that there's no conflict between
+ * the TLS (thread-local storage) slots used via libEGL/bionic
+ * and the TLS space allocated by the host toolchain. The array
+ * declared here should remain unchanged regardless of GL activity.
+ * Since this array is the first __thread storage declared in the main
+ * program, glibc will allocate it before any others.
+ */
+#define SLOT_FILLER (void *) 0x11122111 /* arbitrary non-zero value */
+#define S SLOT_FILLER
+__thread void *tls_space[64] = {
+ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
+ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
+ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
+ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
+};
+#undef S
+
const char vertex_src [] =
" \
attribute vec4 position; \
@@ -346,7 +363,7 @@ int main(int argc, char **argv)
glClearColor ( 1. , 1. , 1. , 1.); // background color
float phase = 0;
int i, oldretire = -1, oldrelease = -1, oldrelease2 = -1;
- for (i=0; i<1020*60; ++i) {
+ for (i=0; i<60*60; ++i) {
glClear(GL_COLOR_BUFFER_BIT);
glUniform1f ( phase_loc , phase ); // write the value of phase to the shaders phase
phase = fmodf ( phase + 0.5f , 2.f * 3.141f ); // and update the local variable
@@ -372,6 +389,18 @@ int main(int argc, char **argv)
printf("terminated\n");
android_dlclose(baz);
#endif
+
+ int bad_tls = 0;
+ for (i=0; i<64; ++i) {
+ if (tls_space[i] != SLOT_FILLER) {
+ printf("TLS array slot %d polluted: %p\n", i, tls_space[i]);
+ bad_tls++;
+ }
+ }
+ if (bad_tls)
+ return 1;
+
+ return 0;
}
#else
--
2.23.0