Notable changes in this release:


Multiple installation media are provided for PC, Raspberry Pi, MNT Reform, and QEMU. For PC, burn an .iso file to CD, or dd it directly to USB media. For Raspberry Pi or MNT Reform, dd an .img file directly to sdcard.

The pi.img file can be used for Raspberry Pi 1, 2, and 3. The pi3.img file can be used for Raspberry Pi 3 and 4.

QEMU images are provided in QCOW2 format.








   ; sha1sum -2 256 9front-10277*gz
   a04a0ec7179affc3c1289f34e748e4fb601b9124de4b5036031811f1c4321f55      9front-10277.386.iso.gz
   fbf1a3f017369ee26479221feec43a660ca94b2037ed225552951aa62f4a044f      9front-10277.amd64.iso.gz
   f4d69829ce7ccca4090bc80f2fa6b771148ff94f8e1610a0502a86d854861a31      9front-10277.amd64.qcow2.gz
   1949091b674997d40aec6974f4f1634c4fefc1e6787ae290b604b6b13b431fe6      9front-10277.arm64.qcow2.gz
   de3753dd8588579fe84f73887e9bda246de5118d97726a1261885b663f004bd3      9front-10277.pi.img.gz
   49c572589aee80033855452eade9f0b9ccce00cdd4423bd84d1f01d24c520465      9front-10277.pi3.img.gz
   acdb2b43fdf4ef76359aac755187afe39463f148614e447d44c47e426dc00077      9front-10277.reform.img.gz








dash 1 manual: http://9front.org/propaganda/books


by cinap


by sl





9/boot/net.rc: allow setting additional flags to aux/wpa with $wpaopts in plan9.ini

add arm64 qemu kernel

arm64: mem.c doesnt need sysreg.h

arm64: remove hz/mhz from conf, not needed.

bcm, bcm64, imx8, kw: Fix missing preempted() call on non-clock interrupt (thanks Anthony Martin)

bcm, bcm64: Add bitbang i2cgpio driver

bcm, bcm64: handle disk activity led from sdmmc

bcm64, imx8, pc64: save stack space in fault handler

bcm64, imx8: fix breakpoint note strings

bcm64, imx8: provide more flexible MPIDR_EL1 CPUID to machno mapping

bcm64, imx8: writing CAPR_EL1 (to turn fpu on/off) needs a intruction barrier

bcm64: add i2c for pi3

bcm64: dont need sysreg.h in mem.c

bcm64: port new FPU code, making FPU available to interrupts

bcm64: remove sysreg.c

bcm64: use generic 9/arm64/* files

bcm64: use generic 9/arm64/mmu.c

bcm: add wifi driver

boot/efi: add arm64

boot/reform: update flash.bin url

devarch: recognize AMD Jaguar and Puma SoC’s (thanks dave)

devether: handle bypass outside of ethermux()

devi2c: expose the I2Cdev structure to the controller.

devip: add gratious arp ctl message to /net/arp

devip: automatically unbind interface on read errors

devip: fix comment ifc->id -> ifc->ifcid

devip: have findipifc() return rlock’d interface, allow to use “del” instead of “remove” for route and interface operations

devip: make some symbols static, cleanup

devip: run Medium.unbind() with ifc->conv released, cleanup

devpipe: remove bogus “wstat on closed pipe” note

devsd, sd*: use seprint() style start/end pointer for rctl() function

devsd, sdmmc, ether4330: improve infrastructure for sdio

devtls: allow larger than MaxRecLen (16k) writes

devuart: cleanup uart console code

devuart: fix wrong opens count in case of uartenable() error

devuart: handle software flow control (XON/XOFF) in devuart alone

devuart: make sure consuart was enabled before setting serialoq

devvmx: reset kernel fpu state before loading vmx fpu state

devvmx: restore previous initial value for xcr0

ether4330: annex sdM for emmc (changed order)

ether82563: add B360 i219-v

ether82563: clear force speed/duplex bits in link-up (thanks taw)

etherimx: ignore trailing 4 byte garbage in ethernet receive packet

etheriwl: Add support for Wireless AC 3160 (thanks kws)

ethermultilink: add “bypass” ctl for ethernet

ethermultilink: send gratious arp instead of flushing arp cache

ethermultilink: switch between different physical interfaces based on link status

i2cbcm: clean up and fixes

i2cbcm: use core clock rate from vcore instead of hardcoding 250Mhz

imx8, bcm64: make sure interrupts are of (sched() re-enables them)

imx8, bcm64: touser() already called splhi()’d

imx8: port new FPU code, making FPU available to interrupts

imx8: share generic arm64 mmu.c

imx8: usb: enable host IN auto retry

imx8: use generic 9/arm64/^(init9.s rebootcode.s)

imx8: use generic 9/arm64/cache.v8.s

imx8: use generic 9/arm64/fpu.c

imx8: use generic 9/arm64/sysreg.c

imx8: use generic 9/arm64/sysreg.h

imx8: use generic 9/arm64/trap.c

kernel: fix SEGMAXSIZE macro, force 64-bit result

kernel: make walk/open errors more consistent with userspace

kernel: move virtio10 drivers to port

kernel: support 32k iounit

nusb/disk: advertise the correct iounit for disk files.

nusb/disk: use IOUNIT constant for Maxiosize

nusb/disk: work around quirk in some CD drives

nusb/ether: implement link status detection for smsc and lan78xx

nusb/ether: make stats file compatible to stats(8)

nusb/kb: fix Glorious Model O mouse

nusb/kb: fix portreset feature and recovery

nusb/usbd: attach spam protection for reset loops and flanky devices

nusb/usbd: don’t spam opendevdata() transaction errors before timeout, error printing

nusbrc: use exponential backoff and timeout usb enumeration

mouse: use tsleep() instead of delay() (thanks uramekus)

omap: Fix missing preempted() call after non-clock interrupt (Thanks Anthony Martin)

pc, pc64: clear osxsave flag in cr4 when not used

pc64: avoid STI/CLI, touser() already called splhi()’d

pc64: make FPU available in interrupts

pc64: no need to _stts() in squidboy()

pc: do trapinit() and mathinit() early

pc: skip CLI/STI when not needed

pi3, pi4: change the order of emmc and sdhc for ether4330

pipe: bring back wstat, set size (in bytes) of the pipe buffer

qio: fix memory leak in qproduce()

reform/pm: fix lcd pwm cycle setting precision

reform: add ethersink driver for ethermultilink

sdhost: implement sdhost controller driver so we can use wifi always (pi3)

sdnvme: dont make queues largers than MQES field in capability

swap: fix pager nil pointer derefence when running out of procs

zuke: make stack usage independent of Biobuf’s Bsize.

zynq: fix print format in emmc driver

zynq: remove uartconsole() function, already done by devuart internally


/sys/lib/acid/port: mind upper bounds of fnbound

6a: use IOUNIT for BUFSIZ

6c: fix embedded struct conversion codegen

6c: fix wrong signed type conversion from char/short -> float/double

6c: remove stray non-interruptible temporary warning

7c: add form3 support (no functional change)

7c: do NOT allocate link register for general use

7c: dont replace SXTW instruction following MOVW $const, r

7c: fix constant propagation for negative 64-bit constants

7c: replace {CMP $0,…; Bcond} with CB[N]Z/TB[N]Z when possible

7l: 1 → NOPROF to avoid confusion

7l: avoid hitting old 7c bug with 64-bit constant propagation

7l: define missing TBZ/TBNZ relation

7l: do a single pass to produce data segment instead of doing it in chunks

7l: fix MADD/MSUB optional reg

7l: support CB[N]Z[W] instructions

7l: support fmov between general and fp registers

7l: support fused multiply-add/sub ops

7l: use wider INITTEXT and INITDAT

*l: make sure Sym and Auto structs are fully initialized (thanks moodman)

ar: use IOUNIT for streaming in files

cc: support binary constants and refactor

cc: use IOUNIT for BUFSIZ

cpp: remove trigraphs

cpp: run tests with ‘mk test’

yacc: define dummy yytokname() and yystatname() macros if not yydebug


lib9p: return effective iounit in Ropen response

libaml: dummy implement NotifyOp (thanks uramekus)

libauthsrv: readnvram: prompt for password conformation

libbio: bump Bsize to IOUNIT

libc/arm64: disable profiling on memcpy (memmove is an alias and follows immediately)

libc/arm64: fabs, floor and ceil in assembly

libc/arm64: memmove/memset - save/restore link register

libc: fix crash in idn routines with long domain names

libdraw: use IOUNIT for transfer block size in readimage()

libjson: make sure string contains only a single JSON value

libmach: arm64: disasm fmov Rn,Fd / fmov Fn,Rd

libmach: fix RETURN and branch target for CBZ/CBNZ for arm64 (wrong sign extension)

libmach: fix dropped header in last commit

libmach: open /proc/n/kfpregs when kernel debugging

libmach: set errstr if we can’t find a SP for a PC

libmach: setmach: mipsLE* -> spim

libmach: thumb support

libregexp: regprint: make regimpl.h include match its siblings

libsec: ansi-ify hkdf, pbkdf2 and scrypt

libvorbis: delete random sparc64 .a


acme: add font control message

add /rc/bin/doom: games/doom launcher

add aux/aout2efi

add games/dmx: decode doom sound effect lumps (dss*)

add games/mid2s: streaming midi from file, and merge common stuff into generic framework

ape/expr: ansi-ify function declarations

ape/pdksh: ansi-ify function declarations

ape: ansi-ify isatty and listen

ape: libap: do not set objtype in amd64 mkfile

audio/flacenc: implement [-i fmt] for supported formats; fix tell callback; fix big endian and 3-byte samples

audio/zuke: ICY: 4k of stack is enough for everybody

audio/zuke: double mainstacksize

audio/zuke: fix ICY proc running out of stack

audiohda: added Cannon Lake support

audiohda: detect hda devices using pci class id

aux/depend: remove old cruft

aux/dial: use IOUNIT for transfer block size

aux/trampoline: use IOUNIT for transfer block size

bar, fontsel: use heap allocated biobuf

bar: smaller buffer for aux proc; exit on eof

bzfs: use IOUNIT for buffer size

bzip2: use IOUNIT for transfer block size

cdfs: use IOUNIT for maxrpc (thanks Arne Meyer)

cfs: use IOUNIT for MAXFDATA

cmd: use increased iounit

compress: ansi-ify function declerations and enable warnings

cpurc, termrc, bootrc: organize default device binds

diff: don’t flush on every line

diff: fix no newline test

diff: generate no-newline directives

diff: improve is-binary heuristic

diff: make distproto copies tests

dossrv: use IOUNIT for Maxdata

eui: draw in seperate proc

fcp: use IOUNIT as default size

file: recognize MOD files (thanks umbraticus)

file: recognize and differentiate opus

file: use xiph mimetypes to clearly differentiate ogg/vorbis from ogg/opus et al (thanks sigrid)

fshalt: get rid of special nvme hack for disk shutdown

games/aout2gba: allow either ARM or ARMB mach type

games/dmx: rename to games/dmxdec for consistency

games/doom: bump max number of simultaneous sound effects

games/doom: don’t crash on invalid music selection with idmus cheat

games/doom: don’t print useless status on stderr

games/doom: draw in a separate proc

games/doom: faster palette→rgb conversion for arm64; fix convproc channel handling

games/doom: fix unhooked sound attenuation with distance

games/doom: remove dead code

games/doom: run audio in its own proc; can stop frame-dropping as well

games/doom: use wadfs to expose genmidi lump instead of extracting to /tmp

games/doom: wait explicitly for convproc to exit before running getwindow on resize

games/festoon: ansi-ify function declerations

games/gb: correctly mark transmitted serial data as sent

games/gba/rom: use -t with 5a

games/md: ignore invalid writes (makes cave story work)

games/mid2s: fix usage string

games/mkfile: match the dmxdec rename

games/opl3: fix choking on high tempo streams

games/vocenc dec: move from audio and add encoder

git/*: reduce object cache size

git/add: don’t include paths in the .git directory

git/branch: avoid null list errors

git/branch: prevent deleting current branch, skip dirty check for deleting branches

git/clone: correctly handle cloning repos with ‘/’ in the remote ref

git/commit: fix sed invocation: our ‘^’ operator has a quirk when used with ‘g’

git/diff: always respect the specified branch

git/diff: make ‘-u’ flag imply ‘-s’

git/fs: fix leak of uid strings

git/fs: match errors with other file servers

git/fs: preserve mode bits when walking branch dirs

git/fs: when statting an object, generate a correct qid

git/merge: include files changed in the merged commits

git/query: allow arbitrary length queries

git/query: check for nil return from seprint

git/revert: correctly revert files with spaces in the path

git/revert: only look at changed files

git/save: fix warning

git/walk, git/save: be less restrictive about permission matching

git/walk: add -b option to override base branch

git/walk: filter out files from within the .git repo

git/walk: fix usage on new repo

git/walk: only show untracked paths matching requested prefix

git: fix zero hash check crash in git/serve

git: replace index format for ~200x speedup

grabrfc: update fetching

hg: actually remove hg this time

hg: remove forgotten traces

history: set missing execute bit

hjfs: unlimited buffer works

hjfs: use smaller fixed buffer size

imap4d: use IOUNIT for Bufsize

ip/ftpfs: fix totally broken messagesize, use IOUNIT

ip/ipconfig: allow “del” verb in addition to “remove”

ip/snoopy: fix missing break rrfmt() in (tho, harmless as of rrsupported() check)

ip/snoopy: sync with ndb/dns

ircrc: fix pong message (thanks mkf)

ktrans: more tests, telex rewrite, small chinese fix

ktrans: pinyin, cleanup and documentation updates

lstk: add /bin/lstk to dump most recent crashed proc

merge3: handle edge cases where we remove lines

merge3: overlap happens on the source offsets, not the dest offsets

mk: dead code removal

ms2html: fix crash on macro without newline

ndb/dns: add -L flag for local-recursive server

ndb/dns: avoid blocking 9p on refresh, use shorter 15second query timeout, cleanup

ndb/dns: better handling of extended response code

ndb/dns: built-in tcp server, remove cruft, refactor

ndb/dns: embedd name string into DN struct

ndb/dns: fix RR.caa leak

ndb/dns: fix memory leak in dnzone()

ndb/dns: hack for the caching server for delegated nameservers

ndb/dns: implement EDNS(0) extension (rfc6891)

ndb/dns: implement concurrent garbage collection

ndb/dns: make sure theres only a single Topt option in getednsopt().

ndb/dns: refresh the cached dnsserver domain ndb entries in db2cache()

ndb/dns: remove leftover #pragma varargck argpos dnsdebug 1

nedmail: set $% to the full path of the current message

newuser: use non-expanded $home instead of /usr/$user in lib/plumbing comment

page: use IOUNIT for NBUF

paqfs: use IOUNIT+IOHDRSZ for mesgsize

patch: delete files for tests before test run

patch: fix offsets in reverse mode

patch: support no-newline directives

postscript: ansi-ify function declerations

rc: use IOUNIT for io NBUF

readtags, zuke: extract cover images stored in the audio files (thanks g-w1)

riow: skip redundant k events with shifted keys

rx: use IOUNIT for transfer block size

skelfs: use more correct “file does not exist” error

sshfs: use MAXWRITE for I/O unit

sysupdate: use the rc -b flag to keep sysupdate in memory

tapefs: use IOUNIT for Maxbuf

tl: use IOUNIT for MAXIO

tl: use the allocator from cc/compat

tlsclient: use IOUNIT for transfer block size

tmdate: add ordinal day of month format specifier

tput: use iounit(2) of the file-descriptor by default

troff: embiggen troff character size limit to support huge fonts

uhtml: use IOUNIT for transfer block size

upas/Mail: when space is tight use ellipsis (…) instead of 3 dots (…)

upas/Mail: use IOUNIT for Bufsz

upas/fs: don’t abort when the server gives us invalid dates

upas/fs: don’t try to fstat a renamed fd

upas/fs: use IOUNIT

upas/fs: write index out to temp file

upas/imap4d: fix bad censorship of the password when debug is enabled.

upas/imap4d: return SEARCH response in caps.

upas/marshal: use IOUNIT

upas: “move” ctl verb to move messages between imap folders (thanks Risto Salminen)

vac: use IOUNIT reading files

vacfs: use IOUNIT

vncs: use IOUNIT for Maxfdata

vncv: remove 16 -> 32 bpp conversion routine

vt: bracketed paste mode (fixes autoindentation in text editors)

vt: resize only when the window is not hidden (fixes window at top left corner with riow after terminal reset)

walk: handle removed files correctly

wc: use IOUNIT for NBUF

webfs: use IOUNIT for transfer block size


ether(3): document “bypass” ctl message.

ethermultilink(8): add manpage with example

ethermultilink(8): add some warnings about leaving the secondary interfaces alone

ethermultilink(8): fix bridge(3) reference (thanks Stuart Morrow)

ethermultilink(8): fix sink bind (thanks sigrid)

git(1): document ‘git/diff -u’

git(1): document flag to show unused files

git(1): document git/import -n

git(1): remove lies from manual, improve wording.

git(1): update and clean up git/walk section

ip(3): document garp ctl message for /net/arp

listen(8): remove tcp53 reference, remove !tcp53 template

rio(1), rio(4): wctl /srv pipe is dead, mention ‘none’ attach (thanks unobe)

paqfs(4): remove 8K default message size comment

pc(1): remove non-existent -n (thanks kvo); misc fixes from checkman

plan9.ini(8): document $wpaopts

sd(3): list /led and /smart files

snap(4): clean up lies

stats(8): drop 802.11, consider ALL /net/ether*/stats

webcookies(4): cookiefs -> webcookies

zuke(1): document audio/readtags


/lib/keyboard: fix subscript small letter n. add super/sub small letter i

/lib/rob: Critical code needs static typing.

/lib/theo: You are in way over your head

/lib/theo: You are trying to compare a pig and a moon rocket.

/lib/theo: You get to adapt to what we produce.

/lib/troll: We have created something new that we named R9, an OS strongly inspired by Plan 9, written in the Rust programming language.

/sys/lib/dist/mkfile: include /386/mbr et al in disk images

/sys/lib/dist/ndb/common: add esmtp (port 587)

/sys/src/boot/mkfile: add missing child directories

distproto: include /lib/ucd in releases

replace ? with ؟ character in fa kbmap (thanks mkf)