Hardware and kernel diagnostics
FAQ › EUZOS Desktop › Diagnostics · Nederlands
What is it?
EUZOS has no external tools: every look inside the PC is a console command of the kernel itself. This page covers the diagnostics of the hardware (PCI, USB, chipset, ACPI/AML, battery, SDIO), of the kernel (threads, memory, cores, performance, processes, the log, the clock, CMOS) and of unknown devices (DriverEnricher), plus boot diagnostics and the lock watchdog. Most commands exist in both editions; the exceptions are marked.
You type them in the console, or over SSH (ssh <pc> '<command>'; see Console).
How do I…?
How do I see which hardware the PC has?
pci lists every PCI device (network and Wi-Fi chips are marked). usb lists every USB device per port, with speed, vendor:product and driver; usbports shows the raw state of every USB port. chipset shows the PCIe ports of an Intel chipset (series 7/8/9, via RCBA).
How do I find out why a device does not work?
drivers lists the devices without a driver, exactly what DriverEnricher reports to EUZOS. drivers text shows the report as it is sent; drivers send sends it now. For a USB pointer (touchscreen, pen, mouse) use usb hid (add all or fields for more). For ACPI devices, aml <path> evaluates an object such as \_SB.PCI0.SDHC._STA.
How do I check the battery?
battery shows charge, state (charging/discharging), rate, voltage, remaining/full/design capacity, health, cycles and the AC adapter. battery read reads it again right now; battery ec dumps the embedded controller bytes.
How do I see what the kernel is doing?
ps lists the kernel threads and their state (with SMP a core column and a line per core). mem shows RAM, heap, threads and processes; mem processes shows RAM, shared memory, CPU time and kind per process (useful for Chromium). log [n] shows the last n lines of the log (default 30; over SSH everything).
How do I use all processor cores?
They are on by default (x86-64; ARM64 uses one core). smp boot off writes off to \EOS\FW\SMP.TXT: one core from the next boot on; smp boot on removes the file again. smp on starts the other cores now. smp shows the state and why. If SMP stops a PC from booting, hold S while switching on: one core for that one boot, nothing is written (docs/SMP.md, "Rescue").
How do I run a test program?
run <name> loads \EOS\BIN\<NAME>.ELF from the stick and starts it (max 8 letters/digits). Put the program there with ssh <pc> 'put EOS/BIN/NAME.ELF'. process <name> [n] starts one of the built-in ring-3 test programs. kill <id> stops a process.
How do I fix the clock?
date shows date and time (UTC) and the source (NTP or the RTC, possibly corrected by \EOS\FW\TIME.TXT, legacy name TIJD.TXT). date ntp fetches the time from the network again.
What do I do when a PC hangs at boot?
Put \EOS\FW\BOOTDIAG.TXT on the stick: the boot loader and kernel then draw a coloured block after every early phase, so a photo shows where booting stops. A trial kernel (try) that hangs on a lock for 20 s writes a report to \EOS\HANG.TXT and reboots by itself into the committed kernel; the next boot puts it in the log. See Boot.
How do I reboot or power off cleanly?
reboot quiets every device step by step, shows each step and keeps the last one in a CMOS byte; poweroff does the same and then ACPI S5. cmos shows all CMOS bytes and the reboot settings. If nothing responds anymore, hold Ctrl+Alt+Esc for 3 seconds: an emergency reboot, which skips most of those steps on a PS/2 keyboard. Releasing a key cancels it, and a short press does nothing.
Details
Clean reboot and power off
restart::before_reboot quiets the PC the way Windows and Linux do: stop the threads that touch hardware, optional _TTS(5), flush the stick, put input devices and I2C controllers to sleep, take Wi-Fi and SDHC down, optional _PTS(5), stop xHCI, AHCI and PCI bus mastering, interrupts off, then the reset methods. The number of the last step reached goes into a CMOS byte (default 0x7E) and is reported on the next boot, which shows whether the PC died before or after the reset. poweroff reads SLP_TYPa/b from \_S5, does the same steps, clears wake sources and writes PM1a/b_CNT (or the hardware-reduced sleep register; PSCI SYSTEM_OFF on ARM64). If the PC is not off after 3 s, the screen says to hold the power button.
DriverEnricher
Devices without a working driver (PCI, USB, ACPI, identified-but-undriven Wi-Fi chips) plus the device model (SMBIOS), the processor and the build are sent to the profile server, so EUZOS can add drivers. Never serial numbers, MAC/IP addresses or user names. One random inventory id per installation is kept in \EOS\FW\DRIVERS.TXT. The thread drivers waits 30 s after boot, for a network address and for a login (the server only accepts a valid PC token), and sends only when the inventory changed; retries after 1, 5, 15 and 60 minutes. Automatic reporting is on by default in sandbox and local, off in production (then only after consent, Settings › Privacy › "Report unknown devices to EUZOS (DriverEnricher)").
Missing hardware (counts only)
Separate from DriverEnricher and off unless you turn it on (Settings › Privacy › "Report hardware without a driver (counts only)", or drivers missing on). Once a day per ID, a logged-in PC sends only the USB or PCI vendor, device and class codes of hardware without a driver: no serial numbers, names, inventory id, build or model. The profile server checks the PC token but stores only a count per code per day, for 180 days, with no link to an account or PC. drivers missing shows the report exactly as it is sent. See docs/DRIVER-FACTORY.md.
Lock watchdog
kernel/src/watchdog.rs samples the main kernel locks every second (screen, network, browser network, heap, physical pages, scheduler, console, log, terminal). Held 10 samples in a row by the same holder at the same place: a report in the log (lock, holder, place, waiters). A re-entered lock also goes to the screen. A trial kernel stuck for 20 s writes \EOS\HANG.TXT and reboots. With SMP an NMI watchdog reports a core that spins with interrupts off.
Performance switches (perf set)
perf set priority|app|grid|copy on|off switches scheduler and compositor options used while measuring video (docs/CHROMIUM.md, "Choppy video"); perf alone shows them. perf set app on also releases the scheduler's emergency brake.
Reference
Console commands
| Command | Arguments | What it does |
|---|---|---|
pci | — | All PCI devices; network and Wi-Fi chips marked |
usb | — | All USB devices (xHCI and EHCI): port, speed, vendor:product, name, driver, slot; devices without a driver; USB Wi-Fi; keyboards, mice, HID pointers; per-slot errors |
usb hid | [all|fields] | USB HID pointers (touchscreen, pen, mouse) in report protocol: descriptor, fields, reports, errors; boot-protocol interfaces. Legacy aliases: alles, velden |
usbports | — | Raw state of every USB port. Legacy alias: usbpoorten |
chipset | — | State of the PCIe ports (Intel chipset with RCBA, series 7/8/9) |
aml | — | ACPI bytecode summary: tables, objects, _OSI queries |
aml | <path> | Evaluate an AML object, e.g. aml \_SB.PCI0.SDHC._STA (value, resources, time) |
aml log | — | The last 40 lines of the AML log |
acpi | — | SCI, GPEs, EC events (_Qxx, Notify), power button, lid |
battery | — | Battery and charger state |
battery read | — | Read the battery again now. Legacy alias: battery lees |
battery ec | — | Dump the embedded controller bytes |
sdio | — | Switch the SD/SDIO controller on (_STA, _PS0) and identify the card (Desktop only) |
smp | — | Cores per MADT, active cores, trampoline, at-boot setting, TLB shootdowns, watchdog reports, per core (x86-64) |
smp on | — | Start the other cores now. Legacy alias: smp aan |
smp boot | on|off | off: write off to \EOS\FW\SMP.TXT (one core from the next boot on); on: delete it (the default: all cores). Legacy aliases: smp opstart aan|uit |
ps | — | Kernel threads and their state |
mem | — | RAM, heap, threads, processes (and per core with SMP) |
mem processes | — | Per process: pid, parent, MiB, shared MiB, CPU ms, name, kind (x86-64). Legacy alias: mem processen |
perf | — | Show the perf switches, then the start measurement |
perf video | [1-600] | Measure video for s seconds (default 30): frames, sound, waiting times, peaks |
perf power | [1-3600] | Power per domain (package, core, graphics, DRAM) over s seconds (default 1): min/avg/max watts; Intel PCs only |
perf start | — | Measure Chromium's start |
perf yt | — | Player diagnostics of Chromium in the log (Desktop, x86-64) |
perf net | on|off | Failed Chromium requests in the log (Desktop, x86-64). Legacy aliases: aan, uit |
perf play | — | Start the video (with sound) in Chromium (Desktop, x86-64). Legacy alias: perf speel |
perf set | priority|app|grid|copy on|off | Switch a performance option. Legacy aliases: zet, voorrang, raster, kopie, aan, uit |
counter | [s] | Test thread that counts s seconds (default 30, max 3600). Legacy alias: teller |
counter state | — | The counter's value. Legacy alias: counter stand |
counter busy | [s] | Compute s seconds without pausing (default 10, max 600; needs a preemptive timer). Legacy alias: counter druk |
run | [+jit] [+camera] [+mic] <name> [arguments] | Start \EOS\BIN\<NAME>.ELF; Linux programs get argv; +jit, +camera, +mic grant a permission (Linux programs only, tests) (x86-64) |
process | <hello|counter|fault|cli|wx|leak|fpu|stack> [n] | Built-in ring-3 test program, n at once (1–4) (x86-64). Legacy names: hallo, teller, fout, lek. Legacy command alias: proces |
kill | <id> | Stop a process (id from ps) (x86-64) |
package | [list] | App packages in RAM: name, items, MiB, users, SHA-256. Legacy aliases: pakket, lijst |
package load | <name> | Load \EOS\APP\<NAME>.PAK from the stick. Legacy alias: laad |
package receive | <name> | Only over SSH: ssh <pc> 'package receive <name>' < X.PAK. Legacy alias: ontvang |
package remove | <name> | Remove from the list (gone when no process uses it). Legacy alias: weg |
package content | <name> [dir] | List the files in a package. Legacy alias: inhoud |
package start | <name> <program> [arguments] | Start a program from a package (glibc, dynamic loading) |
linuxtrace | off|errors|all | System calls of Linux programs in the log. Legacy aliases: linuxspoor; uit, fouten, alles |
log | [n] | The last n lines of the log (default 30; over SSH everything) |
date | [ntp] | Date and time (UTC) and their source; ntp: fetch from the network again. Legacy alias: datum |
cmos | — | All CMOS bytes and the reboot settings |
reboot | — | Reboot, every step on the screen, the last one in CMOS (emergency: hold Ctrl+Alt+Esc for 3 s). Legacy alias: herstart |
poweroff | — | ACPI S5 after the same clean steps. Legacy alias: uitzetten |
drivers | — | Devices without a driver, reporting state, model, BIOS, processor |
drivers text | — | The report exactly as sent. Legacy alias: tekst |
drivers send | — | Report now (also when automatic reporting is off). Legacy alias: stuur |
drivers on / drivers off | — | Automatic reporting on/off. Legacy aliases: aan, uit |
drivers forget | — | New inventory id (the server sees a new PC). Legacy alias: vergeet |
Related diagnostics on other pages: ahci, nvme, disks in Storage; input, i2c in Input; sound in Sound; camera, privacy in Camera; ip, net, e1000, rtl8168, bcm in Network; stick, try, commit in Boot.
Functions and modules
| Function / module | Role |
|---|---|
crate::run_command (kernel/src/main.rs) | The dispatcher of every console command |
crate::print_pci, crate::print_usb, crate::print_chipset | pci, usb, chipset |
crate::usb::hid_lines, crate::usb::port_lines | usb hid, usbports |
crate::pci_intel::{inspect, describe} | Intel chipset PCIe ports |
crate::aml::command, crate::aml::bring_up_sdio | aml, sdio |
crate::sci::command | acpi |
crate::battery::command | battery |
crate::arch::smp::command | smp |
crate::sched::command, crate::sched::print_cpus | ps, per-core lines |
crate::proc::{processes_command, command, kill_command, run_command} | mem processes, process, kill, run |
crate::perf::command | perf |
crate::linux::package::command | package |
crate::linux::TRACE | linuxtrace level (0 off, 1 errors, 2 all) |
crate::console::log_text | log |
crate::rtc::command, crate::net::ntp::sync | date |
crate::restart::{before_reboot, before_power_off, report_previous, configure, cmos_command} | Clean reboot/power off, report the last step of the previous reboot, read RESET.TXT words, cmos |
crate::power_off::command | poweroff |
crate::driverenricher::{command, inventory, pci_claimed, rescan} | DriverEnricher |
crate::boot_diag::{begin, step} | Boot diagnostics blocks |
crate::watchdog | Lock watchdog, HANG.TXT |
libs/driverenricher (coverage, privacy) | What counts as covered; privacy filter; the report format |
Config files
| File | Key / content | Values | Meaning |
|---|---|---|---|
\EOS\FW\SMP.TXT | content | off (legacy uit), on (legacy aan) | off: one core (written by smp boot off). Missing, on or unknown content: all cores |
\EOS\FW\DRIVERS.TXT | report (legacy melden) | on, off (legacy aan, uit; no line: on in sandbox/local, off in production) | Automatic DriverEnricher reporting |
\EOS\FW\DRIVERS.TXT | id | 32 hex digits | Random inventory id per installation |
\EOS\FW\DRIVERS.TXT | missing | on, off (no line: off, in every environment) | Missing-hardware counts |
\EOS\FW\DRIVERS.TXT | missing-day, missing-sent | Unix day; usb:vvvv:dddd (repeated) | What this PC already sent today |
\EOS\FW\DRIVERS.TXT | sent (legacy verstuurd) | SHA-256 hex | Fingerprint of the last inventory sent |
\EOS\FW\RESET.TXT | words in any order | acpi kbd cf9 cf9full efi (reset methods), pts, tts, old, cmos=0xNN, cmos=off (legacy oud, cmos=uit) | Reboot behaviour: order of reset methods, _PTS(5), _TTS(5), skip the new quieting steps, CMOS byte for the step number |
\EOS\FW\TIME.TXT (legacy name TIJD.TXT) | content | minutes, e.g. -120 | Difference between the RTC and UTC |
\EOS\FW\BOOTDIAG.TXT | ebs=, pause=, reboot= | ebs=0..7, ms, s | Boot diagnostics mode (see docs/BOOT-DIAGNOSTICS.md) |
\EOS\HANG.TXT | (written by the kernel) | text report | Lock report of a hung trial kernel; read and deleted at the next boot |
\EOS\BIN\<NAME>.ELF | — | ELF | Programs for run |
\EOS\APP\<NAME>.PAK | — | package | App packages for package load |
Since 27-10-2026 EUZOS writes English config file names, keys, values and confirmation words (for example
WIPE-…,environment=inPROFILE.TXT); the old Dutch names (marked legacy here) are still read and accepted (docs/ENGLISH.md).
API endpoints (called by the kernel)
| Method | Path | Used for |
|---|---|---|
POST | /api/driverenricher/melding?token=<pc-token> | DriverEnricher report. Legacy Dutch route, still called by the kernel; English route: /api/driverenricher/report (see API) |
Protocol messages and formats
DriverEnricher report (line format, version 1), text/plain; charset=utf-8; the keys are wire format and stay Dutch:
driverenricher=1
id=<inventory id>
build=<build>
arch=x86_64
cpu=<processor brand string>
model-fabrikant=<manufacturer>
model-product=<product>
model-bios=<BIOS>
apparaat=pci|usb|acpi|wifi (one block per device)
vendor=… device=… subvendor=… subdevice=… klasse=… subklasse=… progif=… revisie=… bars=…
(usb: product=, bcd=, usbversie=, snelheid=, fabrikant=, naam=, interface=, rapport=)
Without a valid PC token the server answers 401 and reads nothing. Full format, limits and the agent API: docs/DRIVERENRICHER.md.
EUZOS