pmaports/hybris/libhybris/0002-tests-Regression-test-for-EGL-glibc-TLS-conflict.patch
NotKit c9b6e30e76 Package libhybris (#1402)
As discussed in #1039, I want to split feature/hybris branch into
smaller sensible pull requests.

This is the first one that simply adds android-headers and libhybris
packaging. libhybris allows apps compiled with glibc (musl in our case)
to load Android libraries that utilize bionic libc, which is used to
load proprietary userspace drivers.

The package isn't very useful on its own and requires core (non-UI/Java)
Android services to be running in some way - either in Halium-style LXC
container or in same root as main OS with modified init (Mer/Sailfish do
it this way). Both ways are tested to work in postmarketOS.

libhybris also includes some tests, not all of them are known to be
representative, but test_vibrator and test_egl_configs are usually good
indicators if system is set up correctly.
2018-04-10 21:13:42 +00:00

75 lines
2.7 KiB
Diff

From 91f4908067686c28e10894d4bd6042c0a452bf24 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 2253d50..b5d04a4 100644
--- a/hybris/tests/test_hwcomposer.cpp
+++ b/hybris/tests/test_hwcomposer.cpp
@@ -29,6 +29,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; \
@@ -343,7 +360,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
@@ -369,6 +386,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;
}
// vim:ts=4:sw=4:noexpandtab
--
2.15.1