First 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-10522*gz 
   1c9ffaa779e6d239ab7be6facea00e338e63cd8a7ca101b0c76952d650565705      9front-10522.386.iso.gz
   89f1e35bf735bfc9aeca38286a9a6607f3a40292befa4a30133157790f2edbcc      9front-10522.amd64.iso.gz
   54550d09d83aa8223c043ab1e95d3f6d08b781c089ac0d684848c69a4e03e347      9front-10522.amd64.qcow2.gz
   a6040e87a9738b44af9394c076384cf65f10e3e7a9198bfc775deaa2e81c5c27      9front-10522.arm64.qcow2.gz
   d16439ae8d354a64f09b6656ad4454469da281415d4a1840623573c473821fcf      9front-10522.pi.img.gz
   c3d971c51101febd71fb6f0df95619ea2dbf6e2079f569d5544f12f0ceb5c3b4      9front-10522.pi3.img.gz
   7191a76660367ae71c347a494db99afbf2d88d75c15a9763672e084d22a8f9ad      9front-10522.reform.img.gz








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


by cinap


by sl



cover photo by sigrid

do not install logo by prahou


arm64/qemu: add xhci usb

arm64/qemu: detect VM configuration

audioac97: add 0x27de did

bcm64: fix build caused by added bootargs file in arm64/

devether: handle bypass case for dmat

devether: make dmatproxy part of devether

devether: use qfull() instead of qwindow()

devip: fix isula()

devip: handle interface spec correctly for writes to /net/iproute

devip: no more wandering routes

devmnt: handle too short or negative message sizes

devpipe: use 256k pipeqsize as default, make sure its a multiple of the i/o unit

devsdp: fix randomization of dial and acceptid

devuart: dont allow ridiculous queue sizes

devuart: should use rts() control only when hw flow control is enabled (modem flag)

ether4330: dmat support

ether4330: ignore join request while bypassed

ether4330: set link status, omit “status:” line from ifstats for aux/wpa when bypassed

ether7688: fix compiler warnings

ether8169: fix rx/tx on more recent realtek models (thanks uramekus)

etherseeq: defer enabling controller until attach(), provide shutdown() function

ethervirtio: make multicast work (thanks Arne)

igmp: maintain timeout per group per interface

imx8, arm64: fix tbdf argumnt position for intrdisable() (thanks cosa)

imx8/sai: run off ref 25MHz clock - no need to turn audio PLL on

imx8: the mpid should not contain other bits from MPIDR_EL1, only the AFF bits

kernel: Fix qio flow control

kernel: Use _Noreturn for gotolabel(), error(), nexterror() and panic()

kernel: add extra “New” process state to catch invalid state transitions

kernel: add pc field in QLock for debugging

kernel: bring back cooperating scheduling

kernel: delcare nalemenerror() and faulterror() as _Noreturn

kernel: do nlocks && delayshed check only for Running state

kernel: don’t sched() for clock interrupt when up->state != Running

kernel: dont zero up->nerrlab in syscall()

kernel: fix EDF scheduler double ready() and more robust double-ready detection

kernel: fix addbroken() race

kernel: fix the semacquire stack corruption on interrupt

kernel: fix typo in sema assert= vs == (thanks moody)

kernel: handle errors in semacquire

kernel: make sure process is in Queueing state in qunlock()

kernel: make trap() handlers consistent and check for stack overflow in kenter() for all archs

kernel: never do sched() in unlock() when not in “Running” state.

kernel: print warning in rlock() and wlock() when we hold spinlocks

kernel: remove some debugging cruft from taslock.c

kernel: remove unused Proc.lockwait Lock pointer

kernel: remove unused variables from arm trap() handler

kernel: zero Proc.lastlock and Proc.lastilock in newproc()

kernel: zero up->ureg on sysexec() and pexit()

mt7688/uart: fix compiler warnings, fixed interrupts

mt7688: add devarch and i2c

nusb/audio: fix division by zero error

nusb/audio: great new features

nusb/audio: name audio device as audioUxxxx/volumeUxxxx (thanks arne)

nusb/audio: pick a different rate if 44.1kHz is not available

nusb/ether: implement link status for a88179

nusb/kb: increase uchar rep from 512 to 1024, makes thinkpad x280 usb touchscreen work

nusb/ptp: transaction IDs are sequences of numbers starting with 0 (thanks unobe)

nusb/usbd: fix typos

nusbrc: ignore ITE RGB LED Controller

pc, pc64: fix rlock: nlocks 1 print from vga

pc, pc64: simplify error handling setscreensize()

pc64: no need to CLI in noteret() and forkret()

pc64: set accessed and dirty bits in PTE to avoid write-back

pc64: use chain of IDIVQ for delayloop() (former aamloop())

pc: fix link order, libc.a after libsec.a (for rand())

pc: use JMPF instead of indirect jump for going to syscall()

qio: fix deadlock with qdiscard()

qio: fix queue bloat blocking condition for qwrite()

qlock: keep the caller pc in the qlock for debugging

rudp: better newgen() function, avoiding the lock

rudp: fix start generation randomization and cleanup

sdide: add pci id for SiS 964 IDE controller (thanks mrunix00)

sgi: fix botched conversion to stacks below Proc.

sgi: make newport graphics work in MAME

tcp: fix limbo entry leaks from hell

tcp: remove “MaxSegment” MIB stat, add InLimbo stat

usbxhci: fix high/super speed iso transfers

zynq: fix missing return argument for intr()

zynq: fix unused argument warning in procrestore()


6?, 8?, libc: add JMPF instruction

6[acl], libmach: add 3-byte opcode encoding support for SSE[34] along with some instructions

6c: fix botched “embedded struct conversion codegen”-fix

7c: fix storeprop() sign extension bug

7l: dont dump constant-pool in the middle of switch/case jump table

7l: fix constant pool size for imm14 displacement for TBZ/TBNZ

?c: allow registerizing .ret (thanks rodri)

?c: fix nodret check

cc: don’t rearrange constant scaling across unsigned casts

qc: fix crash, nodet not nused/initialized


libc, libthread, ape: mark exit functions as _Noreturn and clean up new warnings

libc: add _callmain to share more initialization code

libc: correct dst transition times

libc: deduplicate fake cycles() imeplementation to port/

libc: remove dead code from main9p.s

libgeometry: add barycentric interpolation routines

libgeometry: add matrix minor and cofactor functions

libgeometry: fix typo from previous commit

libmach: add DPPD decoding for amd64

libmach: add HSUBPD decoding for amd64

libmach: add TBZ and TBNZ instructions for arm64

libndb: do some extra robustness checks around hash files

libpcm: audio/pcmconv-as-a-library

libpcm: fix pcmratio - forgot to adjust for output frame size

libtags/m4a: “gnre” is non-standard id3v1 style (non-text) - check before reading the value

libtags/wav: don’t stop on data (tags may follow after); don’t stop after 8 sections either

libtags/wav: process unknown tags as well

libtags/wav: respect buffer size when reading tag value

libtags: add Tcomposer and Tcomment

libtags: correct 437 codepage

libtags: fix multiple issues found by fuzzing

libtags: separate “album artist” key

libtags: sync with upstream


*: make Rerror for non existent files consistent

9boot: use BIOS tick counter instead of INT 0x15 WAIT

9fs: add iso case for nightly iso box

9fs: case 9front: move extra to plan9.stanleylieber.com

9nfs: fix rfork() race with shared pid variable

?i: correct memory access

Mail: add ‘Mark +s’ to default tag

Mail: show cc list in message view

ape: bring in entrypoint changes from libc and fix profiling across the board

audio/flac: remove unused var; add a missing newline

audio/mixfs: allow switching between audio devices (/dev/audio*)

audio/mixfs: convert pcm for devices that are not 44.1kHz

audio/mixfs: fix volume proxying; ignore audioctl and audiostat - not device names

audio/mixfs: resample based on audio dev output format, not just the rate

audio/mkplist: fix wrong pointer being dereferenced

audio/pcmconv: use libpcm

audio/readtags: print Tunknown tags

aux/wpa: continue trying to connect when forked

awk: fix out of bounds write with large fields (thanks kristo)

bootrc: make sure essid and wpapsk are used literally

cifs: fix rfork() race with shard pid variable

cifsd: clarify SMBv1 is supported, not SMB 2/3.

date: remove reference to dead -m flag (thanks Thim Cederlund)

disk/qcow2: fix crash with misaligned sectors

disk/smart: fix a warning

ethermultilink: ignore link-status of primary

ext4srv: add append-only and temp files support

ext4srv: clean up and fix a couple bugs

ext4srv: correct the “not found” walk error

ext4srv: dir/index: disable htree csum checks for now (lwext4 broken); fix a few bugs

ext4srv: disallow fwrite/ftruncate on files not open for writing

ext4srv: ext4_crc32c: use u32int macro

ext4srv: ext4_recover: fix a deadlock on filesystems without a journal

ext4srv: faster crc32c

ext4srv: fix ..-walk from a dir under root

ext4srv: fix a missed size decrement; fix 32-bit int crc32 on big endian

ext4srv: fix dir/idx case when creating new dirs; update mtime on writes; close dirs after create

ext4srv: fix ext4_bmap_bit_find_clr returning the wrong bit index

ext4srv: fix meta csum producing garbage

ext4srv: fix/simplify ext4_bmap_bits_free

ext4srv: generate a uuid when doing mkfs; don’t journal ext2

ext4srv: reduce the number of options, align more with existing filesystems

ext4srv: remove mbr scanning and writing

ext4srv: replace ext2srv with ext4srv

ext4srv: revisit “fix meta csum producing garbage” in a better way

ext4srv: support ORCLOSE

ext4srv: update inode change time on wstat

ext4srv: walk: set QTTMP

fshalt: halt ext4srv as well

g: search .S files

g: search in files with .txt suffix

games/gba: add rtc GPIO implementation

git/branch: don’t add dirs to removed file list

git/fs: don’t unload large objects when inserting into cache

git/get: move ERR handling into protocol code

git/log: ensure we’re starting to log from a commit hash

git/ref.c: check if object is a commit when needed

git/serve: provide better errors

git/walk: skip all paths with ‘.git/’ when creating the index

git: utilize time zone info when present and ignore it when it’s not

imap4d: be consistant with rest of system in log file name

ip/cifsd: dont add pointless logging (already logged when debug is active)

ip/dhcpd: don’t override local address for gateway case

ip/ipconfig: don’t add default route for ULA prefix

ip/ppp: fix race condition with rfork()

ip/ppp: increase echo timeout to 5 periods (25 seconds)

ip/ppp: lower echo timeout to 2 periods (10 seconds)

ip/ppp: remove -> del

ip/torrent: allow seeding files from read-only contexts.

ip/torrent: fix webseed when there is only one defined in the torrent file

ip/torrent: only register note handler in one proc

ktrace: _intrr -> noteret (pc64)

ktrans: correct Korean input (thanks npmania!)

ktrans: graphical upgrade and feedback

merge3: make identical changes merge cleanly

mk: Various improvements

ndb/dns: DoT support

ndb/dns: fix dnsservers() function

ndb/dns: give each DoT server Maxtcpdialtm + 500ms to complete request

ndb/dns: log appropriate message when thumbfile is missing, make tcpfree static, timeout constants

ndb/dns: set procname() for tls server

ndb/dnsdebug: fix dnsserver override (thanks moody)

ndb/mkhash: handle database= reordering, check offset overflow, remove file

rc: handle Xeflag in exitnext()

rio: fix memory leak with closed kbdtap (thanks aap)

snoopy: add igmp protocol

snoopy: teach gre about ethernet and ip6 payloads (thanks arne meyer)

stats: use a high water mark for maximum on graphs

tapefs/^(v6fs 32vfs): fix read errors (thanks Lyssa)

tapefs: fix two warnings

telco: fix rfork() race for pid

vdiff: a visual diff viewer

vdiff: add ability to collapse file diffs

vdiff: add support for stripping path elements when plumbing

vdiff: correctly strip more than one prefix

vncs: bind devswap also for memory(1), this used to be in devcons

vncv: implement autoscaling via -a flag (thanks unobe)

zuke: add “composer” tag support (column hidden by default)


/sys/doc/nssec.ms: fix references section header

acmed(8): fix typos

audio(1): add a missing comma

audio(1): mention mixfs resampling audio

cal(1): indicate which reformation date is used

cal(1): remove redundant statement

diff(1): docuemnt merge3

diff(1): include merge3 name in diff manpage

ext4srv(4): fshalt works with ext4srv now, update; add SOURCE section

filter(1): small typesetting error

git(1): conform NAME to indexing assumptions

keyboard(6): use >> instead of > for caps example (thanks moody)

ndb(8): document thumbprint file for DoT

nusb(4): document usbhubctl command format for PPPS

nusb(4): fix Audio section

nusb(4): fix audio(3) reference

plan9.ini(8): document $sysname override

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

usbtree(8): document usbtree


/lib/ndb/common: add tcp=dot port=853 entry

/lib/terry: speak no ill of the dead

/lib/theo: there is another possibility is everyone is out to get you.

/sys/lib/acid/kernel: fix proctab()

/sys/lib/dist/ndb/common: remove old random auth domains

/sys/lib/dist/ndb: update root servers and add script to keep them updated

/sys/lib/kbmap/caps: Add caps kbmap

/sys/src: remove testfiles on mk clean

inst: remove net install support