Repository navigation
Open Cube OS 2.2.0 - the fix release closing both 2.1.0 open items with real kernel root-cause fixes (no test-side workarounds, no timeout inflation). The itemized record lives in KNOWN_ISSUES.md.
Fix 1: the wp10_tui post-suite kernel-stack #DF (O-01)
Present identically in 2.0.0 and 2.1.0: after the wp10_tui suite's closing SVC round (checkupdate --local from ush), the kernel double-faulted and HALTed - after all 37 checks had already passed.
Root cause (measured, not guessed): the deepest real kernel call chain runs SYS_L1SVC -> ota_update_check -> http_get_body (6000 B frame) -> net_tls_https_get (2144) -> net_tls13_do_handshake -> crypto_x509_verify_chain (1872) -> crypto_rsa_verify_pss (2704) -> crypto_bn_mod_exp (4160) -> mont_mul (1200) -> mont_redc (1856) - a -fstack-usage sum of ~23.6 KB. The recorded crash had rip = crypto_bn_mont_redc+0x2A with rsp 20,880 B below the stack top, inside the guard page, on a 20 KiB usable window (24 KiB alloc minus the unmapped guard page); a timer/e1000 IRQ nesting its frame on the same stack pushes past it, and the guard-page #PF push (with the stack already spent) escalates to #DF.
Fix: OC_KTHREAD_STACK_PAGES 6 -> 10 (40 KiB window / 36 KiB usable) - covers the measured worst chain + worst IRQ nesting with ~8 KiB headroom; costs 512 KiB of the ~505 MiB PMM pool across all 32 tasks. The corrupted #DF panic banner (andled -> handled) is fixed too. Verified: the exact crashing chunk now runs to 12/12 checks passed with the real checkupdate report (Current version is up to date) and no panic.
Fix 2: the wait4-vs-fork flake (O-02) - which was not a timing race
2.1.0 declared this as a rare interrupt-timing race. It was actually deterministic bookkeeping: when a process died, g_procs entries still pointing at it as parent (living orphans AND dead-but-unwaited zombies from earlier crashed/killed children) kept parent_tid = the dead parent's tid. The reaper freed that tid; a later task REUSED it; the new task's wait4(pid=0, any-child) matched the stale zombie, collected its exit code and returned before the caller's own child was ever scheduled (observed live: child status = 142 = 128+SIGSEGV of a #PF-killed unwaited child, with the verdict printed ahead of the child's first output line).
Fix, two points (commit 11d2127):
user_process_reap_resources(): orphan-detach - every entry whoseparent_tidequals the dying tid goes to the sentinel-1(a value no task can own);wait4's parent scan, the exit/wake> 0checks and the usershell== 0flag test are all safe for-1.sys_fork()half-product paths (address-space copy failure / task-creation failure): the corpse entry detaches too - the living parent never collects a child POSIX says was never created.
Verified: fresh-boot battery 20/20 boots clean (pre-fix: 2/2 boots hit the anomaly with the zombie sources ahead of the victim); same-boot marathon g6_exec_a = 138 both rounds; same-boot stress (zombie sources + wait4 family x 8 rounds = 80 runs) zero anomalies.
Also in this release
- 2.0.0 mirror assets restored: the 2.1.0 mirror sync had deleted the 2.0.0 ISO/SRC from the private mirror's downloads tree (rsynced from the public tree, which never carried them). Both files are restored from this GitHub Release with byte-exact SHA256 verification against the Release API digests.
- Build-id caliber, exact in three places: 2.1.0's tree carried a stale
version_gen.hstamp (build 308) against a release build of 309 (the header is a build-time dependency-graph marker; the-Dflags are authoritative). 2.2.0 closes the ambiguity: the tag tree'sversion_gen.h, the ELF immediate (movq $0x13c= 316 incore_dump_save) andupdate.jsonall read build 316 = the tag commit's rev-list count (295) + the documented +21 offset. - BUILDING.md freeze literal corrected (still said
2.0.0).
The numbers (unchanged interface surface)
- Command homes: 251 = 99 L0 (
oc>) + 133 ring-3 SYS_L1SVC + 19 ush built-ins (the ushSVC_CMDStable carries 142 rows; 9 dual-homed names attributed to L0 by the first-home rule, callable from both shells). - v1.0.0 baseline: 233 commands, all mapped (INTERFACES.md Part 1c).
- L1SVC: 17 categories / 158 numbered ops; kernel-side declarations: 144; syscalls: 54.
- v1 interface surface per-entry: 278 declarations compared - 267 public, 6 internalized, 5 gone (declared in Part 2d, each with its verified replacement).
- Source: 130,572 lines / 379 files (the +46 over 2.1.0 are the two kernel fixes' code + documentation).
Test matrix (real runs, skip counts declared)
| Gate | Result |
|---|---|
host unit tests (make test) |
17 passed, 2 skipped (openssl fixtures absent - declared) |
| wp12 watchdog/logging/health E2E | 14/14 (Intel TCO real reset + ACPI WDAT) |
| wp10_tui command-surface E2E (BIOS) | 37/37, no #DF - the suite runs to its closing summary and the shell stays alive (the fix verified on the release build) |
| chinese console E2E (BIOS) | 21/21 |
| tuiqa desktop apps | 32/32 BIOS + 32/32 UEFI |
| native desktop E2E | 36 PASS / 0 FAIL BIOS + UEFI |
| L1 per-app record | 35/35 |
| wait4 fresh-boot battery (new gate) | 20/20 boots clean - the O-02 acceptance on the release build |
| boot gates | BIOS PASS + UEFI PASS (banner + ring-3 ush> + uname + oc> fallback + poweroff), re-verified on the final shipped ISO |
| reproducible build | PASS - ELF byte-identical across two clean builds |
Evidence: evidence/2_2_0_release/ in the repo.
Honest deviations (declared, not hidden)
- The two host-test skips are the rsa/x509 openssl fixtures (absent from this host; same declared state as 2.1.0).
- The same-boot marathon's round-1
g6_testT5 FAIL is the test's own fixed-name-directory EEXIST limitation when re-run in the same boot (round 0 passes; the directory names are by design not randomized) - a test-harness property, not a kernel defect; declared here and in the evidence README.
Assets (build 316)
| File | SHA256 | Size |
|---|---|---|
opencube-2.2.0.iso |
20f93fee8c791af7ac9ec1b6b53a525bef2ac2d5697b829721b28bbe0fd950f9 |
12,392,448 B |
opencube-2.2.0-src.zip |
a2041daaf3b1f5ff72cbbf161f3e90718da2adf16605cbb9ae29b8c24f2ed01b |
4,716,252 B |
opencube-2.2.0-update.tar.gz |
ac9a6ec2c3dd679977ad1c716dbacb26ae84119ddc75751fb30712effa6ad19e |
1,080,741 B |
The website download page, this Release and the repo tree hold byte-identical copies. Boot it: qemu-system-x86_64 -m 512 -cdrom opencube-2.2.0.iso (BIOS and UEFI alike).