Skip to content

5. Reverse engineering, from the open sources

The adapters failed because they started at the wrong end. The turn came from reading. Sophos publishes the source code of the open-source parts of its firmware, and the software on the coprocessor is built on open-source components. So the reverse engineering proper began there: with the open files and the vendors' own sources, read until the hardware could be described from them.

What there was to read

material what it gave
Sophos's open-source release for each firmware version - for the XGS 136's family, 794 files including Marvell's pcie_ep_armada; for the XGS 3300's, the pcie_ep_octeontx SDK, four archives deep inside the release disc the protocol across the PCIe link: register offsets, command numbers, descriptor layouts
Marvell's UMSD switch driver, in the same release the 88E6193X switch: its registers and its forwarding table
Sophos's NetAgent sources the network agent: its messages and attributes
the vendor's platform data for each assembly the port maps: which label is which switch port, which PHY, which bus
the coprocessor's root filesystem and its fast path, usfp, with symbols structure layouts and names, from the debug information left in it
the vendor's host tools the reset line's commands and the per-board masks, by disassembly
the appliances' own boot logs confirmation that a reading was right

A story about reading literally

Reading is not the same as believing what you read. The front panel of the XGS 3300 taught that best - later, in the repository's second week.

The front panel's micro-controller, a GIFAR bridge

The vendor's own script sets the panel's serial line to 2400 baud, so 2400 is what was tried. At 2400 the display filled with scattered x-with-a-bar glyphs - HD44780 character 0xF8, which is exactly what bytes look like when they arrive at a quarter of the receiver's rate: the stretched start bit holds the first three sampled bits at zero, and the next stretched bit fills the other five with ones.

The script was right about the command and wrong about the effect. stty ispeed 2400 sets only the input speed, and the port is a 16450 with a single divisor, so on the vendor's own system that command never moved the line at all: it stayed at Linux's default, 9600. At 9600 the text was legible, and on 2026-10-02 two correct lines were read off the panel. Reading the vendor's script literally had kept that question open for a week.

The boundary I keep

The project is BSD-2-Clause, and almost none of it could have been written without material licensed differently. So it keeps one rule about that material, and says so where anyone can check:

Facts are transcribed. Expression is not copied.

A register offset, a command number or a field width is a fact about a piece of hardware; the code that acts on it is written from nothing. Each family has its own account of exactly what was read and from where: ARMADA and OCTEON TX.


Previous: 4. The first XGS 3300 · Next: 6. A firmware of its own, and a board of many chips

Discussion

The discussion of this page is held in the project's GitHub Discussions. Showing it here loads giscus from giscus.app and GitHub, and writing in it needs a GitHub account - what that means.