Add ARM basic bootloader build

This commit is contained in:
Paul Mathieu 2022-05-07 23:00:22 -07:00
parent 47059c1c15
commit d83d42fb60
4 changed files with 100 additions and 0 deletions

32
arm/bootloader.ld Normal file
View File

@ -0,0 +1,32 @@
MEMORY
{
ICTM (rwx) : ORIGIN = 0x00000000, LENGTH = 16384
}
SECTIONS
{
.text :
{
KEEP(vector_table.o(.vector_table))
*(.text*)
*(.rodata*)
} > ICTM
.bss (NOLOAD) :
{
_bss_begin = .;
*(.bss*)
*(COMMON)
_bss_end = .;
} > ICTM
.data :
{
*(.data*)
__exidx_start = .;
*(.exidx*)
__exidx_end = .;
} > ICTM
}

13
arm/main.cc Normal file
View File

@ -0,0 +1,13 @@
#include <cstdint>
struct Gpio {
volatile uint32_t data;
};
#define gpio0 ((Gpio*) 0x40000000)
int main() {
gpio0->data = 42;
while (true) {}
}

25
arm/makefile Normal file
View File

@ -0,0 +1,25 @@
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
CXX = arm-none-eabi-g++
OBJCOPY = arm-none-eabi-objcopy
linker_script = bootloader.ld
CFLAGS = -march=armv6-m -g -ffunction-sections -fdata-sections -O2
CXXFLAGS = $(CFLAGS) -std=c++20 -fno-exceptions
LDFLAGS = -march=armv6-m -g --specs=nano.specs --specs=nosys.specs -Wl,--gc-sections -Wl,-T$(linker_script) -O2
all: bootloader.bin
%.bin: %.elf
$(OBJCOPY) -O binary $< $@
bootloader.elf: main.o vector_table.o
%.elf:
$(LD) $(LDFLAGS) -o $@ $^
.PHONY: clean
clean:
rm -rf *.elf *.bin *.o

30
arm/vector_table.cc Normal file
View File

@ -0,0 +1,30 @@
#include <cstdint>
extern "C" uint32_t _bss_begin, _bss_end;
extern "C" int main();
namespace {
enum VectorTableEntry {
StackPointer = 0,
Reset = 1,
};
void ResetHandler() {
// clear .bss
for (uint32_t* ptr = &_bss_begin; ptr < &_bss_end; ptr++) {
*ptr = 0;
}
main();
while(true) {}
}
} // namespace
__attribute__((section(".vector_table")))
uint32_t vector_table[16] = {
[StackPointer] = 0x00010000,
[Reset] = reinterpret_cast<uint32_t>(ResetHandler),
};