c9b6e30e76
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.
75 lines
2.7 KiB
Diff
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
|
|
|