mirror of
https://github.com/spoopyghosty0/frameport.git
synced 2026-10-24 21:01:52 +02:00
32-bit ARM (armeabi-v7a) libraries run inside a normal 64-bit Android app on the Steam Frame, without Android's native-bridge mechanism (no Lepton changes): each libX.so becomes libX.a32.so plus a 64-bit stub, next to liba32bridge.so (the translator + host glue) and liba32rt.so (a 32-bit static-PIE runtime with bionic's libc/libm/libz/libstdc++ and a loader for the game's libraries). Guest and host talk through hypercalls (SVC 0, r7 = 0x0a32xxxx). Bridge (native/a32translator/bridge): - JNI both ways: generated + hand-written JNIEnv/JavaVM, RegisterNatives and Java_* exports through AAPCS64 -> AAPCS32 trampolines, handles for references, arrays/strings shared when below 4 GiB, else copied - NativeActivity glue, libandroid imports (weak, generated from imports.txt) - GLES 3.2 + extensions + EGL: 996 functions generated from the NDK headers - OpenSL ES output implemented in the guest, played through AAudio - VrApi 1.x (Gear VR era) translated to the 64-bit VrApi -> OpenXR bridge, including OVRPlugin 1.12's frame layout and its wrapped (app texture) chains - controller input as Gear VR touchpad/back/gamepad events (UnityPlayer.injectEvent) - convert.py: prototype of the APK conversion (FramePort patch to follow) - PC harness with a fake JVM (32 checks, qemu or native) and an on-device test APK Translator fixes found on the way: guest signals during blocking system calls and in host code (Boehm GC deadlock in Unity's Mono), static-PIE start files and PT_TLS/PT_GNU_RELRO bias, host fault chaining, stderr to logcat in bridge mode. vrapi-bridge: OVP_HEADLESS_TEST=1 skips the wait for a tracked head (automated tests without a worn headset); upstream-patches/runtime.cpp.patch updated. Verified on the Frame (2026-10-10): AFFECTED The Manor (Unity 5.6 + Mono, OVRPlugin 1.12) runs in the headset with picture and sound; controls in progress. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
27 lines
740 B
C++
27 lines
740 B
C++
// Guest test library (armv7, C++, static libc++): exceptions thrown and caught inside a guest library unwind
|
|
// through the runtime's dl_unwind_find_exidx; static constructors run at load.
|
|
#include <stdexcept>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
static std::vector<int> g_init{1, 2, 3}; // a static constructor
|
|
|
|
static int thrower(int x)
|
|
{
|
|
if (x > 2) throw std::runtime_error("too big: " + std::to_string(x));
|
|
return x;
|
|
}
|
|
|
|
extern "C" int cxx_test(int n)
|
|
{
|
|
int caught = 0;
|
|
for (int k = 0; k < n; k++) {
|
|
try {
|
|
thrower(k);
|
|
} catch (const std::runtime_error &e) {
|
|
if (std::string(e.what()).find("too big") == 0) caught++;
|
|
}
|
|
}
|
|
return caught * 100 + (int)g_init.size();
|
|
}
|