stdlib: Integrate BootloaderKernelWorkload (#630)

This change does the following,

- Change the name of several python parameter names of the
RiscvBootloaderKernelWorkload. This is done to conform the expectation
from the stdlib, e.g., the kernel path must be `object_file`, and the
boot parameter must be `command_line`.
- Use RiscvBootloaderKernelWorkload by default for all full system
RISC-V simulations. RiscvBootloaderKernelWorkload is a superset of
RiscvFsWorkload.
This commit is contained in:
Bobby R. Bruce
2023-12-01 17:04:02 -08:00
committed by GitHub
5 changed files with 23 additions and 12 deletions

View File

@@ -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"
)

View File

@@ -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");

View File

@@ -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();

View File

@@ -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:

View File

@@ -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(