Status: living tracker
Created: 2026-07-17
Rule: Every temporary workaround that future work must remove belongs here as OPEN.
When the proper fix lands, mark the item CLOSED, move it into §Closed (sorted), and keep the full history.
Do not list permanent non-goals as OPEN workarounds—list them under §Non-goals.
| Name | Use |
|---|---|
win32_open_items.md (this file) |
Preferred: leftovers and temporary workarounds |
win32_leftovers.md |
OK alias if you prefer |
win32_bug_tracker.md |
Prefer for defect IDs only; this file is broader |
| Doc | Role |
|---|---|
| win64_art_port.md | Product phases / feasibility |
| win32_filesystem.md | Option H path model |
| win32_tls_jit_entrypoints.md | TLS / managed ABI / quick / JIT design (draft) |
| win32_libcore_os_natives.md | Os/Linux natives: Implemented / Needed / ENOSYS |
tools/verify/win64_phase*/RESULT.md |
Gate evidence |
Add when you land a temporary path (compile stub, force-interpreter, fake DLL name, wine-only gate, etc.):
### W-XXX — short title
- **State:** OPEN
- **Kind:** workaround | leftover | debt | host-gap
- **Area:** art | libcore-stub | icu | packaging | linux-host | docs | …
- **Symptom / why:** …
- **Current behavior:** …
- **Proper fix:** …
- **Code anchors:** `path:line` or symbol names
- **Blocked on / design doc:** …
- **Opened:** YYYY-MM-DDClose when fixed:
- **State:** CLOSED (YYYY-MM-DD) — one-line howThen move the full item into §Closed (keep history; sort by ID prefix then number). Do not leave CLOSED bodies under Temporary workarounds / leftovers / host / design.
IDs: W- workaround, L- leftover/product gap, H- host/validation gap, D- docs/process. Numbers are stable; do not reuse.
| Bucket | Summary |
|---|---|
| Phases 0–3 | Gate-complete (P3 G12 real Win10 + wine) |
| Phase 4 | Wine complete; host re-run still recommended |
| PE libcore/ICU/openjdk | Product-default real PE (icu/javacore/openjdk); NIO.2 non-goal; NetProbe OK |
| Quick/JIT/TLS | Partial: rSELF=r15; nterp N-1 + PE 0x328; ClassLoader empty-path fixed (defer nterp until finished_starting); float methods excluded; residual empty Hello stdout under nterp; switch/-Xint green |
| Linux multiplatform | Native dalvikvm -showversion OK; imageless Hello e2e not re-gated here |
- State: CLOSED (product default uses quick invoke)
- Kind: workaround (removed as product default)
- Area: art / invoke
- Symptom / why: Win64 used to force interpreter invoke until quick path was smoke-validated.
- Current behavior: On
_WIN32, invokable non-proxy methods useart_quick_invoke_*(MS entry → SysV body, rSELF=r15) by default, matching Linux. Opt-out withART_WIN64_QUICK_INVOKE=0forcesEnterInterpreterFromInvoke. Debugger/-Xintstill force interpreter via normal ART paths. - Proper fix: Done for product default. Residual: broader host re-run; optional delete of the env force path later.
- Code anchors:
vendor/art/runtime/art_method.cc;quick_entrypoints_x86_64.SWin prologues; win32_tls_jit_entrypoints.md §12b / §17.8 - Blocked on: n/a (default ON as of 2026-07-19)
- Opened: 2026-07-16 (Phase 2)
- Updated: 2026-07-19 — product default ON (Linux-like); opt-out
ART_WIN64_QUICK_INVOKE=0
- State: OPEN (partial — rSELF path is product default; residual JNI attach / non-invoke entries)
- Kind: workaround / design debt
- Area: art / TLS
- Symptom / why: Linux x86_64 uses
ARCH_SET_GSso quick/nterp use%gs:OFFSET. Windows GS is TEB. - Current behavior:
InitCpudoes not touch GS (correct). Asm usesTHREAD_*macros: r15 base on_WIN32, GS on Linux. rSELF published inart_quick_invoke_*(default ON). Nterp N-1 (rREFS=rbp) product default ON (§17.8). - Proper fix: Keep rSELF=r15; audit remaining managed entries (JNI return, attach, trampolines) publish rSELF; then close when full matrix is green without GS.
- Code anchors:
thread_x86_64.cc;asm_support_x86_64.STHREAD_*;nterp.cc(default ON; opt-outART_WIN64_NTERP=0); design §6 / §12b / §15 / §16 / §17 / §17.8 - Opened: 2026-07-16
- Updated: 2026-07-19 — product default rSELF + nterp ON; residual attach/publish audit
- Design: win32_tls_jit_entrypoints.md §15 N-1 LOCKED, §17 register-map lock; FS-self §16 reject; §17.8 defaults ON
- State: OPEN (partial — SETUP_SAVE_REFS_ONLY / ALL_CALLEE_SAVES un-int3'd on Win)
- Kind: workaround (hard fail if other paths still stubbed)
- Area: art / quick asm
- Symptom / why: Apple still traps; Win now builds frames via shared SETUP with
THREAD_STOREfor top quick frame. - Current behavior:
SETUP_SAVE_REFS_ONLY_FRAME/SETUP_SAVE_ALL_CALLEE_SAVES_FRAMEno longerint3on_WIN32. C++ helpers called assysv_abi(ART_QUICK_ENTRYPOINT_ABI). - Proper fix: Smoke the invoke→interpreter bridge; close when no Win SETUP path traps and product default uses quick invoke.
- Code anchors:
asm_support_x86_64.S;ART_QUICK_ENTRYPOINT_ABIin macros + entrypoints - Depends on: W-001 validation
- Opened: 2026-07-16
- Updated: 2026-07-18 — Win SETUP enabled
- State: OPEN (acceptable interim; still temporary vs ideal PE codegen)
- Kind: workaround
- Area: art / asm
- Current behavior: Win path calls
art_Runtime_instance_ptrwith shadow space instead of@GOTPCREL. - Proper fix: Keep helper or RIP-relative import of
Runtime::instance_consistently for JIT + hand asm (document single sequence). - Code anchors:
LOAD_RUNTIME_INSTANCEinasm_support_x86_64.S - Opened: 2026-07-16
- State: OPEN
- Kind: workaround (policy flags)
- Area: packaging / product CLI
- Current behavior: Host package scripts and wine runners force interpreter + no boot image + no sigchain.
- Proper fix: After W-001–W-003, drop forced
-Xintfor default product scripts (keep as opt-in debug). Imageless may remain until boot image (separate track). - Code anchors:
tools/win64/host_package/package_win64_phase3.sh,tools/verify/win64_phase*/run_*.sh - Opened: 2026-07-16
- State: OPEN (may become permanent architecture — reclassify if so)
- Kind: workaround → candidate permanent design
- Area: art / exceptions
- Current behavior:
sigchain_windows.ccstub; crash/null/SO paths use VEH + minidump inruntime_windows.cc. - Proper fix: Document as permanent WinNT model or deepen VEH/sigchain integration tests; remove any code that still assumes Linux sigchain interposition.
- Code anchors:
vendor/art/runtime/multiplatform/windows/sigchain_windows.cc,runtime_windows.cc - Opened: 2026-07-16
- State: OPEN
- Kind: workaround
- Area: art / jni
- Current behavior: Extra shorty paths in interpreter JNI so Phase-2/3 natives work without full quick/JNI trampoline matrix.
- Proper fix: After real PE libcore + entrypoints, audit whether generic path suffices; trim PE-only shorty explosion if redundant.
- Code anchors: interpreter JNI / generic paths (Phase-2 RESULT notes: FJ/IJ/VLJ/…)
- Opened: 2026-07-16
- State: OPEN
- Kind: workaround
- Area: art / jni
- Current behavior: Windows avoids GS-based JNI lookup stub.
- Proper fix: Fold into final managed-self / JNI trampoline design (W-002).
- Code anchors: Phase-2 RESULT; JNI resolution paths under
_WIN32 - Opened: 2026-07-16
- State: OPEN (may stay as permanent Win allocator policy)
- Kind: workaround / platform policy
- Area: art / heap
- Current behavior: WIN32 mmap/MORECORE path + low-4g constraints for compressed refs / imageless bring-up (see Phase-2 root-cause notes).
- Proper fix: Re-validate against real Win10 under load; document as permanent if correct; remove any Linux-only assumptions left in comments.
- Code anchors: dlmalloc Win path / Phase-2 docs in
win64_art_port.md§9c - Opened: 2026-07-16
- State: OPEN
- Kind: workaround
- Area: art / threads
- Current behavior: Win
GetThreadStackuses VirtualQuery + clamps; ProtectStack skipped/no-op on_WIN32in places to avoid mprotect of wrong regions. - Proper fix: TEB-accurate stack bounds + optional guard pages when trusted; re-enable protection carefully.
- Code anchors:
vendor/art/runtime/thread.ccWin branch;ProtectStack#ifdef _WIN32 - Opened: 2026-07-16
- State: OPEN
- Kind: workaround / incomplete port
- Area: openjdk / nio
- Current behavior: Phase B2 builds AOSP NIO channel natives with Winsock CRT-fd shims;
epoll_*emulated withselect; NIO.2 UnixNativeDispatcher/WatchService/async EPollPort not registered. - Proper fix: Keep NIO.2 non-goal; deepen channel/options matrix; optional IOCP epoll later if needed.
- Code anchors:
tools/verify/win64_libcore_icu/CMakeLists.txt(_OJ_SRCSfilters);compat/src/win64_socket_posix.c - Opened: 2026-07-17
- State: OPEN
- Kind: workaround / debt (must revert multipath demotions)
- Area: art / libcore / JNI ABI
- Symptom / why: Official AOSP libcore marks many natives
@CriticalNativeor@FastNative(Math/StrictMath were @FastNative → @CriticalNative in AOSP; see libcored021f1d8475c). Win64 multipath cannot yet honor those ABIs because:- W-001 forces interpreter invoke (no quick/managed entrypoints / TLS).
- Interpreter JNI historically lacked full CriticalNative shorty coverage (partially papered by W-019 for Math
DD/DDD/…). - Product demotions for bring-up: Math.ceil / Math.floor are pure Java (
ART-WinNTcomments inMath.java; natives unregistered inMath.c) even though AOSP exposes them as@CriticalNativenatives. - Win
Math.cuses a PE-specific registration table (gMethodsWinCriticalNative-shaped pointers) vs LinuxFAST_NATIVE_METHODmacro table — temporary dual path until PE trampolines match AOSP.
- Current behavior:
- Annotations remain on most Math/StrictMath/etc. methods, but ceil/floor are non-native pure Java.
- Win64 relies on interpreter CriticalNative shorty dispatch + correct CriticalNative binding (no
JNIEnv*) rather than real quick CriticalNative stubs. - FastNative methods stay Runnable on the interpreter bridge (W-019 supporting fix) instead of true FastNative entrypoints.
- Proper fix (when JIT / TLS / quick entrypoints land — W-001–W-003 + win32_tls_jit_entrypoints.md):
- Restore every multipath demotion of methods that were originally
@CriticalNative/@FastNativein AOSP (starting with Math.ceil / Math.floor → native +@CriticalNativeagain). - Re-register matching natives in
Math.c(and any other demoted tables) on both PE and ELF with AOSP-correct CriticalNative/FastNative ABIs. - Prefer real ART CriticalNative/FastNative trampolines over InterpreterJni shorty expansion; then trim PE-only shorty explosion (W-011) and dual
gMethodsWinpaths where redundant. - Audit libcore for other
ART-WinNTpure-Java / ABI demotions of Critical/Fast natives (not just Math) and revert once entrypoints are product-default.
- Restore every multipath demotion of methods that were originally
- Exit criteria:
- No pure-Java stand-ins for AOSP
@CriticalNative/@FastNativeMath (ceil/floor native again). - Wine + Linux smokes for Math/HashMap/conscrypt without relying on pure-Java ceil or incomplete CriticalNative shorty lists.
- Document that W-019 temporary ABI/shorty fixes are superseded (may remain as defensive fallback until deleted).
- No pure-Java stand-ins for AOSP
- Code anchors:
vendor/libcore/ojluni/src/main/java/java/lang/Math.java(ART-WinNTpure-Java ceil/floor)vendor/libcore/ojluni/src/main/native/Math.c(gMethodsWin/ no ceil|floor register; LinuxFAST_NATIVE_METHOD)vendor/art/runtime/interpreter/interpreter.cc(InterpreterJniGenericCriticalNative shorties)vendor/art/runtime/art_method.cc(Win32 force interpreter invoke)- AOSP history:
d021f1d8475cFastNative→CriticalNative Math; multipathf16cd44db5fepure-Java ceil/floor;b9265e7b5da6CriticalNative register fix; art7ea144b073/4c17423714interpreter Critical/FastNative bridge
- Blocked on: W-001–W-003 implementation (JIT/TLS/quick entrypoints)
- Related: W-019 (CLOSED temporary Math ABI fix), W-011 (InterpreterJni shorty expansion)
- Opened: 2026-07-17
No open product leftovers. Closed L- items live under §Closed.
- State: OPEN
- Kind: host-gap
- Gap: Wine Phase 4 PASS (incl. multiplatform rebuild 2026-07-17). Real Win10 Phase-4 subset (gcstress, threadheavy, handleleak, crash native/abort) not re-proven with multiplatform PE.
- Exit criteria: Host logs under
tools/verify/win64_phase4/evidence/host/(or successor) OVERALL PASS. - Opened: 2026-07-16
- State: OPEN
- Kind: host-gap
- Gap: Authoritative G12 used earlier host package; multiplatform in-tree PE rebuild should re-package and smoke on Win10 when convenient.
- Opened: 2026-07-17
- State: OPEN (policy reminder, not a code fix)
- Kind: host-gap / process
- Note: Keep wine as agent01 oracle; product claims need real Windows for VEH/TEB/network.
- Opened: 2026-07-16
| Item | Decision |
|---|---|
Windows NIO.2 (sun.nio.fs) |
Non-goal for now (win32_filesystem.md) |
| WSL2 / Wine as product runtime | Rejected |
| Win32 x86 product SKU | Out of scope (x64 first) |
| Full Android framework / zygote / binder | Out of scope |
| In-process dual JIT ISA (x64+Arm64EC) | Rejected in TLS/JIT draft |
If product reopens a non-goal, add an L- item and link the decision.
Summary (details below; do not delete history):
- W-005 — Combined PE JNI stub DLL aliased as libjavacore/libopenjdk/libicu_jni (2026-07-17) — product packaging uses stage_native_modules.sh (real PE only); libcombined is legacy non-product
- W-006 — Minimal NativeConverter / ICU version shims (not full ICU4C) (2026-07-17) — product uses real icu_jni NativeConverter + icuuc/icui18n + icudt; native_converter.c obsolete and removed from libcombined; charset stub no longer product path
- W-007 — Classic sockets / poll via Winsock
select(not full Os/NIO) (2026-07-17) — permanent WinNT design: classic Os sockets use Winsock +select()-based poll/timeouts (not CRT-fdWSAPoll) - W-009 — Phase-1 grade
compatPOSIX/pthread stubs (2026-07-17) — hot paths hardened; remaining ENOSYS is intentional Linux-only surface - W-015 — openjdkjvm memory exports minimal PE surface (2026-07-17) — product ships comprehensive standalone
libopenjdkjvm.dll - W-016 — ICU needs external
ICU_DATA/icudt72l.datfor wine smoke (2026-07-17) — product always stages run/icu/icudt72l.dat via tools/win64/stage_run_assets.sh (same class as boot.jar); libicu_jni defaults ICU_DATA to run/icu when unset - W-018 — NetProbe StructLinger NPE (getsockopt SO_LINGER incomplete in javacore Win bridge) (2026-07-17) — implemented getsockoptLinger/setsockoptLinger in win_net_natives; NetProbe wine PASS
- W-019 — Math @CriticalNative / FastNative double ABI on Win64 (2026-07-17) — Math.ceil/floor/sqrt + HashSet wine PASS after interpreter CriticalNative DD/DDD
- W-020 — FileChannelImpl.map0 pointer truncation on Win64 (LLP64) (2026-07-17) —
ptr_to_jlong(mapAddress)instead of(jlong)(unsigned long) - W-021 — Default KeyStore type Android-compatible (AndroidCAStore) (2026-07-17)
- W-022 — Product default CA bundle (AndroidCAStore cacerts) (2026-07-17)
- W-023 — OkHttp Http(s)Handler on bootclasspath + ASCII IDN/Normalizer multipath (2026-07-17)
- L-001 — Real PE libcore / openjdk / ICU module build (2026-07-17)
- L-002 — boringssl / conscrypt / SSL PE (2026-07-17) — product TLS stack green under wine (providers + SSLContext.init + HTTPS GET)
- L-003 — Process/exec, rich locale, zip edge, UDP/IPv6 matrix (2026-07-17)
- L-004 — Shrink or replace multi-name DLL staging (2026-07-17) — product ships one PE soname each:
libicu_jni/libjavacore/libopenjdk/libopenjdkjvm/libcrypto/libssl/libjavacrypto(+icuuc/icui18n); short-name twins removed from packaging - L-005 — Linux multiplatform imageless Hello / boot.jar CI gate (2026-07-17)
- L-006 — phase1.cmake / generated Win graph pure-vendor consistency (2026-07-17)
- D-001 — Shared boot.jar via runtime OS selection (2026-07-17)
- State: CLOSED (2026-07-17) — product packaging uses stage_native_modules.sh (real PE only); libcombined is legacy non-product
- Kind: workaround
- Area: libcore-stub / packaging
- Symptom / why: Full ojluni + ICU4C PE ports not built; ART
InitNativeMethodsstill dlopens those sonames. - Current behavior:
tools/win64/jni_stubs/libcombined.dllcopied to six names (libjavacore.dll,libopenjdk.dll,libicu_jni.dll, and short names). ~160Java_*exports, hand-written (~2.3k LOC). - Proper fix: Real PE modules (or fewer real DLLs) from Soong/bp2cmake Win64 graph: javacore, openjdk, icu_jni + icuuc/i18n, etc.; stop multi-name aliasing of one stub.
- Code anchors:
tools/win64/jni_stubs/build_combined.sh,tools/win64/host_package/package_win64_phase3.sh, stage scripts in phase2 RESULT - Opened: 2026-07-16 (Phase 2; expanded Phase 3)
- State: CLOSED (2026-07-17) — product uses real icu_jni NativeConverter + icuuc/icui18n + icudt; native_converter.c obsolete and removed from libcombined; charset stub no longer product path
- Kind: workaround
- Area: icu
- Current behavior: Phase-3 package historically used
native_converter.cstubs. Phase A progress: real PEicuuc.dll/icui18n.dll/icu_jni.dllnow build from AOSP sources (tools/verify/win64_libcore_icu/) and can replace stublibicu_jniinbuild/win64_phase1.libjavacore/libopenjdkstill combined stubs (may still register overlapping charset helpers until removed). - Proper fix: Default package/install to real ICU PE only; remove charset exports from
libcombined; verify full data (ICU_DATA/ icudt) vs stubdata; complete L-001 for javacore/openjdk. - Code anchors:
tools/verify/win64_libcore_icu/,tools/win64/jni_stubs/native_converter.c - Opened: 2026-07-16
- Progress: 2026-07-17 — real ICU PE + CoreProbe wine OK with hybrid package
- State: CLOSED (2026-07-17) — permanent WinNT design: classic Os sockets use Winsock +
select()-based poll/timeouts (not CRT-fdWSAPoll) - Kind: workaround → permanent platform design
- Area: libcore-stub / net
- Symptom / why: Full AOSP
libcore.io.LinuxPE not used on Win64; real Win10 rejected CRT_open_osfhandle+WSAPoll(WSAEINVALon accept poll). - Fix / design:
- Product
libjavacoreWin bridge (win_net_natives.c) implements classic socket surface withselect()forpoll, SO_TIMEOUT waits, and connect write-readiness. - NIO epoll path similarly select-emulated in
compat/src/win64_socket_posix.c(boundedFD_SETSIZE). - 2026-07-17: registered
bind/connectSocketAddressoverloads forInetSocketAddress(AF_UNIX still out of product scope).
- Product
- Evidence:
- Host G12 (2026-07-16): net/dns/goldenapp PASS after select poll fix (
tools/verify/win64_phase3/evidence/host/ANALYSIS_20260716T205926.md). - Wine (2026-07-17): NetProbe, DnsProbe, UdpProbe, AsyncCloseProbe, GoldenApp, SocketAddressProbe PASS.
- Host G12 (2026-07-16): net/dns/goldenapp PASS after select poll fix (
- Non-goals residual: AF_UNIX SocketAddress; full AOSP
libcore_io_Linux.cpp(L-001 closed with Win bridge map); NIO.2. - Code anchors:
tools/win64/jni_stubs/win_net_natives.c,register_libcore_io_Linux_win.cpp,compat/src/win64_socket_posix.c - Opened: 2026-07-16
- Closed: 2026-07-17
- State: CLOSED (2026-07-17) — hot paths hardened; remaining ENOSYS is intentional Linux-only surface
- Kind: workaround → platform compat layer (ongoing shrink is maintenance, not open product gap)
- Area: compat
- Fix / evidence:
pthread_rwlock_*now real SRWLOCK shared/exclusive (was CRITICAL_SECTION exclusive-only) — ARTMutex/ReaderWriterMutexABI rebuilt into productart.dll.unameusesRtlGetVersion+ computer name;clock_gettime(CLOCK_MONOTONIC)via QPC;pthread_setname_np/getname_npviaSetThreadDescriptionwhen available.- Socket-aware
poll/epoll already select-based (W-007); mmap/mprotect/pthread mutex/cond already real Win32. - Wine:
dalvikvm -showversion, CoreProbe, NetProbe, GoldenApp PASS after ART rebuild.
- Residual (not OPEN product work): fork/ptrace/sendfile/tgkill etc. remain ENOSYS; further shrink only when a product path needs them.
- Code anchors:
compat/src/win64_posix_stubs.c,compat/include/pthread.h - Opened: 2026-07-16 (Phase 0/1)
- Closed: 2026-07-17
- State: CLOSED (2026-07-17) — product ships comprehensive standalone
libopenjdkjvm.dll - Kind: workaround
- Area: art / openjdkjvm
- Fix / evidence:
- Product PE from
tools/verify/win64_libcore_icu/openjdkjvm_memory_standalone.c: memory/GC + file I/O + sockets + raw monitors + time (JVM_*set used by hybrid openjdk). - Added
JVM_ActiveProcessorCount. - ART-tree
openjdkjvm_memory_windows.ccremains minimal ART-heap-only helper for experimental ART-linked builds; not the product soname path. - Wine CoreProbe/GoldenApp/NetProbe with staged
libopenjdkjvmPASS.
- Product PE from
- Code anchors:
tools/verify/win64_libcore_icu/openjdkjvm_memory_standalone.c; stage viastage_native_modules.sh - Opened: 2026-07-16
- Closed: 2026-07-17
- State: CLOSED (2026-07-17) — product always stages run/icu/icudt72l.dat via tools/win64/stage_run_assets.sh (same class as boot.jar); libicu_jni defaults ICU_DATA to run/icu when unset
- Kind: workaround
- Area: icu / packaging
- Symptom / why: Linked stubdata alone yields
u_initU_FILE_ACCESS_ERRORunder wine; full data file works. - Current behavior: Stage
run/icu/icudt72l.datand setICU_DATA=run/icu(or absolute path).Register.cppalso callsudata_setCommonData(&U_ICUDATA_ENTRY_POINT)on Win. - Proper fix: Package full ICU data by default in host package scripts; verify embedded data path or always set ICU_DATA in runners.
- Code anchors:
vendor/icu/android_icu4j/libcore_bridge/src/native/Register.cpp;build/win64_phase1/run/icu/ - Opened: 2026-07-17
- Progress: 2026-07-17 —
package_win64_phase3.shfails ificudt72l.datmissing; phase3/4 runners and install_into_phase1 default/exportICU_DATA=run/icu
- State: CLOSED (2026-07-17) — implemented getsockoptLinger/setsockoptLinger in win_net_natives; NetProbe wine PASS
- Kind: leftover / bug
- Area: libcore-stub / net
- Symptom / why:
NetProbefails:StructLinger.isOn()on null from linger get. - Proper fix: Implement linger get/set in
win_net_natives/ Linux Os bridge returning realStructLinger. - Code anchors:
tools/win64/jni_stubs/win_net_natives.c; NetProbe client path - Opened: 2026-07-17
- State: CLOSED (2026-07-17) — Math.ceil/floor/sqrt + HashSet wine PASS after interpreter CriticalNative DD/DDD
- See also: W-024 — full restore of AOSP Critical/FastNative after JIT/TLS/entrypoints (ceil/floor pure-Java demotion still OPEN debt)
- Kind: workaround / runtime ABI
- Area: libcore Math / ART interpreter JNI (Win64 -Xint)
- Root cause: Official AOSP CriticalNative is fine on Linux quick/generic-JNI. Win64 multipath forces
ArtMethod::Invokethrough the interpreter;InterpreterJniGenericonly handled CriticalNative shortiesII/I/Z/ZI.Math.ceilis shortyDD((D)D), so dispatch fell through and crashed. Secondary: registeringMath_*_jni(JNIEnv*,jclass,jdouble)under CriticalNative is the wrong ABI. - Fix (landed source): interpreter CriticalNative
DD/DDD/FF/J; Math.c gMethodsWin →Math_ceil(jdouble)etc.; posix stubslocaltime_r/mingw_gettimeofdayfor art rebuild. - Exit criteria:
MathProbe+SslProviderProbewine PASS with rebuiltart.dll. - Code anchors:
vendor/art/runtime/interpreter/interpreter.cc,vendor/libcore/ojluni/src/main/native/Math.c,compat/src/win64_posix_stubs.c - Opened: 2026-07-17
- Progress: 2026-07-17 — root cause + source fix; full art PE rebuild running
- State: CLOSED (2026-07-17) —
ptr_to_jlong(mapAddress)instead of(jlong)(unsigned long) - Kind: bug / ABI
- Area: openjdk NIO / boot classpath ZIP mmap
- Root cause: AOSP
FileChannelImpl_map0returned(jlong)(unsigned long)mapAddress. On Win64 LLP64unsigned longis 32-bit, so mapped addresses like0x6ffff…were truncated (high bits zeroed).Memory.peekByteArraythen crashed in CRT (fault_addr=0xff0e0eecpattern) whileVMClassLoaderclinit mappedboot.jarforClassPathURLStreamHandler. - Symptom chain:
Security.getProviders→ provider class load →BootClassLoader.loadClass→findLoadedClasspath / resource handlers → ZIP mmap via NIO → AV. Earlier W-019-style AV signature was coincidental. - Also fixed nearby (supporting): Win64
-Xintkeeps natives on interpreter bridge (ShouldStayInSwitchInterpreter+ArtInterpreterToInterpreterBridge→InterpreterJni); FastNative stays Runnable; specialized staticLLLshorty. - Exit criteria: SecStep17
BootClassLoader.loadClass+ SecStep3Security.getProviderswine PASS. - Code anchors:
vendor/libcore/ojluni/src/main/native/FileChannelImpl.c;vendor/art/runtime/interpreter/interpreter.cc;interpreter_common.cc - Opened: 2026-07-17
- Closed: 2026-07-17
- State: CLOSED (2026-07-17)
- Kind: config / compatibility
- Area: JCA / conscrypt SSL defaults
- Root cause: Win64 multipath deferred BouncyCastle, so
keystore.type=BKScould not resolve.Security.initializeStatic()also omittedkeystore.type, soKeyStore.getDefaultType()fell back to desktopjks, which is not registered.KeyManagerFactory.init(null,null)→KeyStore.getInstance("jks")failed andSSLContext.initaborted. - Fix: default
keystore.type=AndroidCAStore(HarmonyJSSE/TrustedCertificateKeyStoreSpi, empty-loadable); restore loadingsecurity.propertieson Windows after W-020; mirror inbuild_conscrypt_win64.shand boot.jar resource. - Exit criteria: KeyStoreProbe + SslProviderProbe
sslcontext.init=okunder wine. - Opened/Closed: 2026-07-17
- State: CLOSED (2026-07-17)
- Kind: packaging / product asset
- Area: TLS trust / AndroidCAStore
- Root cause: Android
TrustedCertificateStorereads$ANDROID_ROOT/etc/security/cacerts/<subject_hash_old>.N. Product previously shipped empty dirs, so SSLContext.init worked but trust set was empty. - Fix: generate Mozilla/system PEM bundle into OpenSSL hash_old layout (
tools/win64/generate_cacerts.sh), hermetic assets undertools/win64/assets/cacerts, stage viastage_run_assets.shas required asset (withboot.jar/icudt72l.dat). LocaleData hard-coded fallback so OpenSSLX509Certificate date parsing works without full ICU4J resource bundles in boot.jar. - Exit criteria: TrustStoreProbe AndroidCAStore.size>=50 and acceptedIssuers>=50 under wine with ANDROID_ROOT=run.
- Opened/Closed: 2026-07-17
- State: CLOSED (2026-07-17)
- Kind: packaging / compatibility
- Area: java.net URL / HTTPS
- Root cause: Android resolves
http/httpsviacom.android.okhttp.HttpHandler/HttpsHandler, not packaged in multipath boot.jar. After packaging, pure-ASCII OkHttp/TLS paths still required ICU4J StringPrep/Normalizer tables not present in boot.jar. - Fix:
tools/bootjar/build_okhttp_win64.shmerges repackaged OkHttp+okio into boot;IDN.toASCIIandjava.text.Normalizershort-circuit pure-ASCII; product ICU data preferred over stub inlibicu_jniRegister.cpp; cacerts already staged. - Exit criteria: HttpsProbe handler resolution +
https://example.com/status 200 under wine. - Opened/Closed: 2026-07-17
- State: CLOSED (2026-07-17)
- Kind: leftover
- Area: build / libcore / icu
- Gap:
Win64 product still on libcombined / incomplete hybrid PEproduct PE from AOSP + multipath hybrids; no libcombined aliasing. - Exit criteria: PE DLLs built from AOSP sources without
libcombinedaliasing; GoldenApp + charset/locale smoke still pass. Met. - Fix / evidence:
- Product stages only real PE via
tools/win64/stage_native_modules.sh(rejectslibcombined):libicu_jni,libjavacore,libopenjdk,libopenjdkjvm,icuuc,icui18n(+ optional crypto under L-002). - Hybrid
libjavacoreincludes AOSP Register surface + Memory, NetworkUtilities, NativeBN (libcrypto), ExpatParser (staticvendor/external/expat), AsynchronousCloseMonitor, OsConstantsHolder (multipath), Win Os bridge (win_fs/win_net/register map). - Hybrid
libopenjdkships AOSP NIO/zip/fdlibm surface +win_closeNET_* AsyncClose wrappers (NIO.2 non-goal). - Wine gates (2026-07-17):
GoldenApp(golden.ok/net.ok/done),CoreProbe(charset=true),LocaleProbe, plus L-001 probes Bn/Xml/AsyncClose/OsConstants/Dns/Net/Io.
- Product stages only real PE via
- Opened: 2026-07-17
- Closed: 2026-07-17
- Progress / residual (not exit blockers):
- Full AOSP
libcore_io_Linux.cppremains excluded by design for Win64; product Os surface is the Win bridge map (win32_libcore_os_natives.md: needed=0, 82 implemented, 44 ENOSYS). cbigintunused in graph; Linux-onlyandroid_system_OsConstantsHolder.cppreplaced by multipath Win TU.- Crypto/TLS productization tracked under L-002; NIO.2 non-goal.
- Details:
tools/verify/win64_libcore_icu/RESULT.md
- Full AOSP
- State: CLOSED (2026-07-17) — product TLS stack green under wine (providers + SSLContext.init + HTTPS GET)
- Kind: leftover
- Area: crypto
- Gap:
Win64 TLS/crypto PE incompleteproduct PE + boot packaging complete for HTTPS smoke. - Exit criteria: HTTPS/crypto golden or explicit non-goal. Met (wine HttpsProbe status 200 + SslProviderProbe).
- Fix / evidence:
- PE:
libcrypto/libssl/libjavacryptofrom hybrid CMake; staged single-soname product names. - Boot:
tools/bootjar/build_conscrypt_win64.sh+build_okhttp_win64.sh→ OpenSSLProvider/JSSE + OkHttp handlers +security.properties(AndroidCAStore). - Trust: product
run/etc/security/cacerts(121 roots) viastage_run_assets.sh. - Wine (2026-07-17 reverify after ART/compat rebuild):
SslProviderProbe.done=ok(AndroidOpenSSL digests/AES-GCM/SSLContext.init)HttpsProbe.done=ok(https://example.com/status 200; handlers Http/HttpsURLConnectionImpl)
- PE:
- Residual (non-exit / optional): boringssl win-x86_64 ASM acceleration; BouncyCastle/BKS; full ICU4J IDNA tables for non-ASCII hosts; broader HTTPS golden matrix on real Win10.
- Code anchors:
tools/verify/win64_libcore_icu/CMakeLists.txt;tools/bootjar/build_conscrypt_win64.sh;tools/bootjar/build_okhttp_win64.sh;tools/win64/stage_run_assets.sh - Opened: 2026-07-17
- Closed: 2026-07-17
- State: CLOSED (2026-07-17)
- Kind: leftover
- Area: libcore / openjdk hybrid
- Gap: Phase-3 product matrix for process/exec, locale (without full ICU4J bundles), zip edges, UDP IPv4, dual-stack IPv6 Os.socket bind.
- Fix:
win_process_natives.cCreateProcessUNIXProcess+ openjdk OnLoad register- InterpreterJni 12-slot path for multi-arg natives (
forkAndExec,sendtoBytes) - UDP
recvfromInetSocketAddress holder fill; multicast GroupReq/IpMreqn - ZipFile CEN: Windows heap-read + DirectByteBuffer mirror (mmap CEN invalid under wine)
- LocaleProbe uses Calendar/String case without ICU DecimalFormatSymbols bundles
- Ipv6Probe: Os.socket AF_INET6 bind on raw
::(avoid reverse-DNS hang) - Gate:
tools/verify/win64_phase3/run_l003_wine.sh— OVERALL PASS
- Exit criteria: Process/UDP/locale/zip/IPv6 gates documented + wine green met.
- Non-goals / host residual: TCP IPv4-mapped dual-stack under wine; full ICU Collator resources; zip STORED empty-dir edges beyond DEFLATED multi-entry.
- Code anchors:
win_process_natives.c,win_net_natives.c,ZipFile.java(Win CEN),FileInputStream.cavailable0,interpreter.cc12-slot, probes undertools/verify/win64_phase3/src/ - Opened: 2026-07-17
- Closed: 2026-07-17
- State: CLOSED (2026-07-17) — product ships one PE soname each:
libicu_jni/libjavacore/libopenjdk/libopenjdkjvm/libcrypto/libssl/libjavacrypto(+icuuc/icui18n); short-name twins removed from packaging - Kind: leftover / packaging debt
- Depends on: L-001, W-005
- Fix: CMake
OUTPUT_NAMEfor hybrid targets;stage_native_modules.shstages only product names and deletes short twins; install rejects short-name reappearance - Opened: 2026-07-17
- State: CLOSED (2026-07-17)
- Kind: leftover
- Area: linux-host
- Gap:
After repo migration, host Linux verifiedscripted gate landed.dalvikvm -showversiononly - Exit criteria: One scripted imageless Hello (or RESULT) on multiplatform
main. - Fix:
tools/verify/linux_hello/run_imageless_hello.sh+RESULT.mdPASS onbuild/native/dalvikvmimageless-XintHello. Requires UnixFileSystem boot.jar (rejects Win64 WinNT product boot). - Opened: 2026-07-17
- Closed: 2026-07-17
- State: CLOSED (2026-07-17)
- Kind: leftover / build
- Area: build
- Gap:
Residual MinDalvikVM-Archive path assumptions in product scriptspure-vendor. - Fix / evidence:
- Product CMake (
tools/verify/win64_phase1,win64_libcore_icu,native/, Linux verify) already resolved via${MDVM_NATIVE_SRC_ROOT_DIR}→vendor/;phase1.cmakehas no hard-coded archive absolutes. tools/bootjar/build.shno longer auto-discovers siblingMinDalvikVM-Archive(_)for ICU/annotation stubs; requires nestedvendor/icu+ in-treecompat/java-stubs(expanded minimal android.annotation / android.compat.annotation set).MDVM_ARCHIVEremains an optional non-default escape hatch only.- Docs/tests scrubbed:
README.md,native/{CMakeLists,generate}.sh,tools/bp2cmakeCODEGEN/codegen + unit tests point at multipathvendor/. - Historical
tools/verify/*/RESULT.mdabsolute archive paths left as past evidence only (not product inputs).
- Product CMake (
- Opened: 2026-07-17
- Closed: 2026-07-17
- State: CLOSED (2026-07-17)
- Goal (actual): one multipath
boot.jar(not dual packaged jars / not “prove WinFS-on-Win and UnixFS-on-Unix” as close criteria) - Doc:
archived/shared_bootjar_runtime_os_detection.md - Canonical property:
dalvik.vm.multiplatform.internal.os=windows|unix- Long +
internalintentional (not a public app API; not expected for external use) - Reject short
dalvik.vm.mp.os(mpambiguous) - Values:
windows|unix(notposix, notlinux) — aligns withWinNTFileSystem/UnixFileSystem
- Long +
- Injection:
vendor/art/runtime/runtime.ccafterPropertiesListrelease (PE=windows, ELF=unixif unset) - Detection ladder:
VMRuntime.properties()→ System props /os.name→ defaultunix(VMRuntime.isWindowsOs) - Separators: removed from
AndroidHardcodedSystemProperties; set inSystem.initUnchangeableSystemProperties - Boot:
tools/bootjar/build_win64.shstages shared jar (no WinNT-only overlay); jar embeds both FS +isWindowsOs - Exit criteria (met): single shared boot pipeline produces one jar used for Linux imageless Hello (L-005 PASS on shared multipath bytes)
- Non-goals for this close: dual-host acceptance that Windows always selects
WinNTFileSystemand Unix always selectsUnixFileSystemunder product PE/wine — those are ordinary product smoke, not D-001 scope - Follow-up (orthogonal): wine/host Hello on same bytes; PE
art.dllinject path when PE product is rebuilt - Code anchors:
dalvik/system/VMRuntime.java(isWindowsOs*),DefaultFileSystem.java,System.java,runtime.cc,build_win64.sh - Opened: 2026-07-17
- Closed: 2026-07-17
No open design notes. Closed D- items live under §Closed.
D-001CLOSED — single shared boot.jar (runtime OS selection); dual-host FS smoke is not the close bar.- W-001–W-003 — TLS/entrypoint implementation (design draft ready); then W-024 restore Critical/FastNative surfaces.
L-001— CLOSED real PE libcore/openjdk/ICU hybrid; residual Linux TU/bridge growth optional.- H-001 — host Phase-4 with multiplatform package.
L-005 — Linux Hello gateCLOSED.
- New
#ifdef _WIN32temporary behavior → new W- row - New stub JNI → update W-005 export scope or split W-
- Gate newly green on host → close matching H-
- Permanent design choice (e.g. VEH forever) → move from W- to documented architecture; close workaround
- CLOSED items: move full item into §Closed (sorted by ID); keep State CLOSED history
- State: OPEN (J-1 green; D-1 mostly on; residual StringFactory exclude)
- Kind: feature gap
- Area: art / jit / compiler
- Symptom / why: Need Linux-like JIT. Create used to soft-fail; residual NPE when both
StringBuilder.toStringandStringFactory.newStringFromBytesare JIT'd. - Current behavior: J-1 Create OK; ThreadOffsetAddr/r15; compile default ON excluding StringFactory.
ART_WIN64_JIT=0disables compile;ART_WIN64_JIT_ALLOW_STRINGFACTORY=1re-enables residual. - Proper fix: Fix StringFactory/toString pair (win32_jit_memory.md §13); drop exclude.
- Code anchors:
mem_map.ccRemapAtEnd;jit.ccWin gate;assembler_x86_64.*; codegen x86_64 - Opened: 2026-07-19
- Updated: 2026-07-19 — default compile ON minus StringFactory; pair isolation; SysV-wrapper attempt AV (reverted)
Last snapshot: 2026-07-19 — W-001 closed (quick invoke default ON); nterp product default ON (opt-out ART_WIN64_NTERP=0); JIT default remains ART UseJitCompilation=true.