1#--------------------------------------------------------------------------- 2# Project: TwlSDK - tools - makelcf 3# File: ARM9-TS.lcf.template 4# 5# Copyright 2003-2008 Nintendo. All rights reserved. 6# 7# These coded instructions, statements, and computer programs contain 8# proprietary information of Nintendo of America Inc. and/or Nintendo 9# Company Ltd., and are protected by Federal copyright law. They may 10# not be disclosed to third parties or copied or duplicated in any form, 11# in whole or in part, without the prior written consent of Nintendo. 12# 13# $Date:: 2008-09-18#$ 14# $Rev: 8573 $ 15# $Author: okubata_ryoma $ 16#--------------------------------------------------------------------------- 17MEMORY 18{ 19 main (RWX) : ORIGIN = 0x02000000, LENGTH = 0x0 > main.sbin 20 binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin 21 binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> main.sbin 22 23 main_defs (RW) : ORIGIN = AFTER(main), LENGTH = 0x0 > main_defs.sbin 24 main_table (RW) : ORIGIN = AFTER(main), LENGTH = 0x0 > main_table.sbin 25 overlay_0 (RWXO): ORIGIN = 0x03f00000, LENGTH = 0x0 > overlay_0.sbin 26 overlay_1 (RWXO): ORIGIN = AFTER(main), LENGTH = 0x0 > overlay_1.sbin 27 overlay_2 (RWXO): ORIGIN = AFTER(overlay_1), LENGTH = 0x0 > overlay_2.sbin 28 dummy.MAIN_EX (RW) : ORIGIN = 0x023e0000, LENGTH = 0x0 29 arena.MAIN (RW) : ORIGIN = AFTER(main,overlay_1,overlay_2), LENGTH = 0x0 30 arena.MAIN_EX (RW) : ORIGIN = AFTER(dummy.MAIN_EX), LENGTH = 0x0 31 arena.ITCM (RW) : ORIGIN = AFTER(ITCM), LENGTH = 0x0 32 arena.DTCM (RW) : ORIGIN = AFTER(DTCM), LENGTH = 0x0 33 binary.MODULE_FILES (RW) : ORIGIN = 0x0, LENGTH = 0x0 > component.files 34 check.ITCM (RWX) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check 35 check.DTCM (RW) : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check 36} 37 38FORCE_ACTIVE 39{ 40 SVC_SoftReset 41} 42 43KEEP_SECTION 44{ 45 .sinit 46} 47 48SECTIONS 49{ 50 ############################ STATIC ################################# 51 .main: 52 { 53 ALIGNALL(4); . = ALIGN(32); # Fit to cache line 54 55 # 56 # TEXT BLOCK: READ ONLY 57 # 58 SDK_STATIC_START =.; 59 SDK_STATIC_TEXT_START =.; 60 #:::::::::: text/rodata 61 libsyscall.a (.text) 62 crt0.o (.text) 63 crt0.o (.rodata) 64 # 65 # Added .version section. 66 # The information included in this section will be needed for Lotcheck purposes. Be sure to leave it in this position. 67 # 68 # 69 * (.version) 70 OBJECT(NitroMain,*) 71 *.o (.text) 72 . = ALIGN(4); 73 * (.exception) 74 . = ALIGN(4); 75 SDK_STATIC_ETABLE_START =.; 76 EXCEPTION 77 SDK_STATIC_ETABLE_END =.; 78 . = ALIGN(4); 79 . = ALIGN(4); 80 . = ALIGN(4); 81 82 SDK_STATIC_SINIT_START =.; 83 #:::::::::: ctor 84 *.axxx (.ctor) 85 WRITEW 0; 86 #:::::::::: ctor 87 SDK_STATIC_SINIT_END =.; 88 89 #:::::::::: text/rodata 90 . = ALIGN(32); 91 SDK_STATIC_TEXT_END =.; 92 93 # 94 # DATA BLOCK: READ WRITE 95 # 96 SDK_STATIC_DATA_START =.; 97 #:::::::::: Data 98 . = ALIGN(4); 99 . = ALIGN(4); 100 SDK_OVERLAY_DIGEST =.; 101 # NO DIGEST 102 SDK_OVERLAY_DIGEST_END =.; 103 #:::::::::: Data 104 . = ALIGN(32); 105 SDK_STATIC_DATA_END =.; 106 SDK_STATIC_END =.; 107 108 SDK_STATIC_TEXT_SIZE = SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START; 109 SDK_STATIC_DATA_SIZE = SDK_STATIC_DATA_END - SDK_STATIC_DATA_START; 110 SDK_STATIC_SIZE = SDK_STATIC_END - SDK_STATIC_START; 111 __sinit__ = SDK_STATIC_SINIT_START; # For static initializer 112 __exception_table_start__ = SDK_STATIC_ETABLE_START; # For exception table 113 __exception_table_end__ = SDK_STATIC_ETABLE_END; # For exception table 114 } > main 115 116 .main.bss: 117 { 118 ALIGNALL(4); . = ALIGN(32); 119 120 # 121 # BSS BLOCK 122 # 123 SDK_STATIC_BSS_START =.; 124 #:::::::::: bss 125 . = ALIGN(4); 126 . = ALIGN(4); 127 #:::::::::: bss 128 . = ALIGN(32); 129 SDK_STATIC_BSS_END = .; 130 SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START; 131 132 } >> main 133 134 135 ############################ AUTOLOADS ############################## 136 SDK_AUTOLOAD.ITCM.START = 0x01ff8000; 137 SDK_AUTOLOAD.ITCM.END = SDK_AUTOLOAD.ITCM.START; 138 SDK_AUTOLOAD.ITCM.BSS_END = SDK_AUTOLOAD.ITCM.START; 139 SDK_AUTOLOAD.ITCM.SIZE = 0; 140 SDK_AUTOLOAD.ITCM.BSS_SIZE = 0; 141 SDK_AUTOLOAD.DTCM.START = 0x027e0000; 142 SDK_AUTOLOAD.DTCM.END = SDK_AUTOLOAD.DTCM.START; 143 SDK_AUTOLOAD.DTCM.BSS_END = SDK_AUTOLOAD.DTCM.START; 144 SDK_AUTOLOAD.DTCM.SIZE = 0; 145 SDK_AUTOLOAD.DTCM.BSS_SIZE = 0; 146 SDK_AUTOLOAD_START = SDK_STATIC_END; 147 SDK_AUTOLOAD_SIZE = 0; 148 SDK_AUTOLOAD_NUMBER = 0; 149 150 151 SDK_AUTOLOAD_ITCM_START = SDK_AUTOLOAD.ITCM.START; 152 SDK_AUTOLOAD_ITCM_END = SDK_AUTOLOAD.ITCM.END; 153 SDK_AUTOLOAD_ITCM_BSS_END = SDK_AUTOLOAD.ITCM.BSS_END; 154 SDK_AUTOLOAD_ITCM_SIZE = SDK_AUTOLOAD.ITCM.SIZE; 155 SDK_AUTOLOAD_ITCM_BSS_SIZE = SDK_AUTOLOAD.ITCM.BSS_SIZE; 156 SDK_AUTOLOAD_DTCM_START = SDK_AUTOLOAD.DTCM.START; 157 SDK_AUTOLOAD_DTCM_END = SDK_AUTOLOAD.DTCM.END; 158 SDK_AUTOLOAD_DTCM_BSS_END = SDK_AUTOLOAD.DTCM.BSS_END; 159 SDK_AUTOLOAD_DTCM_SIZE = SDK_AUTOLOAD.DTCM.SIZE; 160 SDK_AUTOLOAD_DTCM_BSS_SIZE = SDK_AUTOLOAD.DTCM.BSS_SIZE; 161 162 ############################ AUTOLOAD_INFO ########################## 163 .binary.AUTOLOAD_INFO: 164 { 165 } > binary.AUTOLOAD_INFO 166 167 SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE; 168 SDK_AUTOLOAD_LIST_END = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); 169 SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); 170 171 ############################ STATIC_FOOTER ########################## 172 .binary.STATIC_FOOTER: 173 { 174 WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE 175 WRITEW _start_ModuleParams - ADDR(.main); 176 WRITEW 0; # NO DIGEST 177 } > binary.STATIC_FOOTER 178 179 ############################ OVERLAYS ############################### 180 SDK_OVERLAY_NUMBER = 3; 181 182 .overlay_0: 183 { 184 ALIGNALL(4); . = ALIGN(32); 185 186 # 187 # TEXT BLOCK: READ ONLY 188 # 189 SDK_OVERLAY_overlay_0_ID =0; ### SEGMENT overlay_0 OVERLAY ID 190 SDK_OVERLAY.overlay_0.ID =0; 191 SDK_OVERLAY.overlay_0.START =.; 192 SDK_OVERLAY.overlay_0.TEXT_START =.; 193 #:::::::::: text/rodata 194 aaa.o (.text) 195 bbb.o (.text) 196 . = ALIGN(4); 197 aaa.o (.rodata) 198 bbb.o (.rodata) 199 . = ALIGN(4); 200 aaa.o (.init) 201 bbb.o (.init) 202 . = ALIGN(4); 203 SDK_OVERLAY.overlay_0.SINIT_START =.; 204 #:::::::::: ctor 205 aaa.o (.ctor) 206 bbb.o (.ctor) 207 aaa.o (.sinit) 208 bbb.o (.sinit) 209 WRITEW 0; 210 #:::::::::: ctor 211 SDK_OVERLAY.overlay_0.SINIT_END =.; 212 213 #:::::::::: text/rodata 214 . = ALIGN(32); 215 SDK_OVERLAY.overlay_0.TEXT_END =.; 216 217 # 218 # DATA BLOCK: READ WRITE 219 # 220 SDK_OVERLAY.overlay_0.DATA_START =.; 221 #:::::::::: Data 222 aaa.o (.sdata) 223 bbb.o (.sdata) 224 . = ALIGN(4); 225 aaa.o (.data) 226 bbb.o (.data) 227 . = ALIGN(4); 228 #:::::::::: Data 229 . = ALIGN(32); 230 SDK_OVERLAY.overlay_0.DATA_END =.; 231 SDK_OVERLAY.overlay_0.END =.; 232 233 SDK_OVERLAY.overlay_0.TEXT_SIZE = SDK_OVERLAY.overlay_0.TEXT_END - SDK_OVERLAY.overlay_0.TEXT_START; 234 SDK_OVERLAY.overlay_0.DATA_SIZE = SDK_OVERLAY.overlay_0.DATA_END - SDK_OVERLAY.overlay_0.DATA_START; 235 SDK_OVERLAY.overlay_0.SIZE = SDK_OVERLAY.overlay_0.END - SDK_OVERLAY.overlay_0.START; 236 237 } > overlay_0 238 239 .overlay_0.bss: 240 { 241 ALIGNALL(4); . = ALIGN(32); 242 243 # 244 # BSS BLOCK 245 # 246 SDK_OVERLAY.overlay_0.BSS_START = .; 247 #:::::::::: bss 248 aaa.o (.bss) 249 bbb.o (.bss) 250 . = ALIGN(4); 251 aaa.o (.sbss) 252 bbb.o (.sbss) 253 . = ALIGN(4); 254 #:::::::::: bss 255 . = ALIGN(32); 256 SDK_OVERLAY.overlay_0.BSS_END = .; 257 258 SDK_OVERLAY.overlay_0.BSS_SIZE = SDK_OVERLAY.overlay_0.BSS_END - SDK_OVERLAY.overlay_0.BSS_START; 259 260 } >> overlay_0 261 262 .overlay_1: 263 { 264 ALIGNALL(4); . = ALIGN(32); 265 266 # 267 # TEXT BLOCK: READ ONLY 268 # 269 SDK_OVERLAY_overlay_1_ID =1; ### SEGMENT overlay_1 OVERLAY ID 270 SDK_OVERLAY.overlay_1.ID =1; 271 SDK_OVERLAY.overlay_1.START =.; 272 SDK_OVERLAY.overlay_1.TEXT_START =.; 273 #:::::::::: text/rodata 274 ccc.o (.text) 275 ddd.o (.text) 276 . = ALIGN(4); 277 ccc.o (.rodata) 278 ddd.o (.rodata) 279 . = ALIGN(4); 280 ccc.o (.init) 281 ddd.o (.init) 282 . = ALIGN(4); 283 SDK_OVERLAY.overlay_1.SINIT_START =.; 284 #:::::::::: ctor 285 ccc.o (.ctor) 286 ddd.o (.ctor) 287 ccc.o (.sinit) 288 ddd.o (.sinit) 289 WRITEW 0; 290 #:::::::::: ctor 291 SDK_OVERLAY.overlay_1.SINIT_END =.; 292 293 #:::::::::: text/rodata 294 . = ALIGN(32); 295 SDK_OVERLAY.overlay_1.TEXT_END =.; 296 297 # 298 # DATA BLOCK: READ WRITE 299 # 300 SDK_OVERLAY.overlay_1.DATA_START =.; 301 #:::::::::: Data 302 ccc.o (.sdata) 303 ddd.o (.sdata) 304 . = ALIGN(4); 305 ccc.o (.data) 306 ddd.o (.data) 307 . = ALIGN(4); 308 #:::::::::: Data 309 . = ALIGN(32); 310 SDK_OVERLAY.overlay_1.DATA_END =.; 311 SDK_OVERLAY.overlay_1.END =.; 312 313 SDK_OVERLAY.overlay_1.TEXT_SIZE = SDK_OVERLAY.overlay_1.TEXT_END - SDK_OVERLAY.overlay_1.TEXT_START; 314 SDK_OVERLAY.overlay_1.DATA_SIZE = SDK_OVERLAY.overlay_1.DATA_END - SDK_OVERLAY.overlay_1.DATA_START; 315 SDK_OVERLAY.overlay_1.SIZE = SDK_OVERLAY.overlay_1.END - SDK_OVERLAY.overlay_1.START; 316 317 } > overlay_1 318 319 .overlay_1.bss: 320 { 321 ALIGNALL(4); . = ALIGN(32); 322 323 # 324 # BSS BLOCK 325 # 326 SDK_OVERLAY.overlay_1.BSS_START = .; 327 #:::::::::: bss 328 ccc.o (.bss) 329 ddd.o (.bss) 330 . = ALIGN(4); 331 ccc.o (.sbss) 332 ddd.o (.sbss) 333 . = ALIGN(4); 334 #:::::::::: bss 335 . = ALIGN(32); 336 SDK_OVERLAY.overlay_1.BSS_END = .; 337 338 SDK_OVERLAY.overlay_1.BSS_SIZE = SDK_OVERLAY.overlay_1.BSS_END - SDK_OVERLAY.overlay_1.BSS_START; 339 340 } >> overlay_1 341 342 .overlay_2: 343 { 344 ALIGNALL(4); . = ALIGN(32); 345 346 # 347 # TEXT BLOCK: READ ONLY 348 # 349 SDK_OVERLAY_overlay_2_ID =2; ### SEGMENT overlay_2 OVERLAY ID 350 SDK_OVERLAY.overlay_2.ID =2; 351 SDK_OVERLAY.overlay_2.START =.; 352 SDK_OVERLAY.overlay_2.TEXT_START =.; 353 #:::::::::: text/rodata 354 eee.o (.text) 355 fff.o (.text) 356 . = ALIGN(4); 357 eee.o (.rodata) 358 fff.o (.rodata) 359 . = ALIGN(4); 360 eee.o (.init) 361 fff.o (.init) 362 . = ALIGN(4); 363 SDK_OVERLAY.overlay_2.SINIT_START =.; 364 #:::::::::: ctor 365 eee.o (.ctor) 366 fff.o (.ctor) 367 eee.o (.sinit) 368 fff.o (.sinit) 369 WRITEW 0; 370 #:::::::::: ctor 371 SDK_OVERLAY.overlay_2.SINIT_END =.; 372 373 #:::::::::: text/rodata 374 . = ALIGN(32); 375 SDK_OVERLAY.overlay_2.TEXT_END =.; 376 377 # 378 # DATA BLOCK: READ WRITE 379 # 380 SDK_OVERLAY.overlay_2.DATA_START =.; 381 #:::::::::: Data 382 eee.o (.sdata) 383 fff.o (.sdata) 384 . = ALIGN(4); 385 eee.o (.data) 386 fff.o (.data) 387 . = ALIGN(4); 388 #:::::::::: Data 389 . = ALIGN(32); 390 SDK_OVERLAY.overlay_2.DATA_END =.; 391 SDK_OVERLAY.overlay_2.END =.; 392 393 SDK_OVERLAY.overlay_2.TEXT_SIZE = SDK_OVERLAY.overlay_2.TEXT_END - SDK_OVERLAY.overlay_2.TEXT_START; 394 SDK_OVERLAY.overlay_2.DATA_SIZE = SDK_OVERLAY.overlay_2.DATA_END - SDK_OVERLAY.overlay_2.DATA_START; 395 SDK_OVERLAY.overlay_2.SIZE = SDK_OVERLAY.overlay_2.END - SDK_OVERLAY.overlay_2.START; 396 397 } > overlay_2 398 399 .overlay_2.bss: 400 { 401 ALIGNALL(4); . = ALIGN(32); 402 403 # 404 # BSS BLOCK 405 # 406 SDK_OVERLAY.overlay_2.BSS_START = .; 407 #:::::::::: bss 408 eee.o (.bss) 409 fff.o (.bss) 410 . = ALIGN(4); 411 eee.o (.sbss) 412 fff.o (.sbss) 413 . = ALIGN(4); 414 #:::::::::: bss 415 . = ALIGN(32); 416 SDK_OVERLAY.overlay_2.BSS_END = .; 417 418 SDK_OVERLAY.overlay_2.BSS_SIZE = SDK_OVERLAY.overlay_2.BSS_END - SDK_OVERLAY.overlay_2.BSS_START; 419 420 } >> overlay_2 421 422 423 ############################ MAIN EX ################################## 424 # MAIN EX Area 425 .dummy.MAIN_EX: 426 { 427 . = ALIGN(32); 428 } > dummy.MAIN_EX 429 430 ############################ ARENA ################################## 431 .arena.MAIN: 432 { 433 . = ALIGN(32); 434 SDK_SECTION_ARENA_START =.; 435 } > arena.MAIN 436 437 .arena.MAIN_EX: 438 { 439 . = ALIGN(32); 440 SDK_SECTION_ARENA_EX_START =.; 441 } > arena.MAIN_EX 442 443 .arena.ITCM: 444 { 445 . = ALIGN(32); 446 SDK_SECTION_ARENA_ITCM_START =.; 447 } > arena.ITCM 448 449 .arena.DTCM: 450 { 451 . = ALIGN(32); 452 SDK_SECTION_ARENA_DTCM_START =.; 453 } > arena.DTCM 454 455 ############################ OVERLAYDEFS ############################ 456 .main_defs: 457 { 458 ### main module information 459 WRITEW ADDR(.main); # Load address 460 WRITEW _start; # Entry address 461 WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE; # Size of module 462 WRITEW _start_AutoloadDoneCallback; # Callback autoload done 463 464 ### overlay filename 465 WRITES ("overlay_0.sbin"); # Overlay 0 466 WRITES ("overlay_1.sbin"); # Overlay 1 467 WRITES ("overlay_2.sbin"); # Overlay 2 468 469 } > main_defs 470 471 472 ############################ OVERLAYTABLE ########################### 473 .main_table: 474 { 475 # Overlay 0 476 WRITEW 0; # Overlay ID 477 WRITEW ADDR(.overlay_0); # Load address 478 WRITEW SDK_OVERLAY.overlay_0.SIZE; # Size of module 479 WRITEW SDK_OVERLAY.overlay_0.BSS_SIZE; # Size of bss 480 WRITEW SDK_OVERLAY.overlay_0.SINIT_START; # Start address of static init 481 WRITEW SDK_OVERLAY.overlay_0.SINIT_END; # End address of static init 482 WRITEW 0; # ROM file ID 483 WRITEW 0; # Reserved 484 485 # Overlay 1 486 WRITEW 1; # Overlay ID 487 WRITEW ADDR(.overlay_1); # Load address 488 WRITEW SDK_OVERLAY.overlay_1.SIZE; # Size of module 489 WRITEW SDK_OVERLAY.overlay_1.BSS_SIZE; # Size of bss 490 WRITEW SDK_OVERLAY.overlay_1.SINIT_START; # Start address of static init 491 WRITEW SDK_OVERLAY.overlay_1.SINIT_END; # End address of static init 492 WRITEW 1; # ROM file ID 493 WRITEW 0; # Reserved 494 495 # Overlay 2 496 WRITEW 2; # Overlay ID 497 WRITEW ADDR(.overlay_2); # Load address 498 WRITEW SDK_OVERLAY.overlay_2.SIZE; # Size of module 499 WRITEW SDK_OVERLAY.overlay_2.BSS_SIZE; # Size of bss 500 WRITEW SDK_OVERLAY.overlay_2.SINIT_START; # Start address of static init 501 WRITEW SDK_OVERLAY.overlay_2.SINIT_END; # End address of static init 502 WRITEW 2; # ROM file ID 503 WRITEW 0; # Reserved 504 505 506 } > main_table 507 508 509 ############################ OTHERS ################################# 510 SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START; 511 SDK_IRQ_STACKSIZE = 1024; # Allocated in DTCM 512 SDK_SYS_STACKSIZE = 8192; # When 0 means all remains of DTCM 513 514 # Module filelist 515 .binary.MODULE_FILES: 516 { 517 WRITES ("main.sbin"); 518 WRITES ("main_defs.sbin"); 519 WRITES ("main_table.sbin"); 520 } > binary.MODULE_FILES 521 522 # ITCM/DTCM size checker => check AUTOLOAD_ITCM/DTCM 523 .check.ITCM: 524 { 525 . = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE; 526 } > check.ITCM 527 528 SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1; 529 .check.DTCM: 530 { 531 . = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE; 532 . = . + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN; 533 } > check.DTCM 534 535} 536