Added startup code, updated ldscript.

This commit is contained in:
imi415 2022-06-21 23:16:14 +08:00
parent 2826b89248
commit ca588dca3c
Signed by: imi415
GPG Key ID: 885EC2B5A8A6F8A7
3 changed files with 132 additions and 7 deletions

View File

@ -1,16 +1,21 @@
cmake_minimum_required(VERSION 3.10)
enable_language(ASM)
project(hello)
set(TARGET_SRCS
set(TARGET_LDSCRIPT "${CMAKE_SOURCE_DIR}/stx7105.ld")
set(TARGET_SOURCES
"src/main.c"
"startup_stx7105.S"
)
set(TARGET_INCLUDES
"include"
)
set(TARGET_FLAGS_HARDWARE "-m4")
set(TARGET_FLAGS_HARDWARE "-m4-300 -ml")
set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -g -O0")
set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -g -O0")
@ -22,4 +27,13 @@ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto")
set(CMAKE_C_FLAGS "${TARGET_FLAGS_HARDWARE} -Wall")
set(CMAKE_CXX_FLAGS "${TARGET_FLAGS_HARDWARE} -Wall")
set(CMAKE_EXE_LINKER_FLAGS "${TARGET_FLAGS_HARDWARE} -Wall")
set(CMAKE_EXE_LINKER_FLAGS "${TARGET_FLAGS_HARDWARE} -Wall -lc -lm -nostartfiles -Wl,--print-memory-usage")
add_compile_definitions(TARGET_DEFS)
include_directories(TARGET_INCLUDES)
add_executable(${CMAKE_PROJECT_NAME}.elf ${TARGET_SOURCES})
target_link_options(${CMAKE_PROJECT_NAME}.elf
PRIVATE "-T${TARGET_LDSCRIPT}"
PRIVATE "-Wl,-Map=${CMAKE_PROJECT_NAME}.map"
)

View File

@ -1,5 +1,67 @@
.global _start
.section .text.init, "ax"
.global _start
_start:
nop
nop
nop
mov.l stack_k, sp /* Setup R15(SP) */
copy_data:
mov.l sidata_k, r0
mov.l sdata_k, r1
mov.l edata_k, r2
loop_copy_data:
mov.l @r0+, r3 /* Load a word to r3 from [sidata], with post-increment of 4 */
mov.l r3, @r1 /* Store the word in r3 to [sdata] */
add #4, r1 /* Increment sdata pointer */
cmp/ge r1, r2
bt loop_copy_data
zero_bss:
mov.l edata_k, r0
mov.l end_k, r1
mov #0, r2
loop_zero_bss:
mov.l r2, @r0
add #4, r0
cmp/ge r0, r1
bt loop_zero_bss
setup_fpu:
mov.l set_fpscr_k, r1
jsr @r1
mov #0, r4
lds r3, fpscr
mov.l main_k,r0
jsr @r0
or r0, r0
mov r0, r4
mov.l exit_k, r0
jsr @r0
or r0, r0
/* It would be more efficient by using indirect addressing instead of 8 instructions... */
.align 2
set_fpscr_k:
.long ___set_fpscr
stack_k:
.long _stack
sidata_k:
.long _sidata
sdata_k:
.long _sdata
edata_k:
.long _edata
end_k:
.long _end
main_k:
.long _main /* Same address as main */
exit_k:
.long _exit

View File

@ -1,7 +1,56 @@
MEMORY {
HEAP_SIZE = 0x10000;
STACK_SIZE = 0x10000;
ENTRY(_start)
/* For bare-metal applications, we use 29-bit addressing mode. */
MEMORY {
EMI (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 /* EMI physical address: 0x0000_0000 */
LMI (rwx) : ORIGIN = 0x0C000000, LENGTH = 0x10000000 /* LMI physical address: 0x0C00_0000 */
}
SECTIONS {
.text : {
. = ALIGN(4);
*(.text.init)
*(.text)
*(.text*)
*(.rodata)
*(.rodata*)
} >EMI
.data : {
. = ALIGN(4);
_sdata = .;
*(.data)
*(.data*)
_edata = .;
} >LMI AT >EMI
_sidata = LOADADDR(.data);
.bss : {
. = ALIGN(4);
__bss_start = .;
*(.bss)
*(.bss*)
*(COMMON)
_end = ALIGN(8);
__end = _end;
} >LMI
.heap : {
. = ALIGN(8);
. += HEAP_SIZE;
}
.stack : {
. = ALIGN(8);
. += STACK_SIZE;
}
_stack = ORIGIN(LMI) + LENGTH(LMI);
PROVIDE(__stack = _stack);
}