diff --git a/src/arch/riscv/RiscvFsWorkload.py b/src/arch/riscv/RiscvFsWorkload.py index 36580a5498..467d7ec26a 100644 --- a/src/arch/riscv/RiscvFsWorkload.py +++ b/src/arch/riscv/RiscvFsWorkload.py @@ -67,9 +67,7 @@ class RiscvBootloaderKernelWorkload(Workload): bootloader_addr = Param.Addr( 0x0, "Where to place the bootloader in memory." ) - kernel_filename = Param.String( - "", "vmlinux file. Don't use kernel if empty." - ) + object_file = Param.String("", "vmlinux file. Don't use kernel if empty.") kernel_addr = Param.Addr( 0x80200000, "Where to place the kernel in memory. Typically, after the first " @@ -85,6 +83,6 @@ class RiscvBootloaderKernelWorkload(Workload): dtb_addr = Param.Addr(0x87E00000, "Where to place the DTB in memory.") # booting parameters - boot_args = Param.String( + command_line = Param.String( "", "Booting arguments, to be passed to the kernel" ) diff --git a/src/arch/riscv/linux/fs_workload.cc b/src/arch/riscv/linux/fs_workload.cc index 2946d6c324..2b36f0aaa5 100644 --- a/src/arch/riscv/linux/fs_workload.cc +++ b/src/arch/riscv/linux/fs_workload.cc @@ -97,8 +97,8 @@ BootloaderKernelWorkload::loadBootloaderSymbolTable() void BootloaderKernelWorkload::loadKernelSymbolTable() { - if (params().kernel_filename != "") { - kernel = loader::createObjectFile(params().kernel_filename); + if (params().object_file != "") { + kernel = loader::createObjectFile(params().object_file); kernelSymbolTable = kernel->symtab(); auto renamedKernelSymbolTable = \ kernelSymbolTable.functionSymbols()->rename( @@ -131,7 +131,7 @@ BootloaderKernelWorkload::loadBootloader() void BootloaderKernelWorkload::loadKernel() { - if (params().kernel_filename != "") { + if (params().object_file != "") { Addr kernel_paddr_offset = params().kernel_addr; kernel->buildImage().offset(kernel_paddr_offset).write( system->physProxy @@ -139,7 +139,7 @@ BootloaderKernelWorkload::loadKernel() delete kernel; inform("Loaded kernel \'%s\' at 0x%llx\n", - params().kernel_filename, + params().object_file, kernel_paddr_offset); } else { inform("Kernel is not specified.\n"); diff --git a/src/arch/riscv/linux/fs_workload.hh b/src/arch/riscv/linux/fs_workload.hh index a0366a27c4..95269e6f93 100644 --- a/src/arch/riscv/linux/fs_workload.hh +++ b/src/arch/riscv/linux/fs_workload.hh @@ -81,7 +81,7 @@ class BootloaderKernelWorkload: public Workload public: PARAMS(RiscvBootloaderKernelWorkload); BootloaderKernelWorkload(const Params &p) - : Workload(p), entryPoint(p.entry_point), bootArgs(p.boot_args) + : Workload(p), entryPoint(p.entry_point), bootArgs(p.command_line) { loadBootloaderSymbolTable(); loadKernelSymbolTable(); diff --git a/src/python/gem5/components/boards/kernel_disk_workload.py b/src/python/gem5/components/boards/kernel_disk_workload.py index f0b0b0ff1a..dcf20081fa 100644 --- a/src/python/gem5/components/boards/kernel_disk_workload.py +++ b/src/python/gem5/components/boards/kernel_disk_workload.py @@ -207,8 +207,9 @@ class KernelDiskWorkload: # implementation of the ArmBoard class expects a boot loader file to be # provided along with the kernel and the disk image. + self._bootloader = [] if bootloader is not None: - self._bootloader = [bootloader.get_local_path()] + self._bootloader.append(bootloader.get_local_path()) # Set the readfile. if readfile: diff --git a/src/python/gem5/components/boards/riscv_board.py b/src/python/gem5/components/boards/riscv_board.py index f032388571..a3685f2991 100644 --- a/src/python/gem5/components/boards/riscv_board.py +++ b/src/python/gem5/components/boards/riscv_board.py @@ -42,7 +42,7 @@ from m5.objects import ( PMAChecker, Port, RawDiskImage, - RiscvLinux, + RiscvBootloaderKernelWorkload, RiscvMmioVirtIO, RiscvRTC, VirtIOBlock, @@ -97,7 +97,7 @@ class RiscvBoard(AbstractSystemBoard, KernelDiskWorkload): @overrides(AbstractSystemBoard) def _setup_board(self) -> None: - self.workload = RiscvLinux() + self.workload = RiscvBootloaderKernelWorkload() # Contains a CLINT, PLIC, UART, and some functions for the dtb, etc. self.platform = HiFive() @@ -488,6 +488,18 @@ class RiscvBoard(AbstractSystemBoard, KernelDiskWorkload): def get_disk_device(self): return "/dev/vda" + @overrides(AbstractSystemBoard) + def _pre_instantiate(self): + if len(self._bootloader) > 0: + self.workload.bootloader_addr = 0x0 + self.workload.bootloader_filename = self._bootloader[0] + self.workload.kernel_addr = 0x80200000 + self.workload.entry_point = 0x80000000 # Bootloader starting point + else: + self.workload.kernel_addr = 0x0 + self.workload.entry_point = 0x80000000 + self._connect_things() + @overrides(KernelDiskWorkload) def _add_disk_to_board(self, disk_image: AbstractResource): image = CowDiskImage(