├── .github ├── ISSUE_TEMPLATE │ ├── BUG-REPORT.yml │ └── config.yml └── workflows │ └── build.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── assets ├── diagram.svg ├── diagram_dark.svg ├── diagram_light.svg ├── ldscript.lcf ├── ldscript_partial.lcf ├── macros.inc ├── signatures │ ├── ClearArena.yml │ ├── DBInit.yml │ ├── DMAErrorHandler.yml │ ├── DVDGetDriveStatus.yml │ ├── DVDInit.yml │ ├── DVDLowReset.yml │ ├── DVDLowStopMotor.yml │ ├── DVDLowWaitCoverClose.yml │ ├── DVDReadDiskID.yml │ ├── DVDReset.yml │ ├── DVDSetAutoFatalMessaging.yml │ ├── DecrementerExceptionCallback.yml │ ├── DecrementerExceptionHandler.yml │ ├── ESP_GetTitleId.yml │ ├── EXIGetID.yml │ ├── EXIInit.yml │ ├── GXInit.yml │ ├── IOS_Open.yml │ ├── IPCCltInit.yml │ ├── IPCiProfQueueReq.yml │ ├── ISFS_OpenAsync.yml │ ├── ISFS_OpenLib.yml │ ├── InitMetroTRK.yml │ ├── InitMetroTRKCommTable.yml │ ├── NANDInit.yml │ ├── NANDLoggingAddMessageAsync.yml │ ├── NANDPrivateOpenAsync.yml │ ├── NANDSetAutoErrorMessaging.yml │ ├── OSDefaultExceptionHandler.yml │ ├── OSDisableScheduler.yml │ ├── OSExceptionInit.yml │ ├── OSExceptionVector.yml │ ├── OSInit.yml │ ├── OSInitAlarm.yml │ ├── OSRegisterResetFunction.yml │ ├── OSRegisterShutdownFunction.yml │ ├── OSReport.yml │ ├── OSResetSystem.yml │ ├── OSReturnToMenu.yml │ ├── OSSetArenaHi.yml │ ├── OSSetArenaLo.yml │ ├── OSSetMEM1ArenaHi.yml │ ├── OSSetMEM1ArenaLo.yml │ ├── OSSetMEM2ArenaHi.yml │ ├── OSSetMEM2ArenaLo.yml │ ├── OSSwitchFPUContext.yml │ ├── RSOStaticLocateObject.yml │ ├── ReportOSInfo.yml │ ├── SCInit.yml │ ├── SCReloadConfFileAsync.yml │ ├── SIGetType.yml │ ├── SIInit.yml │ ├── SISetSamplingRate.yml │ ├── SISetXY.yml │ ├── TRKEXICallBack.yml │ ├── TRKExceptionHandler.yml │ ├── TRKInitializeIntDrivenUART.yml │ ├── TRKInitializeNub.yml │ ├── TRKInterruptHandler.yml │ ├── TRKInterruptHandlerEnableInterrupts.yml │ ├── TRKLoadContext.yml │ ├── TRKNubMainLoop.yml │ ├── TRKNubWelcome.yml │ ├── TRKRestoreExtended1Block.yml │ ├── TRKSaveExtended1Block.yml │ ├── TRKSwapAndGo.yml │ ├── TRKTargetContinue.yml │ ├── TRK_main.yml │ ├── VIGetTvFormat.yml │ ├── _ExitProcess.yml │ ├── __DVDCheckDevice.yml │ ├── __DVDClearWaitingQueue.yml │ ├── __DVDFSInit.yml │ ├── __DVDInitWA.yml │ ├── __DVDLowSetWAType.yml │ ├── __DVDStoreErrorCode.yml │ ├── __FileWrite.yml │ ├── __NANDPrintErrorMessage.yml │ ├── __OSCacheInit.yml │ ├── __OSContextInit.yml │ ├── __OSDBIntegrator.yml │ ├── __OSDBJump.yml │ ├── __OSFPRInit.yml │ ├── __OSGetExceptionHandler.yml │ ├── __OSInitAlarm.yml │ ├── __OSInitAudioSystem.yml │ ├── __OSInitIPCBuffer.yml │ ├── __OSInitMemoryProtection.yml │ ├── __OSInitNet.yml │ ├── __OSInitPlayTime.yml │ ├── __OSInitSTM.yml │ ├── __OSInitSram.yml │ ├── __OSInitSystemCall.yml │ ├── __OSInterruptInit.yml │ ├── __OSPSInit.yml │ ├── __OSReschedule.yml │ ├── __OSReturnToMenu.yml │ ├── __OSShutdownDevices.yml │ ├── __OSStartPlayRecord.yml │ ├── __OSSyncSram.yml │ ├── __OSThreadInit.yml │ ├── __OSUnhandledException.yml │ ├── __StringWrite.yml │ ├── __check_pad3.yml │ ├── __destroy_global_chain.yml │ ├── __fini_cpp.yml │ ├── __fini_cpp_exceptions.yml │ ├── __fstLoad.yml │ ├── __fwrite.yml │ ├── __init_cpp.yml │ ├── __init_cpp_exceptions.yml │ ├── __init_data.yml │ ├── __init_hardware.yml │ ├── __init_registers.yml │ ├── __ios_Ipc2.yml │ ├── __mod2u.yml │ ├── __msl_runtime_constraint_violation_s.yml │ ├── __pformatter.yml │ ├── __register_atexit.yml │ ├── __register_fragment.yml │ ├── __register_global_object.yml │ ├── __set_debug_bba.yml │ ├── __start.yml │ ├── __stdio_atexit.yml │ ├── __unregister_fragment.yml │ ├── exit.yml │ ├── fwrite.yml │ ├── longlong2str.yml │ ├── memset.yml │ ├── nandConvertErrorCode.yml │ ├── nandGenerateAbsPath.yml │ ├── nandGetHeadToken.yml │ ├── nandIsInitialized.yml │ ├── nandOpen.yml │ ├── printf.yml │ ├── sprintf.yml │ ├── stateReady.yml │ ├── vprintf.yml │ ├── vsnprintf.yml │ └── vsprintf.yml └── syntax │ ├── README │ ├── default.themedump │ └── default_newlines.packdump ├── build.rs ├── deny.toml ├── docs ├── other_approaches.md ├── readme.md └── terminology.md ├── rustfmt.toml └── src ├── analysis ├── cfa.rs ├── executor.rs ├── mod.rs ├── objects.rs ├── pass.rs ├── signatures.rs ├── slices.rs ├── tracker.rs └── vm.rs ├── argp_version.rs ├── cmd ├── alf.rs ├── ar.rs ├── demangle.rs ├── disc.rs ├── dol.rs ├── dwarf.rs ├── elf.rs ├── elf2dol.rs ├── extab.rs ├── map.rs ├── mod.rs ├── nlzss.rs ├── rarc.rs ├── rel.rs ├── rso.rs ├── shasum.rs ├── u8_arc.rs ├── vfs.rs ├── wad.rs ├── yay0.rs └── yaz0.rs ├── main.rs ├── obj ├── addresses.rs ├── mod.rs ├── relocations.rs ├── sections.rs ├── splits.rs └── symbols.rs ├── util ├── alf.rs ├── asm.rs ├── bin2c.rs ├── comment.rs ├── config.rs ├── dep.rs ├── diff.rs ├── dol.rs ├── dwarf.rs ├── elf.rs ├── extab.rs ├── file.rs ├── lcf.rs ├── map.rs ├── mod.rs ├── ncompress.rs ├── nested.rs ├── nlzss.rs ├── path.rs ├── rarc.rs ├── read.rs ├── reader.rs ├── rel.rs ├── rso.rs ├── signatures.rs ├── split.rs ├── take_seek.rs ├── toposort.rs ├── u8_arc.rs └── wad.rs └── vfs ├── common.rs ├── disc.rs ├── mod.rs ├── rarc.rs ├── std_fs.rs ├── u8_arc.rs └── wad.rs /.github/ISSUE_TEMPLATE/BUG-REPORT.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug 2 | description: Create a new ticket for a bug. 3 | title: "[BUG] " 4 | labels: 5 | - bug 6 | body: 7 | - type: input 8 | id: repo-url 9 | attributes: 10 | label: Repository URL 11 | description: | 12 | The URL of the repository where this bug can be reproduced. 13 | 14 | If you're working with dtk-template locally, **please** consider pushing your configuration to a repository for easier reproduction. 15 | In return, this also allows contributing configuration fixes back to your repository. 16 | placeholder: ex. https://github.com/USERNAME/REPO-NAME 17 | - type: input 18 | id: game-name 19 | attributes: 20 | label: Game Name 21 | description: The name of the game that is impacted by this bug. 22 | placeholder: ex. Metroid Prime 23 | - type: input 24 | id: game-version 25 | attributes: 26 | label: Game Version 27 | description: The version of the game that is impacted by this bug. 28 | placeholder: ex. USA v0 29 | - type: textarea 30 | id: description 31 | attributes: 32 | label: Description 33 | description: Please describe the issue including full error messages if applicable. 34 | placeholder: "ex. When I try to split the game, I get the following error: ..." 35 | validations: 36 | required: true 37 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /.idea 3 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "decomp-toolkit" 3 | description = "Yet another GameCube/Wii decompilation toolkit." 4 | authors = ["Luke Street <luke@street.dev>"] 5 | license = "MIT OR Apache-2.0" 6 | version = "1.6.1" 7 | edition = "2021" 8 | publish = false 9 | repository = "https://github.com/encounter/decomp-toolkit" 10 | readme = "README.md" 11 | categories = ["command-line-utilities"] 12 | rust-version = "1.81" 13 | 14 | [[bin]] 15 | name = "dtk" 16 | path = "src/main.rs" 17 | 18 | [profile.release] 19 | panic = "abort" 20 | 21 | [profile.release-lto] 22 | inherits = "release" 23 | lto = "fat" 24 | strip = "debuginfo" 25 | codegen-units = 1 26 | 27 | [dependencies] 28 | encoding_rs = "0.8" 29 | aes = "0.8" 30 | anyhow = { version = "1.0", features = ["backtrace"] } 31 | ar = { git = "https://github.com/bjorn3/rust-ar.git", branch = "write_symbol_table" } 32 | argp = "0.3" 33 | base16ct = "0.2" 34 | base64 = "0.22" 35 | byteorder = "1.5" 36 | typed-path = "0.9" 37 | cbc = "0.1" 38 | crossterm = "0.28" 39 | cwdemangle = "1.0" 40 | cwextab = "1.1" 41 | dyn-clone = "1.0" 42 | enable-ansi-support = "0.2" 43 | filetime = "0.2" 44 | fixedbitset = "0.5" 45 | flagset = { version = "0.4", features = ["serde"] } 46 | glob = "0.3" 47 | hex = "0.4" 48 | indent = "0.1" 49 | indexmap = "2.6" 50 | itertools = "0.13" 51 | log = "0.4" 52 | memchr = "2.7" 53 | memmap2 = "0.9" 54 | multimap = "0.10" 55 | nodtool = "1.4" 56 | #nodtool = { path = "../nod-rs/nodtool" } 57 | num_enum = "0.7" 58 | objdiff-core = { version = "2.2", features = ["ppc"] } 59 | #objdiff-core = { path = "../objdiff/objdiff-core", features = ["ppc"] } 60 | object = { version = "0.36", features = ["read_core", "std", "elf", "write_std"], default-features = false } 61 | once_cell = "1.20" 62 | orthrus-ncompress = "0.2" 63 | owo-colors = { version = "4.1", features = ["supports-colors"] } 64 | ppc750cl = "0.3" 65 | rayon = "1.10" 66 | regex = "1.11" 67 | rustc-hash = "2.0" 68 | sanitise-file-name = "1.0" 69 | serde = "1.0" 70 | serde_json = "1.0" 71 | serde_repr = "0.1" 72 | serde_yaml = "0.9" 73 | sha-1 = "0.10" 74 | size = "0.4" 75 | supports-color = "3.0" 76 | syntect = { version = "5.2", features = ["parsing", "regex-fancy", "dump-load"], default-features = false } 77 | tracing = "0.1" 78 | tracing-attributes = "0.1" 79 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 80 | unicode-width = "0.2" 81 | xxhash-rust = { version = "0.8", features = ["xxh3"] } 82 | zerocopy = { version = "0.8", features = ["derive"] } 83 | 84 | [target.'cfg(target_env = "musl")'.dependencies] 85 | mimalloc = "0.1" 86 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2021 Luke Street. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /assets/ldscript.lcf: -------------------------------------------------------------------------------- 1 | MEMORY 2 | { 3 | text : origin = $ORIGIN 4 | } 5 | 6 | SECTIONS 7 | { 8 | GROUP: 9 | { 10 | $SECTIONS 11 | .stack ALIGN(0x100):{} 12 | } > text 13 | 14 | _stack_end = $LAST_SECTION_SYMBOL + SIZEOF($LAST_SECTION_NAME); 15 | _stack_addr = (_stack_end + $STACKSIZE + 0x7) & ~0x7; 16 | _db_stack_addr = (_stack_addr + 0x2000); 17 | _db_stack_end = _stack_addr; 18 | __ArenaLo = (_db_stack_addr + 0x1f) & ~0x1f; 19 | __ArenaHi = $ARENAHI; 20 | } 21 | 22 | FORCEACTIVE 23 | { 24 | $FORCEACTIVE 25 | } 26 | -------------------------------------------------------------------------------- /assets/ldscript_partial.lcf: -------------------------------------------------------------------------------- 1 | SECTIONS 2 | { 3 | GROUP: 4 | { 5 | $SECTIONS 6 | } 7 | } 8 | 9 | FORCEACTIVE 10 | { 11 | $FORCEACTIVE 12 | } 13 | -------------------------------------------------------------------------------- /assets/macros.inc: -------------------------------------------------------------------------------- 1 | # General Purpose Registers (GPRs) 2 | .set r0, 0 3 | .set r1, 1 4 | .set r2, 2 5 | .set r3, 3 6 | .set r4, 4 7 | .set r5, 5 8 | .set r6, 6 9 | .set r7, 7 10 | .set r8, 8 11 | .set r9, 9 12 | .set r10, 10 13 | .set r11, 11 14 | .set r12, 12 15 | .set r13, 13 16 | .set r14, 14 17 | .set r15, 15 18 | .set r16, 16 19 | .set r17, 17 20 | .set r18, 18 21 | .set r19, 19 22 | .set r20, 20 23 | .set r21, 21 24 | .set r22, 22 25 | .set r23, 23 26 | .set r24, 24 27 | .set r25, 25 28 | .set r26, 26 29 | .set r27, 27 30 | .set r28, 28 31 | .set r29, 29 32 | .set r30, 30 33 | .set r31, 31 34 | 35 | # Floating Point Registers (FPRs) 36 | .set f0, 0 37 | .set f1, 1 38 | .set f2, 2 39 | .set f3, 3 40 | .set f4, 4 41 | .set f5, 5 42 | .set f6, 6 43 | .set f7, 7 44 | .set f8, 8 45 | .set f9, 9 46 | .set f10, 10 47 | .set f11, 11 48 | .set f12, 12 49 | .set f13, 13 50 | .set f14, 14 51 | .set f15, 15 52 | .set f16, 16 53 | .set f17, 17 54 | .set f18, 18 55 | .set f19, 19 56 | .set f20, 20 57 | .set f21, 21 58 | .set f22, 22 59 | .set f23, 23 60 | .set f24, 24 61 | .set f25, 25 62 | .set f26, 26 63 | .set f27, 27 64 | .set f28, 28 65 | .set f29, 29 66 | .set f30, 30 67 | .set f31, 31 68 | 69 | # Graphics Quantization Registers (GQRs) 70 | .set qr0, 0 71 | .set qr1, 1 72 | .set qr2, 2 73 | .set qr3, 3 74 | .set qr4, 4 75 | .set qr5, 5 76 | .set qr6, 6 77 | .set qr7, 7 78 | 79 | # Special Purpose Registers (SPRs) 80 | .set XER, 1 81 | .set LR, 8 82 | .set CTR, 9 83 | .set DSISR, 18 84 | .set DAR, 19 85 | .set DEC, 22 86 | .set SDR1, 25 87 | .set SRR0, 26 88 | .set SRR1, 27 89 | .set SPRG0, 272 90 | .set SPRG1, 273 91 | .set SPRG2, 274 92 | .set SPRG3, 275 93 | .set EAR, 282 94 | .set PVR, 287 95 | .set IBAT0U, 528 96 | .set IBAT0L, 529 97 | .set IBAT1U, 530 98 | .set IBAT1L, 531 99 | .set IBAT2U, 532 100 | .set IBAT2L, 533 101 | .set IBAT3U, 534 102 | .set IBAT3L, 535 103 | .set DBAT0U, 536 104 | .set DBAT0L, 537 105 | .set DBAT1U, 538 106 | .set DBAT1L, 539 107 | .set DBAT2U, 540 108 | .set DBAT2L, 541 109 | .set DBAT3U, 542 110 | .set DBAT3L, 543 111 | .set GQR0, 912 112 | .set GQR1, 913 113 | .set GQR2, 914 114 | .set GQR3, 915 115 | .set GQR4, 916 116 | .set GQR5, 917 117 | .set GQR6, 918 118 | .set GQR7, 919 119 | .set HID2, 920 120 | .set WPAR, 921 121 | .set DMA_U, 922 122 | .set DMA_L, 923 123 | .set UMMCR0, 936 124 | .set UPMC1, 937 125 | .set UPMC2, 938 126 | .set USIA, 939 127 | .set UMMCR1, 940 128 | .set UPMC3, 941 129 | .set UPMC4, 942 130 | .set USDA, 943 131 | .set MMCR0, 952 132 | .set PMC1, 953 133 | .set PMC2, 954 134 | .set SIA, 955 135 | .set MMCR1, 956 136 | .set PMC3, 957 137 | .set PMC4, 958 138 | .set SDA, 959 139 | .set HID0, 1008 140 | .set HID1, 1009 141 | .set IABR, 1010 142 | .set DABR, 1013 143 | .set L2CR, 1017 144 | .set ICTC, 1019 145 | .set THRM1, 1020 146 | .set THRM2, 1021 147 | .set THRM3, 1022 148 | 149 | # Condition Register (CR) bits 150 | .set cr0lt, 0 151 | .set cr0gt, 1 152 | .set cr0eq, 2 153 | .set cr0un, 3 154 | .set cr1lt, 4 155 | .set cr1gt, 5 156 | .set cr1eq, 6 157 | .set cr1un, 7 158 | .set cr2lt, 8 159 | .set cr2gt, 9 160 | .set cr2eq, 10 161 | .set cr2un, 11 162 | .set cr3lt, 12 163 | .set cr3gt, 13 164 | .set cr3eq, 14 165 | .set cr3un, 15 166 | .set cr4lt, 16 167 | .set cr4gt, 17 168 | .set cr4eq, 18 169 | .set cr4un, 19 170 | .set cr5lt, 20 171 | .set cr5gt, 21 172 | .set cr5eq, 22 173 | .set cr5un, 23 174 | .set cr6lt, 24 175 | .set cr6gt, 25 176 | .set cr6eq, 26 177 | .set cr6un, 27 178 | .set cr7lt, 28 179 | .set cr7gt, 29 180 | .set cr7eq, 30 181 | .set cr7un, 31 182 | 183 | # Defines a sized symbol with function type. 184 | # Usage: 185 | # .fn my_function, local 186 | # /* asm here */ 187 | # .endfn my_function 188 | .macro .fn name, visibility=global 189 | .\visibility "\name" 190 | .type "\name", @function 191 | "\name": 192 | .endm 193 | 194 | .macro .endfn name 195 | .size "\name", . - "\name" 196 | .endm 197 | 198 | # Defines a sized symbol with object type. 199 | # Usage: 200 | # .obj my_object, local 201 | # /* data here */ 202 | # .endobj my_object 203 | .macro .obj name, visibility=global 204 | .\visibility "\name" 205 | .type "\name", @object 206 | "\name": 207 | .endm 208 | 209 | .macro .endobj name 210 | .size "\name", . - "\name" 211 | .endm 212 | 213 | # Defines a sized symbol without a type. 214 | # Usage: 215 | # .sym my_sym, local 216 | # /* anything here */ 217 | # .endsym my_sym 218 | .macro .sym name, visibility=global 219 | .\visibility "\name" 220 | "\name": 221 | .endm 222 | 223 | .macro .endsym name 224 | .size "\name", . - "\name" 225 | .endm 226 | 227 | # Generates a relative relocation against a symbol. 228 | # Usage: 229 | # .rel my_function, .L_label 230 | .macro .rel name, label 231 | .4byte "\name" + ("\label" - "\name") 232 | .endm 233 | -------------------------------------------------------------------------------- /assets/signatures/DVDLowWaitCoverClose.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: a2f2555c70cdf306d3c910de993f0cbb2be63823 3 | signature: kGAAAP/gAAA4AAAB/////5AAAAD/4AAAOAAAAP////+QAAAA/+AAADgAAAL/////PIDMAP////+QBGAE/////zhgAAH/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: DVDLowWaitCoverClose 7 | size: 40 8 | flags: 5 9 | section: .text 10 | - kind: Object 11 | name: Callback 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | - kind: Object 16 | name: WaitingCoverClose 17 | size: 4 18 | flags: 2 19 | section: .sbss 20 | - kind: Object 21 | name: StopAtNextInt 22 | size: 4 23 | flags: 2 24 | section: .sbss 25 | relocations: 26 | - offset: 0 27 | kind: PpcEmbSda21 28 | symbol: 1 29 | addend: 0 30 | - offset: 8 31 | kind: PpcEmbSda21 32 | symbol: 2 33 | addend: 0 34 | - offset: 16 35 | kind: PpcEmbSda21 36 | symbol: 3 37 | addend: 0 38 | - symbol: 0 39 | hash: fefe82e79bdcbcb64edd89f1c87f30ab3f4e94ff 40 | signature: OAAAAf////+QYAAA/+AAADxgzAD/////kAAAAP/gAAA4AAAA/////ziDYAD/////kAAAAP/gAAA4AAAC/////zhgAAH/////kAQABP////9OgAAg/////w== 41 | symbols: 42 | - kind: Function 43 | name: DVDLowWaitCoverClose 44 | size: 44 45 | flags: 1 46 | section: .text 47 | - kind: Object 48 | name: Callback 49 | size: 4 50 | flags: 2 51 | section: .sbss 52 | - kind: Object 53 | name: WaitingCoverClose 54 | size: 4 55 | flags: 2 56 | section: .sbss 57 | - kind: Object 58 | name: StopAtNextInt 59 | size: 4 60 | flags: 2 61 | section: .sbss 62 | relocations: 63 | - offset: 4 64 | kind: PpcEmbSda21 65 | symbol: 1 66 | addend: 0 67 | - offset: 12 68 | kind: PpcEmbSda21 69 | symbol: 2 70 | addend: 0 71 | - offset: 24 72 | kind: PpcEmbSda21 73 | symbol: 3 74 | addend: 0 75 | -------------------------------------------------------------------------------- /assets/signatures/DVDReset.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: ac491161099273428cf0376b1a9477680808e332 3 | signature: fAgCpv////+QAQAE/////5Qh//j/////SAAAAfwAAAM8YMwA/////zgAACr/////kANgAP////84g2AA/////zgAAAD/////gGNgBP////+QZAAE/////5AAAAD/4AAAkAAAAP/gAACAAQAM/////zghAAj/////fAgDpv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: DVDReset 7 | size: 68 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: DVDLowReset 12 | size: 0 13 | flags: 1 14 | section: .text 15 | - kind: Object 16 | name: ResetRequired 17 | size: 4 18 | flags: 2 19 | section: .sbss 20 | - kind: Object 21 | name: ResumeFromHere 22 | size: 4 23 | flags: 2 24 | section: .sbss 25 | relocations: 26 | - offset: 12 27 | kind: PpcRel24 28 | symbol: 1 29 | addend: 0 30 | - offset: 44 31 | kind: PpcEmbSda21 32 | symbol: 2 33 | addend: 0 34 | - offset: 48 35 | kind: PpcEmbSda21 36 | symbol: 3 37 | addend: 0 38 | - symbol: 0 39 | hash: fb707bf800f0c87d16e6d0a3161023d8ae500dd6 40 | signature: fAgCpv////+QAQAE/////5Qh//j/////SAAAAfwAAAM4AAAq/////zxgzAD/////kANgAP////88YMwA/////4ADYAT/////PGDMAP////+QA2AE/////zgAAAD/////kAAAAP/gAAA4AAAA/////5AAAAD/4AAAgAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 41 | symbols: 42 | - kind: Function 43 | name: DVDReset 44 | size: 76 45 | flags: 1 46 | section: .text 47 | - kind: Function 48 | name: DVDLowReset 49 | size: 0 50 | flags: 5 51 | section: .text 52 | - kind: Object 53 | name: ResetRequired 54 | size: 4 55 | flags: 2 56 | section: .sbss 57 | - kind: Object 58 | name: ResumeFromHere 59 | size: 4 60 | flags: 2 61 | section: .sbss 62 | relocations: 63 | - offset: 12 64 | kind: PpcRel24 65 | symbol: 1 66 | addend: 0 67 | - offset: 48 68 | kind: PpcEmbSda21 69 | symbol: 2 70 | addend: 0 71 | - offset: 56 72 | kind: PpcEmbSda21 73 | symbol: 3 74 | addend: 0 75 | -------------------------------------------------------------------------------- /assets/signatures/DecrementerExceptionHandler.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 6c977557abdae5d2f6839f329a69540fb67dd446 3 | signature: kAQAAP////+QJAAE/////5BEAAj/////vMQAGP////98EeKm/////5AEAaj/////fBLipv////+QBAGs/////3wT4qb/////kAQBsP////98FOKm/////5AEAbT/////fBXipv////+QBAG4/////3wW4qb/////kAQBvP////98F+Km/////5AEAcD/////SAAAAPwAAAM= 4 | symbols: 5 | - kind: Function 6 | name: DecrementerExceptionHandler 7 | size: 76 8 | flags: 2 9 | section: .text 10 | - kind: Function 11 | name: DecrementerExceptionCallback 12 | size: 0 13 | flags: 2 14 | section: .text 15 | relocations: 16 | - offset: 72 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: e4dc0b95d3d525555dd48d098822461b33b5b1a8 22 | signature: kAQAAP////+QJAAE/////5BEAAj/////vMQAGP////98EeKm/////5AEAaj/////fBLipv////+QBAGs/////3wT4qb/////kAQBsP////98FOKm/////5AEAbT/////fBXipv////+QBAG4/////3wW4qb/////kAQBvP////98F+Km/////5AEAcD/////lCH/+P////9IAAAA/AAAAw== 23 | symbols: 24 | - kind: Function 25 | name: DecrementerExceptionHandler 26 | size: 80 27 | flags: 2 28 | section: .text 29 | - kind: Function 30 | name: DecrementerExceptionCallback 31 | size: 0 32 | flags: 2 33 | section: .text 34 | relocations: 35 | - offset: 76 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | -------------------------------------------------------------------------------- /assets/signatures/ESP_GetTitleId.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 29176266331eb4f8704bc71665c4ca1b90eea2c1 3 | signature: VCsG/v////98LAt4/////yFr/sD/////fCFZbv////98CAKm/////5AMAAT/////OOEA8P////+T7P/8/////3x/G3j/////gIAAAP/gAAAsBAAA/////0GAABD/////OAAAAP////98AwBA/////0CCAAz/////OGD8B/////9IAABA/////zhhACD/////OAAACP////+QYQDw/////3yDI3j/////OIAAIP////84oAAA/////5ABAPT/////OMAAAf////9IAAAB/AAAAywDAAD/////QIIAFP////+AAQAg/////4CBACT/////kJ8ABP////+QHwAA/////4FBAAD/////gAoABP////+D6v/8/////3wIA6b/////fUFTeP////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: ESP_GetTitleId 7 | size: 152 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: __esFd 12 | size: 4 13 | flags: 2 14 | section: .sdata 15 | - kind: Function 16 | name: IOS_Ioctlv 17 | size: 0 18 | flags: 1 19 | section: .text 20 | relocations: 21 | - offset: 36 22 | kind: PpcEmbSda21 23 | symbol: 1 24 | addend: 0 25 | - offset: 100 26 | kind: PpcRel24 27 | symbol: 2 28 | addend: 0 29 | - symbol: 0 30 | hash: 04597748a872826b93bedaff192420160e9d09f7 31 | signature: VCsG/v////8ha/7A/////3wsC3j/////fCFZbv////98CAKm/////5AMAAT/////k+z//P////+TzP/4/////5Os//T/////fH0beP////87wAAA/////zvhAPD/////gAAAAP/gAAAsAAAA/////0GAABD/////OAAAAP////98HQBA/////0CCAAz/////O8D8B/////9IAABI/////zgBACD/////kB8AAP////84AAAI/////5AfAAT/////gGAAAP/gAAA4gAAg/////zigAAD/////OMAAAf////9/5/t4/////0gAAAH8AAADfH4beP////8sHgAA/////0CCABT/////gAEAIP////+AYQAk/////5B9AAT/////kB0AAP////9/w/N4/////4FBAAD/////g+r//P////+Dyv/4/////4Oq//T/////gAoABP////98CAOm/////31BU3j/////ToAAIP////8= 32 | symbols: 33 | - kind: Function 34 | name: ESP_GetTitleId 35 | size: 184 36 | flags: 1 37 | section: .text 38 | - kind: Object 39 | name: __esFd 40 | size: 4 41 | flags: 2 42 | section: .sdata 43 | - kind: Function 44 | name: IOS_Ioctlv 45 | size: 0 46 | flags: 1 47 | section: .text 48 | relocations: 49 | - offset: 48 50 | kind: PpcEmbSda21 51 | symbol: 1 52 | addend: 0 53 | - offset: 96 54 | kind: PpcEmbSda21 55 | symbol: 1 56 | addend: 0 57 | - offset: 116 58 | kind: PpcRel24 59 | symbol: 2 60 | addend: 0 61 | -------------------------------------------------------------------------------- /assets/signatures/IOS_Open.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 6023916e799ae851d6b0821b68c83ae1e758fe85 3 | signature: lCH/4P////98CAKm/////5ABACT/////k+EAHP////+QYQAI/////5CBAAz/////O+AAAP////84YAAA/////ziAAAH/////OKAAAP////84wAAA/////zjhABD/////SAAAAfwAAAN8fxt4/////ywfAAD/////QIIAMP////+AYQAQ/////4CBAAj/////gKEADP////9IAAAB/AAAA3x/G3j/////LB8AAP////9AggAU/////4BhABD/////OIAAAP////9IAAAB/AAAA3x/G3j/////f+P7eP////+D4QAc/////4ABACT/////fAgDpv////84IQAg/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: IOS_Open 7 | size: 132 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: __ios_Ipc1 12 | size: 0 13 | flags: 2 14 | section: .text 15 | - kind: Function 16 | name: __ios_Open 17 | size: 0 18 | flags: 2 19 | section: .text 20 | - kind: Function 21 | name: __ios_Ipc2 22 | size: 0 23 | flags: 2 24 | section: .text 25 | relocations: 26 | - offset: 48 27 | kind: PpcRel24 28 | symbol: 1 29 | addend: 0 30 | - offset: 76 31 | kind: PpcRel24 32 | symbol: 2 33 | addend: 0 34 | - offset: 100 35 | kind: PpcRel24 36 | symbol: 3 37 | addend: 0 38 | - symbol: 0 39 | hash: dbc519205df008731e1195cae0ab139600b07598 40 | signature: lCH/4P////98CAKm/////5ABACT/////NAEACP////+T4QAc/////5PBABj/////O8AAAP////+ToQAU/////3ydI3j/////k4EAEP////98fBt4/////0CCAAz/////O8D//P////9IAABM/////4BgAAD/4AAAOIAAQP////84oAAg/////0gAAAH8AAADLAMAAP////+QYQAI/////0CCAAz/////O8D/6v////9IAAAo/////zigAAD/////OAAAAf////+QowAg/////4CBAAj/////kKQAJP////+AgQAI/////5CkACj/////kAMAAP////+QowAI/////yweAAD/////QIIAeP////+D4QAI/////zvAAAD/////LB8AAP////9AggAM/////zvA//z/////SAAASP////9/g+N4/////ziAAED/////SAAACP////84YwAB/////4gDAAD/////LAAAAP////9BggAQ/////ywEAAD/////OIT///////9Agv/o/////3ycGFD/////f4PjeP////84hAAB/////0gAAAH8AAADPByAAP////+QHwAM/////5O/ABD/////LB4AAP////9AggAU/////4BhAAj/////OIAAAP////9IAAAB/AAAA3x+G3j/////f8PzeP////+D4QAc/////4PBABj/////g6EAFP////+DgQAQ/////4ABACT/////fAgDpv////84IQAg/////06AACD///// 41 | symbols: 42 | - kind: Function 43 | name: IOS_Open 44 | size: 288 45 | flags: 1 46 | section: .text 47 | - kind: Object 48 | name: hid 49 | size: 4 50 | flags: 2 51 | section: .sdata 52 | - kind: Function 53 | name: iosAllocAligned 54 | size: 0 55 | flags: 1 56 | section: .text 57 | - kind: Function 58 | name: DCFlushRange 59 | size: 0 60 | flags: 1 61 | section: .text 62 | - kind: Function 63 | name: __ios_Ipc2 64 | size: 0 65 | flags: 2 66 | section: .text 67 | relocations: 68 | - offset: 56 69 | kind: PpcEmbSda21 70 | symbol: 1 71 | addend: 0 72 | - offset: 68 73 | kind: PpcRel24 74 | symbol: 2 75 | addend: 0 76 | - offset: 212 77 | kind: PpcRel24 78 | symbol: 3 79 | addend: 0 80 | - offset: 244 81 | kind: PpcRel24 82 | symbol: 4 83 | addend: 0 84 | - symbol: 0 85 | hash: 364b5f41a5e0b21e8c9592bddf46d689a4a14d22 86 | signature: lCH/4P////98CAKm/////5ABACT/////NAEACP////+T4QAc/////5PBABj/////O8AAAP////+ToQAU/////3ydI3j/////k4EAEP////98fBt4/////0CCAAz/////O8D//P////9IAABM/////4BgAAD/4AAAOIAAQP////84oAAg/////0gAAAH8AAADLAMAAP////+QYQAI/////0CCAAz/////O8D/6v////9IAAAo/////zigAAD/////kKMAIP////84AAAB/////4CBAAj/////kKQAJP////+AgQAI/////5CkACj/////kAMAAP////+QowAI/////yweAAD/////QIIAfP////+D4QAI/////zvAAAD/////LB8AAP////9AggAM/////zvA//z/////SAAATP////9/g+N4/////ziAAED/////SAAADP////9gAAAA/////zhjAAH/////iAMAAP////8sAAAA/////0GCABD/////LAQAAP////84hP///////0CC/+j/////fJwYUP////9/g+N4/////ziEAAH/////SAAAAfwAAAM8HIAA/////5AfAAz/////k78AEP////8sHgAA/////0CCABT/////gGEACP////84gAAA/////0gAAAH8AAADfH4beP////9/w/N4/////4PhABz/////g8EAGP////+DoQAU/////4OBABD/////gAEAJP////98CAOm/////zghACD/////ToAAIP////8= 87 | symbols: 88 | - kind: Function 89 | name: IOS_Open 90 | size: 292 91 | flags: 1 92 | section: .text 93 | - kind: Object 94 | name: hid 95 | size: 4 96 | flags: 2 97 | section: .sdata 98 | - kind: Function 99 | name: iosAllocAligned 100 | size: 0 101 | flags: 1 102 | section: .text 103 | - kind: Function 104 | name: DCFlushRange 105 | size: 0 106 | flags: 1 107 | section: .text 108 | - kind: Function 109 | name: __ios_Ipc2 110 | size: 0 111 | flags: 2 112 | section: .text 113 | relocations: 114 | - offset: 56 115 | kind: PpcEmbSda21 116 | symbol: 1 117 | addend: 0 118 | - offset: 68 119 | kind: PpcRel24 120 | symbol: 2 121 | addend: 0 122 | - offset: 216 123 | kind: PpcRel24 124 | symbol: 3 125 | addend: 0 126 | - offset: 248 127 | kind: PpcRel24 128 | symbol: 4 129 | addend: 0 130 | -------------------------------------------------------------------------------- /assets/signatures/InitMetroTRK.yml: -------------------------------------------------------------------------------- 1 | # If this is in a separate section, it's .dbgtext 2 | # Otherwise .text 3 | - symbol: 0 4 | hash: 208efe0e06985ffb4916ba3ac472dd2d8144f108 5 | signature: OCH//P////+QYQAA/////zxgAAD//wAAYGMAAP//AAC8AwAA/////4CBAAD/////OCEABP////+QIwAE/////5CDAAz/////fIgCpv////+QgwCE/////5CDAID/////fIAAJv////+QgwCI/////3yAAKb/////YIOAAP////9oY4AA/////3xgAST/////fJsDpv////9IAAAB/AAAAzxgAAD//wAAYGMAAP//AAC4AwAA/////zgAAAD/////fBL7pv////98Ffum/////zwgAAD//wAAYCEAAP//AAB8oyt4/////0gAAAH8AAADLAMAAf////9AggAU/////4CDAIT/////fIgDpv////+4AwAA/////06AACD/////SAAAAPwAAAM= 6 | symbols: 7 | - kind: Function 8 | name: InitMetroTRK 9 | size: 148 10 | flags: 1 11 | section: .dbgtext 12 | - kind: Object 13 | name: gTRKCPUState 14 | size: 1072 15 | flags: 1 16 | section: .bss 17 | - kind: Function 18 | name: TRKSaveExtended1Block 19 | size: 0 20 | flags: 1 21 | section: .dbgtext 22 | - kind: Unknown 23 | name: _db_stack_addr 24 | size: 0 25 | flags: 1 26 | section: null 27 | - kind: Function 28 | name: InitMetroTRKCommTable 29 | size: 0 30 | flags: 1 31 | section: .dbgtext 32 | - kind: Function 33 | name: TRK_main 34 | size: 0 35 | flags: 1 36 | section: .dbgtext 37 | relocations: 38 | - offset: 8 39 | kind: PpcAddr16Hi 40 | symbol: 1 41 | addend: 0 42 | - offset: 12 43 | kind: PpcAddr16Lo 44 | symbol: 1 45 | addend: 0 46 | - offset: 76 47 | kind: PpcRel24 48 | symbol: 2 49 | addend: 0 50 | - offset: 80 51 | kind: PpcAddr16Hi 52 | symbol: 1 53 | addend: 0 54 | - offset: 84 55 | kind: PpcAddr16Lo 56 | symbol: 1 57 | addend: 0 58 | - offset: 104 59 | kind: PpcAddr16Hi 60 | symbol: 3 61 | addend: 0 62 | - offset: 108 63 | kind: PpcAddr16Lo 64 | symbol: 3 65 | addend: 0 66 | - offset: 116 67 | kind: PpcRel24 68 | symbol: 4 69 | addend: 0 70 | - offset: 144 71 | kind: PpcRel24 72 | symbol: 5 73 | addend: 0 74 | - symbol: 0 75 | hash: 23fc7c31e89a118810ba6c673e78695dc1cb1de9 76 | signature: OCH//P////+QYQAA/////zxgAAD//wAAYGMAAP//AAC8AwAA/////4CBAAD/////OCEABP////+QIwAE/////5CDAAz/////fIgCpv////+QgwCE/////5CDAID/////fIAAJv////+QgwCI/////3yAAKb/////YIOAAP////9oY4AA/////3xgAST/////fJsDpv////9IAAAB/AAAAzxgAAD//wAAYGMAAP//AAC4AwAA/////zgAAAD/////fBL7pv////98Ffum/////zwgAAD//wAAYCEAAP//AAB8oyt4/////0gAAAH8AAADLAMAAf////9AggAU/////4CDAIT/////fIgDpv////+4AwAA/////06AACD/////SAAAAPwAAANOgAAg/////w== 77 | symbols: 78 | - kind: Function 79 | name: InitMetroTRK 80 | size: 152 81 | flags: 1 82 | section: .dbgtext 83 | - kind: Object 84 | name: gTRKCPUState 85 | size: 1072 86 | flags: 1 87 | section: .bss 88 | - kind: Function 89 | name: TRKSaveExtended1Block 90 | size: 0 91 | flags: 1 92 | section: .dbgtext 93 | - kind: Unknown 94 | name: _db_stack_addr 95 | size: 0 96 | flags: 1 97 | section: null 98 | - kind: Function 99 | name: InitMetroTRKCommTable 100 | size: 0 101 | flags: 1 102 | section: .dbgtext 103 | - kind: Function 104 | name: TRK_main 105 | size: 0 106 | flags: 1 107 | section: .dbgtext 108 | relocations: 109 | - offset: 8 110 | kind: PpcAddr16Hi 111 | symbol: 1 112 | addend: 0 113 | - offset: 12 114 | kind: PpcAddr16Lo 115 | symbol: 1 116 | addend: 0 117 | - offset: 76 118 | kind: PpcRel24 119 | symbol: 2 120 | addend: 0 121 | - offset: 80 122 | kind: PpcAddr16Hi 123 | symbol: 1 124 | addend: 0 125 | - offset: 84 126 | kind: PpcAddr16Lo 127 | symbol: 1 128 | addend: 0 129 | - offset: 104 130 | kind: PpcAddr16Hi 131 | symbol: 3 132 | addend: 0 133 | - offset: 108 134 | kind: PpcAddr16Lo 135 | symbol: 3 136 | addend: 0 137 | - offset: 116 138 | kind: PpcRel24 139 | symbol: 4 140 | addend: 0 141 | - offset: 144 142 | kind: PpcRel24 143 | symbol: 5 144 | addend: 0 145 | -------------------------------------------------------------------------------- /assets/signatures/NANDSetAutoErrorMessaging.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4a3dea7febf021321ed40143f2f8f98045ed0d34 3 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////98fxt4/////0gAAAH8AAADgKAAAP/gAAAsHwAA/////ziAAAD/////fAUA0P////98ACt4/////1QfD/7/////QYIADP////88gAAA//8AADiEAAD//wAAkIAAAP/gAABIAAAB/AAAA3/j+3j/////g+EADP////+AAQAU/////3wIA6b/////OCEAEP////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: NANDSetAutoErrorMessaging 7 | size: 92 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: OSDisableInterrupts 12 | size: 0 13 | flags: 1 14 | section: .text 15 | - kind: Object 16 | name: NANDErrorFunc 17 | size: 4 18 | flags: 2 19 | section: .sbss 20 | - kind: Function 21 | name: __NANDShowErrorMessage 22 | size: 0 23 | flags: 2 24 | section: .text 25 | - kind: Function 26 | name: OSRestoreInterrupts 27 | size: 0 28 | flags: 1 29 | section: .text 30 | relocations: 31 | - offset: 20 32 | kind: PpcRel24 33 | symbol: 1 34 | addend: 0 35 | - offset: 24 36 | kind: PpcEmbSda21 37 | symbol: 2 38 | addend: 0 39 | - offset: 52 40 | kind: PpcAddr16Ha 41 | symbol: 3 42 | addend: 0 43 | - offset: 56 44 | kind: PpcAddr16Lo 45 | symbol: 3 46 | addend: 0 47 | - offset: 60 48 | kind: PpcEmbSda21 49 | symbol: 2 50 | addend: 0 51 | - offset: 64 52 | kind: PpcRel24 53 | symbol: 4 54 | addend: 0 55 | - symbol: 0 56 | hash: 36341f6ac94fe65cf46272a6cc8531246d067277 57 | signature: lCH/4P////98CAKm/////5ABACT/////k+EAHP////+TwQAY/////5OhABT/////k4EAEP////+QYQAI/////0gAAAH8AAADfH8beP////+AAAAA/+AAACwAAAD/////QYIADP////87oAAB/////0gAAAj/////O6AAAP////9/vut4/////4ABAAj/////LAAAAP////9BggAQ/////zxgAAD//wAAO4MAAP//AABIAAAI/////zuAAAD/////k4AAAP/gAAB/4/t4/////0gAAAH8AAADf8PzeP////+D4QAc/////4PBABj/////g6EAFP////+DgQAQ/////4ABACT/////fAgDpv////84IQAg/////06AACD///// 58 | symbols: 59 | - kind: Function 60 | name: NANDSetAutoErrorMessaging 61 | size: 144 62 | flags: 1 63 | section: .text 64 | - kind: Function 65 | name: OSDisableInterrupts 66 | size: 0 67 | flags: 1 68 | section: .text 69 | - kind: Object 70 | name: NANDErrorFunc 71 | size: 4 72 | flags: 2 73 | section: .sbss 74 | - kind: Function 75 | name: __NANDShowErrorMessage 76 | size: 0 77 | flags: 2 78 | section: .text 79 | - kind: Function 80 | name: OSRestoreInterrupts 81 | size: 0 82 | flags: 1 83 | section: .text 84 | relocations: 85 | - offset: 32 86 | kind: PpcRel24 87 | symbol: 1 88 | addend: 0 89 | - offset: 40 90 | kind: PpcEmbSda21 91 | symbol: 2 92 | addend: 0 93 | - offset: 80 94 | kind: PpcAddr16Ha 95 | symbol: 3 96 | addend: 0 97 | - offset: 84 98 | kind: PpcAddr16Lo 99 | symbol: 3 100 | addend: 0 101 | - offset: 96 102 | kind: PpcEmbSda21 103 | symbol: 2 104 | addend: 0 105 | - offset: 104 106 | kind: PpcRel24 107 | symbol: 4 108 | addend: 0 109 | -------------------------------------------------------------------------------- /assets/signatures/OSDefaultExceptionHandler.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 1f40a0e9104d8a3d93a7d76126d0214d7f4f1a9c 3 | signature: kAQAAP////+QJAAE/////5BEAAj/////vMQAGP////98EeKm/////5AEAaj/////fBLipv////+QBAGs/////3wT4qb/////kAQBsP////98FOKm/////5AEAbT/////fBXipv////+QBAG4/////3wW4qb/////kAQBvP////98F+Km/////5AEAcD/////fLICpv////980wKm/////0gAAAD8AAAD 4 | symbols: 5 | - kind: Function 6 | name: OSDefaultExceptionHandler 7 | size: 84 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: __OSUnhandledException 12 | size: 0 13 | flags: 1 14 | section: .text 15 | relocations: 16 | - offset: 80 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 9d37c8031b331d5e70bf7c323ab01cc75101dc04 22 | signature: kAQAAP////+QJAAE/////5BEAAj/////vMQAGP////98EeKm/////5AEAaj/////fBLipv////+QBAGs/////3wT4qb/////kAQBsP////98FOKm/////5AEAbT/////fBXipv////+QBAG4/////3wW4qb/////kAQBvP////98F+Km/////5AEAcD/////fLICpv////980wKm/////5Qh//j/////SAAAAPwAAAM= 23 | symbols: 24 | - kind: Function 25 | name: OSDefaultExceptionHandler 26 | size: 88 27 | flags: 1 28 | section: .text 29 | - kind: Function 30 | name: __OSUnhandledException 31 | size: 0 32 | flags: 1 33 | section: .text 34 | relocations: 35 | - offset: 84 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | -------------------------------------------------------------------------------- /assets/signatures/OSExceptionVector.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 3d7b32329cadb2fdefaf64fc81291e03178f6e7d 3 | signature: fJBDpv////+AgADA/////5BkAAz/////fHBCpv////+QZAAQ/////5CkABT/////oGQBov////9gYwAC/////7BkAaL/////fGAAJv////+QZACA/////3xoAqb/////kGQAhP////98aQKm/////5BkAIj/////fGECpv////+QZACM/////3x6Aqb/////kGQBmP////98ewKm/////5BkAZz/////fGUbeP////9gAAAA/////3xgAKb/////YGMAMP////98ewOm/////zhgAAD/////gIAA1P////9UpQe9/////0CCABT/////PKAAAP//AAA4pQAA//8AAHy6A6b/////TAAAZP////9UZRW6/////4ClMAD/////fLoDpv////9MAABk/////2AAAAD///// 4 | symbols: 5 | - kind: Function 6 | name: OSExceptionVector 7 | size: 156 8 | flags: 2 9 | section: .text 10 | - kind: Function 11 | name: OSDefaultExceptionHandler 12 | size: 0 13 | flags: 1 14 | section: .text 15 | relocations: 16 | - offset: 120 17 | kind: PpcAddr16Ha 18 | symbol: 1 19 | addend: 0 20 | - offset: 124 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | -------------------------------------------------------------------------------- /assets/signatures/OSReport.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: ee4785a7d0280ffb2f4b901bd30203d43c5b67ef 3 | signature: lCH/kP////9AhgAk/////9ghACj/////2EEAMP/////YYQA4/////9iBAED/////2KEASP/////YwQBQ/////9jhAFj/////2QEAYP////+QYQAI/////5CBAAz/////kKEAEP////+QwQAU/////5DhABj/////kQEAHP////+RIQAg/////5FBACT/////OCEAcP////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: OSReport 7 | size: 80 8 | flags: 1 9 | section: .text 10 | relocations: [] 11 | - symbol: 0 12 | hash: f27f3e1be708a93a1e3e68f1248444597bbeb53d 13 | signature: fAgCpv////+QAQAE/////5Qh/4j/////QIYAJP/////YIQAo/////9hBADD/////2GEAOP/////YgQBA/////9ihAEj/////2MEAUP/////Y4QBY/////9kBAGD/////kGEACP////88AAEA/////5CBAAz/////OIEAbP////+QoQAQ/////5DBABT/////kOEAGP////+RAQAc/////5EhACD/////kUEAJP////+QAQBs/////zgBAID/////kAEAcP////84AQAI/////5ABAHT/////SAAAAfwAAAOAAQB8/////zghAHj/////fAgDpv////9OgAAg/////w== 14 | symbols: 15 | - kind: Function 16 | name: OSReport 17 | size: 128 18 | flags: 1 19 | section: .text 20 | - kind: Function 21 | name: vprintf 22 | size: 0 23 | flags: 1 24 | section: .text 25 | relocations: 26 | - offset: 108 27 | kind: PpcRel24 28 | symbol: 1 29 | addend: 0 30 | - symbol: 0 31 | hash: 12c85922a2fe4b7b5064d98e5121c48505900b2f 32 | signature: lCH/gP////98CAKm/////5ABAIT/////QIYAJP/////YIQAo/////9hBADD/////2GEAOP/////YgQBA/////9ihAEj/////2MEAUP/////Y4QBY/////9kBAGD/////OWEAiP////84AQAI/////z2AAQD/////kIEADP////84gQBo/////5BhAAj/////kKEAEP////+QwQAU/////5DhABj/////kQEAHP////+RIQAg/////5FBACT/////kYEAaP////+RYQBs/////5ABAHD/////SAAAAfwAAAOAAQCE/////3wIA6b/////OCEAgP////9OgAAg/////w== 33 | symbols: 34 | - kind: Function 35 | name: OSReport 36 | size: 128 37 | flags: 5 38 | section: .text 39 | - kind: Function 40 | name: vprintf 41 | size: 0 42 | flags: 1 43 | section: .text 44 | relocations: 45 | - offset: 108 46 | kind: PpcRel24 47 | symbol: 1 48 | addend: 0 49 | - symbol: 0 50 | hash: fb8b066032761e2ed53ef1949c2c3fd5cc773f4e 51 | signature: lCH/gP////98CAKm/////5ABAIT/////k+EAfP////9AhgAk/////9ghACj/////2EEAMP/////YYQA4/////9iBAED/////2KEASP/////YwQBQ/////9jhAFj/////2QEAYP////85YQCI/////zgBAAj/////PYABAP////+QYQAI/////zvhAGj/////kIEADP////9/5Pt4/////5ChABD/////kMEAFP////+Q4QAY/////5EBABz/////kSEAIP////+RQQAk/////5GBAGj/////kWEAbP////+QAQBw/////0gAAAH8AAADgAEAhP////+D4QB8/////3wIA6b/////OCEAgP////9OgAAg/////w== 52 | symbols: 53 | - kind: Function 54 | name: OSReport 55 | size: 140 56 | flags: 5 57 | section: .text 58 | - kind: Function 59 | name: vprintf 60 | size: 0 61 | flags: 1 62 | section: .text 63 | relocations: 64 | - offset: 116 65 | kind: PpcRel24 66 | symbol: 1 67 | addend: 0 68 | - symbol: 0 69 | hash: 8b4d03324cf93acdedafe4612efa769177cd224d 70 | signature: fAgCpv////+QAQAE/////5Qh/4D/////k+EAfP////9AhgAk/////9ghACj/////2EEAMP/////YYQA4/////9iBAED/////2KEASP/////YwQBQ/////9jhAFj/////2QEAYP////+QYQAI/////5CBAAz/////kKEAEP////+QwQAU/////5DhABj/////kQEAHP////+RIQAg/////5FBACT/////fH8beP////88AAEA/////5ABAGz/////OAEAiP////+QAQBw/////zgBAAj/////kAEAdP////84fwAA/////ziBAGz/////SAAAAfwAAAOAAQCE/////4PhAHz/////OCEAgP////98CAOm/////06AACD///// 71 | symbols: 72 | - kind: Function 73 | name: OSReport 74 | size: 144 75 | flags: 5 76 | section: .text 77 | - kind: Function 78 | name: vprintf 79 | size: 0 80 | flags: 1 81 | section: .text 82 | relocations: 83 | - offset: 120 84 | kind: PpcRel24 85 | symbol: 1 86 | addend: 0 87 | - symbol: 0 88 | hash: ab61e2a35076809d04b903f4bf9ca4b8c80de491 89 | signature: lCH/gP////98CAKm/////5ABAIT/////k+EAfP////98fxt4/////0CGACT/////2CEAKP/////YQQAw/////9hhADj/////2IEAQP/////YoQBI/////9jBAFD/////2OEAWP/////ZAQBg/////5BhAAj/////kIEADP////+QoQAQ/////5DBABT/////kOEAGP////+RAQAc/////5EhACD/////kUEAJP////84YQBo/////zwAAQD/////kAMAAP////84AQCI/////5ADAAT/////OAEACP////+QAwAI/////3/j+3j/////OIEAaP////9IAAAB/AAAA4PhAHz/////gAEAhP////98CAOm/////zghAID/////ToAAIP////8= 90 | symbols: 91 | - kind: Function 92 | name: OSReport 93 | size: 148 94 | flags: 5 95 | section: .text 96 | - kind: Function 97 | name: vprintf 98 | size: 0 99 | flags: 1 100 | section: .text 101 | relocations: 102 | - offset: 124 103 | kind: PpcRel24 104 | symbol: 1 105 | addend: 0 -------------------------------------------------------------------------------- /assets/signatures/OSSetArenaHi.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4ad80274e02f917e972ea9c1eff1247e22bc4803 3 | signature: kGAAAP/gAABOgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: OSSetArenaHi 7 | size: 8 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: __OSArenaHi 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 23860b6bb06db3b2406b4046270c6fae85b8eed4 22 | signature: lCH/8P////98CAKm/////5ABABT/////kGEACP////+AYQAI/////0gAAAH8AAADgAEAFP////98CAOm/////zghABD/////ToAAIP////8= 23 | symbols: 24 | - kind: Function 25 | name: OSSetArenaHi 26 | size: 40 27 | flags: 1 28 | section: .text 29 | - kind: Function 30 | name: OSSetMEM1ArenaHi 31 | size: 0 32 | flags: 1 33 | section: .text 34 | relocations: 35 | - offset: 20 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | -------------------------------------------------------------------------------- /assets/signatures/OSSetArenaLo.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4ad80274e02f917e972ea9c1eff1247e22bc4803 3 | signature: kGAAAP/gAABOgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: OSSetArenaLo 7 | size: 8 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: __OSArenaLo 12 | size: 4 13 | flags: 2 14 | section: .sdata 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 23860b6bb06db3b2406b4046270c6fae85b8eed4 22 | signature: lCH/8P////98CAKm/////5ABABT/////kGEACP////+AYQAI/////0gAAAH8AAADgAEAFP////98CAOm/////zghABD/////ToAAIP////8= 23 | symbols: 24 | - kind: Function 25 | name: OSSetArenaLo 26 | size: 40 27 | flags: 1 28 | section: .text 29 | - kind: Function 30 | name: OSSetMEM1ArenaLo 31 | size: 0 32 | flags: 1 33 | section: .text 34 | relocations: 35 | - offset: 20 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | -------------------------------------------------------------------------------- /assets/signatures/OSSetMEM1ArenaHi.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4ad80274e02f917e972ea9c1eff1247e22bc4803 3 | signature: kGAAAP/gAABOgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: OSSetMEM1ArenaHi 7 | size: 8 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: __OSArenaHi 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | -------------------------------------------------------------------------------- /assets/signatures/OSSetMEM1ArenaLo.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4ad80274e02f917e972ea9c1eff1247e22bc4803 3 | signature: kGAAAP/gAABOgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: OSSetMEM1ArenaLo 7 | size: 8 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: __OSArenaLo 12 | size: 4 13 | flags: 2 14 | section: .sdata 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | -------------------------------------------------------------------------------- /assets/signatures/OSSetMEM2ArenaHi.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4ad80274e02f917e972ea9c1eff1247e22bc4803 3 | signature: kGAAAP/gAABOgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: OSSetMEM2ArenaHi 7 | size: 8 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: s_mem2ArenaHi 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | -------------------------------------------------------------------------------- /assets/signatures/OSSetMEM2ArenaLo.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4ad80274e02f917e972ea9c1eff1247e22bc4803 3 | signature: kGAAAP/gAABOgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: OSSetMEM2ArenaLo 7 | size: 8 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: s_mem2ArenaLo 12 | size: 4 13 | flags: 2 14 | section: .sdata 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | -------------------------------------------------------------------------------- /assets/signatures/OSSwitchFPUContext.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: d2bf04a5bce72b989d106a6c6c23c7c3966a5f83 3 | signature: fKAApv////9gpSAA/////3ygAST/////TAABLP////+ApAGc/////2ClIAD/////fLsDpv////88YIAA/////4CjANj/////kIMA2P////98BSAA/////0GCABT/////LAUAAP////9BggAI/////0gAAAH8AAADSAAAAfwAAAOAZACA/////3xv8SD/////gGQAhP////98aAOm/////4BkAZj/////fHoDpv////+AZACI/////3xpA6b/////gGQAjP////98YQOm/////6BkAaL/////VGMH+v////+wZAGi/////4CkABT/////gGQADP////+AhAAQ/////0wAAGT///// 4 | symbols: 5 | - kind: Function 6 | name: OSSwitchFPUContext 7 | size: 132 8 | flags: 2 9 | section: .text 10 | - kind: Function 11 | name: __OSSaveFPUContext 12 | size: 0 13 | flags: 2 14 | section: .text 15 | - kind: Function 16 | name: __OSLoadFPUContext 17 | size: 0 18 | flags: 2 19 | section: .text 20 | relocations: 21 | - offset: 56 22 | kind: PpcRel24 23 | symbol: 1 24 | addend: 0 25 | - offset: 60 26 | kind: PpcRel24 27 | symbol: 2 28 | addend: 0 29 | -------------------------------------------------------------------------------- /assets/signatures/TRKEXICallBack.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: adc2603b85fc094a88704359450171b0524bd6f1 3 | signature: fAgCpv////+QAQAE/////5Qh//D/////k+EADP////98nyN4/////0gAAAH8AAADf+P7eP////84gAUA/////0gAAAH8AAADg+EADP////84IQAQ/////4ABAAT/////fAgDpv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: TRKEXICallBack 7 | size: 56 8 | flags: 1 9 | section: null 10 | - kind: Function 11 | name: OSEnableScheduler 12 | size: 0 13 | flags: 1 14 | section: .text 15 | - kind: Function 16 | name: TRKLoadContext 17 | size: 0 18 | flags: 1 19 | section: null 20 | relocations: 21 | - offset: 20 22 | kind: PpcRel24 23 | symbol: 1 24 | addend: 0 25 | - offset: 32 26 | kind: PpcRel24 27 | symbol: 2 28 | addend: 0 29 | - symbol: 0 30 | hash: 275dee48926851e503006205088214bed1847031 31 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////98nyN4/////0gAAAH8AAADf+P7eP////84gAUA/////0gAAAH8AAADgAEAFP////+D4QAM/////3wIA6b/////OCEAEP////9OgAAg/////w== 32 | symbols: 33 | - kind: Function 34 | name: TRKEXICallBack 35 | size: 56 36 | flags: 1 37 | section: null 38 | - kind: Function 39 | name: OSEnableScheduler 40 | size: 0 41 | flags: 1 42 | section: .text 43 | - kind: Function 44 | name: TRKLoadContext 45 | size: 0 46 | flags: 1 47 | section: null 48 | relocations: 49 | - offset: 20 50 | kind: PpcRel24 51 | symbol: 1 52 | addend: 0 53 | - offset: 32 54 | kind: PpcRel24 55 | symbol: 2 56 | addend: 0 57 | -------------------------------------------------------------------------------- /assets/signatures/TRKExceptionHandler.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: ab3e7b03efa016969a69a81f64e665638cd3cfc4 3 | signature: PEAAAP//AABgQgAA//8AALBiAAj/////fHoCpv////+QYgAA/////6BiAAj/////LAMCAP////9BggBQ/////ywDAwD/////QYIASP////8sAwQA/////0GCAED/////LAMGAP////9BggA4/////ywDBwD/////QYIAMP////8sAwgA/////0GCACj/////LAMQAP////9BggAg/////ywDEQD/////QYIAGP////8sAxIA/////0GCABD/////LAMTAP////9BggAI/////0gAABD/////fHoCpv////84YwAE/////3x6A6b/////PEAAAP//AABgQgAA//8AADhgAAH/////mGIADf////98c0Km/////3xv8SD/////fFFCpv////98ckKm/////0wAAGT///// 4 | symbols: 5 | - kind: Function 6 | name: TRKExceptionHandler 7 | size: 156 8 | flags: 1 9 | section: null 10 | - kind: Object 11 | name: gTRKExceptionStatus 12 | size: 16 13 | flags: 2 14 | section: .data 15 | relocations: 16 | - offset: 0 17 | kind: PpcAddr16Hi 18 | symbol: 1 19 | addend: 0 20 | - offset: 4 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | - offset: 120 25 | kind: PpcAddr16Hi 26 | symbol: 1 27 | addend: 0 28 | - offset: 124 29 | kind: PpcAddr16Lo 30 | symbol: 1 31 | addend: 0 32 | -------------------------------------------------------------------------------- /assets/signatures/TRKInterruptHandler.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 940bb7f21ab18bce281eaa10d24739d5325075b7 3 | signature: fFoDpv////98mwOm/////3yTQqb/////fEAAJv////98U0Om/////zxAAAD//wAAYEIAAP//AACAQgCM/////2BCgAL/////aEKAAv////98AASs/////3xAAST/////fAAErP////88QAAA//8AAGBCAAD//wAAsGIAAP////8sAwUA/////0CCAIT/////PEAAAP//AABgQgAA//8AAHxoAqb/////kGIELP////9IAAAB/AAAAzxAAAD//wAAYEIAAP//AACAYgQs/////3xoA6b/////PEAAAP//AABgQgAA//8AAIBCAKD/////iEIAAP////8sAgAA/////0GCACz/////PEAAAP//AABgQgAA//8AAIhCAAz/////LAIAAf////9BggAY/////zxAAAD//wAAYEIAAP//AAA4YAAB/////5hiAJz/////SAAAIP////88QAAA//8AAGBCAAD//wAAgGIAiP////98b/Eg/////4BiAAz/////gEIACP////9MAABk/////zxAAAD//wAAYEIAAP//AACgYgAA/////zxAAAD//wAAYEIAAP//AACIQgAM/////ywCAAD/////QIIAAP//AAM8QAAA//8AAGBCAAD//wAAkAIAAP////+QIgAE/////3wRQqb/////kAIACP////+wYgL4/////7BiAvr/////fBJCpv////+QAgAM/////7yCABD/////f3oCpv////9/iAKm/////3+zQqb/////f8kCpv////9/4QKm/////79iAID/////SAAAAfwAAAM8QAAA//8AAGBCAAD//wAAOGAAAf////+YYgAM/////zxAAAD//wAAYEIAAP//AACAAgCM/////3wABKz/////fAABJP////98AASs/////4ACAID/////fAgDpv////+AAgCE/////3wJA6b/////gAIAiP////98AQOm/////4ACAJT/////fBIDpv////+AAgCQ/////3wTA6b/////uGIADP////+AAgAA/////4AiAAT/////gEIACP////9IAAAA/AAAAw== 4 | symbols: 5 | - kind: Function 6 | name: TRKInterruptHandler 7 | size: 404 8 | flags: 1 9 | section: null 10 | - kind: Object 11 | name: gTRKState 12 | size: 164 13 | flags: 1 14 | section: .bss 15 | - kind: Object 16 | name: TRK_saved_exceptionID 17 | size: 2 18 | flags: 2 19 | section: null 20 | - kind: Object 21 | name: gTRKCPUState 22 | size: 1072 23 | flags: 1 24 | section: .bss 25 | - kind: Function 26 | name: TRKUARTInterruptHandler 27 | size: 0 28 | flags: 1 29 | section: null 30 | - kind: Object 31 | name: gTRKExceptionStatus 32 | size: 16 33 | flags: 2 34 | section: .data 35 | - kind: Object 36 | name: gTRKSaveState 37 | size: 148 38 | flags: 1 39 | section: .bss 40 | - kind: Function 41 | name: TRKExceptionHandler 42 | size: 0 43 | flags: 1 44 | section: null 45 | - kind: Function 46 | name: TRKSaveExtended1Block 47 | size: 0 48 | flags: 1 49 | section: null 50 | - kind: Function 51 | name: TRKPostInterruptEvent 52 | size: 0 53 | flags: 1 54 | section: null 55 | relocations: 56 | - offset: 20 57 | kind: PpcAddr16Hi 58 | symbol: 1 59 | addend: 0 60 | - offset: 24 61 | kind: PpcAddr16Lo 62 | symbol: 1 63 | addend: 0 64 | - offset: 52 65 | kind: PpcAddr16Hi 66 | symbol: 2 67 | addend: 0 68 | - offset: 56 69 | kind: PpcAddr16Lo 70 | symbol: 2 71 | addend: 0 72 | - offset: 72 73 | kind: PpcAddr16Hi 74 | symbol: 3 75 | addend: 0 76 | - offset: 76 77 | kind: PpcAddr16Lo 78 | symbol: 3 79 | addend: 0 80 | - offset: 88 81 | kind: PpcRel24 82 | symbol: 4 83 | addend: 0 84 | - offset: 92 85 | kind: PpcAddr16Hi 86 | symbol: 3 87 | addend: 0 88 | - offset: 96 89 | kind: PpcAddr16Lo 90 | symbol: 3 91 | addend: 0 92 | - offset: 108 93 | kind: PpcAddr16Hi 94 | symbol: 1 95 | addend: 0 96 | - offset: 112 97 | kind: PpcAddr16Lo 98 | symbol: 1 99 | addend: 0 100 | - offset: 132 101 | kind: PpcAddr16Hi 102 | symbol: 5 103 | addend: 0 104 | - offset: 136 105 | kind: PpcAddr16Lo 106 | symbol: 5 107 | addend: 0 108 | - offset: 152 109 | kind: PpcAddr16Hi 110 | symbol: 1 111 | addend: 0 112 | - offset: 156 113 | kind: PpcAddr16Lo 114 | symbol: 1 115 | addend: 0 116 | - offset: 172 117 | kind: PpcAddr16Hi 118 | symbol: 6 119 | addend: 0 120 | - offset: 176 121 | kind: PpcAddr16Lo 122 | symbol: 6 123 | addend: 0 124 | - offset: 200 125 | kind: PpcAddr16Hi 126 | symbol: 2 127 | addend: 0 128 | - offset: 204 129 | kind: PpcAddr16Lo 130 | symbol: 2 131 | addend: 0 132 | - offset: 212 133 | kind: PpcAddr16Hi 134 | symbol: 5 135 | addend: 0 136 | - offset: 216 137 | kind: PpcAddr16Lo 138 | symbol: 5 139 | addend: 0 140 | - offset: 228 141 | kind: PpcRel14 142 | symbol: 7 143 | addend: 0 144 | - offset: 232 145 | kind: PpcAddr16Hi 146 | symbol: 3 147 | addend: 0 148 | - offset: 236 149 | kind: PpcAddr16Lo 150 | symbol: 3 151 | addend: 0 152 | - offset: 300 153 | kind: PpcRel24 154 | symbol: 8 155 | addend: 0 156 | - offset: 304 157 | kind: PpcAddr16Hi 158 | symbol: 5 159 | addend: 0 160 | - offset: 308 161 | kind: PpcAddr16Lo 162 | symbol: 5 163 | addend: 0 164 | - offset: 320 165 | kind: PpcAddr16Hi 166 | symbol: 1 167 | addend: 0 168 | - offset: 324 169 | kind: PpcAddr16Lo 170 | symbol: 1 171 | addend: 0 172 | - offset: 400 173 | kind: PpcRel24 174 | symbol: 9 175 | addend: 0 176 | -------------------------------------------------------------------------------- /assets/signatures/TRKInterruptHandlerEnableInterrupts.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: ad1e363a52dd88252a4e726dce6f01c658f34869 3 | signature: PEAAAP//AABgQgAA//8AAIACAIz/////fAAErP////98AAEk/////3wABKz/////gAIAgP////98CAOm/////4ACAIT/////fAkDpv////+AAgCI/////3wBA6b/////gAIAlP////98EgOm/////4ACAJD/////fBMDpv////+4YgAM/////4ACAAD/////gCIABP////+AQgAI/////0gAAAD8AAAD 4 | symbols: 5 | - kind: Function 6 | name: TRKInterruptHandlerEnableInterrupts 7 | size: 84 8 | flags: 1 9 | section: null 10 | - kind: Object 11 | name: gTRKState 12 | size: 164 13 | flags: 1 14 | section: .bss 15 | - kind: Function 16 | name: TRKPostInterruptEvent 17 | size: 0 18 | flags: 1 19 | section: null 20 | relocations: 21 | - offset: 0 22 | kind: PpcAddr16Hi 23 | symbol: 1 24 | addend: 0 25 | - offset: 4 26 | kind: PpcAddr16Lo 27 | symbol: 1 28 | addend: 0 29 | - offset: 80 30 | kind: PpcRel24 31 | symbol: 2 32 | addend: 0 33 | -------------------------------------------------------------------------------- /assets/signatures/TRKLoadContext.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 39c774370cd691f26d7a4369050c34e1c0520adc 3 | signature: gAMAAP////+AIwAE/////4BDAAj/////oKMBov////9Upge9/////0GCABT/////VKUH+v////+wowGi/////7ijABT/////SAAACP////+5owA0/////3x/G3j/////fIMjeP////+AnwCA/////3yP8SD/////gJ8AhP////98iAOm/////4CfAIj/////fIkDpv////+AnwCM/////3yBA6b/////fIAApv////9UhARe/////1SEB/r/////fIABJP////98UUOm/////4CfAAz/////fJJDpv////+AnwAQ/////3yTQ6b/////gF8BmP////+AnwGc/////4P/AHz/////SAAAAPwAAAM= 4 | symbols: 5 | - kind: Function 6 | name: TRKLoadContext 7 | size: 136 8 | flags: 1 9 | section: null 10 | - kind: Function 11 | name: TRKInterruptHandler 12 | size: 0 13 | flags: 1 14 | section: null 15 | relocations: 16 | - offset: 132 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | -------------------------------------------------------------------------------- /assets/signatures/TRKNubWelcome.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 1096e8412ac1a6bc148db28304770dce50786182 3 | signature: PGAAAP//AAA4YwAA//8AAEgAAAD8AAAD 4 | symbols: 5 | - kind: Function 6 | name: TRKNubWelcome 7 | size: 12 8 | flags: 1 9 | section: null 10 | - kind: Object 11 | name: '@stringBase0' 12 | size: 29 13 | flags: 2 14 | section: .data 15 | - kind: Function 16 | name: TRK_board_display 17 | size: 0 18 | flags: 1 19 | section: null 20 | relocations: 21 | - offset: 0 22 | kind: PpcAddr16Ha 23 | symbol: 1 24 | addend: 0 25 | - offset: 4 26 | kind: PpcAddr16Lo 27 | symbol: 1 28 | addend: 0 29 | - offset: 8 30 | kind: PpcRel24 31 | symbol: 2 32 | addend: 0 33 | - symbol: 0 34 | hash: bf1d250aadb41b687ba7d98a7f1a9e3feb36a805 35 | signature: lCH/8P////98CAKm/////zxgAAD//wAAkAEAFP////84YwAA//8AAEgAAAH8AAADgAEAFP////98CAOm/////zghABD/////ToAAIP////8= 36 | symbols: 37 | - kind: Function 38 | name: TRKNubWelcome 39 | size: 40 40 | flags: 1 41 | section: null 42 | - kind: Object 43 | name: '@62' 44 | size: 27 45 | flags: 2 46 | section: .rodata 47 | - kind: Function 48 | name: TRK_board_display 49 | size: 0 50 | flags: 1 51 | section: null 52 | relocations: 53 | - offset: 8 54 | kind: PpcAddr16Ha 55 | symbol: 1 56 | addend: 0 57 | - offset: 16 58 | kind: PpcAddr16Lo 59 | symbol: 1 60 | addend: 0 61 | - offset: 20 62 | kind: PpcRel24 63 | symbol: 2 64 | addend: 0 65 | - symbol: 0 66 | hash: d3a8cc933a90410913d19aa2c6aa838d0e140218 67 | signature: fAgCpv////88YAAA//8AAJABAAT/////OGMAAP//AACUIf/4/////0gAAAH8AAADOCEACP////+AAQAE/////3wIA6b/////ToAAIP////8= 68 | symbols: 69 | - kind: Function 70 | name: TRKNubWelcome 71 | size: 40 72 | flags: 1 73 | section: null 74 | - kind: Object 75 | name: '@40' 76 | size: 26 77 | flags: 2 78 | section: .rodata 79 | - kind: Function 80 | name: TRK_board_display 81 | size: 0 82 | flags: 1 83 | section: null 84 | relocations: 85 | - offset: 4 86 | kind: PpcAddr16Ha 87 | symbol: 1 88 | addend: 0 89 | - offset: 12 90 | kind: PpcAddr16Lo 91 | symbol: 1 92 | addend: 0 93 | - offset: 20 94 | kind: PpcRel24 95 | symbol: 2 96 | addend: 0 97 | -------------------------------------------------------------------------------- /assets/signatures/TRKRestoreExtended1Block.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 188f59e23dc0ef4c474149b14f299ba5a3d2abd4 3 | signature: PEAAAP//AABgQgAA//8AADygAAD//wAAYKUAAP//AACIZQAA/////4jFAAH/////OAAAAP////+YBQAA/////5gFAAH/////LAMAAP////9BggAU/////4MCAej/////gyIB7P////9/HEOm/////389Q6b/////uoIC/P////9+kOOm/////36x46b/////ftLjpv////9+8+Om/////38U46b/////fzXjpv////9/VuOm/////39346b/////f5jjpv////9/2uOm/////3/746b/////SAAABP////+6YgKE/////351+6b/////fpnrpv////9+uuum/////37d66b/////fv7rpv////9/G+um/////38466b/////f1zrpv////9/2/um/////3/5+6b/////SAAABP////+6AgGo/////34AAaT/////fiEBpP////9+QgGk/////35jAaT/////foQBpP////9+pQGk/////37GAaT/////fucBpP////9/CAGk/////38pAaT/////f0oBpP////9/awGk/////3+MAaT/////f60BpP////9/zgGk/////3/vAaT/////uYIB8P////99kPum/////32x+6b/////fdsDpv////99/0Om/////34Qg6b/////fjGDpv////9+UoOm/////35zg6b/////fpSDpv////9+tYOm/////37Wg6b/////fveDpv////9/GIOm/////385g6b/////f1qDpv////9/e4Om/////3+cg6b/////f72Dpv////9/3oOm/////3//g6b/////usICXP////9+2QOm/////37zA6b/////fxIDpv////9/MEOm/////39RQ6b/////f3JDpv////9/k0Om/////3/S+6b/////f/pDpv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: TRKRestoreExtended1Block 7 | size: 356 8 | flags: 1 9 | section: null 10 | - kind: Object 11 | name: gTRKCPUState 12 | size: 1072 13 | flags: 1 14 | section: .bss 15 | - kind: Object 16 | name: gTRKRestoreFlags 17 | size: 9 18 | flags: 1 19 | section: .bss 20 | relocations: 21 | - offset: 0 22 | kind: PpcAddr16Hi 23 | symbol: 1 24 | addend: 0 25 | - offset: 4 26 | kind: PpcAddr16Lo 27 | symbol: 1 28 | addend: 0 29 | - offset: 8 30 | kind: PpcAddr16Hi 31 | symbol: 2 32 | addend: 0 33 | - offset: 12 34 | kind: PpcAddr16Lo 35 | symbol: 2 36 | addend: 0 37 | - symbol: 0 38 | hash: 993dfd86ff97aa08c6ad8934c69d8d6029fbe63b 39 | signature: PEAAAP//AABgQgAA//8AADygAAD//wAAYKUAAP//AACIZQAA/////4jFAAH/////OAAAAP////+YBQAA/////5gFAAH/////LAMAAP////9BggAU/////4MCAej/////gyIB7P////9/HEOm/////389Q6b/////uoIC/P////9+kOOm/////36x46b/////ftLjpv////9+8+Om/////38U46b/////fzXjpv////9/VuOm/////39346b/////f5jjpv////9/2uOm/////3/746b/////SAAAHP////+7QgLg/////39Q66b/////f3frpv////9/tvum/////3/X+6b/////f//7pv////+6YgKE/////351+6b/////fpnrpv////9+uuum/////37d66b/////fv7rpv////9/G+um/////38466b/////f1zrpv////9/fPum/////3+d+6b/////f777pv////9/2/um/////3/5+6b/////SAAANP////8sBgAA/////0GCAAz/////g0ICeP////9/VgOm/////7siAkD/////fzDzpv////9/UfOm/////39y86b/////f5Pzpv////9/tPOm/////3/V86b/////f/bzpv////+6AgGo/////34AAaT/////fiEBpP////9+QgGk/////35jAaT/////foQBpP////9+pQGk/////37GAaT/////fucBpP////9/CAGk/////38pAaT/////f0oBpP////9/awGk/////3+MAaT/////f60BpP////9/zgGk/////3/vAaT/////uYIB8P////99kPum/////32x+6b/////fdsDpv////99/0Om/////34Qg6b/////fjGDpv////9+UoOm/////35zg6b/////fpSDpv////9+tYOm/////37Wg6b/////fveDpv////9/GIOm/////385g6b/////f1qDpv////9/e4Om/////3+cg6b/////f72Dpv////9/3oOm/////3//g6b/////usICXP////9+2QOm/////37zA6b/////fxIDpv////9/MEOm/////39RQ6b/////f3JDpv////9/k0Om/////3/S+6b/////f/pDpv////9OgAAg/////w== 40 | symbols: 41 | - kind: Function 42 | name: TRKRestoreExtended1Block 43 | size: 440 44 | flags: 1 45 | section: null 46 | - kind: Object 47 | name: gTRKCPUState 48 | size: 1072 49 | flags: 1 50 | section: .bss 51 | - kind: Object 52 | name: gTRKRestoreFlags 53 | size: 9 54 | flags: 1 55 | section: .data 56 | relocations: 57 | - offset: 0 58 | kind: PpcAddr16Hi 59 | symbol: 1 60 | addend: 0 61 | - offset: 4 62 | kind: PpcAddr16Lo 63 | symbol: 1 64 | addend: 0 65 | - offset: 8 66 | kind: PpcAddr16Hi 67 | symbol: 2 68 | addend: 0 69 | - offset: 12 70 | kind: PpcAddr16Lo 71 | symbol: 2 72 | addend: 0 73 | -------------------------------------------------------------------------------- /assets/signatures/TRKSaveExtended1Block.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 282e360f42e342726fa4befd6ac32896cc39dc1d 3 | signature: PEAAAP//AABgQgAA//8AAH4ABKb/////fiEEpv////9+QgSm/////35jBKb/////foQEpv////9+pQSm/////37GBKb/////fucEpv////9/CASm/////38pBKb/////f0oEpv////9/awSm/////3+MBKb/////f60Epv////9/zgSm/////3/vBKb/////vgIBqP////99TELm/////31tQub/////fZD6pv////99sfqm/////33bAqb/////ff9Cpv////9+EIKm/////34xgqb/////flKCpv////9+c4Km/////36Ugqb/////frWCpv////9+1oKm/////373gqb/////fxiCpv////9/OYKm/////39agqb/////f3uCpv////9/nIKm/////3+9gqb/////f96Cpv////9//4Km/////71CAej/////ftkCpv////9+8wKm/////38SAqb/////fzBCpv////9/UUKm/////39yQqb/////f5NCpv////87oAAA/////3/S+qb/////f/pCpv////++wgJc/////36Q4qb/////frHipv////9+0uKm/////37z4qb/////fxTipv////9/NeKm/////39W4qb/////f3fipv////9/mOKm/////3+54qb/////f9ripv////9/++Km/////76CAvz/////SAAASP////9+AOqm/////34n6qb/////fkjqpv////9+aeqm/////36K6qb/////fqvqpv////9+zOqm/////37t6qb/////fw7qpv////9/L+qm/////39Q6qb/////f3fqpv////9/n+qm/////3+2+qb/////f9f6pv////9///qm/////74CArj/////fnX6pv////9+meqm/////3666qb/////ft3qpv////9+/uqm/////38b6qb/////fzjqpv////9/XOqm/////398+qb/////f536pv////9/vvqm/////3/b+qb/////f/n6pv////++YgKE/////06AACD/////fzDypv////9/UfKm/////39y8qb/////f5Pypv////9/tPKm/////3/V8qb/////f/bypv////+/IgJA/////3/2Aqb/////k+ICeP////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: TRKSaveExtended1Block 7 | size: 440 8 | flags: 1 9 | section: null 10 | - kind: Object 11 | name: gTRKCPUState 12 | size: 1072 13 | flags: 1 14 | section: .bss 15 | relocations: 16 | - offset: 0 17 | kind: PpcAddr16Hi 18 | symbol: 1 19 | addend: 0 20 | - offset: 4 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | - symbol: 0 25 | hash: 422b55c69624b98ec476f3d104a5042a4a402dbc 26 | signature: PEAAAP//AABgQgAA//8AAH4ABKb/////fiEEpv////9+QgSm/////35jBKb/////foQEpv////9+pQSm/////37GBKb/////fucEpv////9/CASm/////38pBKb/////f0oEpv////9/awSm/////3+MBKb/////f60Epv////9/zgSm/////3/vBKb/////vgIBqP////99TELm/////31tQub/////fZD6pv////99sfqm/////33bAqb/////ff9Cpv////9+EIKm/////34xgqb/////flKCpv////9+c4Km/////36Ugqb/////frWCpv////9+1oKm/////373gqb/////fxiCpv////9/OYKm/////39agqb/////f3uCpv////9/nIKm/////3+9gqb/////f96Cpv////9//4Km/////71CAej/////ftkCpv////9+8wKm/////38SAqb/////fzBCpv////9/UUKm/////39yQqb/////f5NCpv////87oAAA/////3/S+qb/////f/pCpv////++wgJc/////36Q4qb/////frHipv////9+0uKm/////37z4qb/////fxTipv////9/NeKm/////39W4qb/////f3fipv////9/mOKm/////3+54qb/////f9ripv////9/++Km/////76CAvz/////SAAASP////9+AOqm/////34n6qb/////fkjqpv////9+aeqm/////36K6qb/////fqvqpv////9+zOqm/////37t6qb/////fw7qpv////9/L+qm/////39Q6qb/////f3fqpv////9/n+qm/////3+2+qb/////f9f6pv////9///qm/////74CArj/////fnX6pv////9+meqm/////3666qb/////ft3qpv////9+/uqm/////38b6qb/////fzjqpv////9/XOqm/////398+qb/////f536pv////9/vvqm/////3/b+qb/////f/n6pv////++YgKE/////0gAACz/////fzDypv////9/UfKm/////39y8qb/////f5Pypv////9/tPKm/////3/V8qb/////f/bypv////+/IgJA/////3/2Aqb/////k+ICeP////9OgAAg/////w== 27 | symbols: 28 | - kind: Function 29 | name: TRKSaveExtended1Block 30 | size: 440 31 | flags: 1 32 | section: null 33 | - kind: Object 34 | name: gTRKCPUState 35 | size: 1072 36 | flags: 1 37 | section: .bss 38 | relocations: 39 | - offset: 0 40 | kind: PpcAddr16Hi 41 | symbol: 1 42 | addend: 0 43 | - offset: 4 44 | kind: PpcAddr16Lo 45 | symbol: 1 46 | addend: 0 47 | - symbol: 0 48 | hash: a08ded918d6b4378c360f017a04cce78823c2adf 49 | signature: PEAAAP//AABgQgAA//8AAH4ABKb/////fiEEpv////9+QgSm/////35jBKb/////foQEpv////9+pQSm/////37GBKb/////fucEpv////9/CASm/////38pBKb/////f0oEpv////9/awSm/////3+MBKb/////f60Epv////9/zgSm/////3/vBKb/////vgIBqP////9/bELm/////3+NQub/////f7D6pv////9/0fqm/////3/7Aqb/////v2IB6P////99/0Km/////34Qgqb/////fjGCpv////9+UoKm/////35zgqb/////fpSCpv////9+tYKm/////37Wgqb/////fveCpv////9/GIKm/////385gqb/////f1qCpv////9/e4Km/////3+cgqb/////f72Cpv////9/3oKm/////3//gqb/////veIB/P////9/EIqm/////38xiqb/////f1KKpv////9/c4qm/////3+Uiqb/////f7WKpv////9/1oqm/////3/3iqb/////vwICQP////9+2QKm/////37zAqb/////fxICpv////9/MEKm/////39RQqb/////f3JCpv////9/k0Km/////3+2Aqb/////f9L6pv////9/+kKm/////77CAlz/////fxX6pv////9/Oeqm/////39a6qb/////f33qpv////9/nuqm/////3+76qb/////f9jqpv////9//Oqm/////78CAoT/////f7eKpv////9/2Iqm/////3/5iqb/////v6ICpP////9/2/qm/////3/5+qb/////v8ICsP////9+GgKm/////5ICArj/////fjqKpv////+SIgK8/////38o6qb/////f0nqpv////9/auqm/////3+L6qb/////f6zqpv////9/zeqm/////3/u6qb/////vyICwP////9/O4qm/////39ciqb/////f32Kpv////9/noqm/////3+/iqb/////f9jipv////9/8/qm/////78iAtz/////fpDipv////9+seKm/////37S4qb/////fvPipv////9/FOKm/////3814qb/////f1bipv////9/d+Km/////3+Y4qb/////f7nipv////9/2uKm/////3/74qb/////voIC/P////9OgAAg/////w== 50 | symbols: 51 | - kind: Function 52 | name: TRKSaveExtended1Block 53 | size: 452 54 | flags: 1 55 | section: null 56 | - kind: Object 57 | name: gTRKCPUState 58 | size: 1072 59 | flags: 1 60 | section: .bss 61 | relocations: 62 | - offset: 0 63 | kind: PpcAddr16Hi 64 | symbol: 1 65 | addend: 0 66 | - offset: 4 67 | kind: PpcAddr16Lo 68 | symbol: 1 69 | addend: 0 70 | -------------------------------------------------------------------------------- /assets/signatures/TRKSwapAndGo.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 062032c22dec5fa721b11e6e1010fb9a9d97a406 3 | signature: PGAAAP//AABgYwAA//8AALwDAAD/////fAAApv////+QAwCM/////3wIAqb/////kAMAgP////98CQKm/////5ADAIT/////fAECpv////+QAwCI/////3wSAqb/////kAMAlP////98EwKm/////5ADAJD/////OCCAAv////98IQj4/////3xgAKb/////fGMIOP////98YAEk/////zxAAAD//wAAYEIAAP//AACAQgCg/////4hCAAD/////LAIAAP////9BggAY/////zxAAAD//wAAYEIAAP//AAA4YAAB/////5hiAJz/////SAAAAPwAAAM8QAAA//8AAGBCAAD//wAAOGAAAP////+YYgAM/////0gAAAH8AAADPEAAAP//AABgQgAA//8AALtiAID/////f3oDpv////9/iAOm/////3+v8SD/////f8kDpv////9/4QOm/////7hiAAz/////gAIAAP////+AIgAE/////4BCAAj/////TAAAZP////8= 4 | symbols: 5 | - kind: Function 6 | name: TRKSwapAndGo 7 | size: 196 8 | flags: 1 9 | section: null 10 | - kind: Object 11 | name: gTRKState 12 | size: 164 13 | flags: 1 14 | section: .bss 15 | - kind: Function 16 | name: TRKInterruptHandlerEnableInterrupts 17 | size: 0 18 | flags: 1 19 | section: null 20 | - kind: Object 21 | name: gTRKExceptionStatus 22 | size: 16 23 | flags: 2 24 | section: .data 25 | - kind: Function 26 | name: TRKRestoreExtended1Block 27 | size: 0 28 | flags: 1 29 | section: null 30 | - kind: Object 31 | name: gTRKCPUState 32 | size: 1072 33 | flags: 1 34 | section: .bss 35 | relocations: 36 | - offset: 0 37 | kind: PpcAddr16Hi 38 | symbol: 1 39 | addend: 0 40 | - offset: 4 41 | kind: PpcAddr16Lo 42 | symbol: 1 43 | addend: 0 44 | - offset: 80 45 | kind: PpcAddr16Hi 46 | symbol: 1 47 | addend: 0 48 | - offset: 84 49 | kind: PpcAddr16Lo 50 | symbol: 1 51 | addend: 0 52 | - offset: 104 53 | kind: PpcAddr16Hi 54 | symbol: 1 55 | addend: 0 56 | - offset: 108 57 | kind: PpcAddr16Lo 58 | symbol: 1 59 | addend: 0 60 | - offset: 120 61 | kind: PpcRel24 62 | symbol: 2 63 | addend: 0 64 | - offset: 124 65 | kind: PpcAddr16Hi 66 | symbol: 3 67 | addend: 0 68 | - offset: 128 69 | kind: PpcAddr16Lo 70 | symbol: 3 71 | addend: 0 72 | - offset: 140 73 | kind: PpcRel24 74 | symbol: 4 75 | addend: 0 76 | - offset: 144 77 | kind: PpcAddr16Hi 78 | symbol: 5 79 | addend: 0 80 | - offset: 148 81 | kind: PpcAddr16Lo 82 | symbol: 5 83 | addend: 0 84 | -------------------------------------------------------------------------------- /assets/signatures/TRKTargetContinue.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 642f55af2878d23c75243dbcc9a63ff1bf3fe552 3 | signature: fAgCpv////84YAAA/////5ABAAT/////lCH/+P////9IAAAB/AAAA0gAAAH8AAADSAAAAfwAAANIAAAB/AAAAzhgAAD/////OCEACP////+AAQAE/////3wIA6b/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: TRKTargetContinue 7 | size: 52 8 | flags: 1 9 | section: null 10 | - kind: Function 11 | name: TRKTargetSetStopped 12 | size: 0 13 | flags: 1 14 | section: null 15 | - kind: Function 16 | name: UnreserveEXI2Port 17 | size: 0 18 | flags: 1 19 | section: null 20 | - kind: Function 21 | name: TRKSwapAndGo 22 | size: 0 23 | flags: 1 24 | section: null 25 | - kind: Function 26 | name: ReserveEXI2Port 27 | size: 0 28 | flags: 1 29 | section: null 30 | relocations: 31 | - offset: 16 32 | kind: PpcRel24 33 | symbol: 1 34 | addend: 0 35 | - offset: 20 36 | kind: PpcRel24 37 | symbol: 2 38 | addend: 0 39 | - offset: 24 40 | kind: PpcRel24 41 | symbol: 3 42 | addend: 0 43 | - offset: 28 44 | kind: PpcRel24 45 | symbol: 4 46 | addend: 0 47 | - symbol: 0 48 | hash: 25c012dcebb107cca87399fe5836bb3152931ad6 49 | signature: lCH/8P////98CAKm/////5ABABT/////OGAAAP////9IAAAB/AAAA0gAAAH8AAADSAAAAfwAAANIAAAB/AAAAzhgAAD/////gAEAFP////98CAOm/////zghABD/////ToAAIP////8= 50 | symbols: 51 | - kind: Function 52 | name: TRKTargetContinue 53 | size: 52 54 | flags: 1 55 | section: null 56 | - kind: Function 57 | name: TRKTargetSetStopped 58 | size: 0 59 | flags: 1 60 | section: null 61 | - kind: Function 62 | name: UnreserveEXI2Port 63 | size: 0 64 | flags: 1 65 | section: null 66 | - kind: Function 67 | name: TRKSwapAndGo 68 | size: 0 69 | flags: 1 70 | section: null 71 | - kind: Function 72 | name: ReserveEXI2Port 73 | size: 0 74 | flags: 1 75 | section: null 76 | relocations: 77 | - offset: 16 78 | kind: PpcRel24 79 | symbol: 1 80 | addend: 0 81 | - offset: 20 82 | kind: PpcRel24 83 | symbol: 2 84 | addend: 0 85 | - offset: 24 86 | kind: PpcRel24 87 | symbol: 3 88 | addend: 0 89 | - offset: 28 90 | kind: PpcRel24 91 | symbol: 4 92 | addend: 0 93 | - symbol: 0 94 | hash: c5ceb6c0acf128cbb6c089d79fb0c41eb8688748 95 | signature: lCH/8P////98CAKm/////zhgAAD/////kAEAFP////9IAAAB/AAAA0gAAAH8AAADSAAAAfwAAANIAAAB/AAAA4ABABT/////OGAAAP////98CAOm/////zghABD/////ToAAIP////8= 96 | symbols: 97 | - kind: Function 98 | name: TRKTargetContinue 99 | size: 52 100 | flags: 1 101 | section: null 102 | - kind: Function 103 | name: TRKTargetSetStopped 104 | size: 0 105 | flags: 1 106 | section: null 107 | - kind: Function 108 | name: UnreserveEXI2Port 109 | size: 0 110 | flags: 1 111 | section: null 112 | - kind: Function 113 | name: TRKSwapAndGo 114 | size: 0 115 | flags: 1 116 | section: null 117 | - kind: Function 118 | name: ReserveEXI2Port 119 | size: 0 120 | flags: 1 121 | section: null 122 | relocations: 123 | - offset: 16 124 | kind: PpcRel24 125 | symbol: 1 126 | addend: 0 127 | - offset: 20 128 | kind: PpcRel24 129 | symbol: 2 130 | addend: 0 131 | - offset: 24 132 | kind: PpcRel24 133 | symbol: 3 134 | addend: 0 135 | - offset: 28 136 | kind: PpcRel24 137 | symbol: 4 138 | addend: 0 139 | -------------------------------------------------------------------------------- /assets/signatures/_ExitProcess.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 9cb15dc0c16f52de5d46476e7226810c7cad1fc4 3 | signature: fAgCpv////+QAQAE/////5Qh//j/////SAAAAfwAAAOAAQAM/////zghAAj/////fAgDpv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: _ExitProcess 7 | size: 32 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: PPCHalt 12 | size: 0 13 | flags: 5 14 | section: .text 15 | relocations: 16 | - offset: 12 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 82d08ce341917ff7f79c945a5cd98f598ad04ee6 22 | signature: lCH/8P////98CAKm/////5ABABT/////SAAAAfwAAAOAAQAU/////3wIA6b/////OCEAEP////9OgAAg/////w== 23 | symbols: 24 | - kind: Function 25 | name: _ExitProcess 26 | size: 32 27 | flags: 1 28 | section: .text 29 | - kind: Function 30 | name: PPCHalt 31 | size: 0 32 | flags: 5 33 | section: .text 34 | relocations: 35 | - offset: 12 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | -------------------------------------------------------------------------------- /assets/signatures/__DVDClearWaitingQueue.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: bd48f655dc42b87dc741aa4b19512f10d3d7643a 3 | signature: PMAAAP//AAA4xgAA//8AADimAAj/////kMYAAP////84hgAQ/////zhmABj/////kMYABP////+QpgAI/////5CmAAz/////kIYAEP////+QhgAU/////5BmABj/////kGYAHP////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: __DVDClearWaitingQueue 7 | size: 56 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: WaitingQueue 12 | size: 32 13 | flags: 2 14 | section: .bss 15 | relocations: 16 | - offset: 0 17 | kind: PpcAddr16Ha 18 | symbol: 1 19 | addend: 0 20 | - offset: 4 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | - symbol: 0 25 | hash: f534174f0af041aa45324839acb2a3c80d4bfa69 26 | signature: PMAAAP//AAA4xgAA//8AAJDGAAD/////OKYACP////84hgAQ/////zhmABj/////kMYABP////+QpQAA/////5ClAAT/////kIQAAP////+QhAAE/////5BjAAD/////kGMABP////9OgAAg/////w== 27 | symbols: 28 | - kind: Function 29 | name: __DVDClearWaitingQueue 30 | size: 56 31 | flags: 1 32 | section: .text 33 | - kind: Object 34 | name: WaitingQueue 35 | size: 32 36 | flags: 2 37 | section: .bss 38 | relocations: 39 | - offset: 0 40 | kind: PpcAddr16Ha 41 | symbol: 1 42 | addend: 0 43 | - offset: 4 44 | kind: PpcAddr16Lo 45 | symbol: 1 46 | addend: 0 47 | - symbol: 0 48 | hash: 47aa68f54b90ec7a94b163fe6b46173b2a10f3e2 49 | signature: PGAAAP//AAA4YwAA//8AAJBjAAD/////OKMACP////84gwAQ/////5BjAAT/////OGMAGP////+QpQAA/////5ClAAT/////kIQAAP////+QhAAE/////5BjAAD/////kGMABP////9OgAAg/////w== 50 | symbols: 51 | - kind: Function 52 | name: __DVDClearWaitingQueue 53 | size: 56 54 | flags: 1 55 | section: .text 56 | - kind: Object 57 | name: WaitingQueue 58 | size: 32 59 | flags: 2 60 | section: .bss 61 | relocations: 62 | - offset: 0 63 | kind: PpcAddr16Ha 64 | symbol: 1 65 | addend: 0 66 | - offset: 4 67 | kind: PpcAddr16Lo 68 | symbol: 1 69 | addend: 0 70 | - symbol: 0 71 | hash: 0894f45ca5499ebb63edf1cb27afc09872021bef 72 | signature: lCH/8P////+/wQAI/////zvAAAD/////SAAAIP////9XxBg4/////zxgAAD//wAAOAMAAP//AAB/4CIU/////5P/AAD/////k/8ABP////873gAB/////ygeAAT/////QYD/4P////+7wQAI/////zghABD/////ToAAIP////8= 73 | symbols: 74 | - kind: Function 75 | name: __DVDClearWaitingQueue 76 | size: 64 77 | flags: 1 78 | section: .text 79 | - kind: Object 80 | name: WaitingQueue 81 | size: 32 82 | flags: 2 83 | section: .bss 84 | relocations: 85 | - offset: 20 86 | kind: PpcAddr16Ha 87 | symbol: 1 88 | addend: 0 89 | - offset: 24 90 | kind: PpcAddr16Lo 91 | symbol: 1 92 | addend: 0 93 | - symbol: 0 94 | hash: a8762d7ac69d76b8b49606cca201d493908db962 95 | signature: lCH/8P////+T4QAM/////5PBAAj/////O8AAAP////9IAAAg/////1fEGDj/////PGAAAP//AAA4AwAA//8AAH/gIhT/////k/8AAP////+T/wAE/////zveAAH/////KB4ABP////9BgP/g/////4PhAAz/////g8EACP////84IQAQ/////06AACD///// 96 | symbols: 97 | - kind: Function 98 | name: __DVDClearWaitingQueue 99 | size: 72 100 | flags: 1 101 | section: .text 102 | - kind: Object 103 | name: WaitingQueue 104 | size: 32 105 | flags: 2 106 | section: .bss 107 | relocations: 108 | - offset: 24 109 | kind: PpcAddr16Ha 110 | symbol: 1 111 | addend: 0 112 | - offset: 28 113 | kind: PpcAddr16Lo 114 | symbol: 1 115 | addend: 0 116 | - symbol: 0 117 | hash: fbfc5459db5330544113db2527b99c54028ee40c 118 | signature: lCH/4P////+T4QAc/////5PBABj/////k6EAFP////98Pwt4/////zugAAD/////SAAAIP////9XpBg4/////zxgAAD//wAAOAMAAP//AAB/wCIU/////5PeAAD/////k94ABP////87vQAB/////ygdAAT/////QYD/4P////9/6vt4/////4PqABz/////g8oAGP////+DqgAU/////4AhAAD/////ToAAIP////8= 119 | symbols: 120 | - kind: Function 121 | name: __DVDClearWaitingQueue 122 | size: 88 123 | flags: 1 124 | section: .text 125 | - kind: Object 126 | name: WaitingQueue 127 | size: 32 128 | flags: 2 129 | section: .bss 130 | relocations: 131 | - offset: 32 132 | kind: PpcAddr16Ha 133 | symbol: 1 134 | addend: 0 135 | - offset: 36 136 | kind: PpcAddr16Lo 137 | symbol: 1 138 | addend: 0 139 | -------------------------------------------------------------------------------- /assets/signatures/__DVDInitWA.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 4e87b8bb854c6281090223cb9aa6e16780496ea7 3 | signature: fAgCpv////88YAAA//8AAJABAAT/////OAAAAP////84gAAA/////5Qh//j/////kAAAAP/gAAA4AP///////5ADAAD//wAAOGAAAP////9IAAAB/AAAA0gAAAH8AAADgAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __DVDInitWA 7 | size: 64 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: CommandList 12 | size: 60 13 | flags: 2 14 | section: .bss 15 | - kind: Object 16 | name: NextCommandNumber 17 | size: 4 18 | flags: 2 19 | section: .sbss 20 | - kind: Function 21 | name: __DVDLowSetWAType 22 | size: 0 23 | flags: 1 24 | section: .text 25 | - kind: Function 26 | name: OSInitAlarm 27 | size: 0 28 | flags: 1 29 | section: .text 30 | relocations: 31 | - offset: 4 32 | kind: PpcAddr16Ha 33 | symbol: 1 34 | addend: 0 35 | - offset: 24 36 | kind: PpcEmbSda21 37 | symbol: 2 38 | addend: 0 39 | - offset: 32 40 | kind: PpcAddr16Lo 41 | symbol: 1 42 | addend: 0 43 | - offset: 40 44 | kind: PpcRel24 45 | symbol: 3 46 | addend: 0 47 | - offset: 44 48 | kind: PpcRel24 49 | symbol: 4 50 | addend: 0 51 | - symbol: 0 52 | hash: 53f35fb3e90b7fdfb54ba4ee75c820ff8eadb31f 53 | signature: fAgCpv////+QAQAE/////5Qh//j/////OAAAAP////+QAAAA/+AAADgA////////PGAAAP//AACQAwAA//8AADhgAAD/////OIAAAP////9IAAAB/AAAA0gAAAH8AAADgAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 54 | symbols: 55 | - kind: Function 56 | name: __DVDInitWA 57 | size: 64 58 | flags: 5 59 | section: .text 60 | - kind: Object 61 | name: NextCommandNumber 62 | size: 4 63 | flags: 2 64 | section: .sbss 65 | - kind: Object 66 | name: CommandList 67 | size: 60 68 | flags: 2 69 | section: .bss 70 | - kind: Function 71 | name: __DVDLowSetWAType 72 | size: 0 73 | flags: 5 74 | section: .text 75 | - kind: Function 76 | name: OSInitAlarm 77 | size: 0 78 | flags: 1 79 | section: .text 80 | relocations: 81 | - offset: 16 82 | kind: PpcEmbSda21 83 | symbol: 1 84 | addend: 0 85 | - offset: 24 86 | kind: PpcAddr16Ha 87 | symbol: 2 88 | addend: 0 89 | - offset: 28 90 | kind: PpcAddr16Lo 91 | symbol: 2 92 | addend: 0 93 | - offset: 40 94 | kind: PpcRel24 95 | symbol: 3 96 | addend: 0 97 | - offset: 44 98 | kind: PpcRel24 99 | symbol: 4 100 | addend: 0 101 | -------------------------------------------------------------------------------- /assets/signatures/__FileWrite.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 34422147b751d78b7794dfe983eb8d440f7ec77c 3 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////98vyt4/////5PBAAj/////fH4beP////98gyN4/////ziAAAH/////f8bzeP////9IAAAB/AAAA3wfGED/////QIIACP////9IAAAI/////zvAAAD/////f8PzeP////+D4QAM/////4PBAAj/////gAEAFP////98CAOm/////zghABD/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __FileWrite 7 | size: 88 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: __fwrite 12 | size: 0 13 | flags: 1 14 | section: .text 15 | relocations: 16 | - offset: 40 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 77884d217ce414025994f5f4d7e0b9215f11fdab 22 | signature: fAgCpv////+QAQAE/////5Qh/+D/////k+EAHP////875QAA/////5PBABj/////O8MAAP////84ZAAA/////zjeAAD/////OIAAAf////9IAAAB/AAAA3wfGED/////QIIADP////9/w/N4/////0gAAAj/////OGAAAP////+AAQAk/////4PhABz/////g8EAGP////98CAOm/////zghACD/////ToAAIP////8= 23 | symbols: 24 | - kind: Function 25 | name: __FileWrite 26 | size: 88 27 | flags: 1 28 | section: .text 29 | - kind: Function 30 | name: fwrite 31 | size: 0 32 | flags: 1 33 | section: .text 34 | relocations: 35 | - offset: 40 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | - symbol: 0 40 | hash: 1ac63a780d24250392eb7c4df3c629b47c8d131e 41 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////98vyt4/////5PBAAj/////fH4beP////98gyN4/////ziAAAH/////f8bzeP////9IAAAB/AAAA3wfGED/////QIIADP////9/w/N4/////0gAAAj/////OGAAAP////+AAQAU/////4PhAAz/////g8EACP////98CAOm/////zghABD/////ToAAIP////8= 42 | symbols: 43 | - kind: Function 44 | name: __FileWrite 45 | size: 88 46 | flags: 1 47 | section: .text 48 | - kind: Function 49 | name: fwrite 50 | size: 0 51 | flags: 1 52 | section: .text 53 | relocations: 54 | - offset: 40 55 | kind: PpcRel24 56 | symbol: 1 57 | addend: 0 58 | - symbol: 0 59 | hash: 0ceeabe5efdc8527601c657daf2cd2d8178f219b 60 | signature: lCH/4P////98CAKm/////5ABACT/////k+EAHP////+TwQAY/////3y+K3j/////kIEACP////84gAAB/////5OhABT/////fH0beP////+AYQAI/////3+m63j/////SAAAAfwAAAN8HhhA/////0CCAAz/////f7/reP////9IAAAI/////zvgAAD/////gAEAJP////9/4/t4/////4PhABz/////g8EAGP////+DoQAU/////3wIA6b/////OCEAIP////9OgAAg/////w== 61 | symbols: 62 | - kind: Function 63 | name: __FileWrite 64 | size: 104 65 | flags: 1 66 | section: .text 67 | - kind: Function 68 | name: fwrite 69 | size: 0 70 | flags: 1 71 | section: .text 72 | relocations: 73 | - offset: 48 74 | kind: PpcRel24 75 | symbol: 1 76 | addend: 0 77 | -------------------------------------------------------------------------------- /assets/signatures/__NANDPrintErrorMessage.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 9d8737e8fff8fd6d4fdc283b21a9fefce07f432d 3 | signature: gYAAAP/gAAAsDAAA/////02CACD/////fYkDpv////9OgAQg/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __NANDPrintErrorMessage 7 | size: 24 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: NANDErrorFunc 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 0273343b6f26a6e4eb239320408ace8404320669 22 | signature: lCH/8P////98CAKm/////5ABABT/////kGEACP////+AAAAA/+AAACwAAAD/////QYIAFP////+AYQAI/////4GAAAD/4AAAfYkDpv////9OgAQh/////4ABABT/////fAgDpv////84IQAQ/////06AACD///// 23 | symbols: 24 | - kind: Function 25 | name: __NANDPrintErrorMessage 26 | size: 60 27 | flags: 1 28 | section: .text 29 | - kind: Object 30 | name: NANDErrorFunc 31 | size: 4 32 | flags: 2 33 | section: .sbss 34 | relocations: 35 | - offset: 16 36 | kind: PpcEmbSda21 37 | symbol: 1 38 | addend: 0 39 | - offset: 32 40 | kind: PpcEmbSda21 41 | symbol: 1 42 | addend: 0 43 | -------------------------------------------------------------------------------- /assets/signatures/__OSDBIntegrator.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 153c56c0abc7e47a38f4ad0d1c737cdf72cb22e4 3 | signature: OKAAQP////98aAKm/////5BlAAz/////gGUACP////9kY4AA/////3xoA6b/////OGAAMP////98YAEk/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __OSDBIntegrator 7 | size: 36 8 | flags: 2 9 | section: .text 10 | relocations: [] 11 | -------------------------------------------------------------------------------- /assets/signatures/__OSDBJump.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 57e7d1fd933a625ca18aa499f0be6a544bbc332a 3 | signature: SAAAAfwAAAM= 4 | symbols: 5 | - kind: Function 6 | name: __OSDBJump 7 | size: 4 8 | flags: 2 9 | section: .text 10 | - kind: Function 11 | name: OSExceptionVector 12 | size: 0 13 | flags: 2 14 | section: .text 15 | relocations: 16 | - offset: 0 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 56 20 | - symbol: 0 21 | hash: 65c54e72bb9d42abe0d44d496d5422fb5ba55e80 22 | signature: SAAAY/////8= 23 | symbols: 24 | - kind: Function 25 | name: __OSDBJump 26 | size: 4 27 | flags: 2 28 | section: .text 29 | relocations: [] 30 | -------------------------------------------------------------------------------- /assets/signatures/__OSFPRInit.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: f5a0f1ba3c8b103b556d9459e61c029a3a5dc629 3 | signature: fGAApv////9gYyAA/////3xgAST/////fHjipv////9UYx///////0GCAIz/////PGAAAP//AAA4YwAA//8AAOADAAD/////ECAAkP////8QQACQ/////xBgAJD/////EIAAkP////8QoACQ/////xDAAJD/////EOAAkP////8RAACQ/////xEgAJD/////EUAAkP////8RYACQ/////xGAAJD/////EaAAkP////8RwACQ/////xHgAJD/////EgAAkP////8SIACQ/////xJAAJD/////EmAAkP////8SgACQ/////xKgAJD/////EsAAkP////8S4ACQ/////xMAAJD/////EyAAkP////8TQACQ/////xNgAJD/////E4AAkP////8ToACQ/////xPAAJD/////E+AAkP/////IAAAA/+AAAPwgAJD//////EAAkP/////8YACQ//////yAAJD//////KAAkP/////8wACQ//////zgAJD//////QAAkP/////9IACQ//////1AAJD//////WAAkP/////9gACQ//////2gAJD//////cAAkP/////94ACQ//////4AAJD//////iAAkP/////+QACQ//////5gAJD//////oAAkP/////+oACQ//////7AAJD//////uAAkP//////AACQ//////8gAJD//////0AAkP//////YACQ//////+AAJD//////6AAkP//////wACQ///////gAJD//////f4Fjv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: __OSFPRInit 7 | size: 296 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: ZeroPS 12 | size: 8 13 | flags: 2 14 | section: .sbss 15 | - kind: Object 16 | name: ZeroF 17 | size: 8 18 | flags: 2 19 | section: .sbss 20 | relocations: 21 | - offset: 24 22 | kind: PpcAddr16Ha 23 | symbol: 1 24 | addend: 0 25 | - offset: 28 26 | kind: PpcAddr16Lo 27 | symbol: 1 28 | addend: 0 29 | - offset: 160 30 | kind: PpcEmbSda21 31 | symbol: 2 32 | addend: 0 33 | -------------------------------------------------------------------------------- /assets/signatures/__OSInitIPCBuffer.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: aed531882f5a52115e7ce8b9dd6b6ae5bc32a34b 3 | signature: PGCAAP////+AAzEw/////5AAAAD/4AAAgAMxNP////+QAAAA/+AAAE6AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __OSInitIPCBuffer 7 | size: 24 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: IpcBufferLo 12 | size: 4 13 | flags: 2 14 | section: .sdata 15 | - kind: Object 16 | name: IpcBufferHi 17 | size: 4 18 | flags: 2 19 | section: .sbss 20 | relocations: 21 | - offset: 8 22 | kind: PpcEmbSda21 23 | symbol: 1 24 | addend: 0 25 | - offset: 16 26 | kind: PpcEmbSda21 27 | symbol: 2 28 | addend: 0 29 | - symbol: 0 30 | hash: 9c4e92b0a1a061160248af91e7dd0841b29c2431 31 | signature: lCH/8P////98CAKm/////5ABABT/////OGAxMP////9IAAAB/AAAA4ADAAD/////kAAAAP/gAAA4YDE0/////0gAAAH8AAADgAMAAP////+QAAAA/+AAAIABABT/////fAgDpv////84IQAQ/////06AACD///// 32 | symbols: 33 | - kind: Function 34 | name: __OSInitIPCBuffer 35 | size: 60 36 | flags: 1 37 | section: .text 38 | - kind: Function 39 | name: OSPhysicalToCached 40 | size: 0 41 | flags: 1 42 | section: .text 43 | - kind: Object 44 | name: IpcBufferLo 45 | size: 4 46 | flags: 2 47 | section: .sdata 48 | - kind: Object 49 | name: IpcBufferHi 50 | size: 4 51 | flags: 2 52 | section: .sbss 53 | relocations: 54 | - offset: 16 55 | kind: PpcRel24 56 | symbol: 1 57 | addend: 0 58 | - offset: 24 59 | kind: PpcEmbSda21 60 | symbol: 2 61 | addend: 0 62 | - offset: 32 63 | kind: PpcRel24 64 | symbol: 1 65 | addend: 0 66 | - offset: 40 67 | kind: PpcEmbSda21 68 | symbol: 3 69 | addend: 0 70 | -------------------------------------------------------------------------------- /assets/signatures/__OSPSInit.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 55501e7ff9d0ab23b2a372b677851bb22407f77e 3 | signature: fAgCpv////+QAQAE/////5Qh//j/////SAAAAfwAAANkY6AA/////0gAAAH8AAADSAAAAfwAAAN8AASs/////zhgAAD/////fHDjpv////+AAQAM/////zghAAj/////fAgDpv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: __OSPSInit 7 | size: 56 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: PPCMfhid2 12 | size: 0 13 | flags: 1 14 | section: .text 15 | - kind: Function 16 | name: PPCMthid2 17 | size: 0 18 | flags: 1 19 | section: .text 20 | - kind: Function 21 | name: ICFlashInvalidate 22 | size: 0 23 | flags: 1 24 | section: .text 25 | relocations: 26 | - offset: 12 27 | kind: PpcRel24 28 | symbol: 1 29 | addend: 0 30 | - offset: 20 31 | kind: PpcRel24 32 | symbol: 2 33 | addend: 0 34 | - offset: 24 35 | kind: PpcRel24 36 | symbol: 3 37 | addend: 0 38 | - symbol: 0 39 | hash: 1d636c81969d879287e983398ea76012331f22c5 40 | signature: lCH/8P////98CAKm/////5ABABT/////SAAAAfwAAANkY6AA/////0gAAAH8AAADSAAAAfwAAAN8AASs/////zhgAAD/////fHDjpv////98ceOm/////3xy46b/////fHPjpv////98dOOm/////3x146b/////fHbjpv////98d+Om/////4ABABT/////fAgDpv////84IQAQ/////06AACD///// 41 | symbols: 42 | - kind: Function 43 | name: __OSPSInit 44 | size: 84 45 | flags: 1 46 | section: .text 47 | - kind: Function 48 | name: PPCMfhid2 49 | size: 0 50 | flags: 1 51 | section: .text 52 | - kind: Function 53 | name: PPCMthid2 54 | size: 0 55 | flags: 1 56 | section: .text 57 | - kind: Function 58 | name: ICFlashInvalidate 59 | size: 0 60 | flags: 1 61 | section: .text 62 | relocations: 63 | - offset: 12 64 | kind: PpcRel24 65 | symbol: 1 66 | addend: 0 67 | - offset: 20 68 | kind: PpcRel24 69 | symbol: 2 70 | addend: 0 71 | - offset: 24 72 | kind: PpcRel24 73 | symbol: 3 74 | addend: 0 75 | - symbol: 0 76 | hash: 526401573cbdad808b82874ea2bdd5c2c2836e8b 77 | signature: fAgCpv////+QAQAE/////5Qh//j/////SAAAAfwAAANkY6AA/////0gAAAH8AAADSAAAAfwAAAN8AASs/////zhgAAD/////fHDjpv////98ceOm/////3xy46b/////fHPjpv////98dOOm/////3x146b/////fHbjpv////98d+Om/////4ABAAz/////OCEACP////98CAOm/////06AACD///// 78 | symbols: 79 | - kind: Function 80 | name: __OSPSInit 81 | size: 84 82 | flags: 1 83 | section: .text 84 | - kind: Function 85 | name: PPCMfhid2 86 | size: 0 87 | flags: 1 88 | section: .text 89 | - kind: Function 90 | name: PPCMthid2 91 | size: 0 92 | flags: 1 93 | section: .text 94 | - kind: Function 95 | name: ICFlashInvalidate 96 | size: 0 97 | flags: 1 98 | section: .text 99 | relocations: 100 | - offset: 12 101 | kind: PpcRel24 102 | symbol: 1 103 | addend: 0 104 | - offset: 20 105 | kind: PpcRel24 106 | symbol: 2 107 | addend: 0 108 | - offset: 24 109 | kind: PpcRel24 110 | symbol: 3 111 | addend: 0 112 | - symbol: 0 113 | hash: cfcffaaa029dfc85862f38fe65012d1d218d6845 114 | signature: fAgCpv////+QAQAE/////5Qh//j/////SAAAAfwAAANkYIAA/////2QDIAD/////SAAAAfwAAANIAAAB/AAAA3wABKz/////OGAAAP////98cOOm/////3xx46b/////fHLjpv////98c+Om/////3x046b/////fHXjpv////98duOm/////3x346b/////gAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 115 | symbols: 116 | - kind: Function 117 | name: __OSPSInit 118 | size: 88 119 | flags: 1 120 | section: .text 121 | - kind: Function 122 | name: PPCMfhid2 123 | size: 0 124 | flags: 1 125 | section: .text 126 | - kind: Function 127 | name: PPCMthid2 128 | size: 0 129 | flags: 1 130 | section: .text 131 | - kind: Function 132 | name: ICFlashInvalidate 133 | size: 0 134 | flags: 1 135 | section: .text 136 | relocations: 137 | - offset: 12 138 | kind: PpcRel24 139 | symbol: 1 140 | addend: 0 141 | - offset: 24 142 | kind: PpcRel24 143 | symbol: 2 144 | addend: 0 145 | - offset: 28 146 | kind: PpcRel24 147 | symbol: 3 148 | addend: 0 149 | - symbol: 0 150 | hash: 3cfdf51ef44901013e3981d5088f69ea9403b64e 151 | signature: lCH/8P////98CAKm/////5ABABT/////SAAAAfwAAANkYIAA/////2QDIAD/////SAAAAfwAAANIAAAB/AAAA3wABKz/////OGAAAP////98cOOm/////3xx46b/////fHLjpv////98c+Om/////3x046b/////fHXjpv////98duOm/////3x346b/////gAEAFP////98CAOm/////zghABD/////ToAAIP////8= 152 | symbols: 153 | - kind: Function 154 | name: __OSPSInit 155 | size: 88 156 | flags: 1 157 | section: .text 158 | - kind: Function 159 | name: PPCMfhid2 160 | size: 0 161 | flags: 1 162 | section: .text 163 | - kind: Function 164 | name: PPCMthid2 165 | size: 0 166 | flags: 1 167 | section: .text 168 | - kind: Function 169 | name: ICFlashInvalidate 170 | size: 0 171 | flags: 1 172 | section: .text 173 | relocations: 174 | - offset: 12 175 | kind: PpcRel24 176 | symbol: 1 177 | addend: 0 178 | - offset: 24 179 | kind: PpcRel24 180 | symbol: 2 181 | addend: 0 182 | - offset: 28 183 | kind: PpcRel24 184 | symbol: 3 185 | addend: 0 186 | -------------------------------------------------------------------------------- /assets/signatures/__OSReschedule.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 0e23b284aec948d801a821d8918052620b10b63c 3 | signature: gAAAAP/gAAAsAAAA/////02CACD/////OGAAAP////9IAAAA/AAAA06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __OSReschedule 7 | size: 24 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: RunQueueHint 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | - kind: Function 16 | name: SelectThread 17 | size: 0 18 | flags: 2 19 | section: .text 20 | relocations: 21 | - offset: 0 22 | kind: PpcEmbSda21 23 | symbol: 1 24 | addend: 0 25 | - offset: 16 26 | kind: PpcRel24 27 | symbol: 2 28 | addend: 0 29 | - symbol: 0 30 | hash: 2824f6f5b353ffc54ee222baec41d7c5af03f6cc 31 | signature: lCH/8P////98CAKm/////5ABABT/////gAAAAP/gAAAsAAAA/////0GCAAz/////OGAAAP////9IAAAB/AAAA4ABABT/////fAgDpv////84IQAQ/////06AACD///// 32 | symbols: 33 | - kind: Function 34 | name: __OSReschedule 35 | size: 48 36 | flags: 1 37 | section: .text 38 | - kind: Object 39 | name: RunQueueHint 40 | size: 4 41 | flags: 2 42 | section: .sbss 43 | - kind: Function 44 | name: SelectThread 45 | size: 0 46 | flags: 2 47 | section: .text 48 | relocations: 49 | - offset: 12 50 | kind: PpcEmbSda21 51 | symbol: 1 52 | addend: 0 53 | - offset: 28 54 | kind: PpcRel24 55 | symbol: 2 56 | addend: 0 57 | - symbol: 0 58 | hash: f94a9ec41cceda6b7df6708228349e6b69057288 59 | signature: fAgCpv////+QAQAE/////5Qh//j/////gAAAAP/gAAAsAAAA/////0GCAAz/////OGAAAP////9IAAAB/AAAA4ABAAz/////OCEACP////98CAOm/////06AACD///// 60 | symbols: 61 | - kind: Function 62 | name: __OSReschedule 63 | size: 48 64 | flags: 1 65 | section: .text 66 | - kind: Object 67 | name: RunQueueHint 68 | size: 4 69 | flags: 2 70 | section: .sbss 71 | - kind: Function 72 | name: SelectThread 73 | size: 0 74 | flags: 2 75 | section: .text 76 | relocations: 77 | - offset: 12 78 | kind: PpcEmbSda21 79 | symbol: 1 80 | addend: 0 81 | - offset: 28 82 | kind: PpcRel24 83 | symbol: 2 84 | addend: 0 85 | -------------------------------------------------------------------------------- /assets/signatures/__OSSyncSram.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 07f36a5bf4a942f32b49d5a1ab42709d0e58b6dc 3 | signature: PGAAAP//AAA4YwAA//8AAIBjAEz/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __OSSyncSram 7 | size: 16 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: Scb 12 | size: 84 13 | flags: 2 14 | section: .bss 15 | relocations: 16 | - offset: 0 17 | kind: PpcAddr16Ha 18 | symbol: 1 19 | addend: 0 20 | - offset: 4 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | -------------------------------------------------------------------------------- /assets/signatures/__StringWrite.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: fd8573d0360049de5abb67c8769f04edfe84d892 3 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////+TwQAI/////3x+G3j/////gGMACP////+A3gAE/////3wDKhT/////fAAwQP////9/4zBQ/////0GBAAj/////fL8reP////+AHgAA/////3/l+3j/////fGAaFP////9IAAAB/AAAA4AeAAj/////OGAAAf////98APoU/////5AeAAj/////g+EADP////+DwQAI/////4ABABT/////fAgDpv////84IQAQ/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __StringWrite 7 | size: 108 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: memcpy 12 | size: 0 13 | flags: 1 14 | section: null 15 | relocations: 16 | - offset: 64 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: aa97d90a13076812a88fc64f1a14c6cfcfd6ee5f 22 | signature: fAgCpv////+QAQAE/////5Qh/+D/////k+EAHP////+TwQAY/////3x+G3j/////gGMACP////+A3gAE/////3wDKhT/////fAAwQP////9BgQAM/////3y/K3j/////SAAACP////9/4zBQ/////4AeAAD/////OL8AAP////98YBoU/////0gAAAH8AAADgB4ACP////98APoU/////5AeAAj/////gAEAJP////+D4QAc/////4PBABj/////fAgDpv////84IQAg/////06AACD///// 23 | symbols: 24 | - kind: Function 25 | name: __StringWrite 26 | size: 108 27 | flags: 1 28 | section: .text 29 | - kind: Function 30 | name: memcpy 31 | size: 0 32 | flags: 1 33 | section: null 34 | relocations: 35 | - offset: 68 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | - symbol: 0 40 | hash: 72eb8198fc92efdbce86b4fce4892df09fe3c4cd 41 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////+TwQAI/////3x+G3j/////gMMACP////+A4wAE/////3wGKhT/////fAA4QP////9/5jhQ/////0GBAAj/////fL8reP////+AAwAA/////3/l+3j/////fGAyFP////9IAAAB/AAAA4AeAAj/////OGAAAf////98APoU/////5AeAAj/////g+EADP////+DwQAI/////4ABABT/////fAgDpv////84IQAQ/////06AACD///// 42 | symbols: 43 | - kind: Function 44 | name: __StringWrite 45 | size: 108 46 | flags: 1 47 | section: .text 48 | - kind: Function 49 | name: memcpy 50 | size: 0 51 | flags: 1 52 | section: null 53 | relocations: 54 | - offset: 64 55 | kind: PpcRel24 56 | symbol: 1 57 | addend: 0 58 | - symbol: 0 59 | hash: 433b639615c59c549da93877493f251072c1330f 60 | signature: lCH/0P////98CAKm/////5ABADT/////k+EALP////+TwQAo/////5OhACT/////kGEACP////+TgQAg/////3y8K3j/////g+EACP////+QgQAM/////4B/AAj/////gB8ABP////98Y+IU/////3wDAED/////QYEADP////9/neN4/////0gAABD/////gH8ACP////+AHwAE/////3+jAFD/////gH8AAP////9/vut4/////4AfAAj/////f8XzeP////+AgQAM/////3xjAhT/////SAAAAfwAAAOAHwAI/////5BhABD/////OGAAAf////98APIU/////5AfAAj/////gAEANP////+D4QAs/////4PBACj/////g6EAJP////+DgQAg/////3wIA6b/////OCEAMP////9OgAAg/////w== 61 | symbols: 62 | - kind: Function 63 | name: __StringWrite 64 | size: 164 65 | flags: 1 66 | section: .text 67 | - kind: Function 68 | name: memcpy 69 | size: 0 70 | flags: 1 71 | section: null 72 | relocations: 73 | - offset: 108 74 | kind: PpcRel24 75 | symbol: 1 76 | addend: 0 77 | -------------------------------------------------------------------------------- /assets/signatures/__check_pad3.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 83ea1a2986a06003ca4462e41a1f833a167b3fc6 3 | signature: PGCAAP////+gAzDk/////3AADu//////LAAO7/////9MggAg/////zhgAAD/////OIAAAP////84oAAA/////0gAAAD8AAADToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __check_pad3 7 | size: 40 8 | flags: 2 9 | section: .init 10 | - kind: Function 11 | name: OSResetSystem 12 | size: 0 13 | flags: 1 14 | section: .text 15 | relocations: 16 | - offset: 32 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: bee3fc50a8504050f518240f52eb977dbb1540f8 22 | signature: fAgCpv////+QAQAE/////5Qh//j/////PGCAAP////+gAzDk/////3AADu//////LAAO7/////9AggAU/////zhgAAD/////OIAAAP////84oAAA/////0gAAAH8AAADgAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 23 | symbols: 24 | - kind: Function 25 | name: __check_pad3 26 | size: 64 27 | flags: 2 28 | section: .init 29 | - kind: Function 30 | name: OSResetSystem 31 | size: 0 32 | flags: 1 33 | section: .text 34 | relocations: 35 | - offset: 44 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | - symbol: 0 40 | hash: 956fc3157a2e2a27f31b046e9b9841b2a321a08c 41 | signature: fAgCpv////88YIAA/////5ABAAT/////lCH/+P////+gAzDk/////3AADu//////LAAO7/////9AggAU/////zhgAAD/////OIAAAP////84oAAA/////0gAAAH8AAADgAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 42 | symbols: 43 | - kind: Function 44 | name: __check_pad3 45 | size: 64 46 | flags: 2 47 | section: .init 48 | - kind: Function 49 | name: OSResetSystem 50 | size: 0 51 | flags: 1 52 | section: .text 53 | relocations: 54 | - offset: 44 55 | kind: PpcRel24 56 | symbol: 1 57 | addend: 0 58 | - symbol: 0 59 | hash: f431fd9f820cdf74ce3549f31b18c5fd32d934b7 60 | signature: lCH/8P////98CAKm/////5ABABT/////PGCAAP////+gAzDk/////3AADu//////LAAO7/////9AggAU/////zhgAAD/////OIAAAP////84oAAA/////0gAAAH8AAADgAEAFP////98CAOm/////zghABD/////ToAAIP////8= 61 | symbols: 62 | - kind: Function 63 | name: __check_pad3 64 | size: 64 65 | flags: 2 66 | section: .init 67 | - kind: Function 68 | name: OSResetSystem 69 | size: 0 70 | flags: 1 71 | section: .text 72 | relocations: 73 | - offset: 44 74 | kind: PpcRel24 75 | symbol: 1 76 | addend: 0 77 | -------------------------------------------------------------------------------- /assets/signatures/__fini_cpp.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 734078ce2ac4f80b15cf23707c7151557348f30d 3 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////88YAAA//8AADvjAAD//wAASAAAFP////+BnwAA/////32JA6b/////ToAEIf////87/wAE/////4AfAAD/////LAAAAP////9Agv/o/////4PhAAz/////gAEAFP////98CAOm/////zghABD/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __fini_cpp 7 | size: 76 8 | flags: 2 9 | section: .text 10 | - kind: Unknown 11 | name: _dtors 12 | size: 0 13 | flags: 1 14 | section: .dtors 15 | relocations: 16 | - offset: 16 17 | kind: PpcAddr16Ha 18 | symbol: 1 19 | addend: 0 20 | - offset: 20 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | -------------------------------------------------------------------------------- /assets/signatures/__fini_cpp_exceptions.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: aa319246ce3e68bc50ec5ab978571665c68e92b9 3 | signature: fAgCpv////+QAQAE/////5Qh//j/////gGAAAP/gAAAsA//+/////0GCABD/////SAAAAfwAAAM4AP/+/////5AAAAD/4AAAgAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __fini_cpp_exceptions 7 | size: 52 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: fragmentID 12 | size: 4 13 | flags: 2 14 | section: .sdata 15 | - kind: Function 16 | name: __unregister_fragment 17 | size: 0 18 | flags: 1 19 | section: .text 20 | relocations: 21 | - offset: 12 22 | kind: PpcEmbSda21 23 | symbol: 1 24 | addend: 0 25 | - offset: 24 26 | kind: PpcRel24 27 | symbol: 2 28 | addend: 0 29 | - offset: 32 30 | kind: PpcEmbSda21 31 | symbol: 1 32 | addend: 0 33 | - symbol: 0 34 | hash: ba270ea9cddc44daa54826c05efd14480ef99b21 35 | signature: lCH/8P////98CAKm/////5ABABT/////gGAAAP/gAAAsA//+/////0GCABD/////SAAAAfwAAAM4AP/+/////5AAAAD/4AAAgAEAFP////98CAOm/////zghABD/////ToAAIP////8= 36 | symbols: 37 | - kind: Function 38 | name: __fini_cpp_exceptions 39 | size: 52 40 | flags: 1 41 | section: .text 42 | - kind: Object 43 | name: fragmentID 44 | size: 4 45 | flags: 2 46 | section: .sdata 47 | - kind: Function 48 | name: __unregister_fragment 49 | size: 0 50 | flags: 1 51 | section: .text 52 | relocations: 53 | - offset: 12 54 | kind: PpcEmbSda21 55 | symbol: 1 56 | addend: 0 57 | - offset: 24 58 | kind: PpcRel24 59 | symbol: 2 60 | addend: 0 61 | - offset: 32 62 | kind: PpcEmbSda21 63 | symbol: 1 64 | addend: 0 65 | -------------------------------------------------------------------------------- /assets/signatures/__init_cpp.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: a180ba4902d4056df79eb3aac8ad17c5524c7b32 3 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////8/4AAA//8AADv/AAD//wAASAAAEP////99iQOm/////06ABCH/////O/8ABP////+BnwAA/////ywMAAD/////QIL/7P////+AAQAU/////4PhAAz/////fAgDpv////84IQAQ/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __init_cpp 7 | size: 72 8 | flags: 2 9 | section: .text 10 | - kind: Unknown 11 | name: _ctors 12 | size: 0 13 | flags: 1 14 | section: .ctors 15 | relocations: 16 | - offset: 16 17 | kind: PpcAddr16Ha 18 | symbol: 1 19 | addend: 0 20 | - offset: 20 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | - symbol: 0 25 | hash: a5bf12574100ae1828f2021e343aa0c53fe1f64d 26 | signature: fAgCpv////+QAQAE/////5Qh//D/////k+EADP////88YAAA//8AADvjAAD//wAASAAAFP////+BnwAA/////32IA6b/////ToAAIf////87/wAE/////4AfAAD/////KAAAAP////9Agv/o/////4ABABT/////g+EADP////84IQAQ/////3wIA6b/////ToAAIP////8= 27 | symbols: 28 | - kind: Function 29 | name: __init_cpp 30 | size: 76 31 | flags: 2 32 | section: .text 33 | - kind: Unknown 34 | name: _ctors 35 | size: 0 36 | flags: 1 37 | section: .ctors 38 | relocations: 39 | - offset: 16 40 | kind: PpcAddr16Ha 41 | symbol: 1 42 | addend: 0 43 | - offset: 20 44 | kind: PpcAddr16Lo 45 | symbol: 1 46 | addend: 0 47 | - symbol: 0 48 | hash: 4b6997d96250556e37ba550d38659e5f541e537f 49 | signature: lCH/8P////98CAKm/////zxgAAD//wAAkAEAFP////84AwAA//8AAJPhAAz/////fB8DeP////9IAAAQ/////32JA6b/////ToAEIf////87/wAE/////4GfAAD/////KAwAAP////9Agv/s/////4ABABT/////g+EADP////98CAOm/////zghABD/////ToAAIP////8= 50 | symbols: 51 | - kind: Function 52 | name: __init_cpp 53 | size: 76 54 | flags: 2 55 | section: .text 56 | - kind: Unknown 57 | name: _ctors 58 | size: 0 59 | flags: 1 60 | section: .ctors 61 | relocations: 62 | - offset: 8 63 | kind: PpcAddr16Ha 64 | symbol: 1 65 | addend: 0 66 | - offset: 16 67 | kind: PpcAddr16Lo 68 | symbol: 1 69 | addend: 0 70 | - symbol: 0 71 | hash: 734078ce2ac4f80b15cf23707c7151557348f30d 72 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////88YAAA//8AADvjAAD//wAASAAAFP////+BnwAA/////32JA6b/////ToAEIf////87/wAE/////4AfAAD/////LAAAAP////9Agv/o/////4PhAAz/////gAEAFP////98CAOm/////zghABD/////ToAAIP////8= 73 | symbols: 74 | - kind: Function 75 | name: __init_cpp 76 | size: 76 77 | flags: 2 78 | section: .text 79 | - kind: Unknown 80 | name: _ctors 81 | size: 0 82 | flags: 1 83 | section: .ctors 84 | relocations: 85 | - offset: 16 86 | kind: PpcAddr16Ha 87 | symbol: 1 88 | addend: 0 89 | - offset: 20 90 | kind: PpcAddr16Lo 91 | symbol: 1 92 | addend: 0 93 | - symbol: 0 94 | hash: 23d69d6b1dd0108a818e2dc49f2190954498b869 95 | signature: fAgCpv////88YAAA//8AAJABAAT/////OAMAAP//AACUIf/w/////5PhAAz/////fB8DeP////9IAAAQ/////32IA6b/////ToAAIf////87/wAE/////4GfAAD/////KAwAAP////9Agv/s/////4ABABT/////g+EADP////84IQAQ/////3wIA6b/////ToAAIP////8= 96 | symbols: 97 | - kind: Function 98 | name: __init_cpp 99 | size: 76 100 | flags: 1 101 | section: .text 102 | - kind: Unknown 103 | name: _ctors 104 | size: 0 105 | flags: 1 106 | section: .ctors 107 | relocations: 108 | - offset: 4 109 | kind: PpcAddr16Ha 110 | symbol: 1 111 | addend: 0 112 | - offset: 12 113 | kind: PpcAddr16Lo 114 | symbol: 1 115 | addend: 0 116 | - symbol: 0 117 | hash: 453bde659bf1659cbd9016b432f9fb40cb1ed4a4 118 | signature: fAgCpv////+QAQAE/////5Qh//D/////k+EADP////88YAAA//8AADgDAAD//wAAfB8DeP////9IAAAE/////0gAAAT/////SAAAEP////99iAOm/////06AACH/////O/8ABP////+BnwAA/////ygMAAD/////QIL/7P////+AAQAU/////4PhAAz/////OCEAEP////98CAOm/////06AACD///// 119 | symbols: 120 | - kind: Function 121 | name: __init_cpp 122 | size: 84 123 | flags: 2 124 | section: .text 125 | - kind: Unknown 126 | name: _ctors 127 | size: 0 128 | flags: 1 129 | section: .ctors 130 | relocations: 131 | - offset: 16 132 | kind: PpcAddr16Ha 133 | symbol: 1 134 | addend: 0 135 | - offset: 20 136 | kind: PpcAddr16Lo 137 | symbol: 1 138 | addend: 0 139 | - symbol: 0 140 | hash: c3f4c58ea391f80ce8ddc250fda91a66f2defb33 141 | signature: lCH/8P////98CAKm/////5ABABT/////k+EADP////88YAAA//8AADvjAAD//wAASAAAHP////8oHwAA/////0GCABD/////gZ8AAP////99iQOm/////06ABCH/////O/8ABP////+AHwAA/////ygAAAD/////QIL/4P////+D4QAM/////4ABABT/////fAgDpv////84IQAQ/////06AACD///// 142 | symbols: 143 | - kind: Function 144 | name: __init_cpp 145 | size: 84 146 | flags: 2 147 | section: .text 148 | - kind: Unknown 149 | name: _ctors 150 | size: 0 151 | flags: 1 152 | section: .ctors 153 | relocations: 154 | - offset: 16 155 | kind: PpcAddr16Ha 156 | symbol: 1 157 | addend: 0 158 | - offset: 20 159 | kind: PpcAddr16Lo 160 | symbol: 1 161 | addend: 0 162 | -------------------------------------------------------------------------------- /assets/signatures/__init_cpp_exceptions.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 32811594987a3c813878178e497723a6061b5a34 3 | signature: lCH/8P////98CAKm/////5ABABT/////gAAAAP/gAAAsAP/+/////0CCABj/////PGAAAP//AAB8RBN4/////zhjAAD//wAASAAAAfwAAAOQYAAA/+AAAIABABT/////fAgDpv////84IQAQ/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __init_cpp_exceptions 7 | size: 60 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: fragmentID 12 | size: 4 13 | flags: 2 14 | section: .sdata 15 | - kind: Object 16 | name: _eti_init_info 17 | size: 0 18 | flags: 1 19 | section: extabindex 20 | - kind: Function 21 | name: __register_fragment 22 | size: 0 23 | flags: 1 24 | section: .text 25 | relocations: 26 | - offset: 12 27 | kind: PpcEmbSda21 28 | symbol: 1 29 | addend: 0 30 | - offset: 24 31 | kind: PpcAddr16Ha 32 | symbol: 2 33 | addend: 0 34 | - offset: 32 35 | kind: PpcAddr16Lo 36 | symbol: 2 37 | addend: 0 38 | - offset: 36 39 | kind: PpcRel24 40 | symbol: 3 41 | addend: 0 42 | - offset: 40 43 | kind: PpcEmbSda21 44 | symbol: 1 45 | addend: 0 46 | - symbol: 0 47 | hash: 8dab18ebf1c6b105f1337147795a5b941c6449a9 48 | signature: fAgCpv////+QAQAE/////5Qh//j/////gAAAAP/gAAAsAP/+/////0CCABz/////SAAAAfwAAAM8oAAA//8AAHxkG3j/////OGUAAP//AABIAAAB/AAAA5BgAAD/4AAAgAEADP////84IQAI/////3wIA6b/////ToAAIP////8= 49 | symbols: 50 | - kind: Function 51 | name: __init_cpp_exceptions 52 | size: 64 53 | flags: 1 54 | section: .text 55 | - kind: Object 56 | name: fragmentID 57 | size: 4 58 | flags: 2 59 | section: .sdata 60 | - kind: Function 61 | name: GetR2__Fv 62 | size: 0 63 | flags: 2 64 | section: .text 65 | - kind: Object 66 | name: _eti_init_info 67 | size: 0 68 | flags: 1 69 | section: extabindex 70 | - kind: Function 71 | name: __register_fragment 72 | size: 0 73 | flags: 1 74 | section: .text 75 | relocations: 76 | - offset: 12 77 | kind: PpcEmbSda21 78 | symbol: 1 79 | addend: 0 80 | - offset: 24 81 | kind: PpcRel24 82 | symbol: 2 83 | addend: 0 84 | - offset: 28 85 | kind: PpcAddr16Ha 86 | symbol: 3 87 | addend: 0 88 | - offset: 36 89 | kind: PpcAddr16Lo 90 | symbol: 3 91 | addend: 0 92 | - offset: 40 93 | kind: PpcRel24 94 | symbol: 4 95 | addend: 0 96 | - offset: 44 97 | kind: PpcEmbSda21 98 | symbol: 1 99 | addend: 0 100 | - symbol: 0 101 | hash: 732ff119307c8e04731f6be4218a43fb4f2de023 102 | signature: lCH/8P////98CAKm/////5ABABT/////gAAAAP/gAAAsAP/+/////0CCABz/////SAAAAfwAAAM8oAAA//8AAHxkG3j/////OGUAAP//AABIAAAB/AAAA5BgAAD/4AAAgAEAFP////98CAOm/////zghABD/////ToAAIP////8= 103 | symbols: 104 | - kind: Function 105 | name: __init_cpp_exceptions 106 | size: 64 107 | flags: 1 108 | section: .text 109 | - kind: Object 110 | name: fragmentID 111 | size: 4 112 | flags: 2 113 | section: .sdata 114 | - kind: Function 115 | name: GetR2__Fv 116 | size: 0 117 | flags: 2 118 | section: .text 119 | - kind: Object 120 | name: _eti_init_info 121 | size: 0 122 | flags: 1 123 | section: extabindex 124 | - kind: Function 125 | name: __register_fragment 126 | size: 0 127 | flags: 1 128 | section: .text 129 | relocations: 130 | - offset: 12 131 | kind: PpcEmbSda21 132 | symbol: 1 133 | addend: 0 134 | - offset: 24 135 | kind: PpcRel24 136 | symbol: 2 137 | addend: 0 138 | - offset: 28 139 | kind: PpcAddr16Ha 140 | symbol: 3 141 | addend: 0 142 | - offset: 36 143 | kind: PpcAddr16Lo 144 | symbol: 3 145 | addend: 0 146 | - offset: 40 147 | kind: PpcRel24 148 | symbol: 4 149 | addend: 0 150 | - offset: 44 151 | kind: PpcEmbSda21 152 | symbol: 1 153 | addend: 0 154 | -------------------------------------------------------------------------------- /assets/signatures/__init_hardware.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 580e1014d29d5d2a34f6a7da1ea99fbf29edc89c 3 | signature: fAAApv////9gACAA/////3wAAST/////f+gCpv////9IAAAB/AAAA0gAAAH8AAADf+gDpv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: __init_hardware 7 | size: 32 8 | flags: 1 9 | section: .init 10 | - kind: Function 11 | name: __OSPSInit 12 | size: 0 13 | flags: 1 14 | section: .text 15 | - kind: Function 16 | name: __OSCacheInit 17 | size: 0 18 | flags: 1 19 | section: .text 20 | relocations: 21 | - offset: 16 22 | kind: PpcRel24 23 | symbol: 1 24 | addend: 0 25 | - offset: 20 26 | kind: PpcRel24 27 | symbol: 2 28 | addend: 0 29 | - symbol: 0 30 | hash: ad769b173a1a17656958bd4dafa7dafde73e6c55 31 | signature: fAAApv////9gACAA/////3wAAST/////f+gCpv////9IAAAB/AAAA0gAAAH8AAADSAAAAfwAAAN/6AOm/////06AACD///// 32 | symbols: 33 | - kind: Function 34 | name: __init_hardware 35 | size: 36 36 | flags: 1 37 | section: .init 38 | - kind: Function 39 | name: __OSPSInit 40 | size: 0 41 | flags: 1 42 | section: .text 43 | - kind: Function 44 | name: __OSFPRInit 45 | size: 0 46 | flags: 1 47 | section: .text 48 | - kind: Function 49 | name: __OSCacheInit 50 | size: 0 51 | flags: 1 52 | section: .text 53 | relocations: 54 | - offset: 16 55 | kind: PpcRel24 56 | symbol: 1 57 | addend: 0 58 | - offset: 20 59 | kind: PpcRel24 60 | symbol: 2 61 | addend: 0 62 | - offset: 24 63 | kind: PpcRel24 64 | symbol: 3 65 | addend: 0 66 | -------------------------------------------------------------------------------- /assets/signatures/__init_registers.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 35e0aecb1159eba2e658821a16f289874cd0979b 3 | signature: PCAAAP//AABgIQAA//8AADxAAAD//wAAYEIAAP//AAA9oAAA//8AAGGtAAD//wAAToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __init_registers 7 | size: 28 8 | flags: 2 9 | section: .init 10 | - kind: Unknown 11 | name: _stack_addr 12 | size: 0 13 | flags: 1 14 | section: null 15 | - kind: Unknown 16 | name: _SDA2_BASE_ 17 | size: 0 18 | flags: 1 19 | section: null 20 | - kind: Unknown 21 | name: _SDA_BASE_ 22 | size: 0 23 | flags: 1 24 | section: null 25 | relocations: 26 | - offset: 0 27 | kind: PpcAddr16Hi 28 | symbol: 1 29 | addend: 0 30 | - offset: 4 31 | kind: PpcAddr16Lo 32 | symbol: 1 33 | addend: 0 34 | - offset: 8 35 | kind: PpcAddr16Hi 36 | symbol: 2 37 | addend: 0 38 | - offset: 12 39 | kind: PpcAddr16Lo 40 | symbol: 2 41 | addend: 0 42 | - offset: 16 43 | kind: PpcAddr16Hi 44 | symbol: 3 45 | addend: 0 46 | - offset: 20 47 | kind: PpcAddr16Lo 48 | symbol: 3 49 | addend: 0 50 | - symbol: 0 51 | hash: 003c9e22ad7c98eab8a91efe4bd20f74310e1fd7 52 | signature: OAAAAP////84YAAA/////ziAAAD/////OKAAAP////84wAAA/////zjgAAD/////OQAAAP////85IAAA/////zlAAAD/////OWAAAP////85gAAA/////znAAAD/////OeAAAP////86AAAA/////zogAAD/////OkAAAP////86YAAA/////zqAAAD/////OqAAAP////86wAAA/////zrgAAD/////OwAAAP////87IAAA/////ztAAAD/////O2AAAP////87gAAA/////zugAAD/////O8AAAP////874AAA/////zwgAAD//wAAYCEAAP//AAA8QAAA//8AAGBCAAD//wAAPaAAAP//AABhrQAA//8AAE6AACD///// 53 | symbols: 54 | - kind: Function 55 | name: __init_registers 56 | size: 144 57 | flags: 2 58 | section: .init 59 | - kind: Unknown 60 | name: _stack_addr 61 | size: 0 62 | flags: 1 63 | section: null 64 | - kind: Unknown 65 | name: _SDA2_BASE_ 66 | size: 0 67 | flags: 1 68 | section: null 69 | - kind: Unknown 70 | name: _SDA_BASE_ 71 | size: 0 72 | flags: 1 73 | section: null 74 | relocations: 75 | - offset: 116 76 | kind: PpcAddr16Hi 77 | symbol: 1 78 | addend: 0 79 | - offset: 120 80 | kind: PpcAddr16Lo 81 | symbol: 1 82 | addend: 0 83 | - offset: 124 84 | kind: PpcAddr16Hi 85 | symbol: 2 86 | addend: 0 87 | - offset: 128 88 | kind: PpcAddr16Lo 89 | symbol: 2 90 | addend: 0 91 | - offset: 132 92 | kind: PpcAddr16Hi 93 | symbol: 3 94 | addend: 0 95 | - offset: 136 96 | kind: PpcAddr16Lo 97 | symbol: 3 98 | addend: 0 99 | -------------------------------------------------------------------------------- /assets/signatures/__mod2u.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: d2e017b521692678e61981afaaecfe91456aa1c1 3 | signature: LAMAAP////98YAA0/////3yJADT/////QIIACP////84CQAg/////ywFAAD/////fKkANP////98ygA0/////0CCAAj/////OSoAIP////98AEgA/////yFAAED/////QYEAsP////85KQAB/////yEpAED/////fABKFP////99KVBQ/////30pA6b/////LAkAIP////846f/g/////0GAABD/////fGg8MP////844AAA/////0gAABj/////fIhMMP////8g6QAg/////3xnODD/////fQg7eP////98Z0ww/////ywAACD/////MSD/4P////9BgAAQ/////3yDSDD/////OIAAAP////9IAAAY/////3xjADD/////ISAAIP////98iUww/////3xjS3j/////fIQAMP////85QP///////zDnAAD/////fIQhFP////98YxkU/////30IQRT/////fOc5FP////98BkAQ/////30lORH/////QYAAEP////98CAN4/////30nS3j/////MAoAAf////9CAP/Y/////30EQ3j/////fOM7eP////9OgAAg/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __mod2u 7 | size: 228 8 | flags: 1 9 | section: .text 10 | relocations: [] 11 | - symbol: 0 12 | hash: 8dfd849a47b6db30906fce7e5ec87a7dba8cbc37 13 | signature: LAMAAP////98YAA0/////3yJADT/////QIIACP////84CQAg/////ywFAAD/////fKkANP////98ygA0/////0CCAAj/////OSoAIP////98AEgA/////yFAAED/////TYEAIP////85KQAB/////yEpAED/////fABKFP////99KVBQ/////30pA6b/////LAkAIP////846f/g/////0GAABD/////fGg8MP////844AAA/////0gAABj/////fIhMMP////8g6QAg/////3xnODD/////fQg7eP////98Z0ww/////ywAACD/////MSD/4P////9BgAAQ/////3yDSDD/////OIAAAP////9IAAAY/////3xjADD/////ISAAIP////98iUww/////3xjS3j/////fIQAMP////85QP///////zDnAAD/////fIQhFP////98YxkU/////30IQRT/////fOc5FP////98BkAQ/////30lORH/////QYAAEP////98CAN4/////30nS3j/////MAoAAf////9CAP/Y/////30EQ3j/////fOM7eP////9OgAAg/////06AACD///// 14 | symbols: 15 | - kind: Function 16 | name: __mod2u 17 | size: 228 18 | flags: 1 19 | section: .text 20 | relocations: [] 21 | -------------------------------------------------------------------------------- /assets/signatures/__msl_runtime_constraint_violation_s.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 9d8737e8fff8fd6d4fdc283b21a9fefce07f432d 3 | signature: gYAAAP/gAAAsDAAA/////02CACD/////fYkDpv////9OgAQg/////06AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __msl_runtime_constraint_violation_s 7 | size: 24 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: __msl_constraint_handler 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | -------------------------------------------------------------------------------- /assets/signatures/__register_fragment.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 20cc2c335b1df2d92f0c8e3d39063f4e864cff0e 3 | signature: PKAAAP//AAA4pQAA//8AAIAFAAj/////LAAAAP////9AggAc/////5BlAAD/////OAAAAf////84YAAA/////5CFAAT/////kAUACP////9OgAAg/////zhg////////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __register_fragment 7 | size: 52 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: fragmentinfo 12 | size: 12 13 | flags: 2 14 | section: .bss 15 | relocations: 16 | - offset: 0 17 | kind: PpcAddr16Ha 18 | symbol: 1 19 | addend: 0 20 | - offset: 4 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | - symbol: 0 25 | hash: 2656e9aa9864995db04839bae9bff4955f4eb881 26 | signature: PKAAAP//AAA4pQAA//8AAEgAAAT/////SAAABP////+ABQAI/////ywAAAD/////QIIAHP////+QZQAA/////zgAAAH/////OGAAAP////+QhQAE/////5AFAAj/////SAAACP////84YP///////06AACD///// 27 | symbols: 28 | - kind: Function 29 | name: __register_fragment 30 | size: 60 31 | flags: 1 32 | section: .text 33 | - kind: Object 34 | name: fragmentinfo 35 | size: 12 36 | flags: 2 37 | section: .bss 38 | relocations: 39 | - offset: 0 40 | kind: PpcAddr16Ha 41 | symbol: 1 42 | addend: 0 43 | - offset: 4 44 | kind: PpcAddr16Lo 45 | symbol: 1 46 | addend: 0 47 | - symbol: 0 48 | hash: 7a7b517c57b230978a35628147683bf87839916c 49 | signature: PKAAAP//AAA4AAAg/////zilAAD//wAAOMAAAP////98CQOm/////4AFAAj/////LAAAAP////9AggAc/////5BlAAD/////OAAAAf////98wzN4/////5CFAAT/////kAUACP////9OgAAg/////zjGAAH/////OKUADP////9CAP/U/////zhg////////ToAAIP////8= 50 | symbols: 51 | - kind: Function 52 | name: __register_fragment 53 | size: 76 54 | flags: 1 55 | section: .text 56 | - kind: Object 57 | name: fragmentinfo 58 | size: 384 59 | flags: 2 60 | section: .bss 61 | relocations: 62 | - offset: 0 63 | kind: PpcAddr16Ha 64 | symbol: 1 65 | addend: 0 66 | - offset: 8 67 | kind: PpcAddr16Lo 68 | symbol: 1 69 | addend: 0 70 | -------------------------------------------------------------------------------- /assets/signatures/__register_global_object.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 9ae42f2a8ca1c619848ba7c2ec54f348044470e4 3 | signature: gAAAAP/gAACQBQAA/////5CFAAT/////kGUACP////+QoAAA/+AAAE6AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __register_global_object 7 | size: 24 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: __global_destructor_chain 12 | size: 4 13 | flags: 1 14 | section: .sbss 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | - offset: 16 21 | kind: PpcEmbSda21 22 | symbol: 1 23 | addend: 0 24 | - symbol: 0 25 | hash: 22cb1f474182a4b5e07e63e09b574fae0bf8e672 26 | signature: PMAAAP//AACABgAA//8AAJAFAAD/////kIUABP////+QZQAI/////5CmAAD//wAAToAAIP////8= 27 | symbols: 28 | - kind: Function 29 | name: __register_global_object 30 | size: 28 31 | flags: 1 32 | section: .text 33 | - kind: Object 34 | name: __global_destructor_chain 35 | size: 4 36 | flags: 1 37 | section: .bss 38 | relocations: 39 | - offset: 0 40 | kind: PpcAddr16Ha 41 | symbol: 1 42 | addend: 0 43 | - offset: 4 44 | kind: PpcAddr16Lo 45 | symbol: 1 46 | addend: 0 47 | - offset: 20 48 | kind: PpcAddr16Lo 49 | symbol: 1 50 | addend: 0 51 | - symbol: 0 52 | hash: 6f0f3d0bb4895d84ee43877da689301e8fc9f844 53 | signature: PMAAAP////+ABgAA/////5AFAAD/////kIUABP////+QZQAI/////5CmAAD/////ToAAIP////8= 54 | symbols: 55 | - kind: Function 56 | name: __register_global_object 57 | size: 28 58 | flags: 1 59 | section: .text 60 | relocations: [] 61 | - symbol: 0 62 | hash: a6c9fe066ab0621a02049267cb648a2aab4f722e 63 | signature: PMAAAP//AACEBgAA//8AAJAFAAD/////kIUABP////+QZQAI/////5CmAAD/////ToAAIP////8= 64 | symbols: 65 | - kind: Function 66 | name: __register_global_object 67 | size: 28 68 | flags: 1 69 | section: .text 70 | - kind: Object 71 | name: __global_destructor_chain 72 | size: 4 73 | flags: 1 74 | section: .bss 75 | relocations: 76 | - offset: 0 77 | kind: PpcAddr16Ha 78 | symbol: 1 79 | addend: 0 80 | - offset: 4 81 | kind: PpcAddr16Lo 82 | symbol: 1 83 | addend: 0 84 | - symbol: 0 85 | hash: c174aed044d0767ee4cf6a7270fbd9c46bb45938 86 | signature: PMAAAP//AACABgAA//8AAJAFAAD/////kIUABP////+QZQAI/////zzAAAD//wAAkKYAAP//AABOgAAg/////w== 87 | symbols: 88 | - kind: Function 89 | name: __register_global_object 90 | size: 32 91 | flags: 1 92 | section: .text 93 | - kind: Object 94 | name: __global_destructor_chain 95 | size: 4 96 | flags: 1 97 | section: .bss 98 | relocations: 99 | - offset: 0 100 | kind: PpcAddr16Ha 101 | symbol: 1 102 | addend: 0 103 | - offset: 4 104 | kind: PpcAddr16Lo 105 | symbol: 1 106 | addend: 0 107 | - offset: 20 108 | kind: PpcAddr16Ha 109 | symbol: 1 110 | addend: 0 111 | - offset: 24 112 | kind: PpcAddr16Lo 113 | symbol: 1 114 | addend: 0 115 | -------------------------------------------------------------------------------- /assets/signatures/__set_debug_bba.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: a34eda2a630deec55eb36b098f554d192ef184aa 3 | signature: OAAAAf////+YAAAA/+AAAE6AACD///// 4 | symbols: 5 | - kind: Function 6 | name: __set_debug_bba 7 | size: 12 8 | flags: 2 9 | section: .init 10 | - kind: Object 11 | name: Debug_BBA 12 | size: 1 13 | flags: 2 14 | section: .sbss 15 | relocations: 16 | - offset: 4 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | -------------------------------------------------------------------------------- /assets/signatures/__stdio_atexit.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: c33febb49422cf93193217b85050688499bba101 3 | signature: ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __stdio_atexit 7 | size: 4 8 | flags: 1 9 | section: .text 10 | relocations: [] 11 | - symbol: 0 12 | hash: fa600b3dbea6e43098448e26ae05503d7d26ce45 13 | signature: PGAAAP//AAA4YwAA//8AAJBgAAD/4AAAToAAIP////8= 14 | symbols: 15 | - kind: Function 16 | name: __stdio_atexit 17 | size: 16 18 | flags: 1 19 | section: .text 20 | - kind: Function 21 | name: __close_all 22 | size: 0 23 | flags: 1 24 | section: .text 25 | - kind: Object 26 | name: __stdio_exit 27 | size: 4 28 | flags: 1 29 | section: .sbss 30 | relocations: 31 | - offset: 0 32 | kind: PpcAddr16Ha 33 | symbol: 1 34 | addend: 0 35 | - offset: 4 36 | kind: PpcAddr16Lo 37 | symbol: 1 38 | addend: 0 39 | - offset: 8 40 | kind: PpcEmbSda21 41 | symbol: 2 42 | addend: 0 43 | - symbol: 0 44 | hash: 5379a24e31fc4aa0bbcd90a4d8a2ca3309dfaf43 45 | signature: PGAAAP//AAA4AwAA//8AAJAAAAD/4AAAToAAIP////8= 46 | symbols: 47 | - kind: Function 48 | name: __stdio_atexit 49 | size: 16 50 | flags: 1 51 | section: .text 52 | - kind: Function 53 | name: __close_all 54 | size: 0 55 | flags: 1 56 | section: .text 57 | - kind: Object 58 | name: __stdio_exit 59 | size: 4 60 | flags: 1 61 | section: .sbss 62 | relocations: 63 | - offset: 0 64 | kind: PpcAddr16Ha 65 | symbol: 1 66 | addend: 0 67 | - offset: 4 68 | kind: PpcAddr16Lo 69 | symbol: 1 70 | addend: 0 71 | - offset: 8 72 | kind: PpcEmbSda21 73 | symbol: 2 74 | addend: 0 75 | -------------------------------------------------------------------------------- /assets/signatures/__unregister_fragment.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 7f011cf08af89b18fb76bcb1f7d104da62a785d6 3 | signature: LAMAAP////9MggAg/////xyDAAz/////PGAAAP//AAA4AAAA/////zhjAAD//wAAfAMhbv////+QAwAE/////5ADAAj/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: __unregister_fragment 7 | size: 40 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: fragmentinfo 12 | size: 12 13 | flags: 2 14 | section: .bss 15 | relocations: 16 | - offset: 12 17 | kind: PpcAddr16Ha 18 | symbol: 1 19 | addend: 0 20 | - offset: 20 21 | kind: PpcAddr16Lo 22 | symbol: 1 23 | addend: 0 24 | - symbol: 0 25 | hash: 63cfddab648b8040ba0fc548d9c6058245107cf5 26 | signature: KAMAH/////9NgQAg/////xyDAAz/////PGAAAP//AAA4AAAA/////zhjAAD//wAAfAMhbv////+QAwAE/////5ADAAj/////ToAAIP////8= 27 | symbols: 28 | - kind: Function 29 | name: __unregister_fragment 30 | size: 40 31 | flags: 1 32 | section: .text 33 | - kind: Object 34 | name: fragmentinfo 35 | size: 384 36 | flags: 2 37 | section: .bss 38 | relocations: 39 | - offset: 12 40 | kind: PpcAddr16Ha 41 | symbol: 1 42 | addend: 0 43 | - offset: 20 44 | kind: PpcAddr16Lo 45 | symbol: 1 46 | addend: 0 47 | - symbol: 0 48 | hash: 1c7fef6e356049ca092911ef494021318eeb8013 49 | signature: LAMAAP////9NgAAg/////ywDAAH/////TIAAIP////8cgwAM/////zxgAAD//wAAOAAAAP////84YwAA//8AAHwDIW7/////kAMABP////+QAwAI/////06AACD///// 50 | symbols: 51 | - kind: Function 52 | name: __unregister_fragment 53 | size: 48 54 | flags: 1 55 | section: .text 56 | - kind: Object 57 | name: fragmentinfo 58 | size: 12 59 | flags: 2 60 | section: .bss 61 | relocations: 62 | - offset: 20 63 | kind: PpcAddr16Ha 64 | symbol: 1 65 | addend: 0 66 | - offset: 28 67 | kind: PpcAddr16Lo 68 | symbol: 1 69 | addend: 0 70 | - symbol: 0 71 | hash: 0dba621b6fe389afcf2ab53bdb76db9d9dc8d54e 72 | signature: LAMAAP////9NgAAg/////ywDAAH/////TIAAIP////8cgwAM/////zxgAAD//wAAOAAAAP////84YwAA//8AAHxjIhT/////kAMAAP////+QAwAE/////5ADAAj/////ToAAIP////8= 73 | symbols: 74 | - kind: Function 75 | name: __unregister_fragment 76 | size: 52 77 | flags: 1 78 | section: .text 79 | - kind: Object 80 | name: fragmentinfo 81 | size: 12 82 | flags: 2 83 | section: .bss 84 | relocations: 85 | - offset: 20 86 | kind: PpcAddr16Ha 87 | symbol: 1 88 | addend: 0 89 | - offset: 28 90 | kind: PpcAddr16Lo 91 | symbol: 1 92 | addend: 0 93 | - symbol: 0 94 | hash: 8a6d162b7c2bade6367615664b53c6fa684930bd 95 | signature: LAMAAP////9BgAAs/////ywDAAH/////QIAAJP////8cgwAM/////zxgAAD//wAAOAMAAP//AAB8YCIU/////zgAAAD/////kAMAAP////+QAwAE/////5ADAAj/////ToAAIP////8= 96 | symbols: 97 | - kind: Function 98 | name: __unregister_fragment 99 | size: 52 100 | flags: 1 101 | section: .text 102 | - kind: Object 103 | name: fragmentinfo 104 | size: 12 105 | flags: 2 106 | section: .bss 107 | relocations: 108 | - offset: 20 109 | kind: PpcAddr16Ha 110 | symbol: 1 111 | addend: 0 112 | - offset: 24 113 | kind: PpcAddr16Lo 114 | symbol: 1 115 | addend: 0 116 | -------------------------------------------------------------------------------- /assets/signatures/nandIsInitialized.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: f817c1799784a6f7f1dadfff8b09e273cbce09f8 3 | signature: gGAAAP/gAAA4A//+/////3wAADT/////VAPZfv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: nandIsInitialized 7 | size: 20 8 | flags: 1 9 | section: .text 10 | - kind: Object 11 | name: s_libState 12 | size: 4 13 | flags: 2 14 | section: .sbss 15 | relocations: 16 | - offset: 0 17 | kind: PpcEmbSda21 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 75990b74647c490ee769808824dd3bb9f9265b94 22 | signature: gAAAAP/gAAAsAAAC/////0CCAAz/////OGAAAf////9IAAAI/////zhgAAD/////ToAAIP////8= 23 | symbols: 24 | - kind: Function 25 | name: nandIsInitialized 26 | size: 28 27 | flags: 1 28 | section: .text 29 | - kind: Object 30 | name: s_libState 31 | size: 4 32 | flags: 2 33 | section: .sbss 34 | relocations: 35 | - offset: 0 36 | kind: PpcEmbSda21 37 | symbol: 1 38 | addend: 0 39 | -------------------------------------------------------------------------------- /assets/signatures/vsnprintf.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: fa9f4305375ff4c38deda8008893305d166f1bc6 3 | signature: fAgCpv////+QAQAE/////zgAAAD/////lCH/0P////+T4QAs/////zvkAAD/////OIEAGP////+TwQAo/////3x+G3j/////PGAAAP//AACTwQAY/////zhjAAD//wAAk+EAHP////+QAQAg/////0gAAAH8AAADfAP4QP////9AgAAM/////3xkG3j/////SAAACP////84n////////zgAAAD/////fB4hrv////+AAQA0/////4PhACz/////g8EAKP////98CAOm/////zghADD/////ToAAIP////8= 4 | symbols: 5 | - kind: Function 6 | name: vsnprintf 7 | size: 112 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: __StringWrite 12 | size: 0 13 | flags: 1 14 | section: .text 15 | - kind: Function 16 | name: __pformatter 17 | size: 0 18 | flags: 2 19 | section: .text 20 | relocations: 21 | - offset: 36 22 | kind: PpcAddr16Ha 23 | symbol: 1 24 | addend: 0 25 | - offset: 44 26 | kind: PpcAddr16Lo 27 | symbol: 1 28 | addend: 0 29 | - offset: 56 30 | kind: PpcRel24 31 | symbol: 2 32 | addend: 0 33 | - symbol: 0 34 | hash: 5c158d8dc03137ede7b68e26eae7ea8e20f4cb70 35 | signature: lCH/4P////98CAKm/////5ABACT/////OAAAAP////+T4QAc/////3yfI3j/////OIEACP////+TwQAY/////3x+G3j/////PGAAAP//AACTwQAI/////zhjAAD//wAAk+EADP////+QAQAQ/////0gAAAH8AAADKB4AAP////9BggAc/////3wD+ED/////OJ////////9AgAAI/////3xkG3j/////OAAAAP////98HiGu/////4ABACT/////g+EAHP////+DwQAY/////3wIA6b/////OCEAIP////9OgAAg/////w== 36 | symbols: 37 | - kind: Function 38 | name: vsnprintf 39 | size: 116 40 | flags: 1 41 | section: .text 42 | - kind: Function 43 | name: __StringWrite 44 | size: 0 45 | flags: 1 46 | section: .text 47 | - kind: Function 48 | name: __pformatter 49 | size: 0 50 | flags: 2 51 | section: .text 52 | relocations: 53 | - offset: 36 54 | kind: PpcAddr16Ha 55 | symbol: 1 56 | addend: 0 57 | - offset: 44 58 | kind: PpcAddr16Lo 59 | symbol: 1 60 | addend: 0 61 | - offset: 56 62 | kind: PpcRel24 63 | symbol: 2 64 | addend: 0 65 | - symbol: 0 66 | hash: dae7c6adc471f7148006db699fa19d4d2d417161 67 | signature: lCH/0P////98CAKm/////zzgAAD//wAAkAEANP////+T4QAs/////zvgAAD/////k8EAKP////98niN4/////5OhACT/////fH0beP////+QYQAI/////zhnAAD//wAAkIEADP////84gQAI/////5PhABD/////SAAAAfwAAAMsHQAA/////0GCACT/////fAPwQP////9AgAAM/////3/9Ga7/////SAAAFP////8sHgAA/////0GCAAz/////fJ3yFP////+b5P///////4ABADT/////g+EALP////+DwQAo/////4OhACT/////fAgDpv////84IQAw/////06AACD///// 68 | symbols: 69 | - kind: Function 70 | name: vsnprintf 71 | size: 132 72 | flags: 1 73 | section: .text 74 | - kind: Function 75 | name: __StringWrite 76 | size: 0 77 | flags: 1 78 | section: .text 79 | - kind: Function 80 | name: __pformatter 81 | size: 0 82 | flags: 2 83 | section: .text 84 | relocations: 85 | - offset: 8 86 | kind: PpcAddr16Ha 87 | symbol: 1 88 | addend: 0 89 | - offset: 44 90 | kind: PpcAddr16Lo 91 | symbol: 1 92 | addend: 0 93 | - offset: 60 94 | kind: PpcRel24 95 | symbol: 2 96 | addend: 0 97 | - symbol: 0 98 | hash: 085881ea5beae3a4b56d9ce3c3886a1818c3b144 99 | signature: lCH/0P////98CAKm/////zzgAAD//wAAkAEANP////+T4QAs/////zvgAAD/////k8EAKP////98niN4/////5OhACT/////fH0beP////+QYQAI/////zhnAAD//wAAOOAAAP////+QgQAM/////ziBAAj/////k+EAEP////9IAAAB/AAAAywdAAD/////QYIAJP////98A/BA/////0CAAAz/////f/0Zrv////9IAAAU/////yweAAD/////QYIADP////98nfIU/////5vk////////gAEANP////+D4QAs/////4PBACj/////g6EAJP////98CAOm/////zghADD/////ToAAIP////8= 100 | symbols: 101 | - kind: Function 102 | name: vsnprintf 103 | size: 136 104 | flags: 1 105 | section: .text 106 | - kind: Function 107 | name: __StringWrite 108 | size: 0 109 | flags: 1 110 | section: .text 111 | - kind: Function 112 | name: __pformatter 113 | size: 0 114 | flags: 2 115 | section: .text 116 | relocations: 117 | - offset: 8 118 | kind: PpcAddr16Ha 119 | symbol: 1 120 | addend: 0 121 | - offset: 44 122 | kind: PpcAddr16Lo 123 | symbol: 1 124 | addend: 0 125 | - offset: 64 126 | kind: PpcRel24 127 | symbol: 2 128 | addend: 0 129 | - symbol: 0 130 | hash: 658726a44dbb17153ed490c2ec3a577cfad693d0 131 | signature: lCH/0P////98CAKm/////5ABADT/////OAAAAP////+T4QAs/////5PBACj/////k6EAJP////98fRt4/////zxgAAD//wAAk4EAIP////98nCN4/////zhjAAD//wAAOIEAEP////+QoQAI/////5DBAAz/////gKEACP////+ToQAQ/////4DBAAz/////k4EAFP////+QAQAY/////0gAAAH8AAADKB0AAP////98fxt4/////0GCACD/////fB/gQP////9AgAAM/////3/++3j/////SAAACP////873P///////zgAAAD/////fB3xrv////+AAQA0/////3/j+3j/////g+EALP////+DwQAo/////4OhACT/////g4EAIP////98CAOm/////zghADD/////ToAAIP////8= 132 | symbols: 133 | - kind: Function 134 | name: vsnprintf 135 | size: 160 136 | flags: 1 137 | section: .text 138 | - kind: Function 139 | name: __StringWrite 140 | size: 0 141 | flags: 1 142 | section: .text 143 | - kind: Function 144 | name: __pformatter 145 | size: 0 146 | flags: 2 147 | section: .text 148 | relocations: 149 | - offset: 32 150 | kind: PpcAddr16Ha 151 | symbol: 1 152 | addend: 0 153 | - offset: 44 154 | kind: PpcAddr16Lo 155 | symbol: 1 156 | addend: 0 157 | - offset: 80 158 | kind: PpcRel24 159 | symbol: 2 160 | addend: 0 -------------------------------------------------------------------------------- /assets/signatures/vsprintf.yml: -------------------------------------------------------------------------------- 1 | - symbol: 0 2 | hash: 0a86ea00beea7cea63ce37b5216063b5346c1c0b 3 | signature: fAgCpv////84xQAA/////5ABAAT/////OKQAAP////88gAAQ/////5Qh//j/////SAAAAfwAAAOAAQAM/////zghAAj/////fAgDpv////9OgAAg/////w== 4 | symbols: 5 | - kind: Function 6 | name: vsprintf 7 | size: 44 8 | flags: 1 9 | section: .text 10 | - kind: Function 11 | name: vsnprintf 12 | size: 0 13 | flags: 1 14 | section: .text 15 | relocations: 16 | - offset: 24 17 | kind: PpcRel24 18 | symbol: 1 19 | addend: 0 20 | - symbol: 0 21 | hash: 13170c969386c2018d768adfbab78de7aa63105d 22 | signature: lCH/4P////98CAKm/////5BhAAj/////kIEADP////84gP///////4BhAAj/////kKEAEP////+AoQAM/////5ABACT/////gMEAEP////9IAAAB/AAAA4ABACT/////fAgDpv////84IQAg/////06AACD///// 23 | symbols: 24 | - kind: Function 25 | name: vsprintf 26 | size: 60 27 | flags: 1 28 | section: .text 29 | - kind: Function 30 | name: vsnprintf 31 | size: 0 32 | flags: 1 33 | section: .text 34 | relocations: 35 | - offset: 40 36 | kind: PpcRel24 37 | symbol: 1 38 | addend: 0 39 | - symbol: 0 40 | hash: 5885efac2a796a2c1b4ff274c694aa4835b02bcd 41 | signature: fAgCpv////84xQAA/////5ABAAT/////OAAAAP////84pAAA/////5Qh/9j/////k+EAJP////874P///////ziBABT/////k8EAIP////98fht4/////zxgAAD//wAAk8EAFP////84YwAA//8AAJPhABj/////kAEAHP////9IAAAB/AAAA3wD+ED/////QIAADP////98ZBt4/////0gAAAj/////OID//v////84AAAA/////3weIa7/////gAEALP////+D4QAk/////4PBACD/////fAgDpv////84IQAo/////06AACD///// 42 | symbols: 43 | - kind: Function 44 | name: vsprintf 45 | size: 120 46 | flags: 1 47 | section: .text 48 | - kind: Function 49 | name: __StringWrite 50 | size: 0 51 | flags: 1 52 | section: .text 53 | - kind: Function 54 | name: __pformatter 55 | size: 0 56 | flags: 2 57 | section: .text 58 | relocations: 59 | - offset: 44 60 | kind: PpcAddr16Ha 61 | symbol: 1 62 | addend: 0 63 | - offset: 52 64 | kind: PpcAddr16Lo 65 | symbol: 1 66 | addend: 0 67 | - offset: 64 68 | kind: PpcRel24 69 | symbol: 2 70 | addend: 0 71 | - symbol: 0 72 | hash: cd553648d654529f91590b8f8f23051d871b875e 73 | signature: lCH/4P////98CAKm/////3ymK3j/////fIUjeP////+QAQAk/////zjg////////OAAAAP////84gQAI/////5PhABz/////fH8beP////88YAAA//8AAJPhAAj/////OGMAAP//AACQ4QAM/////5ABABD/////SAAAAfwAAAMoHwAA/////0GCACD/////OAD///////84gP/+/////3wDAED/////QIAACP////98ZBt4/////zgAAAD/////fB8hrv////+AAQAk/////4PhABz/////fAgDpv////84IQAg/////06AACD///// 74 | symbols: 75 | - kind: Function 76 | name: vsprintf 77 | size: 120 78 | flags: 1 79 | section: .text 80 | - kind: Function 81 | name: __StringWrite 82 | size: 0 83 | flags: 1 84 | section: .text 85 | - kind: Function 86 | name: __pformatter 87 | size: 0 88 | flags: 2 89 | section: .text 90 | relocations: 91 | - offset: 40 92 | kind: PpcAddr16Ha 93 | symbol: 1 94 | addend: 0 95 | - offset: 48 96 | kind: PpcAddr16Lo 97 | symbol: 1 98 | addend: 0 99 | - offset: 60 100 | kind: PpcRel24 101 | symbol: 2 102 | addend: 0 103 | - symbol: 0 104 | hash: 0ce7109467aa4020642bb441a6f6cc163c2acbf8 105 | signature: lCH/0P////98CAKm/////3ymK3j/////fIUjeP////+QAQA0/////zzgAAD//wAAOIEACP////+T4QAs/////zvgAAD/////k8EAKP////87wP///////5OhACT/////fH0beP////+QYQAI/////zhnAAD//wAAk8EADP////+T4QAQ/////0gAAAH8AAADLB0AAP////9BggAY/////3wD8ED/////QIAADP////9//Rmu/////0gAAAj/////m/3//v////+AAQA0/////4PhACz/////g8EAKP////+DoQAk/////3wIA6b/////OCEAMP////9OgAAg/////w== 106 | symbols: 107 | - kind: Function 108 | name: vsprintf 109 | size: 128 110 | flags: 1 111 | section: .text 112 | - kind: Function 113 | name: __StringWrite 114 | size: 0 115 | flags: 1 116 | section: .text 117 | - kind: Function 118 | name: __pformatter 119 | size: 0 120 | flags: 2 121 | section: .text 122 | relocations: 123 | - offset: 20 124 | kind: PpcAddr16Ha 125 | symbol: 1 126 | addend: 0 127 | - offset: 56 128 | kind: PpcAddr16Lo 129 | symbol: 1 130 | addend: 0 131 | - offset: 68 132 | kind: PpcRel24 133 | symbol: 2 134 | addend: 0 135 | - symbol: 0 136 | hash: 9027cdd7c152d7b4df6db6ff732d2e01fd7a2bd5 137 | signature: lCH/0P////98CAKm/////3ymK3j/////fIUjeP////+QAQA0/////zzgAAD//wAAOIEACP////+T4QAs/////zvgAAD/////k8EAKP////87wP///////5OhACT/////fH0beP////+QYQAI/////zhnAAD//wAAOOAAAP////+TwQAM/////5PhABD/////SAAAAfwAAAMsHQAA/////0GCABj/////fAPwQP////9AgAAM/////3/9Ga7/////SAAACP////+b/f/+/////4ABADT/////g+EALP////+DwQAo/////4OhACT/////fAgDpv////84IQAw/////06AACD///// 138 | symbols: 139 | - kind: Function 140 | name: vsprintf 141 | size: 132 142 | flags: 1 143 | section: .text 144 | - kind: Function 145 | name: __StringWrite 146 | size: 0 147 | flags: 1 148 | section: .text 149 | - kind: Function 150 | name: __pformatter 151 | size: 0 152 | flags: 2 153 | section: .text 154 | relocations: 155 | - offset: 20 156 | kind: PpcAddr16Ha 157 | symbol: 1 158 | addend: 0 159 | - offset: 56 160 | kind: PpcAddr16Lo 161 | symbol: 1 162 | addend: 0 163 | - offset: 72 164 | kind: PpcRel24 165 | symbol: 2 166 | addend: 0 167 | -------------------------------------------------------------------------------- /assets/syntax/README: -------------------------------------------------------------------------------- 1 | syntect packs generated from: 2 | https://github.com/braver/Solarized/blob/87e01090cf5fb821a234265b3138426ae84900e7/Solarized%20(dark).tmTheme 3 | https://github.com/sublimehq/Packages/tree/fa6b8629c95041bf262d4c1dab95c456a0530122/C%2B%2B 4 | 5 | // let mut theme_set = ThemeSet::load_from_folder("../Solarized")?; 6 | // syntect::dumps::dump_to_file(&theme_set, "assets/syntax/default.themedump")?; 7 | // 8 | // let mut builder = SyntaxSetBuilder::new(); 9 | // builder.add_from_folder("../sublimehq-Packages/C++", true)?; 10 | // let syntax_set = builder.build(); 11 | // syntect::dumps::dump_to_file(&syntax_set, "assets/syntax/default_newlines.packdump")?; 12 | -------------------------------------------------------------------------------- /assets/syntax/default.themedump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/encounter/decomp-toolkit/f4a67ee61929ab2b6b5c1b0433439f00730558be/assets/syntax/default.themedump -------------------------------------------------------------------------------- /assets/syntax/default_newlines.packdump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/encounter/decomp-toolkit/f4a67ee61929ab2b6b5c1b0433439f00730558be/assets/syntax/default_newlines.packdump -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | let output = std::process::Command::new("git") 3 | .args(["rev-parse", "HEAD"]) 4 | .output() 5 | .expect("Failed to execute git"); 6 | let rev = String::from_utf8(output.stdout).expect("Failed to parse git output"); 7 | println!("cargo:rustc-env=GIT_COMMIT_SHA={rev}"); 8 | println!("cargo:rustc-rerun-if-changed=.git/HEAD"); 9 | } 10 | -------------------------------------------------------------------------------- /docs/other_approaches.md: -------------------------------------------------------------------------------- 1 | # Other approaches 2 | 3 | ## Manual assembly 4 | 5 | With existing GameCube/Wii decompilation tooling, the setup process is very tedious and error-prone. 6 | The general process is: 7 | 8 | - Begin by disassembling the original binary with a tool like 9 | [doldisasm.py](https://gist.github.com/camthesaxman/a36f610dbf4cc53a874322ef146c4123). This produces one giant 10 | assembly file per section. 11 | - Manually comb through the assembly files and fix many issues, like incorrect or missing relocations, incorrect or 12 | missing symbols, and more. 13 | - Manually find-and-replace the auto-generated symbol names based on other sources, like other decompilation projects 14 | or a map file. (If you're lucky enough to have one) 15 | - Manually determine data types and sizes, and convert them accordingly. (For example, `.4byte` -> `.float`, strings, 16 | etc) 17 | - Manually split the assembly files into individual objects. This is a very tedious process, as it requires identifying 18 | the boundaries of each function, determining whether adjacent functions are related, finding associated 19 | data from each data section, and cut-and-pasting all of this into a new file. 20 | 21 | Other downsides of this approach: 22 | 23 | - Manually editing the assembly means that the result is not reproducible. You can't run the script again to 24 | make any updates, because your changes will be overwritten. This also means that the assembly files must be 25 | stored in version control, which is not ideal. 26 | - Incorrectly splitting objects is very easy to do, and can be difficult to detect. For example, a `.ctors` entry _must_ 27 | be located in the same object as the function it references, otherwise the linker will not generate the correct 28 | `.ctors` entry. `extab` and `extabindex` entries _must also_ be located in the same object as the function they 29 | reference, have a label and have the correct size, and have a direct relocation rather than a section-relative 30 | relocation. Otherwise, the linker will crash with a cryptic error message. 31 | - Relying on assembly means that you need an assembler. For GameCube/Wii, this means devkitPro, which is a 32 | large dependency and an obstacle for new contributors. The assembler also has some quirks that don't interact well 33 | with `mwldeppc`, which means that the object files must be manually post-processed to fix these issues. (See the 34 | [elf fixup](/README.md#elf-fixup) command) 35 | 36 | With decomp-toolkit: 37 | 38 | - Many analysis steps are automated and highly accurate. Many DOL files can be analyzed and split into re-linkable 39 | objects with no configuration. 40 | - Signature analysis automatically labels common functions and objects, and allows for more accurate relocation 41 | rebuilding. 42 | - Any manual adjustments are stored in configuration files, which are stored in version control. 43 | - Splitting is simplified by updating a configuration file. The analyzer will check for common issues, like 44 | incorrectly split `.ctors`/`.dtors`/`extab`/`extabindex` entries. If the user hasn't configured a split for these, 45 | the analyzer will automatically split them along with their associated functions to ensure that the linker will 46 | generate everything correctly. This means that matching code can be written without worrying about splitting all 47 | sections up front. 48 | - The splitter generates object files directly, with no assembler required. This means that we can avoid the devkitPro 49 | requirement. (Although we can still generate assembly files for viewing, editing, and compatibility with other tools) 50 | 51 | ## dadosod 52 | 53 | [dadosod](https://github.com/InusualZ/dadosod) is a newer replacement for `doldisasm.py`. It has more accurate function 54 | and relocation analysis than `doldisasm.py`, as well as support for renaming symbols based on a map file. However, since 55 | it operates as a one-shot assembly generator, it still suffers from many of the same issues described above. 56 | 57 | ## ppcdis 58 | 59 | [ppcdis](https://github.com/SeekyCt/ppcdis) is one of the tools that inspired decomp-toolkit. It has more accurate 60 | analysis than doldisasm.py, and has similar goals to decomp-toolkit. It's been used successfully in several 61 | decompilation projects. 62 | 63 | However, decomp-toolkit has a few advantages: 64 | 65 | - Faster and more accurate analysis. (See [Analyzer features](/README.md#analyzer-features)) 66 | - Emits object files directly, with no assembler required. 67 | - More robust handling of features like common BSS, `.ctors`/`.dtors`/`extab`/`extabindex`, and more. 68 | - Requires very little configuration to start. 69 | - Automatically labels common functions and objects with signature analysis. 70 | 71 | ## Honorable mentions 72 | 73 | [splat](https://github.com/ethteck/splat) is a binary splitting tool for N64 and PSX. Some ideas from splat inspired 74 | decomp-toolkit, like the symbol configuration format. 75 | -------------------------------------------------------------------------------- /docs/readme.md: -------------------------------------------------------------------------------- 1 | ### Visit the [dtk-template](https://github.com/encounter/dtk-template) repository for additional documentation, including a guide. 2 | -------------------------------------------------------------------------------- /docs/terminology.md: -------------------------------------------------------------------------------- 1 | # Terminology 2 | 3 | ## DOL 4 | 5 | A [DOL file](https://wiki.tockdom.com/wiki/DOL_(File_Format)) is the executable format used by GameCube and Wii games. 6 | It's essentially a raw binary with a header that contains information about the code and data sections, as well as the 7 | entry point. 8 | 9 | ## ELF 10 | 11 | An [ELF file](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) is the executable format used by most 12 | Unix-like operating systems. There are two common types of ELF files: **relocatable** and **executable**. 13 | 14 | A relocatable ELF (`.o`, also called "object file") contains machine code and relocation information, and is used as 15 | input to the linker. Each object file is compiled from a single source file (`.c`, `.cpp`). 16 | 17 | An executable ELF (`.elf`) contains the final machine code that can be loaded and executed. It *can* include 18 | information about symbols, debug information (DWARF), and sometimes information about the original relocations, but it 19 | is often missing some or all of these (referred to as "stripped"). 20 | 21 | ## Symbol 22 | 23 | A symbol is a name that is assigned to a memory address. Symbols can be functions, variables, or other data. 24 | 25 | **Local** symbols are only visible within the object file they are defined in. 26 | These are usually defined as `static` in C/C++ or are compiler-generated. 27 | 28 | **Global** symbols are visible to all object files, and their names must be unique. 29 | 30 | **Weak** symbols are similar to global symbols, but can be replaced by a global symbol with the same name. 31 | For example: the SDK defines a weak `OSReport` function, which can be replaced by a game-specific implementation. 32 | Weak symbols are also used for functions generated by the compiler or as a result of C++ features, since they can exist 33 | in multiple object files. The linker will deduplicate these functions, keeping only the first copy. 34 | 35 | ## Relocation 36 | 37 | A relocation is essentially a pointer to a symbol. At compile time, the final address of a symbol is 38 | not known yet, therefore a relocation is needed. 39 | At link time, each symbol is assigned a final address, and the linker will use the relocations to update the machine 40 | code with the final addresses of the symbol. 41 | 42 | Before: 43 | 44 | ```asm 45 | # Unrelocated, instructions point to address 0 (unknown) 46 | lis r3, 0 47 | ori r3, r3, 0 48 | ``` 49 | 50 | After: 51 | 52 | ```asm 53 | # Relocated, instructions point to 0x80001234 54 | lis r3, 0x8000 55 | ori r3, r3, 0x1234 56 | ``` 57 | 58 | Once the linker performs the relocation with the final address, the relocation is no longer needed. Still, sometimes the 59 | final ELF will still contain the relocation information, but the conversion to DOL will **always** remove it. 60 | 61 | When we analyze a file, we attempt to rebuild the relocations. This is useful for several reasons: 62 | 63 | - It allows us to split the file into relocatable objects. Each object can then be replaced with a decompiled version, 64 | as matching code is written. 65 | - It allows us to modify or add code and data to the game and have all machine code still to point to the correct 66 | symbols, which may now be in a different location. 67 | - It allows us to view the machine code in a disassembler and show symbol names instead of raw addresses. 68 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | fn_single_line = true 2 | group_imports = "StdExternalCrate" 3 | imports_granularity = "Crate" 4 | overflow_delimited_expr = true 5 | reorder_impl_items = true 6 | use_field_init_shorthand = true 7 | use_small_heuristics = "Max" 8 | where_single_line = true 9 | -------------------------------------------------------------------------------- /src/argp_version.rs: -------------------------------------------------------------------------------- 1 | // Originally from https://gist.github.com/suluke/e0c672492126be0a4f3b4f0e1115d77c 2 | //! Extend `argp` to be better integrated with the `cargo` ecosystem 3 | //! 4 | //! For now, this only adds a --version/-V option which causes early-exit. 5 | use std::ffi::OsStr; 6 | 7 | use argp::{parser::ParseGlobalOptions, EarlyExit, FromArgs, TopLevelCommand}; 8 | 9 | struct ArgsOrVersion<T>(T) 10 | where T: FromArgs; 11 | 12 | impl<T> TopLevelCommand for ArgsOrVersion<T> where T: FromArgs {} 13 | 14 | impl<T> FromArgs for ArgsOrVersion<T> 15 | where T: FromArgs 16 | { 17 | fn _from_args( 18 | command_name: &[&str], 19 | args: &[&OsStr], 20 | parent: Option<&mut dyn ParseGlobalOptions>, 21 | ) -> Result<Self, EarlyExit> { 22 | /// Also use argp for catching `--version`-only invocations 23 | #[derive(FromArgs)] 24 | struct Version { 25 | /// Print version information and exit. 26 | #[argp(switch, short = 'V')] 27 | pub version: bool, 28 | } 29 | 30 | match Version::from_args(command_name, args) { 31 | Ok(v) => { 32 | if v.version { 33 | println!( 34 | "{} {} {}", 35 | command_name.first().unwrap_or(&""), 36 | env!("CARGO_PKG_VERSION"), 37 | env!("GIT_COMMIT_SHA"), 38 | ); 39 | std::process::exit(0); 40 | } else { 41 | // Pass through empty arguments 42 | T::_from_args(command_name, args, parent).map(Self) 43 | } 44 | } 45 | Err(exit) => match exit { 46 | EarlyExit::Help(_help) => { 47 | // TODO: Chain help info from Version 48 | // For now, we just put the switch on T as well 49 | T::from_args(command_name, &["--help"]).map(Self) 50 | } 51 | EarlyExit::Err(_) => T::_from_args(command_name, args, parent).map(Self), 52 | }, 53 | } 54 | } 55 | } 56 | 57 | /// Create a `FromArgs` type from the current process’s `env::args`. 58 | /// 59 | /// This function will exit early from the current process if argument parsing was unsuccessful or if information like `--help` was requested. 60 | /// Error messages will be printed to stderr, and `--help` output to stdout. 61 | pub fn from_env<T>() -> T 62 | where T: TopLevelCommand { 63 | argp::parse_args_or_exit::<ArgsOrVersion<T>>(argp::DEFAULT).0 64 | } 65 | -------------------------------------------------------------------------------- /src/cmd/alf.rs: -------------------------------------------------------------------------------- 1 | use std::io::{stdout, Write}; 2 | 3 | use anyhow::Result; 4 | use argp::FromArgs; 5 | use typed_path::Utf8NativePathBuf; 6 | 7 | use crate::{ 8 | cmd, 9 | util::{ 10 | alf::AlfFile, 11 | file::buf_writer, 12 | path::native_path, 13 | reader::{Endian, FromReader}, 14 | }, 15 | vfs::open_file, 16 | }; 17 | 18 | #[derive(FromArgs, PartialEq, Debug)] 19 | /// Commands for processing NVIDIA Shield TV alf files. 20 | #[argp(subcommand, name = "alf")] 21 | pub struct Args { 22 | #[argp(subcommand)] 23 | command: SubCommand, 24 | } 25 | 26 | #[derive(FromArgs, PartialEq, Debug)] 27 | #[argp(subcommand)] 28 | enum SubCommand { 29 | Info(InfoArgs), 30 | Hashes(HashesArgs), 31 | } 32 | 33 | #[derive(FromArgs, PartialEq, Debug)] 34 | /// Prints information about an alf file. (Same as `dol info`) 35 | #[argp(subcommand, name = "info")] 36 | pub struct InfoArgs { 37 | #[argp(positional, from_str_fn(native_path))] 38 | /// alf file 39 | file: Utf8NativePathBuf, 40 | } 41 | 42 | #[derive(FromArgs, PartialEq, Debug)] 43 | /// Extracts symbol hashes from an alf file. 44 | #[argp(subcommand, name = "hashes")] 45 | pub struct HashesArgs { 46 | #[argp(positional, from_str_fn(native_path))] 47 | /// alf file 48 | alf_file: Utf8NativePathBuf, 49 | #[argp(positional, from_str_fn(native_path))] 50 | /// output file 51 | output: Option<Utf8NativePathBuf>, 52 | } 53 | 54 | pub fn run(args: Args) -> Result<()> { 55 | match args.command { 56 | SubCommand::Info(c_args) => info(c_args), 57 | SubCommand::Hashes(c_args) => hashes(c_args), 58 | } 59 | } 60 | 61 | fn hashes(args: HashesArgs) -> Result<()> { 62 | let alf_file = { 63 | let mut file = open_file(&args.alf_file, true)?; 64 | AlfFile::from_reader(file.as_mut(), Endian::Little)? 65 | }; 66 | let mut w: Box<dyn Write> = if let Some(output) = &args.output { 67 | Box::new(buf_writer(output)?) 68 | } else { 69 | Box::new(stdout()) 70 | }; 71 | let mut symbols = alf_file.symbols.clone(); 72 | symbols.sort_by_key(|s| s.address); 73 | for symbol in symbols { 74 | writeln!( 75 | w, 76 | "{:#010X} | {} | {:?} | {} | {} | {:#X}", 77 | symbol.address, 78 | symbol.section, 79 | symbol.kind, 80 | symbol.name, 81 | symbol.demangled_name, 82 | symbol.size 83 | )?; 84 | } 85 | w.flush()?; 86 | Ok(()) 87 | } 88 | 89 | fn info(args: InfoArgs) -> Result<()> { 90 | cmd::dol::info(cmd::dol::InfoArgs { dol_file: args.file, selfile: None }) 91 | } 92 | -------------------------------------------------------------------------------- /src/cmd/demangle.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{anyhow, Result}; 2 | use argp::FromArgs; 3 | use cwdemangle::{demangle, DemangleOptions}; 4 | 5 | #[derive(FromArgs, PartialEq, Eq, Debug)] 6 | /// Demangle a CodeWarrior C++ symbol. 7 | #[argp(subcommand, name = "demangle")] 8 | pub struct Args { 9 | #[argp(positional)] 10 | /// symbol to demangle 11 | symbol: String, 12 | #[argp(switch)] 13 | /// disable replacing `(void)` with `()` 14 | keep_void: bool, 15 | /// enable Metrowerks extensions 16 | #[argp(switch)] 17 | mw_extensions: bool, 18 | } 19 | 20 | pub fn run(args: Args) -> Result<()> { 21 | let options = DemangleOptions { 22 | omit_empty_parameters: !args.keep_void, 23 | mw_extensions: args.mw_extensions, 24 | }; 25 | match demangle(args.symbol.as_str(), &options) { 26 | Some(symbol) => { 27 | println!("{symbol}"); 28 | Ok(()) 29 | } 30 | None => Err(anyhow!("Failed to demangle symbol")), 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/cmd/disc.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{Error, Result}; 2 | use argp::FromArgs; 3 | use nodtool::SubCommand; 4 | 5 | #[derive(FromArgs, Debug)] 6 | /// Commands for processing disc images. 7 | #[argp(subcommand, name = "disc")] 8 | pub struct Args { 9 | #[argp(subcommand)] 10 | command: SubCommand, 11 | } 12 | 13 | pub fn run(args: Args) -> Result<()> { nodtool::run(args.command).map_err(Error::new) } 14 | -------------------------------------------------------------------------------- /src/cmd/extab.rs: -------------------------------------------------------------------------------- 1 | use std::io::Write; 2 | 3 | use anyhow::{Context, Result}; 4 | use argp::FromArgs; 5 | use typed_path::Utf8NativePathBuf; 6 | 7 | use crate::{ 8 | util, 9 | util::{ 10 | dol::{process_dol, write_dol}, 11 | elf::{is_elf_file, process_elf, write_elf}, 12 | file::buf_writer, 13 | path::native_path, 14 | }, 15 | vfs::open_file, 16 | }; 17 | 18 | #[derive(FromArgs, PartialEq, Debug)] 19 | /// Commands for processing extab (exception table) data. 20 | #[argp(subcommand, name = "extab")] 21 | pub struct Args { 22 | #[argp(subcommand)] 23 | command: SubCommand, 24 | } 25 | 26 | #[derive(FromArgs, PartialEq, Debug)] 27 | #[argp(subcommand)] 28 | enum SubCommand { 29 | Clean(CleanArgs), 30 | } 31 | 32 | #[derive(FromArgs, PartialEq, Eq, Debug)] 33 | /// Rewrites extab data in a DOL or ELF file, replacing any uninitialized padding bytes. 34 | #[argp(subcommand, name = "clean")] 35 | pub struct CleanArgs { 36 | #[argp(positional, from_str_fn(native_path))] 37 | /// Path to input file 38 | input: Utf8NativePathBuf, 39 | #[argp(positional, from_str_fn(native_path))] 40 | /// Path to output file 41 | output: Utf8NativePathBuf, 42 | #[argp(option, short = 'p')] 43 | /// Data to replace padding bytes with, encoded as a hexadecimal string. If not specified, padding bytes will be zeroed instead. 44 | padding: Option<String>, 45 | } 46 | 47 | pub fn run(args: Args) -> Result<()> { 48 | match args.command { 49 | SubCommand::Clean(clean_args) => clean_extab(clean_args), 50 | } 51 | } 52 | 53 | fn clean_extab(args: CleanArgs) -> Result<()> { 54 | let is_elf = is_elf_file(&args.input)?; 55 | let mut obj = if is_elf { 56 | process_elf(&args.input)? 57 | } else { 58 | let mut file = open_file(&args.input, true)?; 59 | let name = args.input.file_stem().unwrap_or_default(); 60 | process_dol(file.map()?, name)? 61 | }; 62 | let padding: Vec<u8> = match args.padding { 63 | None => Vec::new(), 64 | Some(padding_str) => { 65 | hex::decode(padding_str).context("Failed to decode padding bytes from hex")? 66 | } 67 | }; 68 | let num_cleaned = util::extab::clean_extab(&mut obj, padding.iter().copied())?; 69 | tracing::debug!("Cleaned {num_cleaned} extab symbols"); 70 | let mut out = buf_writer(&args.output)?; 71 | if is_elf { 72 | let data = write_elf(&obj, false)?; 73 | out.write_all(&data).context("Failed to write ELF")?; 74 | } else { 75 | write_dol(&obj, &mut out).context("Failed to write DOL")?; 76 | } 77 | Ok(()) 78 | } 79 | -------------------------------------------------------------------------------- /src/cmd/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod alf; 2 | pub mod ar; 3 | pub mod demangle; 4 | pub mod disc; 5 | pub mod dol; 6 | pub mod dwarf; 7 | pub mod elf; 8 | pub mod elf2dol; 9 | pub mod extab; 10 | pub mod map; 11 | pub mod nlzss; 12 | pub mod rarc; 13 | pub mod rel; 14 | pub mod rso; 15 | pub mod shasum; 16 | pub mod u8_arc; 17 | pub mod vfs; 18 | pub mod wad; 19 | pub mod yay0; 20 | pub mod yaz0; 21 | -------------------------------------------------------------------------------- /src/cmd/nlzss.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | 3 | use anyhow::{anyhow, Context, Result}; 4 | use argp::FromArgs; 5 | use typed_path::Utf8NativePathBuf; 6 | 7 | use crate::{ 8 | util::{file::process_rsp, nlzss, path::native_path, IntoCow, ToCow}, 9 | vfs::open_file, 10 | }; 11 | 12 | #[derive(FromArgs, PartialEq, Debug)] 13 | /// Commands for processing NLZSS-compressed files. 14 | #[argp(subcommand, name = "nlzss")] 15 | pub struct Args { 16 | #[argp(subcommand)] 17 | command: SubCommand, 18 | } 19 | 20 | #[derive(FromArgs, PartialEq, Debug)] 21 | #[argp(subcommand)] 22 | enum SubCommand { 23 | Decompress(DecompressArgs), 24 | } 25 | 26 | #[derive(FromArgs, PartialEq, Eq, Debug)] 27 | /// Decompresses NLZSS-compressed files. 28 | #[argp(subcommand, name = "decompress")] 29 | pub struct DecompressArgs { 30 | #[argp(positional, from_str_fn(native_path))] 31 | /// NLZSS-compressed file(s) 32 | files: Vec<Utf8NativePathBuf>, 33 | #[argp(option, short = 'o', from_str_fn(native_path))] 34 | /// Output file (or directory, if multiple files are specified). 35 | /// If not specified, decompresses in-place. 36 | output: Option<Utf8NativePathBuf>, 37 | } 38 | 39 | pub fn run(args: Args) -> Result<()> { 40 | match args.command { 41 | SubCommand::Decompress(args) => decompress(args), 42 | } 43 | } 44 | 45 | fn decompress(args: DecompressArgs) -> Result<()> { 46 | let files = process_rsp(&args.files)?; 47 | let single_file = files.len() == 1; 48 | for path in files { 49 | let mut file = open_file(&path, false)?; 50 | let data = nlzss::decompress(file.as_mut()) 51 | .map_err(|e| anyhow!("Failed to decompress '{}' with NLZSS: {}", path, e))?; 52 | let out_path = if let Some(output) = &args.output { 53 | if single_file { 54 | output.as_path().to_cow() 55 | } else { 56 | output.join(path.file_name().unwrap()).into_cow() 57 | } 58 | } else { 59 | path.as_path().to_cow() 60 | }; 61 | fs::write(out_path.as_ref(), data) 62 | .with_context(|| format!("Failed to write '{out_path}'"))?; 63 | } 64 | Ok(()) 65 | } 66 | -------------------------------------------------------------------------------- /src/cmd/rarc.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use argp::FromArgs; 3 | use typed_path::Utf8NativePathBuf; 4 | 5 | use super::vfs; 6 | use crate::util::path::native_path; 7 | 8 | #[derive(FromArgs, PartialEq, Debug)] 9 | /// Commands for processing RSO files. 10 | #[argp(subcommand, name = "rarc")] 11 | pub struct Args { 12 | #[argp(subcommand)] 13 | command: SubCommand, 14 | } 15 | 16 | #[derive(FromArgs, PartialEq, Debug)] 17 | #[argp(subcommand)] 18 | enum SubCommand { 19 | List(ListArgs), 20 | Extract(ExtractArgs), 21 | } 22 | 23 | #[derive(FromArgs, PartialEq, Eq, Debug)] 24 | /// Views RARC file information. 25 | #[argp(subcommand, name = "list")] 26 | pub struct ListArgs { 27 | #[argp(positional, from_str_fn(native_path))] 28 | /// RARC file 29 | file: Utf8NativePathBuf, 30 | #[argp(switch, short = 's')] 31 | /// Only print filenames. 32 | short: bool, 33 | } 34 | 35 | #[derive(FromArgs, PartialEq, Eq, Debug)] 36 | /// Extracts RARC file contents. 37 | #[argp(subcommand, name = "extract")] 38 | pub struct ExtractArgs { 39 | #[argp(positional, from_str_fn(native_path))] 40 | /// RARC file 41 | file: Utf8NativePathBuf, 42 | #[argp(option, short = 'o', from_str_fn(native_path))] 43 | /// output directory 44 | output: Option<Utf8NativePathBuf>, 45 | #[argp(switch)] 46 | /// Do not decompress files when copying. 47 | no_decompress: bool, 48 | #[argp(switch, short = 'q')] 49 | /// Quiet output. Don't print anything except errors. 50 | quiet: bool, 51 | } 52 | 53 | pub fn run(args: Args) -> Result<()> { 54 | match args.command { 55 | SubCommand::List(c_args) => list(c_args), 56 | SubCommand::Extract(c_args) => extract(c_args), 57 | } 58 | } 59 | 60 | fn list(args: ListArgs) -> Result<()> { 61 | let path = Utf8NativePathBuf::from(format!("{}:", args.file)); 62 | vfs::ls(vfs::LsArgs { path, short: args.short, recursive: true }) 63 | } 64 | 65 | fn extract(args: ExtractArgs) -> Result<()> { 66 | let path = Utf8NativePathBuf::from(format!("{}:", args.file)); 67 | let output = args.output.unwrap_or_else(|| Utf8NativePathBuf::from(".")); 68 | vfs::cp(vfs::CpArgs { 69 | paths: vec![path, output], 70 | no_decompress: args.no_decompress, 71 | quiet: args.quiet, 72 | }) 73 | } 74 | -------------------------------------------------------------------------------- /src/cmd/u8_arc.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use argp::FromArgs; 3 | use typed_path::Utf8NativePathBuf; 4 | 5 | use super::vfs; 6 | use crate::util::path::native_path; 7 | 8 | #[derive(FromArgs, PartialEq, Debug)] 9 | /// Commands for processing U8 (arc) files. 10 | #[argp(subcommand, name = "u8")] 11 | pub struct Args { 12 | #[argp(subcommand)] 13 | command: SubCommand, 14 | } 15 | 16 | #[derive(FromArgs, PartialEq, Debug)] 17 | #[argp(subcommand)] 18 | enum SubCommand { 19 | List(ListArgs), 20 | Extract(ExtractArgs), 21 | } 22 | 23 | #[derive(FromArgs, PartialEq, Eq, Debug)] 24 | /// Views U8 (arc) file information. 25 | #[argp(subcommand, name = "list")] 26 | pub struct ListArgs { 27 | #[argp(positional, from_str_fn(native_path))] 28 | /// U8 (arc) file 29 | file: Utf8NativePathBuf, 30 | #[argp(switch, short = 's')] 31 | /// Only print filenames. 32 | short: bool, 33 | } 34 | 35 | #[derive(FromArgs, PartialEq, Eq, Debug)] 36 | /// Extracts U8 (arc) file contents. 37 | #[argp(subcommand, name = "extract")] 38 | pub struct ExtractArgs { 39 | #[argp(positional, from_str_fn(native_path))] 40 | /// U8 (arc) file 41 | file: Utf8NativePathBuf, 42 | #[argp(option, short = 'o', from_str_fn(native_path))] 43 | /// output directory 44 | output: Option<Utf8NativePathBuf>, 45 | #[argp(switch)] 46 | /// Do not decompress files when copying. 47 | no_decompress: bool, 48 | #[argp(switch, short = 'q')] 49 | /// Quiet output. Don't print anything except errors. 50 | quiet: bool, 51 | } 52 | 53 | pub fn run(args: Args) -> Result<()> { 54 | match args.command { 55 | SubCommand::List(c_args) => list(c_args), 56 | SubCommand::Extract(c_args) => extract(c_args), 57 | } 58 | } 59 | 60 | fn list(args: ListArgs) -> Result<()> { 61 | let path = Utf8NativePathBuf::from(format!("{}:", args.file)); 62 | vfs::ls(vfs::LsArgs { path, short: args.short, recursive: true }) 63 | } 64 | 65 | fn extract(args: ExtractArgs) -> Result<()> { 66 | let path = Utf8NativePathBuf::from(format!("{}:", args.file)); 67 | let output = args.output.unwrap_or_else(|| Utf8NativePathBuf::from(".")); 68 | vfs::cp(vfs::CpArgs { 69 | paths: vec![path, output], 70 | no_decompress: args.no_decompress, 71 | quiet: args.quiet, 72 | }) 73 | } 74 | -------------------------------------------------------------------------------- /src/cmd/wad.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use argp::FromArgs; 3 | use size::Size; 4 | use typed_path::Utf8NativePathBuf; 5 | 6 | use crate::{ 7 | cmd::vfs, 8 | util::{ 9 | path::native_path, 10 | wad::{process_wad, verify_wad}, 11 | }, 12 | vfs::open_file, 13 | }; 14 | 15 | #[derive(FromArgs, PartialEq, Debug)] 16 | /// Commands for processing Wii WAD files. 17 | #[argp(subcommand, name = "wad")] 18 | pub struct Args { 19 | #[argp(subcommand)] 20 | command: SubCommand, 21 | } 22 | 23 | #[derive(FromArgs, PartialEq, Debug)] 24 | #[argp(subcommand)] 25 | enum SubCommand { 26 | Extract(ExtractArgs), 27 | Info(InfoArgs), 28 | Verify(VerifyArgs), 29 | } 30 | 31 | #[derive(FromArgs, PartialEq, Eq, Debug)] 32 | /// Extracts WAD file contents. 33 | #[argp(subcommand, name = "extract")] 34 | pub struct ExtractArgs { 35 | #[argp(positional, from_str_fn(native_path))] 36 | /// WAD file 37 | file: Utf8NativePathBuf, 38 | #[argp(option, short = 'o', from_str_fn(native_path))] 39 | /// output directory 40 | output: Option<Utf8NativePathBuf>, 41 | #[argp(switch)] 42 | /// Do not decompress files when copying. 43 | no_decompress: bool, 44 | #[argp(switch, short = 'q')] 45 | /// Quiet output. Don't print anything except errors. 46 | quiet: bool, 47 | } 48 | 49 | #[derive(FromArgs, PartialEq, Eq, Debug)] 50 | /// Views WAD file information. 51 | #[argp(subcommand, name = "info")] 52 | pub struct InfoArgs { 53 | #[argp(positional, from_str_fn(native_path))] 54 | /// WAD file 55 | file: Utf8NativePathBuf, 56 | } 57 | 58 | #[derive(FromArgs, PartialEq, Eq, Debug)] 59 | /// Verifies WAD file integrity. 60 | #[argp(subcommand, name = "verify")] 61 | pub struct VerifyArgs { 62 | #[argp(positional, from_str_fn(native_path))] 63 | /// WAD file 64 | file: Utf8NativePathBuf, 65 | } 66 | 67 | pub fn run(args: Args) -> Result<()> { 68 | match args.command { 69 | SubCommand::Info(c_args) => info(c_args), 70 | SubCommand::Verify(c_args) => verify(c_args), 71 | SubCommand::Extract(c_args) => extract(c_args), 72 | } 73 | } 74 | 75 | fn info(args: InfoArgs) -> Result<()> { 76 | let mut file = open_file(&args.file, true)?; 77 | let wad = process_wad(file.as_mut())?; 78 | println!("Title ID: {}", hex::encode(wad.ticket().title_id)); 79 | println!("Title key: {}", hex::encode(wad.title_key)); 80 | println!("Fake signed: {}", wad.fake_signed); 81 | for content in wad.contents() { 82 | println!( 83 | "Content {:08x}: Offset {:#X}, size {}", 84 | content.content_index.get(), 85 | wad.content_offset(content.content_index.get()), 86 | Size::from_bytes(content.size.get()) 87 | ); 88 | } 89 | Ok(()) 90 | } 91 | 92 | fn verify(args: VerifyArgs) -> Result<()> { 93 | let mut file = open_file(&args.file, true)?; 94 | let wad = process_wad(file.as_mut())?; 95 | verify_wad(&wad, file.as_mut())?; 96 | println!("Verification successful"); 97 | Ok(()) 98 | } 99 | 100 | fn extract(args: ExtractArgs) -> Result<()> { 101 | let path = Utf8NativePathBuf::from(format!("{}:", args.file)); 102 | let output = args.output.unwrap_or_else(|| Utf8NativePathBuf::from(".")); 103 | vfs::cp(vfs::CpArgs { 104 | paths: vec![path, output], 105 | no_decompress: args.no_decompress, 106 | quiet: args.quiet, 107 | }) 108 | } 109 | -------------------------------------------------------------------------------- /src/cmd/yay0.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | 3 | use anyhow::{Context, Result}; 4 | use argp::FromArgs; 5 | use typed_path::Utf8NativePathBuf; 6 | 7 | use crate::{ 8 | util::{ 9 | file::process_rsp, 10 | ncompress::{compress_yay0, decompress_yay0}, 11 | path::native_path, 12 | IntoCow, ToCow, 13 | }, 14 | vfs::open_file, 15 | }; 16 | 17 | #[derive(FromArgs, PartialEq, Debug)] 18 | /// Commands for processing YAY0-compressed files. 19 | #[argp(subcommand, name = "yay0")] 20 | pub struct Args { 21 | #[argp(subcommand)] 22 | command: SubCommand, 23 | } 24 | 25 | #[derive(FromArgs, PartialEq, Debug)] 26 | #[argp(subcommand)] 27 | enum SubCommand { 28 | Compress(CompressArgs), 29 | Decompress(DecompressArgs), 30 | } 31 | 32 | #[derive(FromArgs, PartialEq, Eq, Debug)] 33 | /// Compresses files using YAY0. 34 | #[argp(subcommand, name = "compress")] 35 | pub struct CompressArgs { 36 | #[argp(positional, from_str_fn(native_path))] 37 | /// Files to compress 38 | files: Vec<Utf8NativePathBuf>, 39 | #[argp(option, short = 'o', from_str_fn(native_path))] 40 | /// Output file (or directory, if multiple files are specified). 41 | /// If not specified, compresses in-place. 42 | output: Option<Utf8NativePathBuf>, 43 | } 44 | 45 | #[derive(FromArgs, PartialEq, Eq, Debug)] 46 | /// Decompresses YAY0-compressed files. 47 | #[argp(subcommand, name = "decompress")] 48 | pub struct DecompressArgs { 49 | #[argp(positional, from_str_fn(native_path))] 50 | /// YAY0-compressed files 51 | files: Vec<Utf8NativePathBuf>, 52 | #[argp(option, short = 'o', from_str_fn(native_path))] 53 | /// Output file (or directory, if multiple files are specified). 54 | /// If not specified, decompresses in-place. 55 | output: Option<Utf8NativePathBuf>, 56 | } 57 | 58 | pub fn run(args: Args) -> Result<()> { 59 | match args.command { 60 | SubCommand::Compress(args) => compress(args), 61 | SubCommand::Decompress(args) => decompress(args), 62 | } 63 | } 64 | 65 | fn compress(args: CompressArgs) -> Result<()> { 66 | let files = process_rsp(&args.files)?; 67 | let single_file = files.len() == 1; 68 | for path in files { 69 | let data = { 70 | let mut file = open_file(&path, false)?; 71 | compress_yay0(file.map()?) 72 | }; 73 | let out_path = if let Some(output) = &args.output { 74 | if single_file { 75 | output.as_path().to_cow() 76 | } else { 77 | output.join(path.file_name().unwrap()).into_cow() 78 | } 79 | } else { 80 | path.as_path().to_cow() 81 | }; 82 | fs::write(out_path.as_ref(), data) 83 | .with_context(|| format!("Failed to write '{out_path}'"))?; 84 | } 85 | Ok(()) 86 | } 87 | 88 | fn decompress(args: DecompressArgs) -> Result<()> { 89 | let files = process_rsp(&args.files)?; 90 | let single_file = files.len() == 1; 91 | for path in files { 92 | let data = { 93 | let mut file = open_file(&path, true)?; 94 | decompress_yay0(file.map()?) 95 | .with_context(|| format!("Failed to decompress '{path}' using Yay0"))? 96 | }; 97 | let out_path = if let Some(output) = &args.output { 98 | if single_file { 99 | output.as_path().to_cow() 100 | } else { 101 | output.join(path.file_name().unwrap()).into_cow() 102 | } 103 | } else { 104 | path.as_path().to_cow() 105 | }; 106 | fs::write(out_path.as_ref(), data) 107 | .with_context(|| format!("Failed to write '{out_path}'"))?; 108 | } 109 | Ok(()) 110 | } 111 | -------------------------------------------------------------------------------- /src/cmd/yaz0.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | 3 | use anyhow::{Context, Result}; 4 | use argp::FromArgs; 5 | use typed_path::Utf8NativePathBuf; 6 | 7 | use crate::{ 8 | util::{ 9 | file::process_rsp, 10 | ncompress::{compress_yaz0, decompress_yaz0}, 11 | path::native_path, 12 | IntoCow, ToCow, 13 | }, 14 | vfs::open_file, 15 | }; 16 | 17 | #[derive(FromArgs, PartialEq, Debug)] 18 | /// Commands for processing YAZ0-compressed files. 19 | #[argp(subcommand, name = "yaz0")] 20 | pub struct Args { 21 | #[argp(subcommand)] 22 | command: SubCommand, 23 | } 24 | 25 | #[derive(FromArgs, PartialEq, Debug)] 26 | #[argp(subcommand)] 27 | enum SubCommand { 28 | Compress(CompressArgs), 29 | Decompress(DecompressArgs), 30 | } 31 | 32 | #[derive(FromArgs, PartialEq, Eq, Debug)] 33 | /// Compresses files using YAZ0. 34 | #[argp(subcommand, name = "compress")] 35 | pub struct CompressArgs { 36 | #[argp(positional, from_str_fn(native_path))] 37 | /// Files to compress 38 | files: Vec<Utf8NativePathBuf>, 39 | #[argp(option, short = 'o', from_str_fn(native_path))] 40 | /// Output file (or directory, if multiple files are specified). 41 | /// If not specified, compresses in-place. 42 | output: Option<Utf8NativePathBuf>, 43 | } 44 | 45 | #[derive(FromArgs, PartialEq, Eq, Debug)] 46 | /// Decompresses YAZ0-compressed files. 47 | #[argp(subcommand, name = "decompress")] 48 | pub struct DecompressArgs { 49 | #[argp(positional, from_str_fn(native_path))] 50 | /// YAZ0-compressed files 51 | files: Vec<Utf8NativePathBuf>, 52 | #[argp(option, short = 'o', from_str_fn(native_path))] 53 | /// Output file (or directory, if multiple files are specified). 54 | /// If not specified, decompresses in-place. 55 | output: Option<Utf8NativePathBuf>, 56 | } 57 | 58 | pub fn run(args: Args) -> Result<()> { 59 | match args.command { 60 | SubCommand::Compress(args) => compress(args), 61 | SubCommand::Decompress(args) => decompress(args), 62 | } 63 | } 64 | 65 | fn compress(args: CompressArgs) -> Result<()> { 66 | let files = process_rsp(&args.files)?; 67 | let single_file = files.len() == 1; 68 | for path in files { 69 | let data = { 70 | let mut file = open_file(&path, false)?; 71 | compress_yaz0(file.map()?) 72 | }; 73 | let out_path = if let Some(output) = &args.output { 74 | if single_file { 75 | output.as_path().to_cow() 76 | } else { 77 | output.join(path.file_name().unwrap()).into_cow() 78 | } 79 | } else { 80 | path.as_path().to_cow() 81 | }; 82 | fs::write(out_path.as_ref(), data) 83 | .with_context(|| format!("Failed to write '{out_path}'"))?; 84 | } 85 | Ok(()) 86 | } 87 | 88 | fn decompress(args: DecompressArgs) -> Result<()> { 89 | let files = process_rsp(&args.files)?; 90 | let single_file = files.len() == 1; 91 | for path in files { 92 | let data = { 93 | let mut file = open_file(&path, false)?; 94 | decompress_yaz0(file.map()?) 95 | .with_context(|| format!("Failed to decompress '{path}' using Yaz0"))? 96 | }; 97 | let out_path = if let Some(output) = &args.output { 98 | if single_file { 99 | output.as_path().to_cow() 100 | } else { 101 | output.join(path.file_name().unwrap()).into_cow() 102 | } 103 | } else { 104 | path.as_path().to_cow() 105 | }; 106 | fs::write(out_path.as_ref(), data) 107 | .with_context(|| format!("Failed to write '{out_path}'"))?; 108 | } 109 | Ok(()) 110 | } 111 | -------------------------------------------------------------------------------- /src/obj/addresses.rs: -------------------------------------------------------------------------------- 1 | use crate::analysis::cfa::SectionAddress; 2 | 3 | /// A collection of address ranges. 4 | /// Slow to insert, but fast to check if an address is contained in any of the ranges. 5 | #[derive(Debug, Clone)] 6 | pub struct AddressRanges { 7 | /// (start, end) pairs of addresses. 8 | inner: Vec<(SectionAddress, u32)>, 9 | } 10 | 11 | impl Default for AddressRanges { 12 | fn default() -> Self { Self::new() } 13 | } 14 | 15 | impl AddressRanges { 16 | #[inline] 17 | pub fn new() -> Self { Self { inner: vec![] } } 18 | 19 | pub fn insert(&mut self, start: SectionAddress, end: SectionAddress) { 20 | debug_assert_eq!( 21 | start.section, end.section, 22 | "AddressIntervals::insert: start and end must be in the same section" 23 | ); 24 | // TODO: Handle overlapping ranges? 25 | match self.inner.binary_search_by_key(&start, |&(start, _)| start) { 26 | Ok(pos) => { 27 | let (_, end_ref) = &mut self.inner[pos]; 28 | *end_ref = end.address.max(*end_ref); 29 | } 30 | Err(pos) => self.inner.insert(pos, (start, end.address)), 31 | } 32 | } 33 | 34 | pub fn contains(&self, address: SectionAddress) -> bool { 35 | let pos = match self.inner.binary_search_by_key(&address, |&(start, _)| start) { 36 | Ok(_) => return true, 37 | Err(pos) => pos, 38 | }; 39 | if pos == 0 { 40 | return false; 41 | } 42 | let (start, end) = &self.inner[pos - 1]; 43 | start.section == address.section 44 | && address.address >= start.address 45 | && address.address < *end 46 | } 47 | } 48 | 49 | #[cfg(test)] 50 | mod tests { 51 | use super::*; 52 | 53 | #[test] 54 | fn test_contains() { 55 | let mut intervals = AddressRanges::new(); 56 | intervals.insert(SectionAddress { section: 0, address: 0x80000000 }, SectionAddress { 57 | section: 0, 58 | address: 0x80000004, 59 | }); 60 | intervals.insert(SectionAddress { section: 0, address: 0x80000008 }, SectionAddress { 61 | section: 0, 62 | address: 0x8000000C, 63 | }); 64 | intervals.insert(SectionAddress { section: 12, address: 0x80004000 }, SectionAddress { 65 | section: 12, 66 | address: 0x80004004, 67 | }); 68 | intervals.insert(SectionAddress { section: 12, address: 0x80004008 }, SectionAddress { 69 | section: 12, 70 | address: 0x8000400C, 71 | }); 72 | 73 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x80000000 })); 74 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x80000001 })); 75 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x80000002 })); 76 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x80000003 })); 77 | assert!(!intervals.contains(SectionAddress { section: 0, address: 0x80000004 })); 78 | assert!(!intervals.contains(SectionAddress { section: 0, address: 0x80000005 })); 79 | assert!(!intervals.contains(SectionAddress { section: 0, address: 0x80000006 })); 80 | assert!(!intervals.contains(SectionAddress { section: 0, address: 0x80000007 })); 81 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x80000008 })); 82 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x80000009 })); 83 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x8000000A })); 84 | assert!(intervals.contains(SectionAddress { section: 0, address: 0x8000000B })); 85 | 86 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x80004000 })); 87 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x80004001 })); 88 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x80004002 })); 89 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x80004003 })); 90 | assert!(!intervals.contains(SectionAddress { section: 12, address: 0x80004004 })); 91 | assert!(!intervals.contains(SectionAddress { section: 12, address: 0x80004005 })); 92 | assert!(!intervals.contains(SectionAddress { section: 12, address: 0x80004006 })); 93 | assert!(!intervals.contains(SectionAddress { section: 12, address: 0x80004007 })); 94 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x80004008 })); 95 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x80004009 })); 96 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x8000400A })); 97 | assert!(intervals.contains(SectionAddress { section: 12, address: 0x8000400B })); 98 | assert!(!intervals.contains(SectionAddress { section: 12, address: 0x8000400C })); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/obj/splits.rs: -------------------------------------------------------------------------------- 1 | use std::{cmp::max, collections::BTreeMap, ops::RangeBounds}; 2 | 3 | use anyhow::{anyhow, Result}; 4 | use itertools::Itertools; 5 | 6 | use crate::{ 7 | obj::{ObjInfo, ObjSection, SectionIndex}, 8 | util::split::default_section_align, 9 | }; 10 | 11 | /// Marks a split point within a section. 12 | #[derive(Debug, Clone, Eq, PartialEq)] 13 | pub struct ObjSplit { 14 | pub unit: String, 15 | pub end: u32, 16 | pub align: Option<u32>, 17 | /// Whether this is a part of common BSS. 18 | pub common: bool, 19 | /// Generated, replaceable by user. 20 | pub autogenerated: bool, 21 | /// Skip when emitting the split object. 22 | pub skip: bool, 23 | /// Override the section name in the split object. (e.g. `.ctors$10`) 24 | pub rename: Option<String>, 25 | } 26 | 27 | impl ObjSplit { 28 | pub fn alignment( 29 | &self, 30 | obj: &ObjInfo, 31 | section_index: SectionIndex, 32 | section: &ObjSection, 33 | split_addr: u32, 34 | ) -> u32 { 35 | self.align.unwrap_or_else(|| { 36 | let default_align = default_section_align(section) as u32; 37 | max( 38 | // Maximum alignment of any symbol in this split 39 | obj.symbols 40 | .for_section_range(section_index, split_addr..self.end) 41 | .filter(|&(_, s)| s.size_known && s.size > 0) 42 | .filter_map(|(_, s)| s.align) 43 | .max() 44 | .unwrap_or(default_align), 45 | default_align, 46 | ) 47 | }) 48 | } 49 | } 50 | 51 | /// Splits within a section. 52 | #[derive(Debug, Clone, Default)] 53 | pub struct ObjSplits { 54 | splits: BTreeMap<u32, Vec<ObjSplit>>, 55 | } 56 | 57 | impl ObjSplits { 58 | pub fn iter(&self) -> impl DoubleEndedIterator<Item = (u32, &ObjSplit)> { 59 | self.splits.iter().flat_map(|(addr, v)| v.iter().map(move |u| (*addr, u))) 60 | } 61 | 62 | pub fn iter_mut(&mut self) -> impl DoubleEndedIterator<Item = (u32, &mut ObjSplit)> { 63 | self.splits.iter_mut().flat_map(|(addr, v)| v.iter_mut().map(move |u| (*addr, u))) 64 | } 65 | 66 | pub fn has_split_at(&self, address: u32) -> bool { self.splits.contains_key(&address) } 67 | 68 | /// Locate an existing split for the given address. 69 | pub fn for_address(&self, address: u32) -> Option<(u32, &ObjSplit)> { 70 | match self.for_range(..=address).next_back() { 71 | Some((addr, split)) if split.end == 0 || split.end > address => Some((addr, split)), 72 | _ => None, 73 | } 74 | } 75 | 76 | pub fn at_mut(&mut self, address: u32) -> Option<&mut ObjSplit> { 77 | match self.for_range_mut(..=address).next_back() { 78 | Some((_, split)) if split.end == 0 || split.end > address => Some(split), 79 | _ => None, 80 | } 81 | } 82 | 83 | /// Locate existing splits within the given address range. 84 | pub fn for_range<R>(&self, range: R) -> impl DoubleEndedIterator<Item = (u32, &ObjSplit)> 85 | where R: RangeBounds<u32> { 86 | self.splits.range(range).flat_map(|(addr, v)| v.iter().map(move |u| (*addr, u))) 87 | } 88 | 89 | /// Locate existing splits within the given address range. 90 | pub fn for_range_mut<R>( 91 | &mut self, 92 | range: R, 93 | ) -> impl DoubleEndedIterator<Item = (u32, &mut ObjSplit)> 94 | where 95 | R: RangeBounds<u32>, 96 | { 97 | self.splits.range_mut(range).flat_map(|(addr, v)| v.iter_mut().map(move |u| (*addr, u))) 98 | } 99 | 100 | pub fn for_unit(&self, unit: &str) -> Result<Option<(u32, &ObjSplit)>> { 101 | self.splits 102 | .iter() 103 | .flat_map(|(addr, v)| v.iter().map(move |u| (*addr, u))) 104 | .filter(|&(_, split)| split.unit == unit) 105 | .at_most_one() 106 | .map_err(|_| anyhow!("Multiple splits for unit {}", unit)) 107 | } 108 | 109 | pub fn push(&mut self, address: u32, split: ObjSplit) { 110 | let out = self.splits.entry(address).or_default(); 111 | out.push(split); 112 | out.sort_by_key(|s| s.end); 113 | } 114 | 115 | pub fn remove(&mut self, address: u32) -> Option<Vec<ObjSplit>> { self.splits.remove(&address) } 116 | } 117 | -------------------------------------------------------------------------------- /src/util/bin2c.rs: -------------------------------------------------------------------------------- 1 | use std::{fmt, str::FromStr}; 2 | 3 | use crate::obj::{ObjSection, ObjSectionKind, ObjSymbol}; 4 | 5 | const PROLOGUE: &str = r#" 6 | #ifndef ATTRIBUTE_ALIGN 7 | #if defined(__MWERKS__) || defined(__GNUC__) 8 | #define ATTRIBUTE_ALIGN(num) __attribute__((aligned(num))) 9 | #elif defined(_MSC_VER) || defined(__INTELLISENSE__) 10 | #define ATTRIBUTE_ALIGN(num) 11 | #else 12 | #error unknown compiler 13 | #endif 14 | #endif 15 | 16 | "#; 17 | 18 | /// The output header type. 19 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] 20 | pub enum HeaderKind { 21 | /// Do not generate a header. (Used for custom processing) 22 | None, 23 | /// A full symbol definition. 24 | Symbol, 25 | /// Raw array data. 26 | Raw, 27 | } 28 | 29 | impl FromStr for HeaderKind { 30 | type Err = (); 31 | 32 | fn from_str(s: &str) -> Result<Self, Self::Err> { 33 | match s { 34 | "none" => Ok(Self::None), 35 | "symbol" => Ok(Self::Symbol), 36 | "raw" => Ok(Self::Raw), 37 | _ => Err(()), 38 | } 39 | } 40 | } 41 | 42 | impl fmt::Display for HeaderKind { 43 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 44 | match self { 45 | Self::None => write!(f, "none"), 46 | Self::Symbol => write!(f, "symbol"), 47 | Self::Raw => write!(f, "raw"), 48 | } 49 | } 50 | } 51 | 52 | /// Converts a binary blob into a C array. 53 | pub fn bin2c( 54 | symbol: &ObjSymbol, 55 | section: &ObjSection, 56 | data: &[u8], 57 | kind: HeaderKind, 58 | rename: Option<&str>, 59 | ) -> String { 60 | match kind { 61 | HeaderKind::None => String::new(), 62 | HeaderKind::Symbol => bin2c_symbol(symbol, section, data, rename), 63 | HeaderKind::Raw => bin2c_raw(data), 64 | } 65 | } 66 | 67 | fn bin2c_symbol( 68 | symbol: &ObjSymbol, 69 | section: &ObjSection, 70 | data: &[u8], 71 | rename: Option<&str>, 72 | ) -> String { 73 | let mut output = String::new(); 74 | output.push_str(PROLOGUE); 75 | output.push_str(&format!( 76 | "// {} (size: {:#X}, address: {:#X}, section: {})\n", 77 | symbol.name, symbol.size, symbol.address, section.name 78 | )); 79 | if symbol.flags.is_local() { 80 | output.push_str("static "); 81 | } 82 | if section.kind == ObjSectionKind::ReadOnlyData { 83 | output.push_str("const "); 84 | } 85 | output.push_str("unsigned char "); 86 | if let Some(rename) = rename { 87 | output.push_str(rename); 88 | } else { 89 | output.push_str(symbol.demangled_name.as_deref().unwrap_or(symbol.name.as_str())); 90 | } 91 | output.push_str(&format!("[] ATTRIBUTE_ALIGN({}) = {{", symbol.align.unwrap_or(4))); 92 | for (i, byte) in data.iter().enumerate() { 93 | if i % 16 == 0 { 94 | output.push_str("\n "); 95 | } else { 96 | output.push(' '); 97 | } 98 | output.push_str(&format!("0x{byte:02X},")); 99 | } 100 | output.push_str("\n};\n"); 101 | output 102 | } 103 | 104 | fn bin2c_raw(data: &[u8]) -> String { 105 | let mut output = String::new(); 106 | for (i, byte) in data.iter().enumerate() { 107 | if i > 0 { 108 | if i % 16 == 0 { 109 | output.push('\n'); 110 | } else { 111 | output.push(' '); 112 | } 113 | } 114 | output.push_str(&format!("0x{byte:02X},")); 115 | } 116 | output.push('\n'); 117 | output 118 | } 119 | -------------------------------------------------------------------------------- /src/util/dep.rs: -------------------------------------------------------------------------------- 1 | use std::io::Write; 2 | 3 | use itertools::Itertools; 4 | use typed_path::{Utf8NativePath, Utf8NativePathBuf, Utf8UnixPathBuf}; 5 | 6 | pub struct DepFile { 7 | pub name: Utf8UnixPathBuf, 8 | pub dependencies: Vec<Utf8UnixPathBuf>, 9 | } 10 | 11 | fn normalize_path(path: Utf8NativePathBuf) -> Utf8UnixPathBuf { 12 | if let Some((a, _)) = path.as_str().split_once(':') { 13 | Utf8NativePath::new(a).with_unix_encoding() 14 | } else { 15 | path.with_unix_encoding() 16 | } 17 | } 18 | 19 | impl DepFile { 20 | pub fn new(name: Utf8NativePathBuf) -> Self { 21 | Self { name: name.with_unix_encoding(), dependencies: vec![] } 22 | } 23 | 24 | pub fn push(&mut self, dependency: Utf8NativePathBuf) { 25 | self.dependencies.push(normalize_path(dependency)); 26 | } 27 | 28 | pub fn extend(&mut self, dependencies: Vec<Utf8NativePathBuf>) { 29 | self.dependencies.extend(dependencies.into_iter().map(normalize_path)); 30 | } 31 | 32 | pub fn write<W>(&self, w: &mut W) -> std::io::Result<()> 33 | where W: Write + ?Sized { 34 | write!(w, "{}:", self.name)?; 35 | for dep in self.dependencies.iter().unique() { 36 | write!(w, " \\\n {}", dep.as_str().replace(' ', "\\ "))?; 37 | } 38 | Ok(()) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/util/extab.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{Context, Result}; 2 | use itertools::Itertools; 3 | 4 | use crate::obj::ObjInfo; 5 | 6 | pub fn clean_extab(obj: &mut ObjInfo, mut padding: impl Iterator<Item = u8>) -> Result<usize> { 7 | let (extab_section_index, extab_section) = obj 8 | .sections 9 | .iter_mut() 10 | .find(|(_, s)| s.name == "extab") 11 | .ok_or_else(|| anyhow::anyhow!("No extab section found"))?; 12 | let mut num_cleaned = 0; 13 | for (_symbol_index, symbol) in obj 14 | .symbols 15 | .for_section(extab_section_index) 16 | .filter(|(_, s)| s.size > 0) 17 | .sorted_by_key(|(_, s)| s.address) 18 | { 19 | let data = extab_section.symbol_data(symbol)?; 20 | let decoded = cwextab::decode_extab(data).with_context(|| { 21 | format!( 22 | "Failed to decode {} (extab {:#010X}..{:#010X})", 23 | symbol.name, 24 | symbol.address, 25 | symbol.address + symbol.size 26 | ) 27 | })?; 28 | let mut updated = false; 29 | for action in &decoded.exception_actions { 30 | // Check if the current action has padding 31 | if let Some(padding_offset) = action.get_struct_padding_offset() { 32 | let index = padding_offset as usize; 33 | let section_offset = (symbol.address - extab_section.address) as usize 34 | + action.action_offset as usize; 35 | let mut clean_data: Vec<u8> = action.get_exaction_bytes(false); 36 | // Write the two padding bytes 37 | clean_data[index] = padding.next().unwrap_or(0); 38 | clean_data[index + 1] = padding.next().unwrap_or(0); 39 | 40 | let orig_data = 41 | &mut extab_section.data[section_offset..section_offset + clean_data.len()]; 42 | orig_data.copy_from_slice(&clean_data); 43 | updated = true; 44 | } 45 | } 46 | if updated { 47 | tracing::debug!( 48 | "Replaced uninitialized bytes in {} (extab {:#010X}..{:#010X})", 49 | symbol.name, 50 | symbol.address, 51 | symbol.address + symbol.size 52 | ); 53 | num_cleaned += 1; 54 | } 55 | } 56 | Ok(num_cleaned) 57 | } 58 | -------------------------------------------------------------------------------- /src/util/lcf.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use itertools::Itertools; 3 | use typed_path::{Utf8NativePathBuf, Utf8UnixPath}; 4 | 5 | use crate::obj::{ObjInfo, ObjKind}; 6 | 7 | const LCF_TEMPLATE: &str = include_str!("../../assets/ldscript.lcf"); 8 | const LCF_PARTIAL_TEMPLATE: &str = include_str!("../../assets/ldscript_partial.lcf"); 9 | 10 | pub fn generate_ldscript( 11 | obj: &ObjInfo, 12 | template: Option<&str>, 13 | force_active: &[String], 14 | ) -> Result<String> { 15 | if obj.kind == ObjKind::Relocatable { 16 | return generate_ldscript_partial(obj, template, force_active); 17 | } 18 | 19 | let origin = obj.sections.iter().map(|(_, s)| s.address).min().unwrap(); 20 | let stack_size = match (obj.stack_address, obj.stack_end) { 21 | (Some(stack_address), Some(stack_end)) => stack_address - stack_end, 22 | _ => 65535, // default 23 | }; 24 | 25 | let section_defs = obj 26 | .sections 27 | .iter() 28 | .map(|(_, s)| format!("{} ALIGN({:#X}):{{}}", s.name, s.align)) 29 | .join("\n "); 30 | 31 | let mut force_files = Vec::with_capacity(obj.link_order.len()); 32 | for unit in &obj.link_order { 33 | let obj_path = obj_path_for_unit(&unit.name); 34 | force_files.push(obj_path.file_name().unwrap().to_string()); 35 | } 36 | 37 | let mut force_active = force_active.to_vec(); 38 | for (_, symbol) in obj.symbols.iter() { 39 | if symbol.flags.is_exported() && symbol.flags.is_global() && !symbol.flags.is_no_write() { 40 | force_active.push(symbol.name.clone()); 41 | } 42 | } 43 | 44 | // Hack to handle missing .sbss2 section... what's the proper way? 45 | let last_section_name = obj.sections.iter().next_back().unwrap().1.name.clone(); 46 | let last_section_symbol = format!("_f_{}", last_section_name.trim_start_matches('.')); 47 | 48 | let out = template 49 | .unwrap_or(LCF_TEMPLATE) 50 | .replace("$ORIGIN", &format!("{origin:#X}")) 51 | .replace("$SECTIONS", §ion_defs) 52 | .replace("$LAST_SECTION_SYMBOL", &last_section_symbol) 53 | .replace("$LAST_SECTION_NAME", &last_section_name) 54 | .replace("$STACKSIZE", &format!("{stack_size:#X}")) 55 | .replace("$FORCEACTIVE", &force_active.join("\n ")) 56 | .replace("$ARENAHI", &format!("{:#X}", obj.arena_hi.unwrap_or(0x81700000))); 57 | Ok(out) 58 | } 59 | 60 | pub fn generate_ldscript_partial( 61 | obj: &ObjInfo, 62 | template: Option<&str>, 63 | force_active: &[String], 64 | ) -> Result<String> { 65 | let mut section_defs = obj 66 | .sections 67 | .iter() 68 | .map(|(_, s)| { 69 | let inner = if s.name == ".data" { " *(.data) *(extabindex) *(extab) " } else { "" }; 70 | format!("{} ALIGN({:#X}):{{{}}}", s.name, s.align, inner) 71 | }) 72 | .join("\n "); 73 | 74 | // Some RELs have no entry point (`.text` was stripped) so mwld requires at least an empty 75 | // `.init` section to be present in the linker script, for some reason. 76 | if obj.entry.is_none() { 77 | section_defs = format!(".init :{{}}\n {section_defs}"); 78 | } 79 | 80 | let mut force_files = Vec::with_capacity(obj.link_order.len()); 81 | for unit in &obj.link_order { 82 | let obj_path = obj_path_for_unit(&unit.name); 83 | force_files.push(obj_path.file_name().unwrap().to_string()); 84 | } 85 | 86 | let mut force_active = force_active.to_vec(); 87 | for (_, symbol) in obj.symbols.iter() { 88 | if symbol.flags.is_exported() && symbol.flags.is_global() && !symbol.flags.is_no_write() { 89 | force_active.push(symbol.name.clone()); 90 | } 91 | } 92 | 93 | let out = template 94 | .unwrap_or(LCF_PARTIAL_TEMPLATE) 95 | .replace("$SECTIONS", §ion_defs) 96 | .replace("$FORCEACTIVE", &force_active.join("\n ")); 97 | Ok(out) 98 | } 99 | 100 | pub fn obj_path_for_unit(unit: &str) -> Utf8NativePathBuf { 101 | Utf8UnixPath::new(unit).with_encoding().with_extension("o") 102 | } 103 | 104 | pub fn asm_path_for_unit(unit: &str) -> Utf8NativePathBuf { 105 | Utf8UnixPath::new(unit).with_encoding().with_extension("s") 106 | } 107 | -------------------------------------------------------------------------------- /src/util/mod.rs: -------------------------------------------------------------------------------- 1 | use std::{borrow::Cow, ops::Deref}; 2 | 3 | pub mod alf; 4 | pub mod asm; 5 | pub mod bin2c; 6 | pub mod comment; 7 | pub mod config; 8 | pub mod dep; 9 | pub mod diff; 10 | pub mod dol; 11 | pub mod dwarf; 12 | pub mod elf; 13 | pub mod extab; 14 | pub mod file; 15 | pub mod lcf; 16 | pub mod map; 17 | pub mod ncompress; 18 | pub mod nested; 19 | pub mod nlzss; 20 | pub mod path; 21 | pub mod rarc; 22 | pub mod read; 23 | pub mod reader; 24 | pub mod rel; 25 | pub mod rso; 26 | pub mod signatures; 27 | pub mod split; 28 | pub mod take_seek; 29 | pub mod toposort; 30 | pub mod u8_arc; 31 | pub mod wad; 32 | 33 | #[inline] 34 | pub const fn align_up(value: u32, align: u32) -> u32 { (value + (align - 1)) & !(align - 1) } 35 | 36 | /// Creates a fixed-size array reference from a slice. 37 | #[macro_export] 38 | macro_rules! array_ref { 39 | ($slice:expr, $offset:expr, $size:expr) => {{ 40 | #[inline] 41 | fn to_array<T>(slice: &[T]) -> &[T; $size] { 42 | unsafe { &*(slice.as_ptr() as *const [_; $size]) } 43 | } 44 | to_array(&$slice[$offset..$offset + $size]) 45 | }}; 46 | } 47 | 48 | /// Creates a fixed-size mutable array reference from a slice. 49 | #[macro_export] 50 | macro_rules! array_ref_mut { 51 | ($slice:expr, $offset:expr, $size:expr) => {{ 52 | #[inline] 53 | fn to_array_mut<T>(slice: &mut [T]) -> &mut [T; $size] { 54 | unsafe { &mut *(slice.as_mut_ptr() as *mut [_; $size]) } 55 | } 56 | to_array_mut(&mut $slice[$offset..$offset + $size]) 57 | }}; 58 | } 59 | 60 | /// Compile-time assertion. 61 | #[macro_export] 62 | macro_rules! static_assert { 63 | ($condition:expr) => { 64 | const _: () = core::assert!($condition); 65 | }; 66 | } 67 | 68 | pub trait IntoCow<'a, B> 69 | where B: ToOwned + ?Sized 70 | { 71 | fn into_cow(self) -> Cow<'a, B>; 72 | } 73 | 74 | pub trait ToCow<'a, B> 75 | where B: ToOwned + ?Sized 76 | { 77 | fn to_cow(&'a self) -> Cow<'a, B>; 78 | } 79 | 80 | impl<'a, O> IntoCow<'a, <O as Deref>::Target> for O 81 | where 82 | O: Deref + Clone + 'a, 83 | <O as Deref>::Target: ToOwned<Owned = O>, 84 | { 85 | fn into_cow(self) -> Cow<'a, <O as Deref>::Target> { Cow::Owned(self) } 86 | } 87 | 88 | impl<'a, B> ToCow<'a, B> for B 89 | where B: ToOwned + ?Sized 90 | { 91 | fn to_cow(&'a self) -> Cow<'a, B> { Cow::Borrowed(self) } 92 | } 93 | 94 | pub enum Bytes<'a> { 95 | Borrowed(&'a [u8]), 96 | Owned(Box<[u8]>), 97 | } 98 | 99 | impl Bytes<'_> { 100 | pub fn into_owned(self) -> Box<[u8]> { 101 | match self { 102 | Bytes::Borrowed(s) => Box::from(s), 103 | Bytes::Owned(b) => b, 104 | } 105 | } 106 | } 107 | 108 | impl AsRef<[u8]> for Bytes<'_> { 109 | fn as_ref(&self) -> &[u8] { 110 | match self { 111 | Bytes::Borrowed(s) => s, 112 | Bytes::Owned(b) => b, 113 | } 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /src/util/ncompress.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{anyhow, Result}; 2 | use orthrus_ncompress::{yay0::Yay0, yaz0::Yaz0}; 3 | 4 | pub const YAZ0_MAGIC: [u8; 4] = *b"Yaz0"; 5 | pub const YAY0_MAGIC: [u8; 4] = *b"Yay0"; 6 | 7 | /// Compresses the data into a new allocated buffer using Yaz0 compression. 8 | pub fn compress_yaz0(input: &[u8]) -> Box<[u8]> { 9 | let mut output = vec![0u8; Yaz0::worst_possible_size(input.len())]; 10 | let size = Yaz0::compress_n64(input, output.as_mut_slice()); 11 | output.truncate(size); 12 | output.into_boxed_slice() 13 | } 14 | 15 | /// Decompresses the data into a new allocated buffer. Assumes a Yaz0 header followed by 16 | /// compressed data. 17 | pub fn decompress_yaz0(input: &[u8]) -> Result<Box<[u8]>> { 18 | Yaz0::decompress_from(input).map_err(|e| anyhow!(e)) 19 | } 20 | 21 | /// Compresses the data into a new allocated buffer using Yay0 compression. 22 | pub fn compress_yay0(input: &[u8]) -> Box<[u8]> { 23 | let mut output = vec![0u8; Yay0::worst_possible_size(input.len())]; 24 | let size = Yay0::compress_n64(input, output.as_mut_slice()); 25 | output.truncate(size); 26 | output.into_boxed_slice() 27 | } 28 | 29 | /// Decompresses the data into a new allocated buffer. Assumes a Yay0 header followed by 30 | /// compressed data. 31 | pub fn decompress_yay0(input: &[u8]) -> Result<Box<[u8]>> { 32 | Yay0::decompress_from(input).map_err(|e| anyhow!(e)) 33 | } 34 | -------------------------------------------------------------------------------- /src/util/nested.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | collections::{btree_map, hash_map, BTreeMap, HashMap}, 3 | hash::Hash, 4 | }; 5 | 6 | use anyhow::{bail, Result}; 7 | 8 | pub trait NestedMap<T1, T2, T3> { 9 | fn nested_insert(&mut self, v1: T1, v2: T2, v3: T3) -> Result<()>; 10 | } 11 | 12 | pub trait NestedVec<T1, T2> { 13 | fn nested_push(&mut self, v1: T1, v2: T2); 14 | fn nested_remove(&mut self, v1: &T1, v2: &T2); 15 | } 16 | 17 | impl<T1, T2, T3> NestedMap<T1, T2, T3> for BTreeMap<T1, BTreeMap<T2, T3>> 18 | where 19 | T1: Eq + Ord, 20 | T2: Eq + Ord, 21 | { 22 | fn nested_insert(&mut self, v1: T1, v2: T2, v3: T3) -> Result<()> { 23 | match self.entry(v1).or_default().entry(v2) { 24 | btree_map::Entry::Occupied(_) => bail!("Entry already exists"), 25 | btree_map::Entry::Vacant(entry) => entry.insert(v3), 26 | }; 27 | Ok(()) 28 | } 29 | } 30 | 31 | impl<T1, T2, T3> NestedMap<T1, T2, T3> for HashMap<T1, HashMap<T2, T3>> 32 | where 33 | T1: Eq + Hash, 34 | T2: Eq + Hash, 35 | { 36 | fn nested_insert(&mut self, v1: T1, v2: T2, v3: T3) -> Result<()> { 37 | match self.entry(v1).or_default().entry(v2) { 38 | hash_map::Entry::Occupied(_) => bail!("Entry already exists"), 39 | hash_map::Entry::Vacant(entry) => entry.insert(v3), 40 | }; 41 | Ok(()) 42 | } 43 | } 44 | 45 | impl<T1, T2> NestedVec<T1, T2> for BTreeMap<T1, Vec<T2>> 46 | where 47 | T1: Ord, 48 | T2: PartialEq, 49 | { 50 | fn nested_push(&mut self, v1: T1, v2: T2) { self.entry(v1).or_default().push(v2); } 51 | 52 | fn nested_remove(&mut self, v1: &T1, v2: &T2) { 53 | if let Some(vec) = self.get_mut(v1) { 54 | vec.retain(|n| n != v2); 55 | } 56 | } 57 | } 58 | 59 | impl<T1, T2> NestedVec<T1, T2> for HashMap<T1, Vec<T2>> 60 | where 61 | T1: Ord + Hash, 62 | T2: PartialEq, 63 | { 64 | fn nested_push(&mut self, v1: T1, v2: T2) { self.entry(v1).or_default().push(v2); } 65 | 66 | fn nested_remove(&mut self, v1: &T1, v2: &T2) { 67 | if let Some(vec) = self.get_mut(v1) { 68 | vec.retain(|n| n != v2); 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/util/path.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | path::{Path, PathBuf}, 3 | str::Utf8Error, 4 | string::FromUtf8Error, 5 | }; 6 | 7 | use typed_path::{NativePath, NativePathBuf, Utf8NativePath, Utf8NativePathBuf}; 8 | 9 | // For argp::FromArgs 10 | pub fn native_path(value: &str) -> Result<Utf8NativePathBuf, String> { 11 | Ok(Utf8NativePathBuf::from(value)) 12 | } 13 | 14 | /// Checks if the path is valid UTF-8 and returns it as a [`Utf8NativePath`]. 15 | #[inline] 16 | pub fn check_path(path: &Path) -> Result<&Utf8NativePath, Utf8Error> { 17 | Utf8NativePath::from_bytes_path(NativePath::new(path.as_os_str().as_encoded_bytes())) 18 | } 19 | 20 | /// Checks if the path is valid UTF-8 and returns it as a [`Utf8NativePathBuf`]. 21 | #[inline] 22 | pub fn check_path_buf(path: PathBuf) -> Result<Utf8NativePathBuf, FromUtf8Error> { 23 | Utf8NativePathBuf::from_bytes_path_buf(NativePathBuf::from( 24 | path.into_os_string().into_encoded_bytes(), 25 | )) 26 | } 27 | -------------------------------------------------------------------------------- /src/util/read.rs: -------------------------------------------------------------------------------- 1 | use std::{io, io::Read}; 2 | 3 | use zerocopy::{FromBytes, FromZeros, IntoBytes}; 4 | 5 | #[inline(always)] 6 | pub fn read_from<T, R>(reader: &mut R) -> io::Result<T> 7 | where 8 | T: FromBytes + IntoBytes, 9 | R: Read + ?Sized, 10 | { 11 | let mut ret = <T>::new_zeroed(); 12 | reader.read_exact(ret.as_mut_bytes())?; 13 | Ok(ret) 14 | } 15 | 16 | #[inline(always)] 17 | pub fn read_box_slice<T, R>(reader: &mut R, count: usize) -> io::Result<Box<[T]>> 18 | where 19 | T: FromBytes + IntoBytes, 20 | R: Read + ?Sized, 21 | { 22 | let mut ret = <[T]>::new_box_zeroed_with_elems(count) 23 | .map_err(|_| io::Error::from(io::ErrorKind::OutOfMemory))?; 24 | reader.read_exact(ret.as_mut().as_mut_bytes())?; 25 | Ok(ret) 26 | } 27 | -------------------------------------------------------------------------------- /src/util/toposort.rs: -------------------------------------------------------------------------------- 1 | /// Topological sort algorithm based on DFS: 2 | /// https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search 3 | /// Finds either an ordering of the vertices such that all edges go from 4 | /// lower to higher indexed nodes, or a cycle. 5 | /// 6 | /// Implementation by Simon Lindholm 7 | /// https://gist.github.com/simonlindholm/08664dd783ad4b9f23532fdd5e352b42 8 | pub fn toposort(graph: &[Vec<usize>]) -> Result<Vec<usize>, Vec<usize>> { 9 | let n = graph.len(); 10 | #[derive(Copy, Clone)] 11 | enum State { 12 | Unvisited, 13 | Active(usize, usize), 14 | Finished, 15 | } 16 | let mut state = vec![State::Unvisited; n + 1]; 17 | state[n] = State::Active(0, usize::MAX); 18 | let mut ret = Vec::new(); 19 | let mut cur = n; 20 | loop { 21 | let State::Active(eind, par) = state[cur] else { panic!("unexpected state 1") }; 22 | let adj; 23 | if cur == n { 24 | if eind == n { 25 | break; 26 | } 27 | adj = eind; 28 | } else { 29 | if eind == graph[cur].len() { 30 | state[cur] = State::Finished; 31 | ret.push(cur); 32 | cur = par; 33 | continue; 34 | } 35 | adj = graph[cur][eind]; 36 | }; 37 | state[cur] = State::Active(eind + 1, par); 38 | match state[adj] { 39 | State::Unvisited => { 40 | state[adj] = State::Active(0, cur); 41 | cur = adj; 42 | } 43 | State::Active(..) => { 44 | let mut cycle = Vec::new(); 45 | while cur != adj { 46 | cycle.push(cur); 47 | let State::Active(_, par) = state[cur] else { panic!("unexpected state 2") }; 48 | cur = par; 49 | } 50 | cycle.push(cur); 51 | cycle.reverse(); 52 | return Err(cycle); 53 | } 54 | State::Finished => {} 55 | }; 56 | } 57 | ret.reverse(); 58 | Ok(ret) 59 | } 60 | 61 | #[cfg(test)] 62 | mod tests { 63 | use std::collections::HashSet; 64 | 65 | use super::*; 66 | 67 | #[test] 68 | fn test_correct() { 69 | let mut rng_state: usize = 0; 70 | let mut rand = || { 71 | rng_state = rng_state.wrapping_mul(123156351724123181_usize); 72 | rng_state = rng_state.wrapping_add(670143798154186239_usize); 73 | rng_state >> 32 74 | }; 75 | for _ in 0..10000 { 76 | let n = rand() % 20; 77 | let mut g = vec![vec![]; n]; 78 | let mut g_set = HashSet::new(); 79 | if n != 0 { 80 | let m = rand() % 50; 81 | for _ in 0..m { 82 | let a = rand() % n; 83 | let b = rand() % n; 84 | g[a].push(b); 85 | g_set.insert((a, b)); 86 | } 87 | } 88 | match toposort(&g) { 89 | Ok(order) => { 90 | assert_eq!(order.len(), n); 91 | let mut node_to_order = vec![usize::MAX; n]; 92 | // Every node should occur exactly once... 93 | for (i, &node) in order.iter().enumerate() { 94 | assert!(node < n); 95 | assert_eq!(node_to_order[node], usize::MAX); 96 | node_to_order[node] = i; 97 | } 98 | // and the edges should go in forward order in the list 99 | for i in 0..n { 100 | for &j in &g[i] { 101 | assert!(node_to_order[i] < node_to_order[j]); 102 | } 103 | } 104 | } 105 | Err(cycle) => { 106 | // The found cycle should exist in the graph 107 | assert!(!cycle.is_empty()); 108 | for i in 0..cycle.len() { 109 | let a = cycle[i]; 110 | let b = cycle[(i + 1) % cycle.len()]; 111 | assert!(g_set.contains(&(a, b))); 112 | } 113 | } 114 | } 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/vfs/common.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | io, 3 | io::{BufRead, Cursor, Read, Seek, SeekFrom}, 4 | sync::Arc, 5 | }; 6 | 7 | use filetime::FileTime; 8 | 9 | use super::{DiscStream, VfsFileType, VfsMetadata}; 10 | use crate::vfs::VfsFile; 11 | 12 | #[derive(Clone)] 13 | pub struct StaticFile { 14 | inner: Cursor<Arc<[u8]>>, 15 | mtime: Option<FileTime>, 16 | } 17 | 18 | impl StaticFile { 19 | pub fn new(data: Arc<[u8]>, mtime: Option<FileTime>) -> Self { 20 | Self { inner: Cursor::new(data), mtime } 21 | } 22 | } 23 | 24 | impl BufRead for StaticFile { 25 | fn fill_buf(&mut self) -> io::Result<&[u8]> { self.inner.fill_buf() } 26 | 27 | fn consume(&mut self, amt: usize) { self.inner.consume(amt) } 28 | } 29 | 30 | impl Read for StaticFile { 31 | fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.inner.read(buf) } 32 | } 33 | 34 | impl Seek for StaticFile { 35 | fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { self.inner.seek(pos) } 36 | } 37 | 38 | impl VfsFile for StaticFile { 39 | fn map(&mut self) -> io::Result<&[u8]> { Ok(self.inner.get_ref()) } 40 | 41 | fn metadata(&mut self) -> io::Result<VfsMetadata> { 42 | Ok(VfsMetadata { 43 | file_type: VfsFileType::File, 44 | len: self.inner.get_ref().len() as u64, 45 | mtime: self.mtime, 46 | }) 47 | } 48 | 49 | fn into_disc_stream(self: Box<Self>) -> Box<dyn DiscStream> { self } 50 | } 51 | 52 | #[derive(Clone)] 53 | pub struct WindowedFile { 54 | base: Box<dyn VfsFile>, 55 | pos: u64, 56 | begin: u64, 57 | end: u64, 58 | } 59 | 60 | impl WindowedFile { 61 | pub fn new(mut base: Box<dyn VfsFile>, offset: u64, size: u64) -> io::Result<Self> { 62 | base.seek(SeekFrom::Start(offset))?; 63 | Ok(Self { base, pos: offset, begin: offset, end: offset + size }) 64 | } 65 | 66 | #[inline] 67 | pub fn len(&self) -> u64 { self.end - self.begin } 68 | } 69 | 70 | impl BufRead for WindowedFile { 71 | fn fill_buf(&mut self) -> io::Result<&[u8]> { 72 | let buf = self.base.fill_buf()?; 73 | let remaining = self.end.saturating_sub(self.pos); 74 | Ok(&buf[..buf.len().min(remaining as usize)]) 75 | } 76 | 77 | fn consume(&mut self, amt: usize) { 78 | let remaining = self.end.saturating_sub(self.pos); 79 | let amt = amt.min(remaining as usize); 80 | self.base.consume(amt); 81 | self.pos += amt as u64; 82 | } 83 | } 84 | 85 | impl Read for WindowedFile { 86 | fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { 87 | let remaining = self.end.saturating_sub(self.pos); 88 | if remaining == 0 { 89 | return Ok(0); 90 | } 91 | let len = buf.len().min(remaining as usize); 92 | self.base.read(&mut buf[..len]) 93 | } 94 | } 95 | 96 | impl Seek for WindowedFile { 97 | #[inline] 98 | fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { 99 | let mut pos = match pos { 100 | SeekFrom::Start(p) => self.begin + p, 101 | SeekFrom::End(p) => self.end.saturating_add_signed(p), 102 | SeekFrom::Current(p) => self.pos.saturating_add_signed(p), 103 | }; 104 | if pos < self.begin { 105 | pos = self.begin; 106 | } else if pos > self.end { 107 | pos = self.end; 108 | } 109 | let result = self.base.seek(SeekFrom::Start(pos))?; 110 | self.pos = result; 111 | Ok(result - self.begin) 112 | } 113 | 114 | #[inline] 115 | fn stream_position(&mut self) -> io::Result<u64> { Ok(self.pos - self.begin) } 116 | } 117 | 118 | impl VfsFile for WindowedFile { 119 | fn map(&mut self) -> io::Result<&[u8]> { 120 | let buf = self.base.map()?; 121 | Ok(&buf[self.pos as usize..self.end as usize]) 122 | } 123 | 124 | fn metadata(&mut self) -> io::Result<VfsMetadata> { 125 | let metadata = self.base.metadata()?; 126 | Ok(VfsMetadata { file_type: VfsFileType::File, len: self.len(), mtime: metadata.mtime }) 127 | } 128 | 129 | fn into_disc_stream(self: Box<Self>) -> Box<dyn DiscStream> { self } 130 | } 131 | -------------------------------------------------------------------------------- /src/vfs/rarc.rs: -------------------------------------------------------------------------------- 1 | use std::io; 2 | 3 | use typed_path::Utf8UnixPath; 4 | 5 | use super::{Vfs, VfsError, VfsFile, VfsFileType, VfsMetadata, VfsResult, WindowedFile}; 6 | use crate::util::rarc::{RarcNodeKind, RarcView}; 7 | 8 | #[derive(Clone)] 9 | pub struct RarcFs { 10 | file: Box<dyn VfsFile>, 11 | } 12 | 13 | impl RarcFs { 14 | pub fn new(file: Box<dyn VfsFile>) -> io::Result<Self> { Ok(Self { file }) } 15 | 16 | fn view(&mut self) -> io::Result<RarcView> { 17 | let data = self.file.map()?; 18 | RarcView::new(data).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) 19 | } 20 | } 21 | 22 | impl Vfs for RarcFs { 23 | fn open(&mut self, path: &Utf8UnixPath) -> VfsResult<Box<dyn VfsFile>> { 24 | let view = self.view()?; 25 | match view.find(path) { 26 | Some(RarcNodeKind::File(_, node)) => { 27 | let offset = view.header.header_len() as u64 28 | + view.header.data_offset() as u64 29 | + node.data_offset() as u64; 30 | let len = node.data_length() as u64; 31 | let file = WindowedFile::new(self.file.clone(), offset, len)?; 32 | Ok(Box::new(file)) 33 | } 34 | Some(RarcNodeKind::Directory(_, _)) => Err(VfsError::IsADirectory), 35 | None => Err(VfsError::NotFound), 36 | } 37 | } 38 | 39 | fn exists(&mut self, path: &Utf8UnixPath) -> VfsResult<bool> { 40 | let view = self.view()?; 41 | Ok(view.find(path).is_some()) 42 | } 43 | 44 | fn read_dir(&mut self, path: &Utf8UnixPath) -> VfsResult<Vec<String>> { 45 | let view = self.view()?; 46 | match view.find(path) { 47 | Some(RarcNodeKind::Directory(_, dir)) => { 48 | let mut entries = Vec::new(); 49 | for node in view.children(dir) { 50 | let name = view.get_string(node.name_offset())?; 51 | if name == "." || name == ".." { 52 | continue; 53 | } 54 | entries.push(name.to_string()); 55 | } 56 | Ok(entries) 57 | } 58 | Some(RarcNodeKind::File(_, _)) => Err(VfsError::NotADirectory), 59 | None => Err(VfsError::NotFound), 60 | } 61 | } 62 | 63 | fn metadata(&mut self, path: &Utf8UnixPath) -> VfsResult<VfsMetadata> { 64 | let metadata = self.file.metadata()?; 65 | let view = self.view()?; 66 | match view.find(path) { 67 | Some(RarcNodeKind::File(_, node)) => Ok(VfsMetadata { 68 | file_type: VfsFileType::File, 69 | len: node.data_length() as u64, 70 | mtime: metadata.mtime, 71 | }), 72 | Some(RarcNodeKind::Directory(_, _)) => { 73 | Ok(VfsMetadata { file_type: VfsFileType::Directory, len: 0, mtime: metadata.mtime }) 74 | } 75 | None => Err(VfsError::NotFound), 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/vfs/std_fs.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | fs, io, 3 | io::{BufRead, BufReader, Read, Seek, SeekFrom}, 4 | }; 5 | 6 | use filetime::FileTime; 7 | use typed_path::{Utf8NativePathBuf, Utf8UnixPath}; 8 | 9 | use super::{DiscStream, Vfs, VfsFile, VfsFileType, VfsMetadata, VfsResult}; 10 | 11 | #[derive(Clone)] 12 | pub struct StdFs; 13 | 14 | impl Vfs for StdFs { 15 | fn open(&mut self, path: &Utf8UnixPath) -> VfsResult<Box<dyn VfsFile>> { 16 | let mut file = StdFile::new(path.with_encoding()); 17 | file.file()?; // Open the file now to check for errors 18 | Ok(Box::new(file)) 19 | } 20 | 21 | fn exists(&mut self, path: &Utf8UnixPath) -> VfsResult<bool> { 22 | Ok(fs::exists(path.with_encoding())?) 23 | } 24 | 25 | fn read_dir(&mut self, path: &Utf8UnixPath) -> VfsResult<Vec<String>> { 26 | let entries = fs::read_dir(path.with_encoding())? 27 | .map(|entry| entry.map(|e| e.file_name().to_string_lossy().into_owned())) 28 | .collect::<Result<Vec<_>, _>>()?; 29 | Ok(entries) 30 | } 31 | 32 | fn metadata(&mut self, path: &Utf8UnixPath) -> VfsResult<VfsMetadata> { 33 | let metadata = fs::metadata(path.with_encoding())?; 34 | Ok(VfsMetadata { 35 | file_type: if metadata.is_dir() { VfsFileType::Directory } else { VfsFileType::File }, 36 | len: metadata.len(), 37 | mtime: Some(FileTime::from_last_modification_time(&metadata)), 38 | }) 39 | } 40 | } 41 | 42 | pub struct StdFile { 43 | path: Utf8NativePathBuf, 44 | file: Option<BufReader<fs::File>>, 45 | mmap: Option<memmap2::Mmap>, 46 | } 47 | 48 | impl Clone for StdFile { 49 | #[inline] 50 | fn clone(&self) -> Self { Self { path: self.path.clone(), file: None, mmap: None } } 51 | } 52 | 53 | impl StdFile { 54 | #[inline] 55 | pub fn new(path: Utf8NativePathBuf) -> Self { StdFile { path, file: None, mmap: None } } 56 | 57 | pub fn file(&mut self) -> io::Result<&mut BufReader<fs::File>> { 58 | Ok(match self.file { 59 | Some(ref mut file) => file, 60 | None => self.file.insert(BufReader::new(fs::File::open(&self.path)?)), 61 | }) 62 | } 63 | } 64 | 65 | impl BufRead for StdFile { 66 | #[inline] 67 | fn fill_buf(&mut self) -> io::Result<&[u8]> { self.file()?.fill_buf() } 68 | 69 | #[inline] 70 | fn consume(&mut self, amt: usize) { 71 | if let Ok(file) = self.file() { 72 | file.consume(amt); 73 | } 74 | } 75 | } 76 | 77 | impl Read for StdFile { 78 | #[inline] 79 | fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.file()?.read(buf) } 80 | } 81 | 82 | impl Seek for StdFile { 83 | #[inline] 84 | fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { self.file()?.seek(pos) } 85 | } 86 | 87 | impl VfsFile for StdFile { 88 | fn map(&mut self) -> io::Result<&[u8]> { 89 | let file = match self.file { 90 | Some(ref mut file) => file, 91 | None => self.file.insert(BufReader::new(fs::File::open(&self.path)?)), 92 | }; 93 | let mmap = match self.mmap { 94 | Some(ref mmap) => mmap, 95 | None => self.mmap.insert(unsafe { memmap2::Mmap::map(file.get_ref())? }), 96 | }; 97 | Ok(mmap) 98 | } 99 | 100 | fn metadata(&mut self) -> io::Result<VfsMetadata> { 101 | let metadata = fs::metadata(&self.path)?; 102 | Ok(VfsMetadata { 103 | file_type: if metadata.is_dir() { VfsFileType::Directory } else { VfsFileType::File }, 104 | len: metadata.len(), 105 | mtime: Some(FileTime::from_last_modification_time(&metadata)), 106 | }) 107 | } 108 | 109 | fn into_disc_stream(self: Box<Self>) -> Box<dyn DiscStream> { self } 110 | } 111 | -------------------------------------------------------------------------------- /src/vfs/u8_arc.rs: -------------------------------------------------------------------------------- 1 | use std::io; 2 | 3 | use typed_path::Utf8UnixPath; 4 | 5 | use super::{Vfs, VfsError, VfsFile, VfsFileType, VfsMetadata, VfsResult, WindowedFile}; 6 | use crate::util::u8_arc::{U8NodeKind, U8View}; 7 | 8 | #[derive(Clone)] 9 | pub struct U8Fs { 10 | file: Box<dyn VfsFile>, 11 | } 12 | 13 | impl U8Fs { 14 | pub fn new(file: Box<dyn VfsFile>) -> io::Result<Self> { Ok(Self { file }) } 15 | 16 | fn view(&mut self) -> io::Result<U8View> { 17 | let data = self.file.map()?; 18 | U8View::new(data).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) 19 | } 20 | } 21 | 22 | impl Vfs for U8Fs { 23 | fn open(&mut self, path: &Utf8UnixPath) -> VfsResult<Box<dyn VfsFile>> { 24 | let view = self.view()?; 25 | match view.find(path) { 26 | Some((_, node)) => match node.kind() { 27 | U8NodeKind::File => { 28 | let offset = node.offset() as u64; 29 | let len = node.length() as u64; 30 | let file = WindowedFile::new(self.file.clone(), offset, len)?; 31 | Ok(Box::new(file)) 32 | } 33 | U8NodeKind::Directory => Err(VfsError::IsADirectory), 34 | U8NodeKind::Invalid => Err(VfsError::from("U8: Invalid node kind")), 35 | }, 36 | None => Err(VfsError::NotFound), 37 | } 38 | } 39 | 40 | fn exists(&mut self, path: &Utf8UnixPath) -> VfsResult<bool> { 41 | let view = self.view()?; 42 | Ok(view.find(path).is_some()) 43 | } 44 | 45 | fn read_dir(&mut self, path: &Utf8UnixPath) -> VfsResult<Vec<String>> { 46 | let view = self.view()?; 47 | match view.find(path) { 48 | Some((idx, node)) => match node.kind() { 49 | U8NodeKind::File => Err(VfsError::NotADirectory), 50 | U8NodeKind::Directory => { 51 | let mut entries = Vec::new(); 52 | let mut idx = idx + 1; 53 | let end = node.length() as usize; 54 | while idx < end { 55 | let child = view.nodes.get(idx).copied().ok_or(VfsError::NotFound)?; 56 | entries.push(view.get_name(child)?.to_string()); 57 | if child.is_dir() { 58 | idx = child.length() as usize; 59 | } else { 60 | idx += 1; 61 | } 62 | } 63 | Ok(entries) 64 | } 65 | U8NodeKind::Invalid => Err(VfsError::from("U8: Invalid node kind")), 66 | }, 67 | None => Err(VfsError::NotFound), 68 | } 69 | } 70 | 71 | fn metadata(&mut self, path: &Utf8UnixPath) -> VfsResult<VfsMetadata> { 72 | let metdata = self.file.metadata()?; 73 | let view = self.view()?; 74 | match view.find(path) { 75 | Some((_, node)) => match node.kind() { 76 | U8NodeKind::File => Ok(VfsMetadata { 77 | file_type: VfsFileType::File, 78 | len: node.length() as u64, 79 | mtime: metdata.mtime, 80 | }), 81 | U8NodeKind::Directory => Ok(VfsMetadata { 82 | file_type: VfsFileType::Directory, 83 | len: 0, 84 | mtime: metdata.mtime, 85 | }), 86 | U8NodeKind::Invalid => Err(VfsError::from("U8: Invalid node kind")), 87 | }, 88 | None => Err(VfsError::NotFound), 89 | } 90 | } 91 | } 92 | --------------------------------------------------------------------------------