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 * (.version) 65 OBJECT(NitroMain,*) 66 obj_a.o (.text) 67 obj_b.o (.text) 68 obj_c.o (.text) 69 . = ALIGN(4); 70 * (.exception) 71 . = ALIGN(4); 72 SDK_STATIC_ETABLE_START =.; 73 EXCEPTION 74 SDK_STATIC_ETABLE_END =.; 75 . = ALIGN(4); 76 . = ALIGN(4); 77 . = ALIGN(4); 78 79 SDK_STATIC_SINIT_START =.; 80 #:::::::::: ctor 81 WRITEW 0; 82 #:::::::::: ctor 83 SDK_STATIC_SINIT_END =.; 84 85 #:::::::::: text/rodata 86 . = ALIGN(32); 87 SDK_STATIC_TEXT_END =.; 88 89 # 90 # DATA BLOCK: READ WRITE 91 # 92 SDK_STATIC_DATA_START =.; 93 #:::::::::: data 94 . = ALIGN(4); 95 . = ALIGN(4); 96 SDK_OVERLAY_DIGEST =.; 97 # NO DIGEST 98 SDK_OVERLAY_DIGEST_END =.; 99 #:::::::::: data 100 . = ALIGN(32); 101 SDK_STATIC_DATA_END =.; 102 SDK_STATIC_END =.; 103 104 SDK_STATIC_TEXT_SIZE = SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START; 105 SDK_STATIC_DATA_SIZE = SDK_STATIC_DATA_END - SDK_STATIC_DATA_START; 106 SDK_STATIC_SIZE = SDK_STATIC_END - SDK_STATIC_START; 107 __sinit__ = SDK_STATIC_SINIT_START; # for static initializer 108 __exception_table_start__ = SDK_STATIC_ETABLE_START; # for exception table 109 __exception_table_end__ = SDK_STATIC_ETABLE_END; # for exception table 110 } > main 111 112 .main.bss: 113 { 114 ALIGNALL(4); . = ALIGN(32); 115 116 # 117 # BSS BLOCK 118 # 119 SDK_STATIC_BSS_START =.; 120 #:::::::::: bss 121 . = ALIGN(4); 122 . = ALIGN(4); 123 #:::::::::: bss 124 . = ALIGN(32); 125 SDK_STATIC_BSS_END = .; 126 SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START; 127 128 } >> main 129 130 131 ############################ AUTOLOADS ############################## 132 SDK_AUTOLOAD.ITCM.START = 0x01ff8000; 133 SDK_AUTOLOAD.ITCM.END = SDK_AUTOLOAD.ITCM.START; 134 SDK_AUTOLOAD.ITCM.BSS_END = SDK_AUTOLOAD.ITCM.START; 135 SDK_AUTOLOAD.ITCM.SIZE = 0; 136 SDK_AUTOLOAD.ITCM.BSS_SIZE = 0; 137 SDK_AUTOLOAD.DTCM.START = 0x027e0000; 138 SDK_AUTOLOAD.DTCM.END = SDK_AUTOLOAD.DTCM.START; 139 SDK_AUTOLOAD.DTCM.BSS_END = SDK_AUTOLOAD.DTCM.START; 140 SDK_AUTOLOAD.DTCM.SIZE = 0; 141 SDK_AUTOLOAD.DTCM.BSS_SIZE = 0; 142 SDK_AUTOLOAD_START = SDK_STATIC_END; 143 SDK_AUTOLOAD_SIZE = 0; 144 SDK_AUTOLOAD_NUMBER = 0; 145 146 147 SDK_AUTOLOAD_ITCM_START = SDK_AUTOLOAD.ITCM.START; 148 SDK_AUTOLOAD_ITCM_END = SDK_AUTOLOAD.ITCM.END; 149 SDK_AUTOLOAD_ITCM_BSS_END = SDK_AUTOLOAD.ITCM.BSS_END; 150 SDK_AUTOLOAD_ITCM_SIZE = SDK_AUTOLOAD.ITCM.SIZE; 151 SDK_AUTOLOAD_ITCM_BSS_SIZE = SDK_AUTOLOAD.ITCM.BSS_SIZE; 152 SDK_AUTOLOAD_DTCM_START = SDK_AUTOLOAD.DTCM.START; 153 SDK_AUTOLOAD_DTCM_END = SDK_AUTOLOAD.DTCM.END; 154 SDK_AUTOLOAD_DTCM_BSS_END = SDK_AUTOLOAD.DTCM.BSS_END; 155 SDK_AUTOLOAD_DTCM_SIZE = SDK_AUTOLOAD.DTCM.SIZE; 156 SDK_AUTOLOAD_DTCM_BSS_SIZE = SDK_AUTOLOAD.DTCM.BSS_SIZE; 157 158 ############################ AUTOLOAD_INFO ########################## 159 .binary.AUTOLOAD_INFO: 160 { 161 } > binary.AUTOLOAD_INFO 162 163 SDK_AUTOLOAD_LIST = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE; 164 SDK_AUTOLOAD_LIST_END = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); 165 SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); 166 167 ############################ STATIC_FOOTER ########################## 168 .binary.STATIC_FOOTER: 169 { 170 WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE 171 WRITEW _start_ModuleParams - ADDR(.main); 172 WRITEW 0; # NO DIGEST 173 } > binary.STATIC_FOOTER 174 175 ############################ OVERLAYS ############################### 176 SDK_OVERLAY_NUMBER = 3; 177 178 .overlay_0: 179 { 180 ALIGNALL(4); . = ALIGN(32); 181 182 # 183 # TEXT BLOCK: READ ONLY 184 # 185 SDK_OVERLAY_overlay_0_ID =0; ### SEGMENT overlay_0 OVERLAY ID 186 SDK_OVERLAY.overlay_0.ID =0; 187 SDK_OVERLAY.overlay_0.START =.; 188 SDK_OVERLAY.overlay_0.TEXT_START =.; 189 #:::::::::: text/rodata 190 aaa.o (.text) 191 bbb.o (.text) 192 . = ALIGN(4); 193 aaa.o (.rodata) 194 bbb.o (.rodata) 195 . = ALIGN(4); 196 aaa.o (.init) 197 bbb.o (.init) 198 . = ALIGN(4); 199 SDK_OVERLAY.overlay_0.SINIT_START =.; 200 #:::::::::: ctor 201 aaa.o (.ctor) 202 bbb.o (.ctor) 203 aaa.o (.sinit) 204 bbb.o (.sinit) 205 WRITEW 0; 206 #:::::::::: ctor 207 SDK_OVERLAY.overlay_0.SINIT_END =.; 208 209 #:::::::::: text/rodata 210 . = ALIGN(32); 211 SDK_OVERLAY.overlay_0.TEXT_END =.; 212 213 # 214 # DATA BLOCK: READ WRITE 215 # 216 SDK_OVERLAY.overlay_0.DATA_START =.; 217 #:::::::::: data 218 aaa.o (.sdata) 219 bbb.o (.sdata) 220 . = ALIGN(4); 221 aaa.o (.data) 222 bbb.o (.data) 223 . = ALIGN(4); 224 #:::::::::: data 225 . = ALIGN(32); 226 SDK_OVERLAY.overlay_0.DATA_END =.; 227 SDK_OVERLAY.overlay_0.END =.; 228 229 SDK_OVERLAY.overlay_0.TEXT_SIZE = SDK_OVERLAY.overlay_0.TEXT_END - SDK_OVERLAY.overlay_0.TEXT_START; 230 SDK_OVERLAY.overlay_0.DATA_SIZE = SDK_OVERLAY.overlay_0.DATA_END - SDK_OVERLAY.overlay_0.DATA_START; 231 SDK_OVERLAY.overlay_0.SIZE = SDK_OVERLAY.overlay_0.END - SDK_OVERLAY.overlay_0.START; 232 233 } > overlay_0 234 235 .overlay_0.bss: 236 { 237 ALIGNALL(4); . = ALIGN(32); 238 239 # 240 # BSS BLOCK 241 # 242 SDK_OVERLAY.overlay_0.BSS_START = .; 243 #:::::::::: bss 244 aaa.o (.bss) 245 bbb.o (.bss) 246 . = ALIGN(4); 247 aaa.o (.sbss) 248 bbb.o (.sbss) 249 . = ALIGN(4); 250 #:::::::::: bss 251 . = ALIGN(32); 252 SDK_OVERLAY.overlay_0.BSS_END = .; 253 254 SDK_OVERLAY.overlay_0.BSS_SIZE = SDK_OVERLAY.overlay_0.BSS_END - SDK_OVERLAY.overlay_0.BSS_START; 255 256 } >> overlay_0 257 258 .overlay_1: 259 { 260 ALIGNALL(4); . = ALIGN(32); 261 262 # 263 # TEXT BLOCK: READ ONLY 264 # 265 SDK_OVERLAY_overlay_1_ID =1; ### SEGMENT overlay_1 OVERLAY ID 266 SDK_OVERLAY.overlay_1.ID =1; 267 SDK_OVERLAY.overlay_1.START =.; 268 SDK_OVERLAY.overlay_1.TEXT_START =.; 269 #:::::::::: text/rodata 270 ccc.o (.text) 271 ddd.o (.text) 272 . = ALIGN(4); 273 ccc.o (.rodata) 274 ddd.o (.rodata) 275 . = ALIGN(4); 276 ccc.o (.init) 277 ddd.o (.init) 278 . = ALIGN(4); 279 SDK_OVERLAY.overlay_1.SINIT_START =.; 280 #:::::::::: ctor 281 ccc.o (.ctor) 282 ddd.o (.ctor) 283 ccc.o (.sinit) 284 ddd.o (.sinit) 285 WRITEW 0; 286 #:::::::::: ctor 287 SDK_OVERLAY.overlay_1.SINIT_END =.; 288 289 #:::::::::: text/rodata 290 . = ALIGN(32); 291 SDK_OVERLAY.overlay_1.TEXT_END =.; 292 293 # 294 # DATA BLOCK: READ WRITE 295 # 296 SDK_OVERLAY.overlay_1.DATA_START =.; 297 #:::::::::: data 298 ccc.o (.sdata) 299 ddd.o (.sdata) 300 . = ALIGN(4); 301 ccc.o (.data) 302 ddd.o (.data) 303 . = ALIGN(4); 304 #:::::::::: data 305 . = ALIGN(32); 306 SDK_OVERLAY.overlay_1.DATA_END =.; 307 SDK_OVERLAY.overlay_1.END =.; 308 309 SDK_OVERLAY.overlay_1.TEXT_SIZE = SDK_OVERLAY.overlay_1.TEXT_END - SDK_OVERLAY.overlay_1.TEXT_START; 310 SDK_OVERLAY.overlay_1.DATA_SIZE = SDK_OVERLAY.overlay_1.DATA_END - SDK_OVERLAY.overlay_1.DATA_START; 311 SDK_OVERLAY.overlay_1.SIZE = SDK_OVERLAY.overlay_1.END - SDK_OVERLAY.overlay_1.START; 312 313 } > overlay_1 314 315 .overlay_1.bss: 316 { 317 ALIGNALL(4); . = ALIGN(32); 318 319 # 320 # BSS BLOCK 321 # 322 SDK_OVERLAY.overlay_1.BSS_START = .; 323 #:::::::::: bss 324 ccc.o (.bss) 325 ddd.o (.bss) 326 . = ALIGN(4); 327 ccc.o (.sbss) 328 ddd.o (.sbss) 329 . = ALIGN(4); 330 #:::::::::: bss 331 . = ALIGN(32); 332 SDK_OVERLAY.overlay_1.BSS_END = .; 333 334 SDK_OVERLAY.overlay_1.BSS_SIZE = SDK_OVERLAY.overlay_1.BSS_END - SDK_OVERLAY.overlay_1.BSS_START; 335 336 } >> overlay_1 337 338 .overlay_2: 339 { 340 ALIGNALL(4); . = ALIGN(32); 341 342 # 343 # TEXT BLOCK: READ ONLY 344 # 345 SDK_OVERLAY_overlay_2_ID =2; ### SEGMENT overlay_2 OVERLAY ID 346 SDK_OVERLAY.overlay_2.ID =2; 347 SDK_OVERLAY.overlay_2.START =.; 348 SDK_OVERLAY.overlay_2.TEXT_START =.; 349 #:::::::::: text/rodata 350 eee.o (.text) 351 fff.o (.text) 352 . = ALIGN(4); 353 eee.o (.rodata) 354 fff.o (.rodata) 355 . = ALIGN(4); 356 eee.o (.init) 357 fff.o (.init) 358 . = ALIGN(4); 359 SDK_OVERLAY.overlay_2.SINIT_START =.; 360 #:::::::::: ctor 361 eee.o (.ctor) 362 fff.o (.ctor) 363 eee.o (.sinit) 364 fff.o (.sinit) 365 WRITEW 0; 366 #:::::::::: ctor 367 SDK_OVERLAY.overlay_2.SINIT_END =.; 368 369 #:::::::::: text/rodata 370 . = ALIGN(32); 371 SDK_OVERLAY.overlay_2.TEXT_END =.; 372 373 # 374 # DATA BLOCK: READ WRITE 375 # 376 SDK_OVERLAY.overlay_2.DATA_START =.; 377 #:::::::::: data 378 eee.o (.sdata) 379 fff.o (.sdata) 380 . = ALIGN(4); 381 eee.o (.data) 382 fff.o (.data) 383 . = ALIGN(4); 384 #:::::::::: data 385 . = ALIGN(32); 386 SDK_OVERLAY.overlay_2.DATA_END =.; 387 SDK_OVERLAY.overlay_2.END =.; 388 389 SDK_OVERLAY.overlay_2.TEXT_SIZE = SDK_OVERLAY.overlay_2.TEXT_END - SDK_OVERLAY.overlay_2.TEXT_START; 390 SDK_OVERLAY.overlay_2.DATA_SIZE = SDK_OVERLAY.overlay_2.DATA_END - SDK_OVERLAY.overlay_2.DATA_START; 391 SDK_OVERLAY.overlay_2.SIZE = SDK_OVERLAY.overlay_2.END - SDK_OVERLAY.overlay_2.START; 392 393 } > overlay_2 394 395 .overlay_2.bss: 396 { 397 ALIGNALL(4); . = ALIGN(32); 398 399 # 400 # BSS BLOCK 401 # 402 SDK_OVERLAY.overlay_2.BSS_START = .; 403 #:::::::::: bss 404 eee.o (.bss) 405 fff.o (.bss) 406 . = ALIGN(4); 407 eee.o (.sbss) 408 fff.o (.sbss) 409 . = ALIGN(4); 410 #:::::::::: bss 411 . = ALIGN(32); 412 SDK_OVERLAY.overlay_2.BSS_END = .; 413 414 SDK_OVERLAY.overlay_2.BSS_SIZE = SDK_OVERLAY.overlay_2.BSS_END - SDK_OVERLAY.overlay_2.BSS_START; 415 416 } >> overlay_2 417 418 419 ############################ MAIN EX ################################## 420 # MAIN EX Area 421 .dummy.MAIN_EX: 422 { 423 . = ALIGN(32); 424 } > dummy.MAIN_EX 425 426 ############################ ARENA ################################## 427 .arena.MAIN: 428 { 429 . = ALIGN(32); 430 SDK_SECTION_ARENA_START =.; 431 } > arena.MAIN 432 433 .arena.MAIN_EX: 434 { 435 . = ALIGN(32); 436 SDK_SECTION_ARENA_EX_START =.; 437 } > arena.MAIN_EX 438 439 .arena.ITCM: 440 { 441 . = ALIGN(32); 442 SDK_SECTION_ARENA_ITCM_START =.; 443 } > arena.ITCM 444 445 .arena.DTCM: 446 { 447 . = ALIGN(32); 448 SDK_SECTION_ARENA_DTCM_START =.; 449 } > arena.DTCM 450 451 ############################ OVERLAYDEFS ############################ 452 .main_defs: 453 { 454 ### main module information 455 WRITEW ADDR(.main); # load address 456 WRITEW _start; # entry address 457 WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE; # size of module 458 WRITEW _start_AutoloadDoneCallback; # callback autoload done 459 460 ### overlay filename 461 WRITES ("overlay_0.sbin"); # Overlay 0 462 WRITES ("overlay_1.sbin"); # Overlay 1 463 WRITES ("overlay_2.sbin"); # Overlay 2 464 465 } > main_defs 466 467 468 ############################ OVERLAYTABLE ########################### 469 .main_table: 470 { 471 # Overlay 0 472 WRITEW 0; # overlay ID 473 WRITEW ADDR(.overlay_0); # load address 474 WRITEW SDK_OVERLAY.overlay_0.SIZE; # size of module 475 WRITEW SDK_OVERLAY.overlay_0.BSS_SIZE; # size of bss 476 WRITEW SDK_OVERLAY.overlay_0.SINIT_START; # start address of static init 477 WRITEW SDK_OVERLAY.overlay_0.SINIT_END; # end address of static init 478 WRITEW 0; # ROM file ID 479 WRITEW 0; # Reserved 480 481 # Overlay 1 482 WRITEW 1; # overlay ID 483 WRITEW ADDR(.overlay_1); # load address 484 WRITEW SDK_OVERLAY.overlay_1.SIZE; # size of module 485 WRITEW SDK_OVERLAY.overlay_1.BSS_SIZE; # size of bss 486 WRITEW SDK_OVERLAY.overlay_1.SINIT_START; # start address of static init 487 WRITEW SDK_OVERLAY.overlay_1.SINIT_END; # end address of static init 488 WRITEW 1; # ROM file ID 489 WRITEW 0; # Reserved 490 491 # Overlay 2 492 WRITEW 2; # overlay ID 493 WRITEW ADDR(.overlay_2); # load address 494 WRITEW SDK_OVERLAY.overlay_2.SIZE; # size of module 495 WRITEW SDK_OVERLAY.overlay_2.BSS_SIZE; # size of bss 496 WRITEW SDK_OVERLAY.overlay_2.SINIT_START; # start address of static init 497 WRITEW SDK_OVERLAY.overlay_2.SINIT_END; # end address of static init 498 WRITEW 2; # ROM file ID 499 WRITEW 0; # Reserved 500 501 502 } > main_table 503 504 505 ############################ OTHERS ################################# 506 SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START; 507 SDK_IRQ_STACKSIZE = 1024; # allocated in DTCM 508 SDK_SYS_STACKSIZE = 8192; # when 0 means all remains of DTCM 509 510 # Module filelist 511 .binary.MODULE_FILES: 512 { 513 WRITES ("main.sbin"); 514 WRITES ("main_defs.sbin"); 515 WRITES ("main_table.sbin"); 516 } > binary.MODULE_FILES 517 518 # ITCM/DTCM size checker => check AUTOLOAD_ITCM/DTCM 519 .check.ITCM: 520 { 521 . = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE; 522 } > check.ITCM 523 524 SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1; 525 .check.DTCM: 526 { 527 . = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE; 528 . = . + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN; 529 } > check.DTCM 530 531} 532