diff --git a/src/arch/riscv/RiscvFsWorkload.py b/src/arch/riscv/RiscvFsWorkload.py index 24dff58828..5f233e1057 100644 --- a/src/arch/riscv/RiscvFsWorkload.py +++ b/src/arch/riscv/RiscvFsWorkload.py @@ -43,6 +43,11 @@ class RiscvBareMetal(Workload): bootloader = Param.String("File, that contains the bootloader code") bare_metal = Param.Bool(True, "Using Bare Metal Application?") reset_vect = Param.Addr(0x0, "Reset vector") + auto_reset_vect = Param.Bool( + True, + "Use bootloader entry point as reset vector. " + "If `auto_reset_vect` is true, the `reset_vect` parameter is ignored.", + ) class RiscvLinux(KernelWorkload): diff --git a/src/arch/riscv/bare_metal/fs_workload.cc b/src/arch/riscv/bare_metal/fs_workload.cc index 574c944bff..a71af1f1d4 100644 --- a/src/arch/riscv/bare_metal/fs_workload.cc +++ b/src/arch/riscv/bare_metal/fs_workload.cc @@ -41,13 +41,18 @@ namespace RiscvISA { BareMetal::BareMetal(const Params &p) : Workload(p), - _isBareMetal(p.bare_metal), _resetVect(p.reset_vect), + _isBareMetal(p.bare_metal), bootloader(loader::createObjectFile(p.bootloader)) { fatal_if(!bootloader, "Could not load bootloader file %s.", p.bootloader); - _resetVect = bootloader->entryPoint(); bootloaderSymtab = bootloader->symtab(); + if (p.auto_reset_vect) { + _resetVect = bootloader->entryPoint(); + } else { + _resetVect = p.reset_vect; + } + loader::debugSymbolTable.insert(bootloaderSymtab); }