paul@0 | 1 | OUTPUT_ARCH(mips) |
paul@0 | 2 | ENTRY(_start) |
paul@0 | 3 | |
paul@22 | 4 | IRQ_STACK_SIZE = 256; |
paul@22 | 5 | |
paul@0 | 6 | /* See... |
paul@0 | 7 | * FIGURE 4-5: MEMORY MAP ON RESET FOR PIC32MX170/270 DEVICES (64 KB RAM, 256 KB FLASH) |
paul@0 | 8 | * PIC32MX1XX/2XX 28/36/44-pin Family Data Sheet |
paul@0 | 9 | */ |
paul@0 | 10 | |
paul@0 | 11 | MEMORY |
paul@0 | 12 | { |
paul@0 | 13 | kseg0_boot_mem (rx) : ORIGIN = 0x9FC00000, LENGTH = 0xBF0 |
paul@0 | 14 | kseg0_program_mem (rx) : ORIGIN = 0x9D000000, LENGTH = 0x40000 |
paul@22 | 15 | kseg0_data_mem (w!x) : ORIGIN = 0x80000000, LENGTH = 0x10000 |
paul@0 | 16 | physical_boot_mem (rx) : ORIGIN = 0x1FC00000, LENGTH = 0xBF0 |
paul@0 | 17 | physical_program_mem (rx) : ORIGIN = 0x1D000000, LENGTH = 0x40000 |
paul@22 | 18 | physical_data_mem (w!x) : ORIGIN = 0x00000000, LENGTH = 0x10000 |
paul@0 | 19 | sfrs : ORIGIN = 0xBF800000, LENGTH = 0x100000 |
paul@0 | 20 | configsfrs : ORIGIN = 0xBFC00BF0, LENGTH = 0x10 |
paul@0 | 21 | config3 : ORIGIN = 0xBFC00BF0, LENGTH = 0x4 |
paul@0 | 22 | config2 : ORIGIN = 0xBFC00BF4, LENGTH = 0x4 |
paul@0 | 23 | config1 : ORIGIN = 0xBFC00BF8, LENGTH = 0x4 |
paul@0 | 24 | config0 : ORIGIN = 0xBFC00BFC, LENGTH = 0x4 |
paul@0 | 25 | physical_config3 : ORIGIN = 0x3FC00BF0, LENGTH = 0x4 |
paul@0 | 26 | physical_config2 : ORIGIN = 0x3FC00BF4, LENGTH = 0x4 |
paul@0 | 27 | physical_config1 : ORIGIN = 0x3FC00BF8, LENGTH = 0x4 |
paul@0 | 28 | physical_config0 : ORIGIN = 0x3FC00BFC, LENGTH = 0x4 |
paul@0 | 29 | } |
paul@0 | 30 | |
paul@0 | 31 | SECTIONS |
paul@0 | 32 | { |
paul@22 | 33 | /* Boot program. */ |
paul@22 | 34 | |
paul@0 | 35 | .boot : { *(.boot*) } > kseg0_boot_mem AT > physical_boot_mem |
paul@22 | 36 | |
paul@22 | 37 | /* Exception/interrupt vectors and general program code. */ |
paul@22 | 38 | |
paul@0 | 39 | .vectors : { *(.vectors*) } > kseg0_program_mem AT > physical_program_mem |
paul@66 | 40 | |
paul@66 | 41 | .got : { |
paul@66 | 42 | _gp = ALIGN(16); |
paul@66 | 43 | *(.got*) |
paul@66 | 44 | } > kseg0_program_mem AT > physical_program_mem |
paul@66 | 45 | |
paul@0 | 46 | .text : { *(.text*) } > kseg0_program_mem AT > physical_program_mem |
paul@22 | 47 | |
paul@22 | 48 | /* Reserve space at the bottom of RAM for the IRQ stack. */ |
paul@22 | 49 | |
paul@22 | 50 | .irqstack : { |
paul@22 | 51 | . += IRQ_STACK_SIZE; |
paul@60 | 52 | } > kseg0_data_mem AT > physical_data_mem |
paul@22 | 53 | |
paul@22 | 54 | /* Add other data after the IRQ stack. */ |
paul@22 | 55 | |
paul@66 | 56 | .bss : { |
paul@66 | 57 | _bss = .; |
paul@66 | 58 | *(.bss*) |
paul@66 | 59 | } > kseg0_data_mem AT > physical_data_mem |
paul@66 | 60 | |
paul@66 | 61 | _bss_size = SIZEOF(.bss); |
paul@22 | 62 | |
paul@22 | 63 | /* Store constant data in program memory. */ |
paul@22 | 64 | |
paul@1 | 65 | .rodata : { *(.rodata*) } > kseg0_program_mem AT > physical_program_mem |
paul@22 | 66 | |
paul@60 | 67 | /* Store initialised non-constant data in program memory for relocation. |
paul@60 | 68 | Employ data memory addresses for generated content. */ |
paul@60 | 69 | |
paul@60 | 70 | .data : { |
paul@60 | 71 | _data = .; |
paul@60 | 72 | *(.data*) |
paul@60 | 73 | } > kseg0_data_mem AT > physical_program_mem |
paul@60 | 74 | |
paul@60 | 75 | _data_original = LOADADDR(.data) - ORIGIN(physical_program_mem) + ORIGIN(kseg0_program_mem); |
paul@60 | 76 | _data_size = SIZEOF(.data); |
paul@60 | 77 | |
paul@22 | 78 | /* Device configuration registers to be flashed. */ |
paul@22 | 79 | |
paul@0 | 80 | .devcfg0 : { *(.devcfg0) } > config0 AT > physical_config0 |
paul@0 | 81 | .devcfg1 : { *(.devcfg1) } > config1 AT > physical_config1 |
paul@0 | 82 | .devcfg2 : { *(.devcfg2) } > config2 AT > physical_config2 |
paul@22 | 83 | |
paul@22 | 84 | /* Discard things that might overwrite useful data. */ |
paul@22 | 85 | |
paul@22 | 86 | /DISCARD/ : { *(.reginfo) *(.MIPS.abiflags) *(.pdr) *(.gnu.attributes) *(.comment) } |
paul@0 | 87 | } |