summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPalmer Dabbelt <palmer@dabbelt.com>2017-06-08 09:39:14 -0700
committerPalmer Dabbelt <palmer@dabbelt.com>2017-06-14 08:53:39 -0700
commit9b831bc77f8a7a0046899075aa0f0016478f5bf2 (patch)
tree9ecd6943e41ac54c233a86b4fb1551f31b3ad3e9
parent809711e87af06ca5c151a2fac568382330f2feb6 (diff)
Add linker scripts that target the scratchpad
Everything still defaults to the flash, but users can optionally select the scratchpad. Note that you have to be pretty careful about your scratchpad programs, most of them won't fit. For example, printf is too big to fit in the scratchpad.
-rw-r--r--Makefile5
-rw-r--r--bsp/env/common.mk2
-rw-r--r--bsp/env/coreplexip-e31-arty/flash.lds (renamed from bsp/env/coreplexip-e31-arty/link.lds)0
-rw-r--r--bsp/env/coreplexip-e31-arty/scratchpad.lds161
l---------bsp/env/coreplexip-e51-arty/flash.lds1
l---------bsp/env/coreplexip-e51-arty/link.lds1
l---------bsp/env/coreplexip-e51-arty/scratchpad.lds1
l---------bsp/env/freedom-e300-arty/flash.lds1
l---------bsp/env/freedom-e300-arty/link.lds1
-rw-r--r--bsp/env/freedom-e300-hifive1/flash.lds (renamed from bsp/env/freedom-e300-hifive1/link.lds)0
10 files changed, 168 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index eedb007..11f239f 100644
--- a/Makefile
+++ b/Makefile
@@ -14,6 +14,7 @@ endif
# Default target
BOARD ?= freedom-e300-hifive1
PROGRAM ?= demo_gpio
+LINK_TARGET ?= flash
GDB_PORT ?= 3333
# Variables the user probably shouldn't override.
@@ -191,11 +192,11 @@ PROGRAM_ELF = software/$(PROGRAM)/$(PROGRAM)
.PHONY: software_clean
software_clean:
- $(MAKE) -C $(PROGRAM_DIR) BSP_BASE=$(abspath bsp) BOARD=$(BOARD) clean
+ $(MAKE) -C $(PROGRAM_DIR) CC=$(RISCV_GCC) RISCV_ARCH=$(RISCV_ARCH) RISCV_ABI=$(RISCV_ABI) AR=$(RISCV_AR) BSP_BASE=$(abspath bsp) BOARD=$(BOARD) LINK_TARGET=$(LINK_TARGET) clean
.PHONY: software
software: software_clean
- $(MAKE) -C $(PROGRAM_DIR) CC=$(RISCV_GCC) RISCV_ARCH=$(RISCV_ARCH) RISCV_ABI=$(RISCV_ABI) AR=$(RISCV_AR) BSP_BASE=$(abspath bsp) BOARD=$(BOARD)
+ $(MAKE) -C $(PROGRAM_DIR) CC=$(RISCV_GCC) RISCV_ARCH=$(RISCV_ARCH) RISCV_ABI=$(RISCV_ABI) AR=$(RISCV_AR) BSP_BASE=$(abspath bsp) BOARD=$(BOARD) LINK_TARGET=$(LINK_TARGET)
dasm: software $(RISCV_OBJDUMP)
$(RISCV_OBJDUMP) -D $(PROGRAM_ELF)
diff --git a/bsp/env/common.mk b/bsp/env/common.mk
index 32703a6..4566b80 100644
--- a/bsp/env/common.mk
+++ b/bsp/env/common.mk
@@ -15,7 +15,7 @@ ASM_SRCS += $(ENV_DIR)/start.S
ASM_SRCS += $(ENV_DIR)/entry.S
C_SRCS += $(PLATFORM_DIR)/init.c
-LINKER_SCRIPT := $(PLATFORM_DIR)/link.lds
+LINKER_SCRIPT := $(PLATFORM_DIR)/$(LINK_TARGET).lds
INCLUDES += -I$(BSP_BASE)/include
INCLUDES += -I$(BSP_BASE)/drivers/
diff --git a/bsp/env/coreplexip-e31-arty/link.lds b/bsp/env/coreplexip-e31-arty/flash.lds
index 590c5b6..590c5b6 100644
--- a/bsp/env/coreplexip-e31-arty/link.lds
+++ b/bsp/env/coreplexip-e31-arty/flash.lds
diff --git a/bsp/env/coreplexip-e31-arty/scratchpad.lds b/bsp/env/coreplexip-e31-arty/scratchpad.lds
new file mode 100644
index 0000000..7887c13
--- /dev/null
+++ b/bsp/env/coreplexip-e31-arty/scratchpad.lds
@@ -0,0 +1,161 @@
+OUTPUT_ARCH( "riscv" )
+
+ENTRY( _start )
+
+MEMORY
+{
+ ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K
+}
+
+PHDRS
+{
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ ram PT_NULL;
+}
+
+SECTIONS
+{
+ __stack_size = DEFINED(__stack_size) ? __stack_size : 1K;
+
+ .init :
+ {
+ KEEP (*(SORT_NONE(.init)))
+ } >ram AT>ram :ram
+
+ .text :
+ {
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.*)
+ *(.gnu.linkonce.t.*)
+ } >ram AT>ram :ram
+
+ .fini :
+ {
+ KEEP (*(SORT_NONE(.fini)))
+ } >ram AT>ram :ram
+
+ PROVIDE (__etext = .);
+ PROVIDE (_etext = .);
+ PROVIDE (etext = .);
+
+ .rodata :
+ {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ } >ram AT>ram :ram
+
+ . = ALIGN(4);
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >ram AT>ram :ram
+
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >ram AT>ram :ram
+
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >ram AT>ram :ram
+
+ .ctors :
+ {
+ /* gcc uses crtbegin.o to find the start of
+ the constructors, so we make sure it is
+ first. Because this is a wildcard, it
+ doesn't matter if the user does not
+ actually link against crtbegin.o; the
+ linker won't look for a file to match a
+ wildcard. The wildcard also means that it
+ doesn't matter which directory crtbegin.o
+ is in. */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ /* We don't want to include the .ctor section from
+ the crtend.o file until after the sorted ctors.
+ The .ctor section from the crtend file contains the
+ end of ctors marker and it must be last */
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ } >ram AT>ram :ram
+
+ .dtors :
+ {
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ } >ram AT>ram :ram
+
+ .lalign :
+ {
+ . = ALIGN(4);
+ PROVIDE( _data_lma = . );
+ } >ram AT>ram :ram
+
+ .dalign :
+ {
+ . = ALIGN(4);
+ PROVIDE( _data = . );
+ } >ram AT>ram :ram_init
+
+ .data :
+ {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ . = ALIGN(8);
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.*)
+ *(.gnu.linkonce.s.*)
+ . = ALIGN(8);
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ } >ram AT>ram :ram_init
+
+ . = ALIGN(4);
+ PROVIDE( _edata = . );
+ PROVIDE( edata = . );
+
+ PROVIDE( _fbss = . );
+ PROVIDE( __bss_start = . );
+ .bss :
+ {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ } >ram AT>ram :ram
+
+ . = ALIGN(8);
+ PROVIDE( _end = . );
+ PROVIDE( end = . );
+
+ .stack :
+ {
+ . = ALIGN(8);
+ . += __stack_size;
+ PROVIDE( _sp = . );
+ PROVIDE( _heap_end = . );
+ } >ram AT>ram :ram
+}
diff --git a/bsp/env/coreplexip-e51-arty/flash.lds b/bsp/env/coreplexip-e51-arty/flash.lds
new file mode 120000
index 0000000..54c1026
--- /dev/null
+++ b/bsp/env/coreplexip-e51-arty/flash.lds
@@ -0,0 +1 @@
+../coreplexip-e31-arty/flash.lds \ No newline at end of file
diff --git a/bsp/env/coreplexip-e51-arty/link.lds b/bsp/env/coreplexip-e51-arty/link.lds
deleted file mode 120000
index f3e0254..0000000
--- a/bsp/env/coreplexip-e51-arty/link.lds
+++ /dev/null
@@ -1 +0,0 @@
-../coreplexip-e31-arty/link.lds \ No newline at end of file
diff --git a/bsp/env/coreplexip-e51-arty/scratchpad.lds b/bsp/env/coreplexip-e51-arty/scratchpad.lds
new file mode 120000
index 0000000..7fbe10a
--- /dev/null
+++ b/bsp/env/coreplexip-e51-arty/scratchpad.lds
@@ -0,0 +1 @@
+../coreplexip-e31-arty/scratchpad.lds \ No newline at end of file
diff --git a/bsp/env/freedom-e300-arty/flash.lds b/bsp/env/freedom-e300-arty/flash.lds
new file mode 120000
index 0000000..6441ce5
--- /dev/null
+++ b/bsp/env/freedom-e300-arty/flash.lds
@@ -0,0 +1 @@
+../freedom-e300-hifive1/flash.lds \ No newline at end of file
diff --git a/bsp/env/freedom-e300-arty/link.lds b/bsp/env/freedom-e300-arty/link.lds
deleted file mode 120000
index 2c48449..0000000
--- a/bsp/env/freedom-e300-arty/link.lds
+++ /dev/null
@@ -1 +0,0 @@
-../freedom-e300-hifive1/link.lds \ No newline at end of file
diff --git a/bsp/env/freedom-e300-hifive1/link.lds b/bsp/env/freedom-e300-hifive1/flash.lds
index 6b37141..6b37141 100644
--- a/bsp/env/freedom-e300-hifive1/link.lds
+++ b/bsp/env/freedom-e300-hifive1/flash.lds