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:
@@ -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"
|
||||
)
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user