CPU Pipeline Timing and Cache Isolation: Difference between revisions
| Revision as of 05:27, 23 October 2026 RemmyLee (GTE Lighting Input Latency: split the cross-link sentence) | Revision as of 05:40, 23 October 2026 RemmyLee (Hardware tests: 15 more test pages (CPU, DMA, SPU, GPU, MDEC, CD-ROM, bus), each with See also links to the pages that measure the same parts) | ||
| Line 1: | Line 1: | ||
| + | --- | ||
| + | title: CPU Pipeline Timing and Cache Isolation | ||
| + | type: test | ||
| + | summary: Measures CPU store and load sequences, uncached instruction fetch, I/O register upper halves, an interrupt taken on a GTE command, and isolated cache reads. | ||
| + | category: Hardware tests | ||
| + | info: Machine = SCPH-5501 | ||
| + | info: Program = followup15, followup15g | ||
| + | --- | ||
| + | |||
| + | ## Overview | ||
| + | |||
| + | Each timing row runs 100 turns of a short sequence built in RAM and run warm from the instruction cache, or from KSEG1 where the row says so. Root counter 2 counts system clock cycles for the whole call, the setup included, and no DMA runs. The other groups read register values: the upper half of RAM_SIZE and I_MASK after a store, two root counter 1 reads in a row, the exception PC when an interrupt lands on RTPS, and loads with the cache isolated.[^run] | ||
| + | |||
| + | Table: Groups | ||
| + | |||
| + | | Tag | Rows | | ||
| + | | --- | --- | | ||
| + | | SNL | A RAM store, n instructions, a RAM or scratchpad load | | ||
| + | | IOA | An I/O register load, n NOPs, a second load | | ||
| + | | LDL | A RAM load, p NOPs, one access on the cycle the data lands | | ||
| + | | BKB | Two RAM loads with a backward branch path between them | | ||
| + | | KLU | A load and a use of its value, run from KSEG1 | | ||
| + | | KSJ | Two stores, k NOPs and a jump or branch, run from KSEG1 | | ||
| + | | UFP | A store that zeroes root counter 2, n NOPs, a read of the counter | | ||
| + | | BBL | 2 to 6 loads back to back | | ||
| + | | MFL | The upper half of RAM_SIZE after an I_MASK store before a cache line fill | | ||
| + | | IMU | The upper half of I_MASK after a store and one other access | | ||
| + | | TIO | Two root counter 1 loads back to back | | ||
| + | | PLC | GP0 stores and polling loops | | ||
| + | | IGT | A root counter 2 interrupt at target n onto a cached RTPS | | ||
| + | | IS2 | Isolated loads after a routine has run from the cache | | ||
| + | | IS4 | An isolated load and store from cached code | | ||
| + | |||
| + | The second program, followup15g, repeats IGT with root counter 2 read before the RTPS and at the handler's entry, and then with a NOP in place of the RTPS.[^g] | ||
| + | |||
| + | See also: | ||
| + | |||
| + | - [Store and Load Sequences](/tests/store-load-sequences/) | ||
| + | - [CPU Load and Store Timing](/tests/cpu-loads/) | ||
| + | - [Load Landing and Device Loads](/tests/load-landing/) | ||
| + | - [CPU Bus Gaps and Cache Isolation](/tests/cpu-bus-gaps/) | ||
| + | - [Write Queue and GTE Interrupts](/tests/write-queue/) | ||
| + | - [GTE Timing during CPU Stalls](/tests/gte-cpu-stalls/) | ||
| + | |||
| + | ## Results | ||
| + | |||
| + | ### Stores and Loads | ||
| + | |||
| + | A RAM load placed 3 to 5 instructions after a RAM store took 1,475 to 1,480 cycles for 100 turns. From 6 instructions on, each further NOP added about 100 cycles, and SB, SH and SW gave the same times. A scratchpad load after the store took 955 cycles at n 3, and every NOP added 100. Through a taken backward BEQ path in place of the NOPs the rise came one instruction earlier: 1,478 to 1,480 cycles at n 4 and 1,562 at n 5.[^run] | ||
| + | |||
| + | Table: Cycles for 100 turns of a store and a load n instructions later | ||
| + | |||
| + | | n | RAM load | Scratchpad load | | ||
| + | | --- | --- | --- | | ||
| + | | 3 | 1,475 | 955 | | ||
| + | | 5 | 1,478 | 1,155 | | ||
| + | | 6 | 1,567 | 1,259 | | ||
| + | | 7 | 1,665 | 1,355 | | ||
| + | | 9 | 1,875 | 1,555 | | ||
| + | |||
| + | A load of I_STAT, GPUSTAT, DPCR or root counter 2 followed at once by a second load of the same register took 1,155 or 1,156 cycles. With 1 to 3 NOPs between them the time rose to 1,355 cycles. With 4 NOPs it rose to 1,455 to 1,459. The same register made no difference.[^run] | ||
| + | |||
| + | When the second load went to RAM or the scratchpad, the time rose in the same steps from a different start. With a RAM load as the second load the rows took 1,276 cycles with no NOP between the loads. They took 1,469 to 1,480 with 1 to 3 NOPs and 1,558 to 1,572 with 4. With a scratchpad load as the second load the rows took 955 cycles with no NOP and 1,155 to 1,160 with 1 to 3 NOPs. They took 1,255 with 4.[^run] | ||
| + | |||
| + | In the LDL rows a RAM load is followed by p NOPs and one access. A store or a scratchpad load as that access took about 1,478 cycles at p 4 and 5, and about 100 more for each NOP after that. A second RAM load took 1,676 to 1,683 at p 4 and 5 and 1,957 at p 8, and an I_STAT load took 1,655 to 1,659 and 1,955.[^run] | ||
| + | |||
| + | Two to six RAM loads back to back took about 1,480, 2,088, 2,698, 3,320 and 3,916 cycles. Each further load therefore added about 6 cycles to a turn. LW, LBU and LH gave the same times, whether the loads read one word, words 40h apart or a new word on every turn.[^run] | ||
| + | |||
| + | ### Branches | ||
| + | |||
| + | A RAM load, 4 NOPs and a second RAM load took 1,681 cycles. With a taken backward BEQ path between the loads the row took 1,763, and 1 to 3 NOPs before the second load brought it to 1,765, 1,882 and 1,962. A BNE that is not taken in the same place gave 1,683. A two-turn inner loop of k instructions and a backward BNE took 1,555, 1,755 and 1,955 cycles for k 1 to 3.[^run] | ||
| + | |||
| + | ### Uncached Code | ||
| + | |||
| + | Run from KSEG1, a load and an ADDU of its value with no NOP between them took 3,858 cycles for a RAM load, 3,535 for I_STAT and 3,252 for the scratchpad. For the scratchpad load each NOP added about 610 cycles, or 6 cycles a turn. For the RAM and I_STAT loads the second NOP added only 420 and 325 cycles. Two stores, k NOPs and a jump took 5,826 to 5,832 cycles at k 0 and about 8,250 at k 4. J, JR, JAL, a taken BEQ and a BEQ that is not taken all gave the same time within 20 cycles.[^run] | ||
| + | |||
| + | The UFP rows store zero to the mode of root counter 2, which also zeroes its count, and read the count n NOPs later. From the cache the count read 0 at n 0 and n minus 1 from n 1 on. From KSEG1 the count read 4 plus 6 for each NOP: 4, 10, 16 and so on up to 52 at n 8. A few reads were 4 to 6 higher.[^run] | ||
| + | |||
| + | Table: Root counter 2 count n NOPs after the store | ||
| + | |||
| + | | n | KSEG1 | Cache | | ||
| + | | --- | --- | --- | | ||
| + | | 0 | 4 | 0 | | ||
| + | | 1 | 10 | 0 | | ||
| + | | 2 | 16 | 1 | | ||
| + | | 4 | 28 | 3 | | ||
| + | | 8 | 52 | 7 | | ||
| + | |||
| + | ### GP0 Stores and Polls | ||
| + | |||
| + | 64 stores to GP0 back to back took 6,453 cycles for 50 turns, and the empty loop took 205. Each store therefore took about 1.95 cycles. 8, 16 and 32 stores each followed by a NOP took 1,955, 3,555 and 6,760 cycles for 100 turns, and the empty loop took 355. Each store and its NOP therefore took 2 cycles. A GPUSTAT poll turn took 1,357 cycles for 100 turns, and a root counter 2 poll turn 1,255.[^run] | ||
| + | |||
| + | ### Register Upper Halves | ||
| + | |||
| + | RAM_SIZE (1F801060h) was read with LW after an I_MASK store. The store sits k words before line B, the cache line that holds the load, and at k 0 it is line B's first word. With no store the upper half read 3C00h cold, the upper half of line B's last word, and 8011h warm. At k 0, 1 and 2 it read 0000h cold, and warm it read the upper half of the stored value, AFA2h or ABCDh. At k 3 and 4 it read as with no store. All six runs of each row gave the same value.[^run] | ||
| + | |||
| + | I_MASK was read after an SW of 12345678h and one other access. With the access to the BIOS, GPUSTAT, the scratchpad or I_STAT, the upper half read 0000h cold, and with 4 NOPs or a root counter 2 read it read 03E0h cold. Warm it read 6E6Eh or 7F7Fh when a RAM word of 6E6E1111h or 7F7F2222h was read before the store, and 3C03h otherwise. The value 1234h was never read. An LBU of the top byte read the high byte of the same halfword.[^run] | ||
| + | |||
| + | Root counter 1 counted system clock cycles in the TIO rows. Two loads of it back to back read 4 apart warm wherever the first load sat in its cache line. Cold, they read 4 apart at words 0, 2 and 3 and 11 apart at word 1.[^run] | ||
| + | |||
| + | ### Interrupt on RTPS | ||
| + | |||
| + | A root counter 2 interrupt at target n was taken by a handler that returns to EPC. For n 20 to 30 EPC pointed 11 to 1 words before the RTPS, and SXY2 in the handler held its old value. At n 31 EPC pointed at the RTPS itself, the word at EPC read 4A180001h, SXY2 in the handler already held the new value and the screen XY FIFO had shifted twice after the return. RTPS had therefore run once before the exception and again after the return. From n 32 on EPC pointed past the RTPS, SXY2 held the new value and the FIFO shifted once. FLAG read 80020000h in every row.[^run] | ||
| + | |||
| + | With root counter 2 read before the RTPS, EPC pointed one word before the RTPS for targets 30 to 34 and at the RTPS at target 35. The FIFO again shifted twice at that target and once at every other. With a NOP in place of the RTPS the same targets gave the same EPC offsets, and the FIFO did not shift.[^g] | ||
| + | |||
| + | ### Cache Isolation | ||
| + | |||
| + | After a routine of LUI $0 words ran from the cache, an isolated load of its word 0 and word 5 read the code words 3C00A000h and 3C00A005h. A word 30h on that never ran read 00000000h. An address 1000h on, in the same cache line with another tag, read 3C00A000h, while memory there held 00000000h. A data word read 00000000h isolated where memory held 11111111h. Both passes gave the same values.[^run] | ||
| + | |||
| + | The program ran an isolated load, store and load from cached code, and the console did not hang. The cache word read 00000000h before, the isolated load read 7FEF0000h, and memory held 11111111h after.[^run] | ||
| + | |||
| + | ## Runs | ||
| + | |||
| + | ### 3 October 2026 | ||
| + | |||
| + | [00RUN.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/00RUN.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 00 RUN | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | 15 tests | ||
| + | A chain program, linked at 80100000 | ||
| + | Saved on the card in slot 2, from image 1 | ||
| + | COP0 at start: BPC 00000000 BDA 00000000 TAR BFC02BAC DCIC 00000000 BadVaddr 00000480 BDAM 00000000 | ||
| + | BPCM 00000000 SR 00000000 Cause 00000020 EPC 8002178C PRId 00000002 | ||
| + | ``` | ||
| + | |||
| + | [01SNL.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/01SNL.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 01 SNL F15 STORE N LOAD | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | 100 turns of a RAM store, n instructions, a load, nop (q14; cpu6 01SLS: sw, 5-8 NOPs, | ||
| + | lw 1484 1575 1667 1774). Path: beq over, n-4 NOPs, beq back to the lw (cpu4 03BRK). | ||
| + | sw, n NOPs, RAM lw (n 3-9): 1475 1479 1478 1567 1665 1764 1875 | ||
| + | sh, n NOPs, RAM lw (n 3-9): 1475 1479 1480 1562 1665 1763 1872 | ||
| + | sb, n NOPs, RAM lw (n 3-9): 1476 1478 1480 1571 1665 1763 1872 | ||
| + | sw, path, RAM lw (n 4-9): 1478 1562 1662 1763 1873 1960 | ||
| + | sh, path, RAM lw (n 4-9): 1479 1562 1666 1763 1877 1957 | ||
| + | sb, path, RAM lw (n 4-9): 1480 1562 1666 1760 1875 1957 | ||
| + | sw, n NOPs, scratchpad lw (n 3-9): 955 1055 1155 1259 1355 1455 1555 | ||
| + | sh, n NOPs, scratchpad lw (n 3-9): 955 1055 1157 1255 1355 1455 1555 | ||
| + | sb, n NOPs, scratchpad lw (n 3-9): 955 1055 1155 1259 1355 1455 1555 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [02IOA.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/02IOA.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 02 IOA F15 AFTER IO LOAD | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | 100 turns of an IO lw, n NOPs (0 to 4), a second lw, nop (q15; cpu4 01IOP: lw, 4 NOPs, | ||
| + | lw 1455 1450 1449 1449; cpu3 01LLP: I_STAT lw, lw 1055). | ||
| + | I_STAT lw, n NOPs, the same lw: 1155 1355 1355 1355 1455 | ||
| + | I_STAT lw, n NOPs, RAM lw: 1276 1480 1478 1474 1572 | ||
| + | I_STAT lw, n NOPs, scratchpad lw: 955 1155 1155 1155 1255 | ||
| + | GPUSTAT lw, n NOPs, the same lw: 1156 1355 1355 1355 1459 | ||
| + | GPUSTAT lw, n NOPs, RAM lw: 1276 1471 1479 1469 1558 | ||
| + | GPUSTAT lw, n NOPs, scratchpad lw: 955 1155 1160 1155 1255 | ||
| + | DPCR lw, n NOPs, the same lw: 1155 1355 1361 1355 1455 | ||
| + | DPCR lw, n NOPs, RAM lw: 1276 1471 1479 1469 1558 | ||
| + | DPCR lw, n NOPs, scratchpad lw: 955 1155 1155 1155 1255 | ||
| + | timer 2 lw, n NOPs, the same lw: 1156 1355 1355 1355 1459 | ||
| + | timer 2 lw, n NOPs, RAM lw: 1276 1471 1479 1469 1558 | ||
| + | timer 2 lw, n NOPs, scratchpad lw: 955 1155 1160 1155 1255 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [03LDL.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/03LDL.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 03 LDL F15 LOAD LANDS | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | 100 turns of a RAM lw, p NOPs (4 to 8), one access, 2 NOPs (q16; chain m LND p 6 sw | ||
| + | 1567, p 6 and 7 lw 1762 1874). | ||
| + | RAM sw: 1478 1477 1562 1661 1759 | ||
| + | RAM sh: 1471 1477 1562 1655 1761 | ||
| + | RAM sb: 1478 1476 1558 1655 1761 | ||
| + | scratchpad sw: 1479 1479 1559 1655 1760 | ||
| + | RAM lw: 1683 1676 1767 1881 1957 | ||
| + | scratchpad lw: 1479 1479 1562 1659 1757 | ||
| + | I_STAT lw: 1655 1659 1758 1869 1955 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [04BKB.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/04BKB.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 04 BKB F15 BACK BEQ | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | 100 turns, RAM loads (q17; cpu4 03BRK: lw, 4 NOPs, lw, nop 1685; backward beq path 1783; | ||
| + | chain m BBR k 1-3 within 10 of the emulator). | ||
| + | lw, 4 NOPs, lw, nop: 1681 | ||
| + | 03BRK backward beq path, then 1, 2, 3 NOPs before the second lw: 1763 1765 1882 1962 | ||
| + | lw, 2 NOPs, bne $0,$0 back (not taken), nop, lw, nop: 1683 | ||
| + | chain m BBR (followup10.c:252-268) k 1, 2, 3: 1555 1755 1955 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [05KLU.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/05KLU.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 05 KLU F15 KSEG1 USE | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | 100 turns from KSEG1 of a lw, n NOPs (0 to 3), addu of it (q18; chain m KST RAM lw, nop, | ||
| + | use 4453, I_STAT 4135). | ||
| + | RAM lw, n NOPs, addu: 3858 4465 4885 5490 | ||
| + | I_STAT lw, n NOPs, addu: 3535 4135 4460 5068 | ||
| + | scratchpad lw, n NOPs, addu: 3252 3853 4466 5078 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [06KSJ.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/06KSJ.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 06 KSJ F15 KSEG1 JUMP | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | 100 turns from KSEG1 of sw, sw, k NOPs (0 to 4), then a jump or branch over one word (q19; | ||
| + | chain m KST: sw, sw, 1 NOP, taken beq 6445); RAM lw, RAM sw, k NOPs (0 to 2). | ||
| + | sw, sw, k NOPs, j: 5826 6462 7035 7652 8246 | ||
| + | sw, sw, k NOPs, jr: 5827 6459 7036 7656 8255 | ||
| + | sw, sw, k NOPs, jal: 5827 6459 7040 7652 8254 | ||
| + | sw, sw, k NOPs, taken beq: 5828 6471 7045 7655 8261 | ||
| + | sw, sw, k NOPs, beq not taken: 5832 6463 7051 7658 8260 | ||
| + | RAM lw, RAM sw, k NOPs: 4266 4885 5494 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [07UFP.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/07UFP.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 07 UFP F15 FETCH PUSH | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | sh zero to timer 2's mode (it zeroes the count), n NOPs (0 to 8), lhu of the count: from | ||
| + | KSEG1, then from the cache (warm), 16 runs each (q20). | ||
| + | n 0 KSEG1: 4 4 4 4 4 8 4 4 4 4 4 4 4 4 4 4 | ||
| + | n 0 cached: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
| + | n 1 KSEG1: 10 10 10 10 10 10 10 10 14 10 10 10 10 10 10 10 | ||
| + | n 1 cached: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
| + | n 2 KSEG1: 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 | ||
| + | n 2 cached: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | ||
| + | n 3 KSEG1: 22 27 22 22 22 22 22 22 22 22 22 22 26 22 22 22 | ||
| + | n 3 cached: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | ||
| + | n 4 KSEG1: 28 28 28 28 28 28 28 28 28 32 28 28 28 28 28 28 | ||
| + | n 4 cached: 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 | ||
| + | n 5 KSEG1: 34 34 38 34 34 38 34 34 39 34 34 34 34 34 34 34 | ||
| + | n 5 cached: 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 | ||
| + | n 6 KSEG1: 40 40 40 45 40 40 45 40 40 45 40 40 45 40 40 45 | ||
| + | n 6 cached: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 | ||
| + | n 7 KSEG1: 46 46 46 50 46 46 50 46 46 46 46 51 46 46 50 46 | ||
| + | n 7 cached: 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 | ||
| + | n 8 KSEG1: 52 52 58 52 52 52 52 56 52 52 52 52 57 52 52 52 | ||
| + | n 8 cached: 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [08BBL.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/08BBL.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 08 BBL F15 BACK TO BACK | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | 100 turns of k RAM loads back to back (k 2 to 6), then 1 NOP (q21; chain k LLN 3 and 4 lw | ||
| + | 2068 and 2689). Walking: word i of the turn, the base 4k on each turn. | ||
| + | lw, one word: 1481 2086 2695 3323 3916 | ||
| + | lw, words 40h apart: 1480 2088 2695 3320 3914 | ||
| + | lw, walking words: 1473 2086 2699 3324 3916 | ||
| + | lbu, one word: 1480 2086 2701 3320 3921 | ||
| + | lbu, words 40h apart: 1478 2088 2699 3320 3918 | ||
| + | lbu, walking words: 1481 2088 2704 3324 3923 | ||
| + | lh, one word: 1480 2088 2697 3320 3914 | ||
| + | lh, words 40h apart: 1472 2089 2701 3320 3922 | ||
| + | lh, walking words: 1481 2088 2704 3318 3917 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [09MFL.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/09MFL.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 09 MFL F15 MASK FILL | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | RAM_SIZE's upper half read after an I_MASK store k words before line B (k 0 to 4; cpu 07MIR: | ||
| + | 0000 at 1 and 2, 3C00 at 3). Six runs cold (FlushCache) / warm; line B 8C82 2400 3400 3C00. | ||
| + | no store: cold 3C00 3C00 3C00 3C00 3C00 3C00 / warm 8011 8011 8011 8011 8011 8011 | ||
| + | I_MASK AFA20009, k 0: cold 0000 0000 0000 0000 0000 0000 / warm AFA2 AFA2 AFA2 AFA2 AFA2 AFA2 | ||
| + | I_MASK AFA20009, k 1: cold 0000 0000 0000 0000 0000 0000 / warm AFA2 AFA2 AFA2 AFA2 AFA2 AFA2 | ||
| + | I_MASK AFA20009, k 2: cold 0000 0000 0000 0000 0000 0000 / warm AFA2 AFA2 AFA2 AFA2 AFA2 AFA2 | ||
| + | I_MASK AFA20009, k 3: cold 3C00 3C00 3C00 3C00 3C00 3C00 / warm 8011 8011 8011 8011 8011 8011 | ||
| + | I_MASK AFA20009, k 4: cold 3C00 3C00 3C00 3C00 3C00 3C00 / warm 8011 8011 8011 8011 8011 8011 | ||
| + | I_MASK ABCD0009, k 0: cold 0000 0000 0000 0000 0000 0000 / warm ABCD ABCD ABCD ABCD ABCD ABCD | ||
| + | I_MASK ABCD0009, k 1: cold 0000 0000 0000 0000 0000 0000 / warm ABCD ABCD ABCD ABCD ABCD ABCD | ||
| + | I_MASK ABCD0009, k 2: cold 0000 0000 0000 0000 0000 0000 / warm ABCD ABCD ABCD ABCD ABCD ABCD | ||
| + | I_MASK ABCD0009, k 3: cold 3C00 3C00 3C00 3C00 3C00 3C00 / warm 8011 8011 8011 8011 8011 8011 | ||
| + | I_MASK ABCD0009, k 4: cold 3C00 3C00 3C00 3C00 3C00 3C00 / warm 8011 8011 8011 8011 8011 8011 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [10IMU.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/10IMU.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 10 IMU F15 IMASK UPPER | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | I_MASK after sw 12345678h, an access, the read: its upper half (lbu+3 its top byte), cold / | ||
| + | warm (02SIM warm read 27BD). v0 none, v1 RAM 6E6E1111h read first, v2 7F7F2222h, v3 27BD0000h. | ||
| + | f BIOS, lw: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | f BIOS, lhu+2: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | f BIOS, lbu+3: v0 0000/003C v1 0000/006E v2 0000/007F v3 0000/003C | ||
| + | g GPUSTAT, lw: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | g GPUSTAT, lhu+2: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | g GPUSTAT, lbu+3: v0 0000/003C v1 0000/006E v2 0000/007F v3 0000/003C | ||
| + | h scratchpad, lw: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | h scratchpad, lhu+2: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | h scratchpad, lbu+3: v0 0000/003C v1 0000/006E v2 0000/007F v3 0000/003C | ||
| + | i I_STAT, lw: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | i I_STAT, lhu+2: v0 0000/3C03 v1 0000/6E6E v2 0000/7F7F v3 0000/3C03 | ||
| + | i I_STAT, lbu+3: v0 0000/003C v1 0000/006E v2 0000/007F v3 0000/003C | ||
| + | k 4 NOPs, lw: v0 03E0/3C03 v1 03E0/6E6E v2 03E0/7F7F v3 03E0/3C03 | ||
| + | k 4 NOPs, lhu+2: v0 03E0/3C03 v1 03E0/6E6E v2 03E0/7F7F v3 03E0/3C03 | ||
| + | k 4 NOPs, lbu+3: v0 0003/003C v1 0003/006E v2 0003/007F v3 0003/003C | ||
| + | l timer 2, lw: v0 03E0/3C03 v1 03E0/6E6E v2 03E0/7F7F v3 03E0/3C03 | ||
| + | l timer 2, lhu+2: v0 03E0/3C03 v1 03E0/6E6E v2 03E0/7F7F v3 03E0/3C03 | ||
| + | l timer 2, lbu+3: v0 0003/003C v1 0003/006E v2 0003/007F v3 0003/003C | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [11TIO.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/11TIO.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 11 TIO F15 TWO IO LOADS | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | Two timer 1 lw back to back (timer 1 at the system clock), the first at word w of a cache | ||
| + | line: the two counts read, cold (FlushCache) / warm, three runs (q24; 07JBD 4/4/11/4). | ||
| + | word 0: cold 16290 16294 58648 58652 35471 35475 / warm 43518 43522 47754 47758 52007 52011 | ||
| + | word 1: cold 7586 7597 49499 49510 26328 26339 / warm 34385 34389 38620 38624 42864 42868 | ||
| + | word 2: cold 63998 64002 40828 40832 17662 17666 / warm 25715 25719 29960 29964 34208 34212 | ||
| + | word 3: cold 55344 55348 32169 32173 9010 9014 / warm 16603 16607 20852 20856 25110 25114 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [12PLC.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/12PLC.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 12 PLC F15 POLL COSTS | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | GP0(00h) stores (a NOP, gpu/i-o-ports-dma-channels-commands-vram.txt:33) and poll turns | ||
| + | (q25; console 12.4 a GP0 store, poll 108, timer poll turn 112). | ||
| + | 50 turns: nothing 205; 64 GP0 sw back to back 6453 | ||
| + | 100 turns: nothing 355; 8 GP0 sw, a NOP after each 1955; 16 GP0 sw, a NOP after each 3555; 32 GP0 sw, a NOP after each 6760 | ||
| + | 100 turns: GPUSTAT lw, nop, and bit 28, beq not taken, nop, nop 1357 | ||
| + | 100 turns: timer 2 lhu, nop, bne taken over one, nop 1255 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [13IGT.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/13IGT.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 13 IGT F15 IRQ ON GTE | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | Timer 2 IRQ at target n (mode 0010h: IRQ at target, one-shot, pulse, timers.txt:26-30) onto | ||
| + | a cached RTPS 40 NOPs after the mode write, taken by our handler, which returns to EPC. | ||
| + | Kernel's 80000080h: 3C1A0000 275A0C80 03400008 00000000 | ||
| + | n: EPC from RTPS in words / word at EPC / SXY2 and FLAG in the handler / timer 2 there / | ||
| + | fifo shifts after the return (0, 1, 2; 9 other). SXY2 old 00030003, new about 00CC0199. | ||
| + | no IRQ: SXY 00020002 00030003 006300C7 FLAG 80020000 | ||
| + | 20: -11 00000000 00030003 80020000 199 1 | ||
| + | 21: -10 00000000 00030003 80020000 195 1 | ||
| + | 22: -9 00000000 00030003 80020000 191 1 | ||
| + | 23: -8 00000000 00030003 80020000 196 1 | ||
| + | 24: -7 00000000 00030003 80020000 193 1 | ||
| + | 25: -6 00000000 00030003 80020000 198 1 | ||
| + | 26: -5 00000000 00030003 80020000 195 1 | ||
| + | 27: -4 00000000 00030003 80020000 202 1 | ||
| + | 28: -3 00000000 00030003 80020000 197 1 | ||
| + | 29: -2 00000000 00030003 80020000 203 1 | ||
| + | 30: -1 00000000 00030003 80020000 199 1 | ||
| + | 31: 0 4A180001 006300C7 80020000 205 2 | ||
| + | 32: 1 00000000 006300C7 80020000 207 1 | ||
| + | 33: 2 00000000 006300C7 80020000 206 1 | ||
| + | 34: 3 00000000 006300C7 80020000 203 1 | ||
| + | 35: 4 00000000 006300C7 80020000 204 1 | ||
| + | 36: 5 00000000 006300C7 80020000 205 1 | ||
| + | 37: 6 00000000 006300C7 80020000 206 1 | ||
| + | 38: 7 00000000 006300C7 80020000 212 1 | ||
| + | 39: 8 00000000 006300C7 80020000 213 1 | ||
| + | 40: 9 00000000 006300C7 80020000 214 1 | ||
| + | 41: 10 00000000 006300C7 80020000 216 1 | ||
| + | 42: 11 00000000 006300C7 80020000 211 1 | ||
| + | 43: 12 00000000 006300C7 80020000 212 1 | ||
| + | 44: 13 00000000 006300C7 80020000 213 1 | ||
| + | 45: 14 00000000 006300C7 80020000 214 1 | ||
| + | 46: 15 00000000 006300C7 80020000 215 1 | ||
| + | 47: 16 00000000 006300C7 80020000 216 1 | ||
| + | 48: 17 00000000 006300C7 80020000 217 1 | ||
| + | 49: 18 00000000 006300C7 80020000 218 1 | ||
| + | 50: 19 00000000 006300C7 80020000 219 1 | ||
| + | 51: 20 00000000 006300C7 80020000 220 1 | ||
| + | 52: 21 00000000 006300C7 80020000 221 1 | ||
| + | 53: 22 00000000 006300C7 80020000 222 1 | ||
| + | 54: 23 00000000 006300C7 80020000 223 1 | ||
| + | 55: 24 00000000 006300C7 80020000 224 1 | ||
| + | 56: 25 00000000 006300C7 80020000 225 1 | ||
| + | 57: 26 00000000 006300C7 80020000 226 1 | ||
| + | 58: 27 00000000 006300C7 80020000 227 1 | ||
| + | 59: 28 00000000 006300C7 80020000 228 1 | ||
| + | Kernel's vector back: 3C1A0000 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [14IS2.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/14IS2.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 14 IS2 F15 ISOLATE STEP 2 | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | Cache isolation step 2: FlushCache, a routine run from the cache, then an isolated lw from | ||
| + | uncached code (cpu_core.c iso_load) at five addresses (q26; chain h read 8FA40254). | ||
| + | routine word 0 80113AA0: isolated 3C00A000, memory 3C00A000 | ||
| + | routine word 5 80113AB4: isolated 3C00A005, memory 3C00A005 | ||
| + | routine +30h, never run 80113AD0: isolated 00000000, memory 00000000 | ||
| + | routine +1000h, same line, other tag 80114AA0: isolated 3C00A000, memory 00000000 | ||
| + | a data word 8010FCE4: isolated 00000000, memory 11111111 | ||
| + | routine word 0 80113AA0: isolated 3C00A000, memory 3C00A000 | ||
| + | routine word 5 80113AB4: isolated 3C00A005, memory 3C00A005 | ||
| + | routine +30h, never run 80113AD0: isolated 00000000, memory 00000000 | ||
| + | routine +1000h, same line, other tag 80114AA0: isolated 3C00A000, memory 00000000 | ||
| + | a data word 8010FCE4: isolated 00000000, memory 11111111 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | [15IS4.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/15IS4.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 15 IS4 F15 ISOLATE STEP 4 | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | Cache isolation step 4: step 3 (isolated lw, sw 22222222, lw, sw back) from cached code. | ||
| + | It hung the 5501 on 2026-09-26 with nothing after its label (14ISO.txt:8). | ||
| + | 4 the same from cached code: cache word before 00000000, read 7FEF0000, memory after 11111111 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | ### 5 October 2026 | ||
| + | |||
| + | [00RUN.txt](/tests/raw/20261005T0000Z-5501a-card-q/followup15g/00RUN.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 00 RUN | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | 1 tests | ||
| + | A chain program, linked at 80010000 | ||
| + | Saved on the card in slot 2, from image 1 | ||
| + | COP0 at start: BPC 00000000 BDA 00000000 TAR 801090B4 DCIC 00000000 BadVaddr 00000480 BDAM 00000000 | ||
| + | BPCM 00000000 SR 40000000 Cause 00000020 EPC 80109C20 PRId 00000002 | ||
| + | ``` | ||
| + | |||
| + | [01IG2.txt](/tests/raw/20261005T0000Z-5501a-card-q/followup15g/01IG2.txt) | ||
| + | |||
| + | ``` | ||
| + | ===== 01 IG2 F15 IRQ ON GTE TIMED | BIOS 19951204 System ROM Version 3.0 11/18/96 A | ||
| + | BadVaddr as the group starts: 00000480 | ||
| + | IGT again (row 58): timer 2 read before the RTPS and first in the handler; then a NOP in | ||
| + | the RTPS's place. n: EPC from the RTPS in words / timer 2 before it / at the handler's | ||
| + | entry / at IGT's place in it / fifo shifts. | ||
| + | RTPS: | ||
| + | 20: -11 80 60 224 1 | ||
| + | 21: -10 160 61 225 1 | ||
| + | 22: -9 160 66 225 1 | ||
| + | 23: -8 160 63 226 1 | ||
| + | 24: -7 160 64 229 1 | ||
| + | 25: -6 160 69 228 1 | ||
| + | 26: -5 160 66 229 1 | ||
| + | 27: -4 160 67 231 1 | ||
| + | 28: -3 160 68 227 1 | ||
| + | 29: -2 160 69 233 1 | ||
| + | 30: -1 37 78 237 1 | ||
| + | 31: -1 37 74 237 1 | ||
| + | 32: -1 37 80 239 1 | ||
| + | 33: -1 37 74 238 1 | ||
| + | 34: -1 37 74 237 1 | ||
| + | 35: 0 160 75 239 2 | ||
| + | 36: 1 160 76 240 1 | ||
| + | 37: 2 160 77 236 1 | ||
| + | 38: 3 160 78 242 1 | ||
| + | 39: 4 160 79 244 1 | ||
| + | 40: 5 160 80 243 1 | ||
| + | 41: 6 160 81 240 1 | ||
| + | 42: 7 160 82 245 1 | ||
| + | 43: 8 160 83 247 1 | ||
| + | 44: 9 160 84 248 1 | ||
| + | 45: 10 160 85 244 1 | ||
| + | 46: 11 160 86 249 1 | ||
| + | 47: 12 160 87 250 1 | ||
| + | 48: 13 160 91 250 1 | ||
| + | 49: 14 160 89 252 1 | ||
| + | 50: 15 160 90 249 1 | ||
| + | 51: 16 160 91 254 1 | ||
| + | 52: 17 160 92 257 1 | ||
| + | 53: 18 160 93 252 1 | ||
| + | 54: 19 160 94 258 1 | ||
| + | 55: 20 160 95 260 1 | ||
| + | 56: 21 160 96 255 1 | ||
| + | 57: 22 160 97 260 1 | ||
| + | 58: 23 160 98 262 1 | ||
| + | 59: 24 160 99 258 1 | ||
| + | NOP in its place: | ||
| + | 20: -11 84 60 223 0 | ||
| + | 21: -10 160 61 224 0 | ||
| + | 22: -9 160 66 225 0 | ||
| + | 23: -8 160 63 222 0 | ||
| + | 24: -7 160 64 228 0 | ||
| + | 25: -6 160 65 227 0 | ||
| + | 26: -5 160 66 230 0 | ||
| + | 27: -4 160 71 230 0 | ||
| + | 28: -3 160 68 227 0 | ||
| + | 29: -2 160 69 232 0 | ||
| + | 30: -1 37 74 238 0 | ||
| + | 31: -1 37 80 239 0 | ||
| + | 32: -1 37 74 233 0 | ||
| + | 33: -1 37 74 236 0 | ||
| + | 34: -1 37 74 237 0 | ||
| + | 35: 0 160 75 234 0 | ||
| + | 36: 1 160 76 240 0 | ||
| + | 37: 2 160 77 236 0 | ||
| + | 38: 3 160 78 242 0 | ||
| + | 39: 4 160 79 242 0 | ||
| + | 40: 5 160 86 245 0 | ||
| + | 41: 6 160 81 245 0 | ||
| + | 42: 7 160 82 241 0 | ||
| + | 43: 8 160 83 246 0 | ||
| + | 44: 9 160 84 248 0 | ||
| + | 45: 10 160 89 248 0 | ||
| + | 46: 11 160 86 251 0 | ||
| + | 47: 12 160 87 250 0 | ||
| + | 48: 13 160 88 251 0 | ||
| + | 49: 14 160 89 252 0 | ||
| + | 50: 15 160 90 249 0 | ||
| + | 51: 16 160 91 254 0 | ||
| + | 52: 17 160 92 251 0 | ||
| + | 53: 18 160 93 258 0 | ||
| + | 54: 19 160 94 253 0 | ||
| + | 55: 20 160 95 258 0 | ||
| + | 56: 21 160 96 255 0 | ||
| + | 57: 22 160 97 260 0 | ||
| + | 58: 23 160 98 257 0 | ||
| + | 59: 24 160 99 263 0 | ||
| + | Kernel's vector back: 3C1A0000 | ||
| + | Done. | ||
| + | ``` | ||
| + | |||
| + | ## References | ||
| + | |||
| + | [^run]: SCPH-5501 output: [followup15/01SNL.txt](/tests/raw/20261003T0000Z-5501a-card-o/followup15/01SNL.txt) and the files beside it, listed under Runs. | ||
| + | [^g]: SCPH-5501 output: [followup15g/01IG2.txt](/tests/raw/20261005T0000Z-5501a-card-q/followup15g/01IG2.txt). | ||