diff --git a/AGENTS.md b/AGENTS.md index 94c0bf2..2bd274d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,31 +1,34 @@ # Sylva OS — Agent Guide -x86_64 UEFI hobby OS. C17 boot (`.c`) → C++17 kernel (`.cpp`), ELF64 → PE32+ via objcopy. +x86_64 UEFI hobby OS. C17 boot → C++17 kernel, ELF64 → PE32+ via objcopy. ## Build & Run | Command | What | |---------|------| -| `make` | Build `build/BOOTX64.EFI` | -| `make run` | QEMU + OVMF, serial port 1 → `serial.log`, serial port 2 → stdio, paused for GDB (`-s -S`) | -| `make clean` | **Always before commit** — gnu-efi build produces untracked files outside `build/` | +| `make` | Build `build/BOOTX64.EFI` + `build/Kernel.elf` | +| `make run` | QEMU + OVMF, serial 1 → `serial.log`, serial 2 → stdio, paused for GDB (`:1234`) | +| `make vdir` | Stage both binaries into `vdir/EFI/BOOT/` for manual boot | +| `make clean` | **Always before commit** — untracked build artifacts leak outside `build/` | ## Architecture -- `boot.c` — UEFI entrypoint (`efi_main` → `kernel_main()`) +- Two-stage boot: `boot.c` (UEFI app) loads `Kernel.elf` from FAT volume, parses ELF PHDRs, jumps to entry +- `kernel/entry.cpp` — `_start` saves `SystemTable`, calls `kernel_main()` - `kernel/main.cpp` — `extern "C" kernel_main()`: init GOP → serial → PMM → heap → idle (`hlt`) -- `kernel/serial.cpp` — UEFI serial protocol wrapper +- `kernel/serial.cpp` — UEFI serial protocol wrapper (write/read/hex) - `kernel/memory/pmm.cpp` — bitmap + free-list physical page allocator -- `kernel/memory/heap.cpp` — kmalloc/kfree/kcalloc/krealloc (first-fit, coalescing) -- `graphics/` — GOP framebuffer pixel drawing, `fonts/` — Hankaku 8×16 font renderer -- `efi/` — bundled gnu-efi source; `gnu-efi/` is an unregistered submodule reference +- `kernel/memory/heap.cpp` — kmalloc/kfree/kcalloc/krealloc (first-fit w/ coalescing) +- `graphics/` — GOP framebuffer, `fonts/` — Hankaku 8×16 font via `pf_print()` +- `efi/` — bundled gnu-efi sources: `gnuefi/` (crt0, lds, reloc), `lib/`, `inc/` +- Kernel linked at `0x100000` (`kernel/kernel.ld`) -## Quirks +## Conventions -- **`uefi_call_wrapper` required for all UEFI protocol calls** — omitting it causes page-faults (see `kernel/main.cpp:49`) -- `kernel_main` must be `extern "C"` (C→C++ linkage) -- QEMU starts paused — connect GDB to `:1234` to proceed -- Compiler standards: C17 (`boot.c`), C++17 (`kernel/`), `-ffreestanding -fno-stack-protector -fshort-wchar -mno-red-zone` +- Commits: `[type] message` with types `feat`, `fix`, `chore`, `docs` (git log) - `#define ASM asm volatile` in `include/common.h` -- `BUILD_INFOS.h` — placeholder for CI; `.github/` is empty -- No tests, no CI, no lint/formatter config +- C17 (`boot.c`), C++17 (`kernel/`) — `-ffreestanding -fno-stack-protector -fshort-wchar -mno-red-zone` +- `uefi_call_wrapper` required for all UEFI protocol calls (omission → page-fault) +- `kernel_main` must be `extern "C"` (C→C++ linkage) +- QEMU starts paused: connect GDB to `:1234` to proceed +- No tests, no CI, no lint config