<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rs-dos/docs/adr, branch qemu</title>
<subtitle>Simple, kernel-only, 64bit OS, early stage.
</subtitle>
<id>https://git.2137697.xyz/rs-dos/atom?h=qemu</id>
<link rel='self' href='https://git.2137697.xyz/rs-dos/atom?h=qemu'/>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/'/>
<updated>2026-11-01T14:53:29Z</updated>
<entry>
<title>scripts: rebuild the dev loop around build.sh/run.sh</title>
<updated>2026-11-01T14:53:29Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-11-01T14:53:29Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=7958276c9f0d230053520ba20f2a00f5ecda18e4'/>
<id>urn:sha1:7958276c9f0d230053520ba20f2a00f5ecda18e4</id>
<content type='text'>
`make` did not parse at all (missing separator at line 139), so every
make target was dead.  The folder also carried three overlapping
launchers (boot.sh, qemu.sh, boot-image.sh) plus a fourth partial one
in the Makefile, `cargo build --package rsdos` copy-pasted eight times,
the QEMU invocation copy-pasted per script, and the test helpers
(fail/wait_log/wait_qemu_exit/qemu_hmp) duplicated in five tests.

New layout:
- scripts/lib.sh: single config (image, OVMF, mem/smp), the one cargo
  invocation (build_all), the one QEMU shape (qemu_args), and the test
  harness (test_boot, wait_log, wait_qemu_exit, qemu_hmp, sendkeys)
- scripts/build.sh: kernel + every bins/* in one pass
- scripts/mksystem.sh: freshness-aware image build that now stages
  every bins/*.efi into /bin/cli|gui (they were never copied before)
- scripts/run.sh: build + stage + boot in one command; --headless,
  --debug (GDB stub), --monitor (HMP socket), --fresh, --mem/--smp/
  --bios/--image; on Wayland it auto-selects XWayland plus
  grab-on-hover so the mouse can be captured (Ctrl+Alt+G toggles)
- scripts/tests/: the five automated tests on the shared harness
- deleted: boot.sh, qemu.sh, boot-image.sh, lib-boot-args.sh,
  build-image-release.sh, build-bootloader.sh (rsboot chain dropped)

The Makefile is now a thin wrapper: make run, make test, make system,
make inspect, make help.  Two-command flow: ./scripts/build.sh then
./scripts/run.sh (run.sh alone also works).

Stale test assumptions fixed so the suite is green again: test-gfx
waited for "gfx: check" while the shell prints "gfx check: PASS";
test-mouse/test-msg hardcoded msgrecv = task 3 (wm-input took slot 3 —
ids are parsed from the log now); the queue-full probe targeted task 0,
whose exec pump drains its own queue as completion codes (moved to the
cursor task, which never recvs).

Verified in QEMU: make test -&gt; test-disk, test-gfx, test-mouse,
test-msg, test-fault all PASS.
</content>
</entry>
<entry>
<title>fs: /bin alias for the system volume</title>
<updated>2026-11-01T14:52:44Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-11-01T14:52:44Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=316a2a239446fe927e35b029b651cbeb08ff3f48'/>
<id>urn:sha1:316a2a239446fe927e35b029b651cbeb08ff3f48</id>
<content type='text'>
ADR 0006 deferred root-path unification because it "needs VFS
bind/alias machinery".  Implement the /bin half: paths whose first
component is `bin` are rewritten to the first mounted volume whose
root has a \bin directory, so `ls /bin/cli`, `cat /bin/cli/x.efi` and
a binary's own fs_resolve("/bin/cli/x.efi") work without knowing the
volume UID.

The alias is transparent — it creates no node, so `ls /` keeps its old
listing and /bin simply does not exist when no system volume is
mounted — and allocates nothing for non-matching paths.  exec::resolve
keeps its per-file volume scan (stricter for multiple volumes).

Update ADR 0006 to record the decision and what remains deferred
(\etc and friends at the root).
</content>
</entry>
<entry>
<title>docs: ADR 0006 (executable binaries) + implementation plan + glossary terms</title>
<updated>2026-08-21T15:18:09Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-08-21T15:18:09Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=fc4c563ca14ddec3de3aeef5a861f9707eaae389'/>
<id>urn:sha1:fc4c563ca14ddec3de3aeef5a861f9707eaae389</id>
<content type='text'>
ADR 0006: PE32+ loader in rsnix, versioned exports-table ABI constructed
per invocation, task-per-binary, single dd-able system image with
/bin/cli and /bin/gui, shell-owned grammar with injected line streams,
per-terminal input discipline as prerequisite phase, frozen built-in
core, 0.6.0 at first exec.

Plan: five phases (image → input discipline → loader/exec → streams +
migration → GUI binaries), each with a QEMU verification gate.

Glossary: Binary, Loader, Exports table, System image; kind = launch
surface.
</content>
</entry>
<entry>
<title>Terminal-app design (ADR 0005) + disk-write controller</title>
<updated>2026-08-17T17:56:24Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-08-17T17:56:24Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=126d5b2e55dca93e024f5654fed6fae37a012369'/>
<id>urn:sha1:126d5b2e55dca93e024f5654fed6fae37a012369</id>
<content type='text'>
- ADR 0005: persistent home terminal (full-screen, chrome-less,
  bottom-pinned), F1 terminal windows, per-instance vt/tty/shell,
  queue-based input for all terminals, and the disk controller
- Glossary: add the Terminal term; update Task/App for the new model
- Add a re-entrant disk lock (DiskGuard over the preemption-depth
  counter) and wrap all fs/fat mutating operations per-call
</content>
</entry>
<entry>
<title>wm: title-bar drag-to-move; stop delivering title-bar gestures to apps</title>
<updated>2026-08-17T16:58:06Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-08-17T16:58:06Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=0e405aad6bc9f631b9b7a766fb1147fef943f492'/>
<id>urn:sha1:0e405aad6bc9f631b9b7a766fb1147fef943f492</id>
<content type='text'>
- Track the active mouse gesture (none / window-move / app-stroke) so a
  press on the title bar becomes a move drag instead of leaking Move
  events into the app's content
- Add move_window (clamped to the canvas, repaint old + new regions)
- Always deliver MouseKind::Release so a stroke that ends outside the
  window still terminates
</content>
</entry>
<entry>
<title>Windowed GUI: wm module, input routing, and the paint app</title>
<updated>2026-08-17T16:56:04Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-08-17T16:56:04Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=5558e3509d020a0e021a77f0617044497b2f2aee'/>
<id>urn:sha1:5558e3509d020a0e021a77f0617044497b2f2aee</id>
<content type='text'>
- Add the wm window-manager facility per ADR 0004: overlapping
  pixel-surface windows, damage-rectangle compositing, WM-drawn title
  bar, focus/minimize/close, and F1-F4 keybindings
- Add gop shadow compositing primitives and vt::repaint_region so the
  console stays layer 0 beneath windows
- Route mouse (absolute coords, press/release edges) and keyboard
  (focus-aware input pump) to the focused window
- Add the rspaint drawing-program crate (pen, 8 colors, clear) and shell
  draw/windows/restore commands
- Extend TaskMsg with AppMouse/Focus/Close and document the design in
  CONTEXT.md + ADR 0004
</content>
</entry>
<entry>
<title>docs: ADR 0003 (preemptive kernel tasks) + task glossary terms</title>
<updated>2026-08-01T14:19:45Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-08-01T14:19:45Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=ce43cb9554d443f12af886ee035a73bf9b322ac5'/>
<id>urn:sha1:ce43cb9554d443f12af886ee035a73bf9b322ac5</id>
<content type='text'>
- ADR 0003: preemptive round-robin kernel tasks on the 100 Hz tick,
  shared address space, guard pages + page-fault handler, graceful task
  panics, safe-builtin spawn surface, only-shell-touches-I/O invariant
- CONTEXT.md: new 'Task' glossary entry; 'Paging strategy' now says
  guard pages exist on task stacks
</content>
</entry>
<entry>
<title>shell: keyword redirection + post-filter flags (ADR 0002)</title>
<updated>2026-08-01T11:14:07Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-08-01T11:14:07Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=6eb14b64209b9d24554c587f610d7e300ef809ea'/>
<id>urn:sha1:6eb14b64209b9d24554c587f610d7e300ef809ea</id>
<content type='text'>
Implement the shell experience redesign: one canonical grammar for every
command — 'cmd args [USE src] [TIL marker] [filters...] [output kw dst]'.

- Keyword redirection (uppercase-only, aliases valid, fully reserved):
  WRITING/WRITE overwrite, TO append, USE/USING input source,
  TIL/UNTIL heredoc/terminator (exact full-line marker).  &gt; &gt;&gt; &lt; &lt;&lt; are
  removed; '&gt;' is plain text.
- Post-filter stages applied left to right over a line stream, each
  repeatable: -h N (head kills the upstream), -t N (tail holds a
  rolling window, flushes at EOF/^C), -g PAT (smart-case literal
  substring), -p (screenful pager, terminal only).  A file sink
  replaces the screen; -p is a no-op with one.
- C-style quoting: "..." groups and literalizes, \x escapes one char;
  quoted/escaped text is never an operator, never split.
- Input consumers: cat/hexdump, path-less only (stdin until ^D,
  USE f, TIL m heredoc, USE f TIL m truncation).  Other commands
  reject input keywords; paths + input keyword is a syntax error.
- ^D is EOF everywhere and never powers off; poweroff/exit are the
  only shutdown verbs.
- help rewritten; test-disk.sh and sendkeys.py use the keyword syntax.

Verified in QEMU: 26 grammar checks on fresh and reused disks, disk
round trip, pager pacing, -h stopping /dev/mem at N lines, ^C flushing
a -t window.  Two bugs found during verification and fixed:
1. WRITING over an existing file wrote after stale NUL padding —
   fs::size() is stale after set_len(0); the sink writes at offset 0
   after truncation.
2. USE f TIL m leaked the post-marker remainder — the final
   partial-line emit ran after the marker break; guarded with a
   stopped flag.
</content>
</entry>
<entry>
<title>Initial commit: raisernics toy kernel</title>
<updated>2026-07-31T00:18:30Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-07-31T00:18:30Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rs-dos/commit/?id=76103215711d268b4b02f62e900f2be3032cf295'/>
<id>urn:sha1:76103215711d268b4b02f62e900f2be3032cf295</id>
<content type='text'>
- Bare-metal x86_64 UEFI kernel (PE32+, no libc)
- GOP framebuffer + 8x16 bitmap font
- PS/2 keyboard (polling, scancode set 1)
- UART 16550 serial driver (COM1, 115200 8N1)
- Bump allocator as #[global_allocator] (alloc::String, Vec, format!)
- UEFI memory map capture (static buffer, ADR 0001)
- Shell with 7 commands (help, echo, clear, hello, info, mem, halt)
- Dual output: GOP framebuffer + serial console
- Makefile: run, run-gui, debug, release, image targets
- tools/: qemu.sh, boot-image.sh, debug-kernel.py
</content>
</entry>
</feed>
