Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
01558db
isp1040: add the dual-channel ISP12160 part
jamesbraid Oct 30, 2026
a1f9cd2
bedrock_flash: add the Fuel boot flash windows
jamesbraid Oct 30, 2026
0b68280
l1: add the Fuel system controller
jamesbraid Oct 30, 2026
78cc80a
ohci: add the Lucent USB host controller
jamesbraid Oct 30, 2026
4c4cb77
odyssey: let a widget-offset machine host the board
jamesbraid Oct 30, 2026
63b4d12
ip35: fit the VPro board in the Fuel's graphics slot
jamesbraid Oct 30, 2026
6eedf0f
ioc4: add the IO9 peripheral controller
jamesbraid Oct 31, 2026
3acfdae
l1: add the router brick reply and a configurable port speed
jamesbraid Oct 31, 2026
93a1bb5
ioc3_kbc: add the IOC PS/2 controller as its own model
jamesbraid Oct 31, 2026
73f1d89
ds1744: add the DS1744-compatible timekeeper
jamesbraid Oct 31, 2026
f7e5fbc
cpu: add the R16000 parts
jamesbraid Nov 6, 2026
389de5a
ip35: compile the reset PROM from the PROM, not the RAM over it
jamesbraid Oct 31, 2026
8c8a0e3
cpu: keep valid primary instruction lines in the CPU's cached view
jamesbraid Nov 8, 2026
b89411d
cpu: take code and generation counters from the cache's bus
jamesbraid Oct 30, 2026
3811e97
ppmem: let a machine hold cache lines where no memory is mapped yet
jamesbraid Nov 8, 2026
fbf4336
fuel: add the serial IP35 machine
jamesbraid Oct 30, 2026
8d4d7a5
pxbow, xbow: add the crossbow widget forwarding behind the PIC
jamesbraid Oct 31, 2026
02d1624
pci: let a function take a whole-dword configuration write
jamesbraid Nov 9, 2026
3ab52f1
bcm5701: add the Broadcom gigabit Ethernet controller
jamesbraid Oct 31, 2026
4f61d9d
l1: carry a node board's CPU configuration in its board record
jamesbraid Nov 10, 2026
4262f16
pic: add the PCI host bridge
jamesbraid Nov 9, 2026
2848d33
ioc_serial_dma, deadline_timers: add the IOC serial ring engine and i…
jamesbraid Oct 31, 2026
de6f713
xtalk: hand the host an interrupt packet's address and source
jamesbraid Nov 10, 2026
74edc37
bedrock: add the Fuel's node controller
jamesbraid Oct 30, 2026
6a5f8d0
xbow: register its locks without keeping the Crossbow alive
jamesbraid Nov 10, 2026
00f80ec
bridge: model the XBridge head as a part of the Bridge
jamesbraid Nov 10, 2026
5375dd7
xbow: model the XBridge's crossbar as a part of the Crossbow
jamesbraid Nov 10, 2026
6c39afa
xbridge: add the two-head Fuel PCI host bridge
jamesbraid Oct 30, 2026
d312f80
bedrock: order the PROM's reset barrier on LB scratch 1
jamesbraid Nov 10, 2026
228fb68
bedrock: bring back a level whose source is still active
jamesbraid Nov 10, 2026
cde1196
bedrock: decode eight banks, four of them above 4 GiB
jamesbraid Nov 10, 2026
e52c651
bedrock_flash: author a Tezro's configuration block
jamesbraid Nov 10, 2026
f6b9f0b
bedrock: fit processors in any of the node's four slots
jamesbraid Nov 10, 2026
18b664b
tezro: add the machine
jamesbraid Nov 10, 2026
74f44e6
tezro: hold the PROM's presence publisher until the other interface p…
jamesbraid Nov 10, 2026
be582cb
tezro: fit the VPro V12 at widget 12
jamesbraid Nov 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,24 @@ hashes are given where a change is easiest to understand by reading the commit.
boot: the century IRIX writes while SET is up restarted the clock from the
old time. The DS1685/DS1687 model now holds a century written under SET
until SET clears, as the part does, and snapshots keep it.
### SGI Fuel (IP34 board, IP35 software platform)

- Added a headless Fuel profile, `fuel_ip34`: the 500 MHz R14000, 512 MiB
of RAM, Bedrock, two XBridge PCI heads, IOC3 serial ports, PS/2 and
Ethernet, a two-channel ISP12160, a Lucent OHCI USB controller and the
L1 system controller. PROM 6.210 passes its diagnostics and IRIX 6.5.30
boots to the login on the L1 or an IOC3 serial console, and `halt -p`
powers it off. See the [Fuel guide](docs/fuel-ip34.md).
- **The Fuel takes a VPro board**: `[graphics] board = "v12"` or `"v10"`
fits the Octane's VPro model at crossbar widget 13. IRIX 6.5.30 with the
VPro driver brings the X login screen up on it.
- **jitv2 compiles the reset PROM from the PROM.** The PROM runs from the reset
window uncached; once memory covers that window the cached view returns RAM
there, and the compile pool used to compile RAM's bytes in place of the
PROM's. The board now presents an uncached instruction fetch of that window at
an address of the PROM's own (`MipsExecutor::uncached_fetch_alias`), so its
code page is keyed, compiled and invalidated by address like any other. The
other machines are unchanged.

### Benchmark and test suites: one pinned compiler

Expand Down Expand Up @@ -68,13 +86,15 @@ hashes are given where a change is easiest to understand by reading the commit.
### R10000-family cache lines as memory

- A valid primary data or secondary cache line now holds its page in that CPU's own copy of ppmem's window, so a PROM that keeps its stack in cache lines reads and writes the lines with cached accesses while the uncached path, DMA and the other CPUs see memory. Index Store Data writes through to such a line. `l2 probe 0` lists the pages held. Nothing changes on a load, store or fetch. A valid R5000 primary data line does the same, for the O2's POST stack.
- Primary instruction lines hold their pages too, each word written there as the instruction it predecodes, for the eleven predecode classes the model knows. Index Load Data (I) where a held secondary line would refill the set returns that line's words, predecoded, until Index Store Data (I) writes the set. Only the Fuel's PROM uses them.
- jitv2 does not compile a page any CPU's cache holds lines in: that CPU runs it from its own view in the interpreter, and every other page stays compiled.
- The O2 keeps POST's stack in those lines. CRIME's side page for the uncached path and the tag-store hook are gone, and an O2 snapshot an older iris took during POST is refused.

### R10000 family fixes, R12000 and R14000

- The R10000 family has 44-bit virtual and 40-bit physical addresses, FrameMask and a 28-bit EntryLo PFN, picks the TLB refill vector by address space, invalidates overlapped TLB writes (Status.TS), and completes uncached stores nothing answers. Partial LWR keeps the upper word, and the cache diagnostics (Index Store Data, secondary tag mask, Config size) work.
- `cpu` takes the parts each machine shipped with, such as `r12000_360` on the Octane, or a family name for the machine's own. The Indy and Indigo2 R4400 is now rev 5.0 at 150 MHz, the O2 R10000 rev 3.4 at 250 MHz, and an Indy no longer takes an R10000 (the R10000 Indigo2 is the IP28). The R12000 and R14000 are new.
- The R16000 is a family of its own, with four parts for the Tezro (`r16000_700` rev 2.1, `r16000_800` rev 2.2, `r16000_900` and `r16000_1000` rev 3.0) and a 4, 8 or 16 MB secondary cache picked once when a machine is built, so no run-time field or branch is added. `hinv` prints an R16000's major revision two below the PRId register's, and the part table undoes that in one place. The FIR is 0x0900, the one R14000 value on record; a model choice. No machine takes them yet.

### Onyx2

Expand Down Expand Up @@ -475,6 +495,14 @@ where they differed:
the cost follows what the guest wrote. Reflinking is unchanged. On Windows the
copy is marked sparse first.

### SGI Tezro (IP53 board, IP35 software platform)

- Added a headless Tezro profile with the 700 MHz R16000 (`r16000_700`, the default; `cpu = "r16000"` takes it too), 4 MiB cache, 4 GiB RAM, a PIC with PXBOW, and the IO9's IOC4, ISP12160 and BCM5701. The 800, 900 and 1000 MHz chips (`r16000_800`, `r16000_900`, `r16000_1000`) are listed and take four processors; see the [Tezro guide](docs/tezro-ip53.md).
- A Tezro can fit a VPro V12 at widget 12 with `[graphics] board = "v12"`, on the VPro model the Octane and the Fuel use.
- A Tezro fits one, two or four processors, four by default, and two or four bring a second PIC at widget 11 on the PXBOW's link 11. Every fitted processor runs, each on its own host thread, so a default four-processor Tezro runs four.
- The Tezro's L1 names its node board for the processor count (`IP53_1CPU`, `IP53_2CPU`, `IP53_4CPU`), so the PROM tries only the fitted processor positions and a one- or two-processor Tezro's first boot does not power-cycle the module for its empty ones.
- The Tezro's PIC fails a configuration read of an empty slot as a master timeout, so the PROM no longer records two phantom devices per empty slot.

### `IRIS_GUI_GL` works in iris-gui

- The GUI's GL capture path (`IRIS_GUI_GL=1`, or `[debug] gui_gl_capture`) never
Expand Down
55 changes: 47 additions & 8 deletions FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,9 @@ the first `[section]`, because TOML tables continue until the next header.

| Key | Default | Values and behavior |
|---|---|---|
| `machine.profile` | `indy_ip24` | indy_ip24, indigo2_ip22, indigo2_ip28, o2_ip32 (configured by `[o2]`, see [the O2 guide](docs/o2-ip32.md)), octane_ip30 (configured by `[octane]`, see [the Octane guide](docs/octane-ip30.md)), origin200_ip29 (configured by `[origin200]`, see [the Origin 200 guide](docs/origin200-ip29.md)), origin2000_ip27 (configured by `[origin2000]`, see [the Origin 2000 guide](docs/origin2000-ip27.md)), onyx2_ip27 (also configured by `[origin2000]`, see [the Onyx2 guide](docs/onyx2-ip27.md)). |
| `machine.cpu` | the machine's first | A family (`r4400`, `r5000`, `r10000`, `r12000`, `r14000`) or a part (`r14000_600`); independent of build features. Indy and `indigo2_ip22`: r4400, r5000; `indigo2_ip28`: r10000; O2: r5000, r10000, r12000; Octane: r10000, r12000, r14000; Origin 200, Origin 2000 and Onyx2: r10000 (`r10000_180`), r12000 (`r12000_270`). The first listed is the default. |
| `machine.cpus` | `1` | Processors fitted. 2 only on the Octane; see [its guide](docs/octane-ip30-multiprocessor.md). |
| `machine.profile` | `indy_ip24` | indy_ip24, indigo2_ip22, indigo2_ip28, o2_ip32 (configured by `[o2]`, see [the O2 guide](docs/o2-ip32.md)), octane_ip30 (configured by `[octane]`, see [the Octane guide](docs/octane-ip30.md)), origin200_ip29 (configured by `[origin200]`, see [the Origin 200 guide](docs/origin200-ip29.md)), origin2000_ip27 (configured by `[origin2000]`, see [the Origin 2000 guide](docs/origin2000-ip27.md)), onyx2_ip27 (also configured by `[origin2000]`, see [the Onyx2 guide](docs/onyx2-ip27.md)), fuel_ip34 (configured by `[fuel]`, see [the Fuel guide](docs/fuel-ip34.md)), tezro_ip53 (configured by `[tezro]`, see [the Tezro guide](docs/tezro-ip53.md)). |
| `machine.cpu` | the machine's first | A family (`r4400`, `r5000`, `r10000`, `r12000`, `r14000`) or a part (`r14000_600`); independent of build features. Indy and `indigo2_ip22`: r4400, r5000; `indigo2_ip28`: r10000; O2: r5000, r10000, r12000; Octane: r10000, r12000, r14000; Origin 200, Origin 2000 and Onyx2: r10000 (`r10000_180`), r12000 (`r12000_270`); Fuel: r14000 (`r14000_500`); Tezro: r16000 (a bare `r16000` is `r16000_700`; `r16000_800`, `r16000_900` and `r16000_1000` are the other parts it ships with). The first listed is the default. |
| `machine.cpus` | `1`; `4` on the Tezro | Processors fitted. 2 on the Octane; see [its guide](docs/octane-ip30-multiprocessor.md). 1, 2 or 4 on the Tezro, each run on its own host thread; one selects the one-processor board with one PIC, two or four the board with two PICs. |

### [origin2000]

Expand All @@ -192,11 +192,50 @@ Origin 2000 settings apply when `machine.profile = "origin2000_ip27"` or `"onyx2
An `[origin2000]` table is written to a saved config only when one of these
keys is set. See the [Origin 2000 guide](docs/origin2000-ip27.md).

### [fuel]

Fuel settings apply when `machine.profile = "fuel_ip34"`.

| Key | Default | Values and behavior |
|---|---|---|
| `flash` | unset | Persistent 16 MiB boot-flash file. Unset, the flash is volatile. |
| `console` | `l1` | `l1`, `ioc3a` or `ioc3b`. Selects the guest console connection. |
| `l1_port` | `8882` | Host TCP port for the L1 console. Used when `console = "l1"`. |
| `l1_log` | unset | Optional serial log path for L1 output when an IOC3 port is selected as console. |
| `ps2_input` | `true` | Fit the IOC3's PS/2 keyboard and mouse and feed them host input. |
| `l1_revision` | `1.48.1` | L1 firmware revision as `major.minor.patch`, decimal. The guest reads it with L1 request `0x0005`. |
| `brick_serial` | `EMUN00` | L1 brick serial, at most 37 bytes. The guest reads it with L1 request `0x0004`. The default is a made-up serial, not a real one. |

The machine has one 500 MHz R14000 and 512 MiB of RAM in two 256 MiB
banks, and runs on a serial console. A `[fuel]` table is written to a
saved config only when one of these keys is set. See the
[Fuel guide](docs/fuel-ip34.md).

### [tezro]

Tezro-specific settings apply when `machine.profile = "tezro_ip53"`.

| Key | Default | Values and behavior |
|---|---|---|
| `flash` | unset | Persistent 16 MiB boot-flash file. Unset, the flash is volatile. |
| `console` | `l1` | `l1`, `ioc4_a`, `ioc4_b`, `ioc4_c` or `ioc4_d`. Selects the guest console connection. |
| `l1_port` | `8882` | Host TCP port for the L1 console. |
| `l1_log` | unset | Optional serial log path for L1 output when an IOC4 port is selected as console. |
| `serial_port_c`, `serial_port_d` | `8883`, `8884` | Host TCP ports of IOC4 ports 2 and 3; ports 0 and 1 use `serial_port_a` and `serial_port_b`. |

The machine runs the 700 MHz R16000 (`r16000_700`, the default), or the 800, 900
or 1000 MHz one (`r16000_800`, `r16000_900`, `r16000_1000`, with 4, 8 and 16 MiB
secondary caches; those take four processors). `banks`
takes 512 or 1024 MiB banks from bank 0; left unset, it is the 4 GiB layout of
1024, 1024 and four 512 MiB banks. A `[tezro]` table is written to a saved
config only when one of these keys is set. See the
[Tezro guide](docs/tezro-ip53.md), which lists its limits.

### [graphics]

| Key | Default | Values and behavior |
|---|---|---|
| `graphics.board` | `newport`; `solidimpact` on the Octane | newport, xz, extreme, solidimpact, highimpact, maximpact, v6, v8, v10, v12, none. Extreme is Indigo2 only. The Octane takes only `solidimpact` (SI), `highimpact` (SI with texture option), `maximpact` (MXI), `v6`, `v8`, `v10`, `v12` (the VPro boards, also `vpro:v12` and so on; need an IRIX install with the VPro driver, IRIX 6.5.10 or later and PROM 4.0, or 4.5 for the V10 and V12, which shipped only in the Octane2 and so give the machine the Octane2's Crossbow 1.4 and Bridge revision) or `none` (no board: the machine runs on its serial console, with no window). |
| `graphics.board` | `newport`; `solidimpact` on the Octane | newport, xz, extreme, solidimpact, highimpact, maximpact, v6, v8, v10, v12, none. Extreme is Indigo2 only. The Octane takes only `solidimpact` (SI), `highimpact` (SI with texture option), `maximpact` (MXI), `v6`, `v8`, `v10`, `v12` (the VPro boards, also `vpro:v12` and so on; need an IRIX install with the VPro driver, IRIX 6.5.10 or later and PROM 4.0, or 4.5 for the V10 and V12, which shipped only in the Octane2 and so give the machine the Octane2's Crossbow 1.4 and Bridge revision) or `none` (no board: the machine runs on its serial console, with no window). The Fuel takes `v12` or `v10` in its graphics slot, or `none`, its default. The Tezro takes `v12` at widget 12, or `none`, its default. |
| `graphics.heads` | `1` | 1 or 2; dual-head requires Newport. |
| `graphics.resolution` | `guest` | guest, 1024x768, 1280x960, 1280x1024; presets require Newport. |
| `graphics.threads` | `2` | Worker threads the board's fragment pipeline draws on, at least 1. VPro: the screen tiles' owners, besides its front-end and raster threads; more help on a host with cores to spare. |
Expand Down Expand Up @@ -231,7 +270,7 @@ An explicit non-disk kind takes precedence over the legacy cdrom flag.

| Key | Default | Values and behavior |
|---|---|---|
| `network.mode` | `nat` | nat, pcap, stream or off (no Ethernet; O2 and Octane only). Stream needs `network.stream`. PCAP needs build support and host capture permissions. PCAP works on every Ethernet; stream on every onboard one, not on a DaynaPort. |
| `network.mode` | `nat` | nat, pcap, stream or off (no Ethernet; O2, Octane and Fuel only). Stream needs `network.stream`. PCAP needs build support and host capture permissions. PCAP works on every Ethernet; stream on every onboard one, not on a DaynaPort. |
| `network.stream` | `unset` | `tcp:IP:PORT` or `unix:PATH`: the server of the private segment for `mode = "stream"` (QEMU `-netdev stream` framing). See NETWORKING.md. |
| `network.pcap_interface` | `auto-pick when unset` | Interface name or numeric list index; PCAP only. |
| `network.nfs_pcap_ip` | `unset` | Virtual LAN IP for the built-in NFS responder in PCAP mode. |
Expand Down Expand Up @@ -434,8 +473,8 @@ IP22/IP24 four-bank IRIX 6.5 behavior remains separate from IP28's verified
two-bank 1 GB layout. Extreme requires IP22. All non-Newport boards require
`heads=1` and `resolution="guest"`. IP28 IRIX needs IMPACT; its PROM has an
embedded fallback.
The config validator permits SCSI controller 1 only on IP22, the O2 and the
Octane, the machines with two controllers.
The config validator permits SCSI controller 1 only on IP22, the O2, the
Octane and the Fuel, the machines with two controllers.

Standalone CLI options update the loaded config where supplied; boolean enable
switches do not provide a general way to clear every saved true setting.
Expand Down Expand Up @@ -488,7 +527,7 @@ iris-gui does not parse this standalone option set; use its named-machine UI.
| `--list-net-interfaces` | Print the host network interfaces libpcap can bridge onto, then exit. Requires a build with --features pcap. |
| `--no-scsi-deferred-int` | Disable deferred SCSI status interrupts (default: enabled for OpenBSD/NetBSD compatibility). |
| `--cpu` | Emulated CPU: a family (`r4400`, `r5000`, `r10000`, `r12000`, `r14000`) or a part (`r14000_600`) the machine takes. Overrides `[machine] cpu`. |
| `--graphics` | Graphics board: `newport` (default), `xz`, `extreme`, `solidimpact`, `highimpact`, `maximpact` (or `impact:solid`, `impact:high`, `impact:max`), `v6`, `v8`, `v10`, `v12` (`vpro:v12` and so on, Octane only). |
| `--graphics` | Graphics board: `newport` (default), `xz`, `extreme`, `solidimpact`, `highimpact`, `maximpact` (or `impact:solid`, `impact:high`, `impact:max`), `v6`, `v8`, `v10`, `v12` (`vpro:v12` and so on, Octane; `v10` and `v12` on the Fuel). |
| `--raster` | VPro and IMPACT: `cpu` (default) or `wgpu`, the raster unit on the host GPU (`[graphics] raster`; needs a build with the `wgpu` feature). |
| `--renderer` | What draws the window: `gl` (default) or `wgpu` (`renderer`; needs a build with the `wgpu` feature). |
| `--gdb-port` | Enable GDB stub on the given TCP port (e.g. --gdb-port 1234). Connect with: target remote localhost:<port> |
Expand Down
Loading