Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
03a6c6c
bedrock: add the node I/O, network, crossbar and local-bus blocks
jamesbraid Oct 30, 2026
823fb80
bedrock_pi: add processor control and interrupts
jamesbraid Oct 30, 2026
d6df118
bedrock_flash: add the Fuel boot flash windows
jamesbraid Oct 30, 2026
72651b7
xbridge: add the two-head Fuel PCI host bridge
jamesbraid Oct 30, 2026
755351c
l1: add the Fuel system controller
jamesbraid Oct 30, 2026
2d6f088
ohci: add the Lucent USB host controller and HID boot devices
jamesbraid Oct 30, 2026
901159d
cpu: take code and generation counters from the cache's bus
jamesbraid Oct 30, 2026
21cb05e
fuel: add the serial IP35 machine
jamesbraid Oct 30, 2026
9eb6fa3
odyssey: hold the refused-push test's slice until the test lets go
jamesbraid Oct 30, 2026
6eff27b
odyssey: let a widget-offset machine host the board
jamesbraid Oct 30, 2026
68dd623
ip35: fit the VPro board in the Fuel's graphics slot
jamesbraid Oct 30, 2026
0f8267d
docs: describe the Fuel machine
jamesbraid Oct 30, 2026
8a0c9eb
cpu: carry the R10000 family's uncached attribute through mapped acce…
jamesbraid Oct 30, 2026
30ae76f
bedrock_md: add the Fuel memory controller
jamesbraid Oct 30, 2026
99f25fe
pci: hold a function's header, interrupt and DMA in one PciFunctionState
jamesbraid Nov 7, 2026
d022ddb
mace_pci: drop the touched and probed report
jamesbraid Nov 7, 2026
c7b59bb
pci: add the interrupt combiner
jamesbraid Nov 7, 2026
5d7194a
pci: add the decode table and BAR runs
jamesbraid Nov 7, 2026
44b2a51
pci_host: add ByteOrder and the BAR bus device
jamesbraid Nov 7, 2026
d5181a1
pci: add PciBus
jamesbraid Nov 7, 2026
3fe2816
mace_pci: own the PCI bus
jamesbraid Nov 7, 2026
1a4a578
bridge: own the PCI bus
jamesbraid Nov 7, 2026
c1c111e
bridge: reset a PCI device when Control drops its reset pin
jamesbraid Nov 7, 2026
b210b7b
pci: split the module into config.rs and function.rs
jamesbraid Nov 7, 2026
6c42fbc
aic7880: put the SCSI targets back on load
jamesbraid Nov 7, 2026
939c461
pci: rename PciBusDevice to PciFunction
jamesbraid Nov 7, 2026
6c5f4c8
pci: test that a function's load overwrites a used instance
jamesbraid Nov 7, 2026
c8d49a2
pci: add a 64-bit memory BAR
jamesbraid Nov 7, 2026
603e2af
docs: describe the PCI layer
jamesbraid Nov 7, 2026
ef2072b
bridge: send type 1 configuration cycles through the 0x028000 aperture
jamesbraid Nov 7, 2026
ec26604
pci: read the expansion ROM base register as zero
jamesbraid Nov 7, 2026
7fccb88
pci: log configuration cycles under the pci log module
jamesbraid Nov 7, 2026
ce1ac49
ip30: log Bridge and HEART accesses under the bridge and heart modules
jamesbraid Nov 7, 2026
b3061f3
pci: add a PCI-to-PCI bridge function
jamesbraid Nov 7, 2026
8db9c67
ip30: reach PCI memory through the Bridge's 2 GB window
jamesbraid Nov 7, 2026
d4304d7
docs: bring the PCI notes up to date and add the PCI plan
jamesbraid Nov 7, 2026
76a925f
ppmem: give each CPU a cached view of memory
jamesbraid Nov 8, 2026
56e2a8c
jitv2: compile no page a CPU's cache holds lines in
jamesbraid Nov 8, 2026
e6754c4
cpu: keep valid primary data and secondary lines in the CPU's cached …
jamesbraid Nov 8, 2026
e4a901d
cpu: keep valid primary instruction lines in the CPU's cached view
jamesbraid Nov 8, 2026
66643f9
ip32: retire the POST stack page
jamesbraid Nov 8, 2026
6979525
isp1040: add the dual-channel ISP12160 part
jamesbraid Oct 30, 2026
0519fe4
ppmem: let a machine hold cache lines where no memory is mapped yet
jamesbraid Nov 8, 2026
1c16d9c
ip35: let lines stand in the Fuel CPU's bank slots
jamesbraid Nov 8, 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
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,32 @@ hashes are given where a change is easiest to understand by reading the commit.

## November 2026

### PCI

- The O2's MACE and the Octane's Bridge share one PCI layer (`src/pci/`,
[docs/pci.md](docs/pci.md)): the function table, BAR
decode, interrupt combining, byte order, RST# and a PCI-to-PCI bridge
function (`PciToPciBridge`, not yet fitted to a machine), reached on the
Octane through the Bridge's type 1 configuration aperture. A write that
lowers Octane Bridge reset pin `n` (Control bit `24 + n`) resets PCI device
`n` and logs a warning. Snapshot schema 6: the PCI bus saves its own state,
and older O2 and Octane snapshots are refused. The Octane gains the `pci`
monitor command, and the `pci`, `bridge` and `heart` log modules record
configuration cycles, Bridge register accesses and HEART interrupt vectors
(see [debug.md](debug.md)).
- The Octane's Bridge answers in its widget's 2 GB window at
`0xF_8000_0000`: the first 16 MB is its small window, and from offset
`0x4000_0000` the 32-bit alias of PCI memory, with BARs there mapped
straight to the function as in the device windows. IRIX 6.5.30 reads a
BAR behind a PCI-to-PCI bridge there, which used to be an unmapped access.

### 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 and Tezro's PROMs use 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.
Expand Down Expand Up @@ -444,6 +470,18 @@ where they differed:
- Memory past 4 GB is as fast as the rest: such a machine gets a 16 GB direct
window, and the JIT compiles code anywhere in it.
- A store-conditional on memory outside the window is now atomic with two CPUs.

### SGI Fuel (IP34 board, IP35 software platform)

- **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.

- Added a headless Fuel profile with the 500 MHz R14000, 512 MiB RAM,
Bedrock, dual-head XBridge, IOC3 networking and two-channel ISP12160 SCSI.
The normal interpreter boot reaches the IRIX 6.5.30 root shell with PROM
6.210. See the [Fuel guide](docs/fuel-ip34.md).

### PCI configuration

- A PCI function can describe its own writable header fields and
Expand Down
8 changes: 8 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,14 @@ libc = "0.2"
# and CI socket's JSON replies.
serde_json = "1.0"

# Model checking of the PCI interrupt combiner's handshake: built only with
# RUSTFLAGS="--cfg loom" (src/pci/intx.rs, `cargo test --lib intx::loom_tests`).
[target.'cfg(loom)'.dev-dependencies]
loom = "0.7"

[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ["cfg(loom)"] }

[profile.release]
lto = "fat"
codegen-units = 1
Expand Down
33 changes: 26 additions & 7 deletions FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@ 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.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 (see [the Fuel guide](docs/fuel-ip34.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`). The first listed is the default. |
| `machine.cpus` | `1` | Processors fitted. 2 only on the Octane; see [its guide](docs/octane-ip30-multiprocessor.md). |

### [origin2000]
Expand All @@ -192,11 +192,30 @@ 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-specific 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. |
| `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 marked synthetic serial, not a real one. |

The machine uses one 500 MHz R14000 and fixed 512 MiB RAM in two 256 MiB
banks. Its IOC3 has no keyboard or mouse ports, so it runs on a serial
console. A `[fuel]` table is written to a saved config only when one of
these keys is set. The sample configuration and supported PROM inputs are in the
[Fuel guide](docs/fuel-ip34.md).

### [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. |
| `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 +250,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 @@ -395,8 +414,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, Octane
and Fuel. These machines have 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 @@ -449,7 +468,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`/`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
Loading