From dff90a831ef3e393b2cea931515d25677fdced30 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Mon, 22 Jun 2020 09:52:42 +0530 Subject: [PATCH] Add kernel command line option for spike It is very inconvenient to always embed kernel flat image into OpenSBI for booting Linux/Xvisor on Spike. We add optional "--kernel" command line option for spike. Using this new option, users can specify kernel flat image separately and OpenSBI ELF separately. Signed-off-by: Anup Patel --- spike_main/spike.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/spike_main/spike.cc b/spike_main/spike.cc index 1f5b7718..78cd8900 100644 --- a/spike_main/spike.cc +++ b/spike_main/spike.cc @@ -50,6 +50,7 @@ static void help(int exit_code = 1) fprintf(stderr, " --rbb-port= Listen on for remote bitbang connection\n"); fprintf(stderr, " --dump-dts Print device tree string and exit\n"); fprintf(stderr, " --disable-dtb Don't write the device tree blob into memory\n"); + fprintf(stderr, " --kernel= Load kernel flat image into memory\n"); fprintf(stderr, " --initrd= Load kernel initrd into memory\n"); fprintf(stderr, " --bootargs= Provide custom bootargs for kernel [default: console=hvc0 earlycon=sbi]\n"); fprintf(stderr, " --real-time-clint Increment clint time at real-time rate\n"); @@ -190,6 +191,8 @@ int main(int argc, char** argv) bool dtb_enabled = true; bool real_time_clint = false; size_t nprocs = 1; + const char* kernel = NULL; + reg_t kernel_offset, kernel_size; size_t initrd_size; reg_t initrd_start = 0, initrd_end = 0; const char* bootargs = NULL; @@ -302,6 +305,7 @@ int main(int argc, char** argv) parser.option(0, "dump-dts", 0, [&](const char *s){dump_dts = true;}); parser.option(0, "disable-dtb", 0, [&](const char *s){dtb_enabled = false;}); parser.option(0, "dtb", 1, [&](const char *s){dtb_file = s;}); + parser.option(0, "kernel", 1, [&](const char* s){kernel = s;}); parser.option(0, "initrd", 1, [&](const char* s){initrd = s;}); parser.option(0, "bootargs", 1, [&](const char* s){bootargs = s;}); parser.option(0, "real-time-clint", 0, [&](const char *s){real_time_clint = true;}); @@ -341,6 +345,20 @@ int main(int argc, char** argv) if (!*argv1) help(); + if (kernel && check_file_exists(kernel)) { + kernel_size = get_file_size(kernel); + if (isa[2] == '6' && isa[3] == '4') + kernel_offset = 0x200000; + else + kernel_offset = 0x400000; + for (auto& m : mems) { + if (kernel_size && (kernel_offset + kernel_size) < m.second->size()) { + read_file_bytes(kernel, 0, m.second->contents() + kernel_offset, kernel_size); + break; + } + } + } + if (initrd && check_file_exists(initrd)) { initrd_size = get_file_size(initrd); for (auto& m : mems) {