Line 1,749:
Line 1,749:
| FUSE_SPARE_BIT_29
| FUSE_SPARE_BIT_29
| 0x7000FBF4
| 0x7000FBF4
−
|-
−
| FUSE_SPARE_BIT_30
−
| 0x7000FBF8
−
|-
−
| FUSE_SPARE_BIT_31
−
| 0x7000FBFC
|}
|}
Line 2,403:
Line 2,397:
=== irom_patch ===
=== irom_patch ===
−
Tegra210 based hardware such as the Switch provides support for bootrom patches. The patch data is burned to the hardware fuse bitmap using a specific format (see [https://gist.github.com/shuffle2/f8728159da100e9df2606d43925de0af shuffle2's ipatch decoder]). The bootrom reads these fuses in order to initialize the IPATCH hardware, which allows overriding data returned for code and data fetches done by BPMP.
+
Bootrom patches are burned to the hardware fuse bitmap using a specific format (see [https://gist.github.com/hexkyz/98c28e292597d8fc7bef7a2200e792d7 ipatch decoder]). The bootrom reads these fuses in order to initialize the IPATCH hardware, which allows overriding data returned for code and data fetches done by BPMP.
The following represents the patch data dumped from a Switch console:
The following represents the patch data dumped from a Switch console:
Line 2,412:
Line 2,406:
RAM:00000000 irom_svc_dispatch
RAM:00000000 irom_svc_dispatch
RAM:00000000 STMFD SP!, {R0-R2} ; ipatches (new):
RAM:00000000 STMFD SP!, {R0-R2} ; ipatches (new):
−
RAM:00000000 ; 0 b57df00 16ae df00 : svc #0x00 (offset 0x48)
+
RAM:00000000 ; 0: 0x0b57df00 0x001016ae 0x0000df00 : svc #0x00 (offset 0x48)
−
RAM:00000000 ; 1 1820df22 3040 df22 : svc #0x22 (offset 0x8c)
+
RAM:00000000 ; 1: 0x1820df22 0x00103040 0x0000df22 : svc #0x22 (offset 0x8c)
−
RAM:00000000 ; 2 3797df26 6f2e df26 : svc #0x26 (offset 0x94)
+
RAM:00000000 ; 2: 0x3797df26 0x00106f2e 0x0000df26 : svc #0x26 (offset 0x94)
−
RAM:00000000 ; 3 3b4d2100 769a 2100 : movs r1, #0x00
+
RAM:00000000 ; 3: 0x3b4d2100 0x0010769a 0x00002100 : movs r1, #0x00
−
RAM:00000000 ; 4 42bdf2c 856 df2c : svc #0x2c (offset 0xa0)
+
RAM:00000000 ; 4: 0x042bdf2c 0x00100856 0x0000df2c : svc #0x2c (offset 0xa0)
−
RAM:00000000 ; 5 37aadf42 6f54 df42 : svc #0x42 (offset 0xcc)
+
RAM:00000000 ; 5: 0x37aadf42 0x00106f54 0x0000df42 : svc #0x42 (offset 0xcc)
−
RAM:00000000 ; 6 972df4b 12e4 df4b : svc #0x4b (offset 0xde)
+
RAM:00000000 ; 6: 0x0972df4b 0x001012e4 0x0000df4b : svc #0x4b (offset 0xde)
−
RAM:00000000 ; 7 2293df54 4526 df54 : svc #0x54 (offset 0xf0)
+
RAM:00000000 ; 7: 0x2293df54 0x00104526 0x0000df54 : svc #0x54 (offset 0xf0)
−
RAM:00000000 ; 8 21fadf5d 43f4 df5d : svc #0x5d (offset 0x102)
+
RAM:00000000 ; 8: 0x21fadf5d 0x001043f4 0x0000df5d : svc #0x5d (offset 0x102)
−
RAM:00000000 ; 9 bba2ac57 17744 ac57 : data
+
RAM:00000000 ; 9: 0xbba2ac57 0x00117744 0x0000ac57 : data
−
RAM:00000000 ; 10 bbac3d19 17758 3d19 : data
+
RAM:00000000 ; 10: 0xbbac3d19 0x00117758 0x00003d19 : data
−
RAM:00000000 ; 11 1e952001 3d2a 2001 : movs r0, #0x01
+
RAM:00000000 ; 11: 0x1e952001 0x00103d2a 0x00002001 : movs r0, #0x01
RAM:00000000 ;
RAM:00000000 ;
RAM:00000000 ; ipatches (old):
RAM:00000000 ; ipatches (old):
−
RAM:00000000 ; 0 b57df00 16ae df00 : svc #0x00 (offset 0x48)
+
RAM:00000000 ; 0: 0x0b57df00 0x001016ae 0x0000df00 : svc #0x00 (offset 0x48)
−
RAM:00000000 ; 1 1820df22 3040 df22 : svc #0x22 (offset 0x8c)
+
RAM:00000000 ; 1: 0x1820df22 0x00103040 0x0000df22 : svc #0x22 (offset 0x8c)
−
RAM:00000000 ; 2 3797df26 6f2e df26 : svc #0x26 (offset 0x94)
+
RAM:00000000 ; 2: 0x3797df26 0x00106f2e 0x0000df26 : svc #0x26 (offset 0x94)
−
RAM:00000000 ; 3 7d9e2000 fb3c 2000 : movs r0, #0x00
+
RAM:00000000 ; 3: 0x7d9e2000 0x0010fb3c 0x00002000 : movs r0, #0x00
−
RAM:00000000 ; 4 42bdf2c 856 df2c : svc #0x2c (offset 0xa0)
+
RAM:00000000 ; 4: 0x042bdf2c 0x00100856 0x0000df2c : svc #0x2c (offset 0xa0)
−
RAM:00000000 ; 5 37aadf42 6f54 df42 : svc #0x42 (offset 0xcc)
+
RAM:00000000 ; 5: 0x37aadf42 0x00106f54 0x0000df42 : svc #0x42 (offset 0xcc)
−
RAM:00000000 ; 6 972df4b 12e4 df4b : svc #0x4b (offset 0xde)
+
RAM:00000000 ; 6: 0x0972df4b 0x001012e4 0x0000df4b : svc #0x4b (offset 0xde)
−
RAM:00000000 ; 7 2293df54 4526 df54 : svc #0x54 (offset 0xf0)
+
RAM:00000000 ; 7: 0x2293df54 0x00104526 0x0000df54 : svc #0x54 (offset 0xf0)
−
RAM:00000000 ; 8 21fadf5d 43f4 df5d : svc #0x5d (offset 0x102)
+
RAM:00000000 ; 8: 0x21fadf5d 0x001043f4 0x0000df5d : svc #0x5d (offset 0x102)
−
RAM:00000000 ; 9 bba2ac57 17744 ac57 : data
+
RAM:00000000 ; 9: 0xbba2ac57 0x00117744 0x0000ac57 : data
−
RAM:00000000 ; 10 bbac3d19 17758 3d19 : data
+
RAM:00000000 ; 10: 0xbbac3d19 0x00117758 0x00003d19 : data
−
RAM:00000000 ; 11 1e952001 3d2a 2001 : movs r0, #0x01
+
RAM:00000000 ; 11: 0x1e952001 0x00103d2a 0x00002001 : movs r0, #0x01
RAM:00000004 MOV R2, LR
RAM:00000004 MOV R2, LR
RAM:00000008 SUB R2, R2, #2
RAM:00000008 SUB R2, R2, #2
Line 2,464:
Line 2,458:
RAM:00000048
RAM:00000048
RAM:00000048 sub_48
RAM:00000048 sub_48
−
RAM:00000048 MOVS R2, #0 ; 0 b57df00 16ae df00 : svc #0x00 (offset 0x48)
+
RAM:00000048 MOVS R2, #0 ; 0: 0x0b57df00 0x001016ae 0x0000df00 : svc #0x00 (offset 0x48)
RAM:0000004A MVNS R2, R2
RAM:0000004A MVNS R2, R2
RAM:0000004C LDR R1, =0x60006410
RAM:0000004C LDR R1, =0x60006410
Line 2,503:
Line 2,497:
RAM:0000008C
RAM:0000008C
RAM:0000008C sub_8C
RAM:0000008C sub_8C
−
RAM:0000008C LDR R0, [R1,#0x18] ; 1 1820df22 3040 df22 : svc #0x22 (offset 0x8c)
+
RAM:0000008C LDR R0, [R1,#0x18] ; 1: 0x1820df22 0x00103040 0x0000df22 : svc #0x22 (offset 0x8c)
RAM:0000008E MOVS R2, #1
RAM:0000008E MOVS R2, #1
RAM:00000090 ORRS R0, R2
RAM:00000090 ORRS R0, R2
Line 2,514:
Line 2,508:
RAM:00000094
RAM:00000094
RAM:00000094 sub_94
RAM:00000094 sub_94
−
RAM:00000094 LDR R2, [R4,#0x50] ; 2 3797df26 6f2e df26 : svc #0x26 (offset 0x94)
+
RAM:00000094 LDR R2, [R4,#0x50] ; 2: 0x3797df26 0x00106f2e 0x0000df26 : svc #0x26 (offset 0x94)
RAM:00000096 ADDS R2, R2, #2
RAM:00000096 ADDS R2, R2, #2
RAM:00000098 STR R2, [R4,#0x50]
RAM:00000098 STR R2, [R4,#0x50]
Line 2,530:
Line 2,524:
RAM:000000A0 ; FUNCTION CHUNK AT RAM:00000148 SIZE 00000004 BYTES
RAM:000000A0 ; FUNCTION CHUNK AT RAM:00000148 SIZE 00000004 BYTES
RAM:000000A0
RAM:000000A0
−
RAM:000000A0 MOVS R0, #0x70000000 ; 4 42bdf2c 856 df2c : svc #0x2c (offset 0xa0)
+
RAM:000000A0 MOVS R0, #0x70000000 ; 4: 0x042bdf2c 0x00100856 0x0000df2c : svc #0x2c (offset 0xa0)
RAM:000000A4 LDR R6, =dword_7000EF14
RAM:000000A4 LDR R6, =dword_7000EF14
RAM:000000A6 LDR R2, =dword_7000E5B4
RAM:000000A6 LDR R2, =dword_7000E5B4
Line 2,562:
Line 2,556:
RAM:000000CC
RAM:000000CC
RAM:000000CC sub_CC
RAM:000000CC sub_CC
−
RAM:000000CC MOVS R2, #0xF000000 ; 5 37aadf42 6f54 df42 : svc #0x42 (offset 0xcc)
+
RAM:000000CC MOVS R2, #0xF000000 ; 5: 0x37aadf42 0x00106f54 0x0000df42 : svc #0x42 (offset 0xcc)
RAM:000000D0 BICS R1, R2
RAM:000000D0 BICS R1, R2
RAM:000000D2 STR R1, [R4,#0x10]
RAM:000000D2 STR R1, [R4,#0x10]
Line 2,577:
Line 2,571:
RAM:000000DE
RAM:000000DE
RAM:000000DE sub_DE
RAM:000000DE sub_DE
−
RAM:000000DE LDR R2, =dword_7000FA9C ; 6 972df4b 12e4 df4b : svc #0x4b (offset 0xde)
+
RAM:000000DE LDR R2, =dword_7000FA9C ; 6: 0x0972df4b 0x001012e4 0x0000df4b : svc #0x4b (offset 0xde)
RAM:000000E0 LDR R2, [R2]
RAM:000000E0 LDR R2, [R2]
RAM:000000E2 LSRS R2, R2, #8
RAM:000000E2 LSRS R2, R2, #8
Line 2,596:
Line 2,590:
RAM:000000F0 arg_0= 0
RAM:000000F0 arg_0= 0
RAM:000000F0
RAM:000000F0
−
RAM:000000F0 LDR R0, =0x400049F0 ; 7 2293df54 4526 df54 : svc #0x54 (offset 0xf0)
+
RAM:000000F0 LDR R0, =0x400049F0 ; 7: 0x2293df54 0x00104526 0x0000df54 : svc #0x54 (offset 0xf0)
RAM:000000F2 LDR R2, [R0]
RAM:000000F2 LDR R2, [R0]
RAM:000000F4 STR R2, [SP,#arg_0]
RAM:000000F4 STR R2, [SP,#arg_0]
Line 2,619:
Line 2,613:
RAM:00000102 arg_0= 0
RAM:00000102 arg_0= 0
RAM:00000102
RAM:00000102
−
RAM:00000102 LDR R2, =0x40010220 ; 8 21fadf5d 43f4 df5d : svc #0x5d (offset 0x102)
+
RAM:00000102 LDR R2, =0x40010220 ; 8: 0x21fadf5d 0x001043f4 0x0000df5d : svc #0x5d (offset 0x102)
RAM:00000104 STR R2, [SP,#arg_0] ; set r2 retval = [0x40010220]
RAM:00000104 STR R2, [SP,#arg_0] ; set r2 retval = [0x40010220]
RAM:00000106 LDR R2, [R2,#0x18]
RAM:00000106 LDR R2, [R2,#0x18]
Line 2,865:
Line 2,859:
==== IROM patch 11 ====
==== IROM patch 11 ====
This patch forces the value of [[Security_Engine|SE_TZRAM_SECURITY]] to be 0x01 instead of restoring it from the saved SE context.
This patch forces the value of [[Security_Engine|SE_TZRAM_SECURITY]] to be 0x01 instead of restoring it from the saved SE context.
+
+
== Mariko ==
+
{| class="wikitable" border="1"
+
! Name
+
! Number
+
! Redundant number
+
! Bits
+
|-
+
| enable_fuse_program
+
| 0
+
| 1
+
| 0
+
|-
+
| disable_fuse_program
+
| 0
+
| 1
+
| 1
+
|-
+
| bypass_fuses
+
| 0
+
| 1
+
| 2
+
|-
+
| jtag_direct_access_disable
+
| 0
+
| 1
+
| 3
+
|-
+
| production_mode
+
| 0
+
| 1
+
| 4
+
|-
+
| jtag_secureid_valid
+
| 0
+
| 1
+
| 5
+
|-
+
| odm_lock
+
| 0
+
| 1
+
| 6-21
+
|-
+
| fa_mode
+
| 0
+
| 1
+
| 22
+
|-
+
| security_mode
+
| 0
+
| 1
+
| 23
+
|-
+
| arm_debug_dis
+
| 0
+
| 1
+
| 24
+
|-
+
| obs_dis
+
| 0
+
| 1
+
| 25
+
|-
+
| public_key0
+
| 64
+
| 65
+
| 15-31
+
|-
+
| public_key0
+
| 66
+
| 67
+
| 0-14
+
|-
+
| public_key1
+
| 66
+
| 67
+
| 15-31
+
|-
+
| public_key1
+
| 68
+
| 69
+
| 0-14
+
|-
+
| public_key2
+
| 68
+
| 69
+
| 15-31
+
|-
+
| public_key2
+
| 70
+
| 71
+
| 0-14
+
|-
+
| public_key3
+
| 70
+
| 71
+
| 15-31
+
|-
+
| public_key3
+
| 72
+
| 73
+
| 0-14
+
|-
+
| public_key4
+
| 72
+
| 73
+
| 15-31
+
|-
+
| public_key4
+
| 74
+
| 75
+
| 0-14
+
|-
+
| public_key5
+
| 74
+
| 75
+
| 15-31
+
|-
+
| public_key5
+
| 76
+
| 77
+
| 0-14
+
|-
+
| public_key6
+
| 76
+
| 77
+
| 15-31
+
|-
+
| public_key6
+
| 78
+
| 79
+
| 0-14
+
|-
+
| public_key7
+
| 78
+
| 79
+
| 15-31
+
|-
+
| public_key7
+
| 80
+
| 81
+
| 0-14
+
|-
+
| private_key0
+
| 86
+
| 87
+
| 30-31
+
|-
+
| private_key0
+
| 88
+
| 89
+
| 0-29
+
|-
+
| private_key1
+
| 88
+
| 89
+
| 30-31
+
|-
+
| private_key1
+
| 90
+
| 91
+
| 0-29
+
|-
+
| private_key2
+
| 90
+
| 91
+
| 30-31
+
|-
+
| private_key2
+
| 92
+
| 93
+
| 0-29
+
|-
+
| private_key3
+
| 92
+
| 93
+
| 30-31
+
|-
+
| private_key3
+
| 94
+
| 95
+
| 0-29
+
|-
+
| private_key4
+
| 94
+
| 95
+
| 30-31
+
|-
+
| private_key4
+
| 96
+
| 97
+
| 0-29
+
|-
+
| boot_device_info
+
| 96
+
| 97
+
| 30-31
+
|-
+
| boot_device_info
+
| 98
+
| 99
+
| 0-13
+
|-
+
| reserved_sw
+
| 98
+
| 99
+
| 14-25
+
|-
+
| secure_provision_index
+
| 152
+
| 153
+
| 23-26
+
|-
+
| secure_provision_info
+
| 152
+
| 153
+
| 27-28
+
|-
+
| aid
+
| 165
+
| None
+
| 2-31
+
|-
+
| aid
+
| 166
+
| None
+
| 0-1
+
|-
+
| spare_bit_0
+
| 167
+
| None
+
| 2
+
|-
+
| spare_bit_1
+
| 167
+
| None
+
| 3
+
|-
+
| spare_bit_2
+
| 167
+
| None
+
| 4
+
|-
+
| spare_bit_3
+
| 167
+
| None
+
| 5
+
|-
+
| spare_bit_4
+
| 167
+
| None
+
| 6
+
|-
+
| spare_bit_5
+
| 167
+
| None
+
| 7
+
|-
+
| spare_bit_6
+
| 167
+
| None
+
| 8
+
|-
+
| spare_bit_7
+
| 167
+
| None
+
| 9
+
|-
+
| spare_bit_8
+
| 167
+
| None
+
| 10
+
|-
+
| spare_bit_9
+
| 167
+
| None
+
| 11
+
|-
+
| spare_bit_10
+
| 167
+
| None
+
| 12
+
|-
+
| spare_bit_11
+
| 167
+
| None
+
| 13
+
|-
+
| spare_bit_12
+
| 167
+
| None
+
| 14
+
|-
+
| spare_bit_13
+
| 167
+
| None
+
| 15
+
|-
+
| spare_bit_14
+
| 167
+
| None
+
| 16
+
|-
+
| spare_bit_15
+
| 167
+
| None
+
| 17
+
|-
+
| spare_bit_16
+
| 167
+
| None
+
| 18
+
|-
+
| spare_bit_17
+
| 167
+
| None
+
| 19
+
|-
+
| spare_bit_18
+
| 167
+
| None
+
| 20
+
|-
+
| spare_bit_19
+
| 167
+
| None
+
| 21
+
|-
+
| spare_bit_20
+
| 167
+
| None
+
| 22
+
|-
+
| spare_bit_21
+
| 167
+
| None
+
| 23
+
|-
+
| spare_bit_22
+
| 167
+
| None
+
| 24
+
|-
+
| spare_bit_23
+
| 167
+
| None
+
| 25
+
|-
+
| spare_bit_24
+
| 167
+
| None
+
| 26
+
|-
+
| spare_bit_25
+
| 167
+
| None
+
| 27
+
|-
+
| spare_bit_26
+
| 167
+
| None
+
| 28
+
|-
+
| spare_bit_27
+
| 167
+
| None
+
| 29
+
|-
+
| spare_bit_28
+
| 167
+
| None
+
| 30
+
|-
+
| spare_bit_29
+
| 167
+
| None
+
| 31
+
|-
+
| reshift_fcpu0
+
| 168
+
| None
+
| 0-31
+
|-
+
| reshift_fcpu1
+
| 169
+
| None
+
| 0-31
+
|-
+
| reshift_fcpu2
+
| 170
+
| None
+
| 0-31
+
|-
+
| reshift_fcpu3
+
| 171
+
| None
+
| 0-31
+
|-
+
| reshift_fl2_tbank0
+
| 172
+
| None
+
| 0-31
+
|-
+
| reshift_fl2_tbank1
+
| 173
+
| None
+
| 0-31
+
|-
+
| reshift_fl2_tbank2
+
| 174
+
| None
+
| 0-31
+
|-
+
| reshift_fl2_tbank3
+
| 175
+
| None
+
| 0-31
+
|-
+
| [[#irom_patch_2|irom_patch]]
+
| 176
+
| None
+
| Variable
+
|}
+
+
=== irom_patch ===
+
<syntaxhighlight>
+
RAM:00000000 ; =============== S U B R O U T I N E =======================================
+
RAM:00000000
+
RAM:00000000
+
RAM:00000000 irom_svc_dispatch
+
RAM:00000000 STMFD SP!, {R0-R2} ; ipatches:
+
RAM:00000000 ; 0: 0x085bdf00 0x001010b6 0x0000df00 : svc #0x00 (offset 0x48)
+
RAM:00000000 ;
+
RAM:00000000 ; 0: 0x12d3df06 0x001025a6 0x0000df06 : svc #0x06 (offset 0x54)
+
RAM:00000000 ; 1: 0x28144770 0x00105028 0x00004770 : bx lr
+
RAM:00000000 ; 2: 0x0fb72001 0x00101f6e 0x00002001 : movs r0, #0x01
+
RAM:00000000 ; 3: 0x692ddf15 0x0010d25a 0x0000df15 : svc #0x15 (offset 0x72)
+
RAM:00000000 ; 4: 0x436ddf1f 0x001086da 0x0000df1f : svc #0x1f (offset 0x86)
+
RAM:00000000 ; 5: 0x4376df23 0x001086ec 0x0000df23 : svc #0x23 (offset 0x8e)
+
RAM:00000000 ; 6: 0x4103df2b 0x00108206 0x0000df2b : svc #0x2b (offset 0x9e)
+
RAM:00000000 ; 7: 0x495c0060 0x001092b8 0x00000060 : lsls r0, r4, #1
+
RAM:00000000 ; 8: 0x62e3ef5b 0x0010c5c6 0x0000ef5b
+
RAM:00000000 ; 9: 0x10d1df6a 0x001021a2 0x0000df6a : svc #0x6a (offset 0x11c)
+
RAM:00000004 MOV R2, LR
+
RAM:00000008 SUB R2, R2, #2
+
RAM:0000000C LDR R2, [R2]
+
RAM:00000010 AND R2, R2, #0xFF
+
RAM:00000014 MOV R2, R2,LSL#1
+
RAM:00000018 LDR R0, =0x10022C
+
RAM:0000001C LDR R1, =0x100174
+
RAM:00000020 SUB R1, R1, R0
+
RAM:00000024 LDR R0, =0x40004164
+
RAM:00000028 ADD R0, R0, R1
+
RAM:0000002C ADD R2, R2, R0
+
RAM:00000030 ORR R2, R2, #1
+
RAM:00000034 LDMFD SP!, {R0,R1}
+
RAM:00000038 BX R2
+
RAM:00000038 ; End of function irom_svc_dispatch
+
RAM:00000038
+
RAM:00000038 ; ---------------------------------------------------------------------------
+
RAM:0000003C dword_3C DCD 0x10022C ; DATA XREF: irom_svc_dispatch+18↑r
+
RAM:00000040 dword_40 DCD 0x100174 ; DATA XREF: irom_svc_dispatch+1C↑r
+
RAM:00000044 dword_44 DCD 0x40004164 ; DATA XREF: irom_svc_dispatch+24↑r
+
RAM:00000048 CODE16
+
RAM:00000048
+
RAM:00000048 ; =============== S U B R O U T I N E =======================================
+
RAM:00000048
+
RAM:00000048
+
RAM:00000048 sub_48 ; 0: 0x085bdf00 0x001010b6 0x0000df00 : svc #0x00 (offset 0x48)
+
RAM:00000048 CMP R5, #0xAF
+
RAM:0000004A BNE loc_4E
+
RAM:0000004C MOVS R5, #0xFF
+
RAM:0000004E
+
RAM:0000004E loc_4E ; CODE XREF: sub_48+2↑j
+
RAM:0000004E SUBS R6, R5, #1
+
RAM:00000050
+
RAM:00000050 loc_50 ; CODE XREF: sub_54+18↓j
+
RAM:00000050 ; sub_72+12↓j ...
+
RAM:00000050 POP {R2}
+
RAM:00000052 MOV PC, LR
+
RAM:00000052 ; End of function sub_48
+
RAM:00000052
+
RAM:00000054
+
RAM:00000054 ; =============== S U B R O U T I N E =======================================
+
RAM:00000054
+
RAM:00000054
+
RAM:00000054 sub_54 ; 0: 0x12d3df06 0x001025a6 0x0000df06 : svc #0x06 (offset 0x54)
+
RAM:00000054 MOVS R3, #7
+
RAM:00000056
+
RAM:00000056 loc_56 ; CODE XREF: sub_72+10↓j
+
RAM:00000056 ; sub_8E+E↓j
+
RAM:00000056 PUSH {R0,R1,R3-R6}
+
RAM:00000058 LDR R0, =0x4000FC20
+
RAM:0000005A LDR R1, =0x40040000
+
RAM:0000005C LDR R3, =0xEAFFFFFE
+
RAM:0000005E MOVS R4, R3
+
RAM:00000060 MOVS R5, R3
+
RAM:00000062 ADDS R6, R3, #0
+
RAM:00000064
+
RAM:00000064 loc_64 ; CODE XREF: sub_54+14↓j
+
RAM:00000064 STMIA R0!, {R3-R6}
+
RAM:00000066 CMP R0, R1
+
RAM:00000068 BCC loc_64
+
RAM:0000006A POP {R0,R1,R3-R6}
+
RAM:0000006C B loc_50
+
RAM:0000006C ; End of function sub_54
+
RAM:0000006C
+
RAM:0000006E ; ---------------------------------------------------------------------------
+
RAM:0000006E ; START OF FUNCTION CHUNK FOR sub_8E
+
RAM:0000006E
+
RAM:0000006E loc_6E ; CODE XREF: sub_8E+8↓j
+
RAM:0000006E LDR R0, =0x1002A0
+
RAM:00000070 BX R0
+
RAM:00000070 ; END OF FUNCTION CHUNK FOR sub_8E
+
RAM:00000072
+
RAM:00000072 ; =============== S U B R O U T I N E =======================================
+
RAM:00000072
+
RAM:00000072
+
RAM:00000072 sub_72 ; 3: 0x692ddf15 0x0010d25a 0x0000df15 : svc #0x15 (offset 0x72)
+
RAM:00000072 MOVS R2, #2
+
RAM:00000074 CMP R0, #0x26 ; '&'
+
RAM:00000076 BLS loc_7A
+
RAM:00000078 ADDS R2, #0x50 ; 'P'
+
RAM:0000007A
+
RAM:0000007A loc_7A ; CODE XREF: sub_72+4↑j
+
RAM:0000007A MOV R3, LR
+
RAM:0000007C ADDS R3, R3, R2
+
RAM:0000007E MOV LR, R3
+
RAM:00000080 CMP R0, #0
+
RAM:00000082 BNE loc_56
+
RAM:00000084 B loc_50
+
RAM:00000084 ; End of function sub_72
+
RAM:00000084
+
RAM:00000086
+
RAM:00000086 ; =============== S U B R O U T I N E =======================================
+
RAM:00000086
+
RAM:00000086
+
RAM:00000086 sub_86 ; 4: 0x436ddf1f 0x001086da 0x0000df1f : svc #0x1f (offset 0x86)
+
RAM:00000086
+
RAM:00000086 arg_8 = 8
+
RAM:00000086
+
RAM:00000086 MOVS R3, R0
+
RAM:00000088 LDR R2, =0x5A55F0E1
+
RAM:0000008A STR R2, [SP,#arg_8]
+
RAM:0000008C B loc_50
+
RAM:0000008C ; End of function sub_86
+
RAM:0000008C
+
RAM:0000008E
+
RAM:0000008E ; =============== S U B R O U T I N E =======================================
+
RAM:0000008E
+
RAM:0000008E
+
RAM:0000008E sub_8E ; 5: 0x4376df23 0x001086ec 0x0000df23 : svc #0x23 (offset 0x8e)
+
RAM:0000008E
+
RAM:0000008E arg_8 = 8
+
RAM:0000008E
+
RAM:0000008E ; FUNCTION CHUNK AT RAM:0000006E SIZE 00000004 BYTES
+
RAM:0000008E
+
RAM:0000008E MOVS R3, R0
+
RAM:00000090 LDR R2, =0x5A55F0E1
+
RAM:00000092 LDR R0, [SP,#arg_8]
+
RAM:00000094 CMP R0, R2
+
RAM:00000096 BEQ loc_6E
+
RAM:00000098 CMP R0, #0
+
RAM:0000009A BEQ loc_50
+
RAM:0000009C B loc_56
+
RAM:0000009C ; End of function sub_8E
+
RAM:0000009C
+
RAM:0000009E
+
RAM:0000009E ; =============== S U B R O U T I N E =======================================
+
RAM:0000009E
+
RAM:0000009E
+
RAM:0000009E sub_9E ; 6: 0x4103df2b 0x00108206 0x0000df2b : svc #0x2b (offset 0x9e)
+
RAM:0000009E LDR R0, =0x7000F900
+
RAM:000000A0 SUBS R0, #0xD8
+
RAM:000000A2 MOVS R2, #1
+
RAM:000000A4 STR R2, [R0]
+
RAM:000000A6 LDR R0, =0x7001231C
+
RAM:000000A8 LDR R3, =0x7041231C
+
RAM:000000AA MOVS R1, #0xE0
+
RAM:000000AC B loc_B4
+
RAM:000000AE ; ---------------------------------------------------------------------------
+
RAM:000000AE
+
RAM:000000AE loc_AE ; CODE XREF: sub_9E+2E↓j
+
RAM:000000AE MOVS R1, #0xF0
+
RAM:000000B0 B loc_B4
+
RAM:000000B2 ; ---------------------------------------------------------------------------
+
RAM:000000B2
+
RAM:000000B2 loc_B2 ; CODE XREF: sub_9E+32↓j
+
RAM:000000B2 MOVS R1, #0xC0
+
RAM:000000B4
+
RAM:000000B4 loc_B4 ; CODE XREF: sub_9E+E↑j
+
RAM:000000B4 ; sub_9E+12↑j
+
RAM:000000B4 MOVS R4, #0
+
RAM:000000B6
+
RAM:000000B6 loc_B6 ; CODE XREF: sub_9E+28↓j
+
RAM:000000B6 MOVS R2, #0
+
RAM:000000B8 STR R1, [R0]
+
RAM:000000BA STR R2, [R0,#4]
+
RAM:000000BC STR R1, [R3]
+
RAM:000000BE STR R2, [R3,#4]
+
RAM:000000C0 ADDS R1, #1
+
RAM:000000C2 ADDS R4, #1
+
RAM:000000C4 CMP R4, #7
+
RAM:000000C6 BLS loc_B6
+
RAM:000000C8 LSRS R1, R1, #4
+
RAM:000000CA CMP R1, #0xE
+
RAM:000000CC BEQ loc_AE
+
RAM:000000CE CMP R1, #0xF
+
RAM:000000D0 BEQ loc_B2
+
RAM:000000D2 MOV R5, LR
+
RAM:000000D4 MOVS R0, #0
+
RAM:000000D6
+
RAM:000000D6 loc_D6 ; CODE XREF: sub_9E+56↓j
+
RAM:000000D6 MOVS R1, #0xD
+
RAM:000000D8 MOVS R2, #0
+
RAM:000000DA MOVS R3, #0xD
+
RAM:000000DC PUSH {R0-R3}
+
RAM:000000DE LDR R4, =0x40004164
+
RAM:000000E0 PUSH {R2,R4}
+
RAM:000000E2 ADRL R4, (loc_EC+1)
+
RAM:000000E6 MOV LR, R4
+
RAM:000000E8 LDR R4, =0x105A19
+
RAM:000000EA BX R4
+
RAM:000000EC
+
RAM:000000EC loc_EC ; DATA XREF: sub_9E+44↑o
+
RAM:000000EC ADD SP, SP, #8
+
RAM:000000EE POP {R0-R3}
+
RAM:000000F0 ADDS R0, #1
+
RAM:000000F2 CMP R0, #1
+
RAM:000000F4 BEQ loc_D6
+
RAM:000000F6 MOV LR, R5
+
RAM:000000F8 LDR R0, =0x4000FC20
+
RAM:000000FA MOV R8, R0
+
RAM:000000FC B loc_50
+
RAM:000000FC ; End of function sub_9E
+
RAM:000000FC
+
RAM:000000FE
+
RAM:000000FE ; =============== S U B R O U T I N E =======================================
+
RAM:000000FE
+
RAM:000000FE
+
RAM:000000FE sub_FE
+
RAM:000000FE POP {R2}
+
RAM:00000100 MOV R4, SP
+
RAM:00000102 SUBS R4, R4, R0
+
RAM:00000104 BLS loc_10C
+
RAM:00000106 CMP R4, R2
+
RAM:00000108 BCS loc_118
+
RAM:0000010A B loc_116
+
RAM:0000010C ; ---------------------------------------------------------------------------
+
RAM:0000010C
+
RAM:0000010C loc_10C ; CODE XREF: sub_FE+6↑j
+
RAM:0000010C LDR R4, =0x4000BE68
+
RAM:0000010E SUBS R4, R4, R0
+
RAM:00000110 BLS loc_118
+
RAM:00000112 CMP R4, R2
+
RAM:00000114 BCS loc_118
+
RAM:00000116
+
RAM:00000116 loc_116 ; CODE XREF: sub_FE+C↑j
+
RAM:00000116 ADDS R2, R4, #0
+
RAM:00000118
+
RAM:00000118 loc_118 ; CODE XREF: sub_FE+A↑j
+
RAM:00000118 ; sub_FE+12↑j ...
+
RAM:00000118 SUBS R3, R0, R1
+
RAM:0000011A BX LR
+
RAM:0000011A ; End of function sub_FE
+
RAM:0000011A
+
RAM:0000011C
+
RAM:0000011C ; =============== S U B R O U T I N E =======================================
+
RAM:0000011C
+
RAM:0000011C
+
RAM:0000011C sub_11C ; 9: 0x10d1df6a 0x001021a2 0x0000df6a : svc #0x6a (offset 0x11c)
+
RAM:0000011C SUBS R3, #5
+
RAM:0000011E MOVS R2, #0xF0
+
RAM:00000120 BICS R2, R3
+
RAM:00000122 B loc_50
+
RAM:00000122 ; End of function sub_11C
+
RAM:00000122
+
RAM:00000122 ; ---------------------------------------------------------------------------
+
RAM:00000124 dword_124 DCD 0x4000FC20 ; DATA XREF: sub_54+4↑r
+
RAM:00000124 ; sub_9E+5A↑r
+
RAM:00000128 dword_128 DCD 0x40040000 ; DATA XREF: sub_54+6↑r
+
RAM:0000012C dword_12C DCD 0xEAFFFFFE ; DATA XREF: sub_54+8↑r
+
RAM:00000130 off_130 DCD 0x1002A0 ; DATA XREF: sub_8E:loc_6E↑r
+
RAM:00000134 dword_134 DCD 0x5A55F0E1 ; DATA XREF: sub_86+2↑r
+
RAM:00000134 ; sub_8E+2↑r
+
RAM:00000138 dword_138 DCD 0x7000F900 ; DATA XREF: sub_9E↑r
+
RAM:0000013C off_13C DCD 0x7001231C ; DATA XREF: sub_9E+8↑r
+
RAM:00000140 off_140 DCD 0x7041231C ; DATA XREF: sub_9E+A↑r
+
RAM:00000144 dword_144 DCD 0x40004164 ; DATA XREF: sub_9E+40↑r
+
RAM:00000148 off_148 DCD 0x105A19 ; DATA XREF: sub_9E+4A↑r
+
RAM:0000014C dword_14C DCD 0x4000BE68 ; DATA XREF: sub_FE:loc_10C↑r
+
RAM:0000014C ; RAM ends
+
</syntaxhighlight>
+
+
==== First IROM patch ====
+
This patch is applied to the bootrom IPATCH handling function so that more patches can be loaded from fuses.
+
+
<syntaxhighlight lang="c">
+
if (patch_start_addr == 0xAF) {
+
patch_start_addr = 0xFF;
+
}
+
+
patch_start_addr--;
+
+
return;
+
</syntaxhighlight>
+
+
==== IROM patch 0 ====
+
This patch initializes all unused IRAM memory to 0xEAFFFFFE (infinite loop instruction).
+
+
<syntaxhighlight lang="c">
+
/*
+
Untranslated instructions:
+
+
MOVS R3, #7
+
PUSH {R0,R1,R3-R6}
+
*/
+
+
for (u32 addr = 0x4000FC20; addr < 0x40040000; addr += 0x04) {
+
*(u32 *)addr = 0xEAFFFFFE;
+
}
+
+
/*
+
Untranslated instructions:
+
+
POP {R0,R1,R3-R6}
+
*/
+
+
return;
+
</syntaxhighlight>
= Anti-downgrade =
= Anti-downgrade =