Main changes of this release:


Multiple installation media are provided for PC and Raspberry Pi. For PC, burn an .iso file to CD, or dd it directly to USB media. For Raspberry Pi, 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.





   ; sha1sum -2 256 9front-8963*gz
   7104645614dccc60332009bf1524850e87ae31379d44a9634b90a9effff48287      9front-8963.f84cf1e60427675514fb056cc1723e45da01e043.386.iso.gz
   ee0fda9ba816b81b43e785882bb7cbd19213f06984adeb8bb54d5ea6b2769506      9front-8963.f84cf1e60427675514fb056cc1723e45da01e043.amd64.iso.gz
   4b308ecdb6bef642669406e3adf2992b3f21d529dc4114a14ef9c649f7d79aaf      9front-8963.f84cf1e60427675514fb056cc1723e45da01e043.pi.img.gz
   475540ecb6fd4ae29ef88c3f7eef0cab6e3a054d219d6938b5ac27f15168f10a      9front-8963.f84cf1e60427675514fb056cc1723e45da01e043.pi3.img.gz










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


by sl



igor (fast reaction)


9boot: fix isowalk() for directories spanning multiple sectors

archacpi: leave acpi enabled with *acpi=

arm64: use generic timer virtual counter for cycles()

audiohda: Add DID for Intel 200 Series PCH HD Audio

audiohda: add support for intel cannon point-lp (t490s)

audiohda: add support for intel comet lake-s, fix typo

audiohda: add ztom z36/z37 device id

audiohda: fix syntax error

aux/wacom: fix race in read queue

bcm: fix rebootcode linkage

bcm/emmc: remove unused cardr wakeup(), use MACHP(0) as tick reference

bcm64/sdhc: add *emmc2bus kernel parameter to set dma dram bus address

bcm64: make the kernel use virtual timer counter register for cycles()

bcm64: parse the emmc2bus/dma-ranges device-tree property and provide *emmc2bus kernel parameter

devbridge: fix vlan range parsing

devbridge: implement experimental vlan support

devbridge: improve locking, unbind ports automatically on read error and more…

devdraw: printmesg: implement “z” fmt arg (safe since printmesg is disabled)

devenv: allow environment total size of up to 1MB

devgpio: make reading ctl file return 0 bytes

devip: add comment to ip.h explaining Routehint struct

devip: allow setting the “trans” flag on a logical interface

devip: cache arp entry in Routehint

devip: dont hold ifc wlock during medium bind/unbind

devip: implement ipv4 arp timeout with icmp host unreachable notification

devip: implement network address translation routes

devip: improve tcp error handling for ipoput

devip: properly rlock() the routelock for v4lookup() and v6lookup()

devip: use better hashipa() macro, use RWlock for arp cache

devip: use top bit (type) | subnet-id for V6H() route hash macro

devsd: cache SDunit pointer in Chan.aux, improve error handling

devssl, cpu, import, oexportfs: delete

devswap: improve setswapchan()

devtls: fix bwrite memory leak when channel stops being open

devtls: implement “hangup” ctl message

devtls: reject zero length records (thanks sigrid)

devuart: allow serial console on late detected uarts

devvmx: skip tsc offset writing if CPU doesn’t support it

ether8169: support rtl8402 variant

ether82563: add 0x15bd i219-lm variant (thanks crab1)

ether82563: add pci id for ethernet on dell optiplex 7090 micro (thanks leimy)

ether82563: add pci id for i219-v on t490s

ether82598: add pci device id for ixgbe i52899 (thanks izaki)

etheriwl: add did for Intel Centrino Advanced-N + WiMAX 6250 (thanks Nessa)

etheriwl: add support for wireless ac 7260 (thanks kemal!)

etheriwl: fix botched merge…

etheriwl: fixes for 7260 ac

igfx: add TypeILK, since it differs slightly from SNB

igfx: add x1 carbon 3rd gen (broadwell)

igfx: fix FDI link training on ironlake

igfx: fix some typos in comments

igfx: maintain single/double-channel LVDS mode from BIOS

igfx: Support for igfx on Celeron® 2957U (thanks Lorenzo Bivens)

igfx: add x1 carbon 3rd gen

igfx: add missing pci did’s for hwblank for known mobile models

kernel/rdb: need to reenable polling mode on the uart, remove cruft

kernel: add extra negative and power-of-two check to pcibarsize()

kernel: call freebroken() for kproc() when out of processes

kernel: dont block allocating kstack for new processes

kernel: ensure that all accesses to Mhead.mount is done with Mhead.lock acquired

kernel: fix off by one for $cputype buffer (thanks anthony martin)

kernel: fix stat bugs

kernel: increase bootfs.paq compression level and blocksize

kernel: make Page.txtflush into an array

kernel: make growfd(), findfreefd() and newfd2() static

kernel: move waserror() macro to port/portfns.h

kernel: page counts a ulong, not usize

kernel: return error from sysrfork instead of waiting and retrying

kernel: simplify /boot/boot: 28K down to less than 4K.

kernel: support large 64-bit pci membars, increase pc64 VMAPSIZE to 1TB

kbdfs: allow X and x to be used not just for hex composition

nusb: Fix handling of interface altsetting.

nusb/audio: use setalt(), make sure endpoint has right direction.

nusb/cam: fix mistake (nil vs -1)

nusb/cam: use setalt()

nusb/disk: use setalt(), print argv0 in prints instead of “disk:”

nusb/ether: remove csp check for rndis, already done in nusbrc

nusb/ether: use setalt()

nusb/lib: provide a setalt() function to set the interface to its altsetting

nusb/serial: fix pl2303 usbcmd error checks

nusb/usbd: use per hname collision counter instead of device address to resolve collisions

nusbrc: fix FTDI detection

sdide: add pci id for AMT IDE-r controller on x230

sdmmc: do card init in a background process after the first try

uartpci: AMT SOL Redirection interface (x200s)

uartpci: add serial-over-lan uart from x230/AMT

usbxhci: endpoint address needs to be masked with Epmax from endpoint number

usbxhci: xhcirecover proc does not need to check status every 10ms

vga: add eeepc1005ha graphics (thanks Andrew Eggenberger)

vga: return modes according to EDID timing priority order

vga: use vlong for pci bar size

vgadb: add 3rd gen intel hd graphics did (thanks mora)

vgadb: add cyber938x bios offset for cyber 9525 (thanks lyndsay)


/sys/lib/acid/pool: format addresses using A format, instead of X (32 bit)

6c: extern registers must be considered used on return

cc: do not expand function-like macros for non-function invocations

cc: fix incorrect octal range condition in mpatov

reduce: use if() to test for exit status of pipeline


ape: add missing idn2utf, utf2idn to lib9

ape: allow exporting rc functions in environ[]

ape: export mktemp() in <stdlib.h> when _BSD_SOURCE is set

ape: fix wrong write size for _assert()

libFLAC: update to 1.3.4

libaml: implement ObjectType instruction (thanks sigrid)

libaml: implement ToString instruction

libaml: resolve refs in ObjectType instruction

libc: change usize to 64-bit for amd64 and arm64, make memory(2) functions use usize

libc: fix overflow of domain component rune buffer for idn2utf()

libc: idn2utf()/utf2idn(): check for < 1 buffer, can’t insert terminating NUL.

libc: use usize for sbrk() increment

libc: qsort: allow usize-sized arrays.

libndb: move mkptrname() into libndb to avoid duplication

libpanel: rename to match clean rule

libsec: decode international domain names in certificat subject, fix overflow botch

libsec: fix bugs in tls extension handling (thanks kemal)

libsec: fix operator precedence bugs (thanks kemal)

libsec: fix wrong assert condition (introduced in 775a4bea4386c12067057de0e56dd8baa34f43ec)

libsec: fix wrong tls1.0 prf regression

libsec: handle international domain names in certificate request

libsec: no point in checking for “xn–” marker, just call idn2utf().

libtags: flac: check sample rate before dividing by zero; also check number of channels

libtags: id3v2: make sure extra id3 tag does not cause infinite loop

libtags: m4a: do not div by zero

libtags: no tags is still fine if format is known

libtags: opus: fix duration on truncated files

libtags: wav: do not div by zero

libthread: deal with schedfork() and schedexec() returning -1

libthread: fix debug prints, simplify

libthread: remove more garbage: threadnotefd, threadpasserpid.

libthread: remove unused _workerdata() prototype from threadimpl.h

libthread: remove unused skip() function


9fs: 9front.org files now live on port 9000.

9fs: remove case 9bugs (defunct)

9fs: update case 9contrib for new server

9fs: update case 9front

acme: don’t let tag button draw over tag border.

acme: fix hiding of top windows when loading a dump file (thanks Xiao-Yong)

acme: fix leaking memory allocated by getenv(“font”)

acme: fix plumb message leaks (thanks igor)

acme: fix window and scrollbar display glitches at bottom fringe of column

acme: remove superfluous print arguments (patch from plan9port)

acmed: add external command flag -e, improvements, bugs

acmed: handle international domain names

acmed: import acme (RFC8555) client

acmed: move from ip/ to auth/

acmed: pass original utf8 subject domain to challengefn, simplify

acmed: reject -t flag when -e is given, dup stderr to stdout of -e cmd

acmed: remove unused define

acmed: tokenize domains from subject also with spaces (fixed multidom cert)

acne/Mail: fix double-free (Bterm() in mesgshow())

aescbc: flush before exit and report an error (if any)

ape/mkstemp: better options

ape/psh: provide /dev/fd

audio/flacdec: handle read errors properly to avoid endless looping saturating cpu

auth/as: fix wrong filesystem permissions due to wrong factotum being attached

auth/rsa2jwk: add code to produce jwk rsa keys

aux/cddb: include album name and correct track number key

awk: fix off-by-one string buffer overflow from gsub

cat: remove stupid long cast

cmd/mkfile: major cleanup

date: remove ‘-m’ flag

diff: fix -u when comparing identical files

diff: revert last change, this breaks git/diff

exportfs, oexportfs, iostats: make -d log to stderr

exportfs: make -d log to stderr

exportfs: revert e524e8d65a7573c46d7beb49e77bfc2d55a5563d

flacdec: do not loop forever on write/decode errors

g: fix duplicate files with directory argument

g: show all file names when grepping

g: use xargs instead of finding complete file list before greping

games/gb: minor style fixes

games/gb: various RTC fixes

gba: fix flash chip id for 128k and add setting

git/branch: fix order of operations (thanks qwx)

git/branch: fix typo in error message

git/branch: make ‘-n’ use HEAD when ‘-b’ unspecified

git/branch: remove duplicate assignment of dirtypaths

git/commit: remove trailing ‘subst -g’

git/commit: squelch error when run outside repository

git/compat: add support for ls-remote [-d]

git/diff: clean up diffs

git/export: use ‘date -f’ instead of ‘date -m’

git/fetch: be more robust

git/fetch: fix overly eager ’s/pack/idx/g' in refactor

git/fetch: improve detection of dumb http protocol

git/fetch: use read for reading packfiles instead of readn

git/fs: remove trailing null bytes from parent file (thanks mcf)

git/pack: check pf->pack for nil before Bterming it

git/query: fix spurious merge requests

git/query: leave range commits in topological order

git/query: refactor graph painting algorithm (findtwixt, lca)

git/revert: fix empty invocation

git/revert: update modification time on revert

git/save: leave submodules unmangled

git/serve: add a ‘\n’ after HEAD

git/serve: don’t show progress when not interactive

git/serve: one more silencing of non-interactive prints

git/{diff,import}: make it easier to handle manually-asembled patch emails

git: better handling of absolute paths, regex metachars

git: fetch all branches by default.

git: fix non-interruptible temporary warning

git: fix typo in git/log output

git: fully init objq

git: improve pack cache heuristics

git: revert c947bf808 – it triggers a bug.

git: separate author and committer

git: size cache in bytes, not objects

git: use commit date as traversal hint instead of author date

git: when stealing from the old packs list, keep what we stole.

gzip, bzip2: add -n flag to suppress modification timestamp

hjfs: fix group ownership of home dirs created by newuser command

iostats: bind /srv into the namespace, its magic

ip/dhcpd: ignore icmp advice

ip/dhcpd: ignore ipv6 addresses when looking up static binding

ip/sol: add intel AMT serial-over-lan console program

ip/sol: use httpdigest authentication

ip/sol: kvm (vnc) redirect, bring back plain authentication as a fallback (when unsupported)

ip/tftpd: add -m argument for name substitution using regular expressions

joy: joystick script for all emulators, and docs

mixfs: add reading (audio loopback)

mklatin: fix compose sequences starting with a space char (␣ and ı)

mkplist: add -s option to enable “simple” sort (thanks qwx)

mothra: fix rendering of tag

ndb/dns: fix ndb serialization of RR*

ndb/dns: fix wrong ndb attribute “txtrr” vs. “txt” for caching server

ndb/dns: handle txt rr strings as binary, remove nullrr ndb code

ndb/dns: implement caa record type in ndb

ndb/dns: make dblookup() consistent with cachedb operation, bring back txtrr for compatibility

ndb/dns: use correct attribute when serializing caa record in ndb format

ndb/dns: use decimal encoding for txt rr string escapes

ndb/dnsdebug: dont duplicate rrfmt()

ndb/dnsdebug: make usage flags consistent

ndb/dnsquery: make ! bang work with reverse lookups, document in ndb(8)

netaudit: fix auth check, can have multiple auth servers!

netaudit, ndb(6): the dom= attribute in ndb should be specified without the trailing period

netaudit: check for sys= attribute to be free of periods

netaudit: simplify

page: performance fixes

pc: do not access out of bounds array element

plumber: remove $plumbsrv, add optional srvname, usage check

rc-httpd: fold two sed calls into one when computing location

rc-httpd/handlers/error: restore fn 400 (thanks, qeed)

rc-httpd/handlers/{dir-index, serve-static}: commit the correct files this time (thanks, igor)

rc-httpd/handlers/{dir-index, serve-static}: fix directory traversal bug (thanks, igor)

rc-httpd/{rc-httpd, handlers/error}: do some minimal sanitization on $SERVER_NAME before handing it off to select-handler.

rc: Xerror is not a instruction, remove from pfnc

rc: add Xhereq instruction to trace

rc: add err != nil check for early exit

rc: fix everything

rc: fix globbing with lists (thanks qwx)

rc: fix here document handling with quoted end-marker (thanks sigrid)

rc: fix leaking runq->cmdfile

rc: fix pwrd() regression, forgot <= ‘ ’ case from needsrcquote()… sorry :(

rc: make it portable (for UNIX)

rc: only have single instance of a symbol, extern in header (thanks mcf)

rc: read heredoc when receiving ‘\n’ (thanks Eckard Brauer)

rc: rstr() shouldnt skip trailing NUL bytes (thanks ori)

rc: simplify Makefile, use yacc default rule (thanks k0ga)

rc: remove useless exit $staus at the end of rcmain

realemu: fix typo in usage message.

rio: allow spaces in working directory path (-cd) when creating a new window via wctl

rio: fix parsing of directory path (-cd) when creating a new window via wctl

sam: fix spurious overwrite message (patch from plan9port)

screenlock: don’t poll to top window (thanks Stuart Morrow)

snoopy: … and fix the memory leak for new dns rr types

snoopy: add vlan protocol (802.1q)

snoopy: adjust for new dns txt rr format

snoopy: dns: add caa record type, fix rrtypestr()

snoopy: fix dns nil pointer crashes when formating dns packets (thanks sl)

ssh: fix typo (thanks izaki)

ssh: use RSA/SHA-256 instead of RSA/SHA-1 as the public key algorithm

sshfs: prefer error codes over error strings

tinc: fix spelling and update manpage (thanks unobe)

tinc: fix typo in unknown host error message

troff: we are not htmlroff

tweak: add missing return to fix double close(…) on file descriptor…

upas/fs: add missing newline to a debug print

venti: fix fprint format string

venti: fix memory layers

vmx: fix PCI ID for virtio block devices

vmx: update openbsd kernel heuristics

vncv: enable connecting to Darwin hosts

vncv: some fixes to work with intel amt kvm

webfs: do not reuse digest Authorization headers

webfs: implement RFC2617 qop extension for http digest authentication

x509: encode empty sequence as constructed

zuke: do not change volume with delta == 0

zuke: fix search function ignoring matching artist name

zuke: reset before tokenize, increase player thread stack

zuke: simplify volume control logic

zuke: support other volume handles, update volume when /dev/audio is opened


0intro(1), acme(1), con(1), rcpu(1), rio(1), namespace(4), authsrv(6), aan(8): cpu -> rcpu

9p(2): fix a typo (thanks humm)

acme(1): fix reference to 9front default acme font

acmed(8), rsa(8): add role=client attribute to rsa keys

acmed(8): add bugs section

acmed(8): fix typo

acmed(8): fix typos, formatting, and missed name change.

acmed(8): ip => auth: missed a reference to the old name

acmed(8): missed a spot

acmed(8): more improvements

acmed(8): typo…

addpt(2): fix inconsistency in description

audio(1): replace references to juke(7) and playlistfs(7) with zuke(1) (thanks unobe)

brk(2): …. we define lowest addres not used by the program above, so use that instead

brk(2): sbrk(0) returns end address, not the base

consolefs(4): import -> rimport

date(1): sync with reality

dial(2): dial returns an open data file, not a ctl one. also fixed little typo.

draw(3): .IR on memlorigin(2), fix wrong “t” param name (should be “top”)

draw(3): add a missing .br

fork(2): document new error behaviour when out of resources

ftpfs(4): import -> rimport

git(1): “see also” consistency (thanks sirjofri)

git(1): fix git/add -r spacing and wording in BUGS section

git(1): fix quotes in git/conf example

git(1): fix typo in git/push section

ip(3): document the trans argument for add/try.

ip(3): use flags instead of tag for 8 column route add/remove

ipconfig(8): add -t flag to enable source address translation

joy(1): fix typo (thanks lyndon)

leak(1): document how to generate pool.$objtype.acid

listen(8): get rid of old ports

listen(8): remove old cpu, exportfs and rexec listeners

man(1): reference /rc/bin/sig in SOURCE section

ndb(2): document txt and txtrr attributes.

ndb(6): add caa

nusbrc(8): fix typo in BUGS section

prep(8): fix typos, wording, and formating

rc(1): fix synopsis

rc-httpd(8): document how to use HTTP basic authentication

rsa(8): document rsa2jwk

rsa(8): fix spelling and adjust macros to fix formating

sam(1): fix description of ctrl+g

sega(1): fix typo

snap(4): remove non-existent -s from snapfs

pushssl(2): remove

ssl(3): remove

venti(8): change documented behavior to match actual


/lib/ndb/local: add dnschallenge ndb file for acmed(8) by default

/lib/theo: Once you understand the mechanism you’ll realize it will never work.

/lib/theo: We don’t need to make statements people perceive as promises.

/lib/theo: You obviously don’t know what you are doing, and I think you don’t deserve help.

/sys/doc/troff.ms: give correct path for -m flag (thanks kyle)

/sys/games/lib/fortunes: GPU.js

/sys/lib/newuser: fix wsys botch, crate bin/arm64

/sys/src/9/mkfile: add bcm64 (thanks stuart morrow)


keyboard: ++ = ⧺

keyboard: add ∵ (because) and ∷ (proportion)

keyboard: complete double-struck capital set; change SS → Ss for §

rootstub: create /sys/lib/tls/acmed directory