-
Notifications
You must be signed in to change notification settings - Fork 0
Reference Veneer patch catalogue
Updated 15 September 2026. Three sites were missing from this page and are now in
tools/mkveneer.py, which applies every patch below to the file rather than to memory:
VA shipped patched why 0x514E00x480006050x60000000claimSYSTEM PARAMETER BLOCK — skip the failure path (ledger row 1)0x51E3C0x4BFFFCA90x60000000claimRESTART BLOCK — likewise0x53DB00x554AA0160x39400000li r10,0in the boot-path derivation; CD-only, paired with the\PPC\SETUPLDRstring at0x5CD30
mkveneer.pyverifies each site's shipped word before writing and refuses an image these addresses were not derived from — the check a distributable patcher needs.
This page owns: every firmware patch this project applies, what it fixes, and — critically — which media it is correct for.
All of these are applied to VENEER.EXE. They used to be poked into memory at load time;
since 15 September mkveneer.py writes them into a copy of the file instead, which is what
lets a cold boot need no pokes at all. Either way the patches are ours and the veneer is the
user's: nothing here is redistributed.
⚠ Addresses are specific to one binary. They are image virtual addresses in the
VENEER.EXEfrom the OEM 000-48303 CD, loaded at base0x50000. A different veneer build would differ, and nothing checks.
Two address spaces appear below, and confusing them is a known time sink:
| Image address | what the disassembler shows, what documentation cites |
| Poke address | image address ^ 4 for a word, ^ 7 for a byte — the little-endian munge |
So the patch at image 0x54748 is written machine.memory.poke.l 0x5474c. Both are correct.
→ Little-endian PowerPC
| # | Image address | What | Applies to |
|---|---|---|---|
| 1 | (inherited) | Two nops over the claim failure paths |
always |
| 2 |
0x52254, 0x52258
|
OFClose return-value slot |
always |
| 3 |
0x5D0C0, 0x5E168
|
the partition(1) and :0 strings |
CD-era; restored for disk |
| 4 | 0x54748 |
VrOpen's partition branch → nop
|
CD only |
| 5 |
0x5F420 (11 bytes) |
the SCSI model string → NCR,825A
|
always |
| — |
0x5CD30–0x5CD4F
|
the boot-file path buffer | disk boots; see the warning |
| — | 0x60C0C |
VrDebug tracing mask |
optional |
| — |
0x5C228+ |
the injected ARC environment | disk boots |
Inherited from the community thread that first got this far. The veneer's memory-claim failure paths abort where they need not. Needs a story for real hardware, since nobody here derived them.
li r9, 0
stw r9, 8(r3)
OFClose does not give Open Firmware's client interface an nret slot, so every close fails.
Twelve instances leak and the CD stops opening — with no message, looking exactly like a media
fault. A genuine bug fix, applied by patching.
Blanked during CD-era work; restored for a disk boot. They are string constants the veneer appends when building Open Firmware paths.
nop over the branch that takes the "a partition was named" path, forcing raw opens down the
whole-device route.
Correct for the CD, where Apple's disk-label answers :N on an ISO with the root directory
as a file — so NT's checksum of "sector 0" reads a directory record and the boot device is
declared inaccessible.
Catastrophic for a hard disk, where :N is the only thing that gives partition-relative
sectors. With this applied, every filesystem recogniser fails, and the loader reports an error
about disk partition tables that has nothing to do with partition tables.
This single row is the best argument for keeping a ledger at all. → ledger row 4
NCR,53C810 → NCR,825A, so Setup's mass-storage detection selects symc810.sys for the
53C825As. Without it the controllers are reported as UNKNOWN SCSI, nothing binds, and the
machine has no disk.
A TXTSETUP [Map.SCSI] addition on an OEM disk would be cleaner.
The shipped buffer holds \os\winnt\osloader.exe — 22 characters — and the argv table's
slot-0 name string 'OsLoader' begins immediately after it at 0x5CD48.
A 24-character path written in place erases that name. The veneer then emits the loader's path as a bare argv entry, the loader's lookup is by name, and it dies with "The 'osloader' parameter does not point to a valid file" — with the value present and correct the whole time.
mkbootscript.py relocates the path into .text tail padding and repoints the table instead.
Never by hand. tools/mkbootscript.py
generates them, and reads the two restored ranges out of your VENEER.EXE — which is how
the tool is publishable without carrying Microsoft code.
A checkpoint freezes whatever patches were applied when it was taken, so a rebuilt checkpoint silently loses any patch not in the script. That has cost a day once already. → Checkpoints and deltas §4
A replacement for the veneer — an ARC implementation of our own, or fixes accepted upstream. Until then, "type these into Open Firmware" is not an answer a published project can stand on.
→ The ledger of workarounds group 1
Corrections welcome — this wiki is edited directly, so nothing here has had a review. Repository · STORY.md · GPL-2.0-only
Start here
Theory
- Why NT on a Power Mac is hard
- Open Firmware
- ARC
- The veneer
- The NT boot chain
- The HAL contract
- The NT PowerPC ABI
- Little-endian PowerPC
- How Setup chooses a HAL
- The NT video stack
Machines
Emulator
- Getting Granny Smith
- Media you must supply
- Building the HAL
- The boot floppy
- Preparing disks
- Running text-mode Setup
- Capturing the installed image
- Booting the installed system
- Iterating on the HAL
- Checkpoints and deltas
- Making an OEM CD (retired)
Real hardware
Debugging
- The emulator shell
- Reading NT binaries
- Decoding a bugcheck
- When your instrumentation lies
- Debugging recipes
Reference
- HAL exports
- ARC environment variables
- The veneer's VrDebug bitmask
- Veneer patch catalogue
- Address and interrupt map
- Error codes seen
Project