aboutsummaryrefslogtreecommitdiff
path: root/spike_main/spike.cc
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2022-10-17 13:51:59 -0700
committerAndrew Waterman <andrew@sifive.com>2022-10-17 13:51:59 -0700
commit68aeeb5500521ff52c216862f9a653b64191f3ad (patch)
tree407230ff48f79f177a792451598d9b2b6e3d34a0 /spike_main/spike.cc
parent191634d2854dfed448fc323195f9b65c305e2d77 (diff)
parent03be4ae6c7b8e9865083b61427ff9724c7706fcf (diff)
downloadspike-68aeeb5500521ff52c216862f9a653b64191f3ad.zip
spike-68aeeb5500521ff52c216862f9a653b64191f3ad.tar.gz
spike-68aeeb5500521ff52c216862f9a653b64191f3ad.tar.bz2
Merge branch 'master' into plic_uart_v1plic_uart_v1
Diffstat (limited to 'spike_main/spike.cc')
-rw-r--r--spike_main/spike.cc56
1 files changed, 35 insertions, 21 deletions
diff --git a/spike_main/spike.cc b/spike_main/spike.cc
index 5529045..933f626 100644
--- a/spike_main/spike.cc
+++ b/spike_main/spike.cc
@@ -36,6 +36,7 @@ static void help(int exit_code = 1)
fprintf(stderr, " --log=<name> File name for option -l\n");
fprintf(stderr, " --debug-cmd=<name> Read commands from file (use with -d)\n");
fprintf(stderr, " --isa=<name> RISC-V ISA string [default %s]\n", DEFAULT_ISA);
+ fprintf(stderr, " --pmpregions=<n> Number of PMP regions [default 16]\n");
fprintf(stderr, " --priv=<m|mu|msu> RISC-V privilege modes supported [default %s]\n", DEFAULT_PRIV);
fprintf(stderr, " --varch=<name> RISC-V Vector uArch string [default %s]\n", DEFAULT_VARCH);
fprintf(stderr, " --pc=<address> Override ELF entry point\n");
@@ -50,12 +51,14 @@ static void help(int exit_code = 1)
fprintf(stderr, " This flag can be used multiple times.\n");
fprintf(stderr, " The extlib flag for the library must come first.\n");
fprintf(stderr, " --log-cache-miss Generate a log of cache miss\n");
+ fprintf(stderr, " --log-commits Generate a log of commits info\n");
fprintf(stderr, " --extension=<name> Specify RoCC Extension\n");
fprintf(stderr, " This flag can be used multiple times.\n");
fprintf(stderr, " --extlib=<name> Shared library to load\n");
fprintf(stderr, " This flag can be used multiple times.\n");
fprintf(stderr, " --rbb-port=<port> Listen on <port> for remote bitbang connection\n");
fprintf(stderr, " --dump-dts Print device tree string and exit\n");
+ fprintf(stderr, " --dtb=<path> Use specified device tree blob [default: auto-generate]\n");
fprintf(stderr, " --disable-dtb Don't write the device tree blob into memory\n");
fprintf(stderr, " --kernel=<path> Load kernel flat image into memory\n");
fprintf(stderr, " --initrd=<path> Load kernel initrd into memory\n");
@@ -70,7 +73,8 @@ static void help(int exit_code = 1)
fprintf(stderr, " --dm-abstract-rti=<n> Number of Run-Test/Idle cycles "
"required for an abstract command to execute [default 0]\n");
fprintf(stderr, " --dm-no-hasel Debug module supports hasel\n");
- fprintf(stderr, " --dm-no-abstract-csr Debug module won't support abstract to authenticate\n");
+ fprintf(stderr, " --dm-no-abstract-csr Debug module won't support abstract CSR access\n");
+ fprintf(stderr, " --dm-no-abstract-fpr Debug module won't support abstract FPR access\n");
fprintf(stderr, " --dm-no-halt-groups Debug module won't support halt groups\n");
fprintf(stderr, " --dm-no-impebreak Debug module won't support implicit ebreak in program buffer\n");
fprintf(stderr, " --blocksz=<size> Cache block size (B) for CMO operations(powers of 2) [default 64]\n");
@@ -171,15 +175,20 @@ static std::vector<mem_cfg_t> parse_mem_layout(const char* arg)
if (size % PGSIZE != 0)
size += PGSIZE - size % PGSIZE;
- if (base + size < base)
- help();
-
if (size != size0) {
fprintf(stderr, "Warning: the memory at [0x%llX, 0x%llX] has been realigned\n"
"to the %ld KiB page size: [0x%llX, 0x%llX]\n",
base0, base0 + size0 - 1, long(PGSIZE / 1024), base, base + size - 1);
}
+ if (!mem_cfg_t::check_if_supported(base, size)) {
+ fprintf(stderr, "unsupported memory region "
+ "{base = 0x%llX, size = 0x%llX} specified\n",
+ (unsigned long long)base,
+ (unsigned long long)size);
+ exit(EXIT_FAILURE);
+ }
+
res.push_back(mem_cfg_t(reg_t(base), reg_t(size)));
if (!*p)
break;
@@ -241,7 +250,7 @@ int main(int argc, char** argv)
bool halted = false;
bool histogram = false;
bool log = false;
- bool socket = false; // command line option -s
+ bool UNUSED socket = false; // command line option -s
bool dump_dts = false;
bool dtb_enabled = true;
const char* kernel = NULL;
@@ -267,6 +276,7 @@ int main(int argc, char** argv)
.abstract_rti = 0,
.support_hasel = true,
.support_abstract_csr_access = true,
+ .support_abstract_fpr_access = true,
.support_haltgroups = true,
.support_impebreak = true
};
@@ -277,6 +287,7 @@ int main(int argc, char** argv)
/*default_isa=*/DEFAULT_ISA,
/*default_priv=*/DEFAULT_PRIV,
/*default_varch=*/DEFAULT_VARCH,
+ /*default_pmpregions=*/16,
/*default_mem_layout=*/parse_mem_layout("2048"),
/*default_hartids=*/std::vector<int>(),
/*default_real_time_clint=*/false);
@@ -326,17 +337,17 @@ int main(int argc, char** argv)
option_parser_t parser;
parser.help(&suggest_help);
- parser.option('h', "help", 0, [&](const char* s){help(0);});
- parser.option('d', 0, 0, [&](const char* s){debug = true;});
- parser.option('g', 0, 0, [&](const char* s){histogram = true;});
- parser.option('l', 0, 0, [&](const char* s){log = true;});
+ parser.option('h', "help", 0, [&](const char UNUSED *s){help(0);});
+ parser.option('d', 0, 0, [&](const char UNUSED *s){debug = true;});
+ parser.option('g', 0, 0, [&](const char UNUSED *s){histogram = true;});
+ parser.option('l', 0, 0, [&](const char UNUSED *s){log = true;});
#ifdef HAVE_BOOST_ASIO
- parser.option('s', 0, 0, [&](const char* s){socket = true;});
+ parser.option('s', 0, 0, [&](const char UNUSED *s){socket = true;});
#endif
parser.option('p', 0, 1, [&](const char* s){nprocs = atoul_nonzero_safe(s);});
parser.option('m', 0, 1, [&](const char* s){cfg.mem_layout = parse_mem_layout(s);});
// I wanted to use --halted, but for some reason that doesn't work.
- parser.option('H', 0, 0, [&](const char* s){halted = true;});
+ parser.option('H', 0, 0, [&](const char UNUSED *s){halted = true;});
parser.option(0, "rbb-port", 1, [&](const char* s){use_rbb = true; rbb_port = atoul_safe(s);});
parser.option(0, "pc", 1, [&](const char* s){cfg.start_pc = strtoull(s, 0, 0);});
parser.option(0, "hartids", 1, [&](const char* s){
@@ -346,19 +357,20 @@ int main(int argc, char** argv)
parser.option(0, "ic", 1, [&](const char* s){ic.reset(new icache_sim_t(s));});
parser.option(0, "dc", 1, [&](const char* s){dc.reset(new dcache_sim_t(s));});
parser.option(0, "l2", 1, [&](const char* s){l2.reset(cache_sim_t::construct(s, "L2$"));});
- parser.option(0, "log-cache-miss", 0, [&](const char* s){log_cache = true;});
+ parser.option(0, "log-cache-miss", 0, [&](const char UNUSED *s){log_cache = true;});
parser.option(0, "isa", 1, [&](const char* s){cfg.isa = s;});
+ parser.option(0, "pmpregions", 1, [&](const char* s){cfg.pmpregions = atoul_safe(s);});
parser.option(0, "priv", 1, [&](const char* s){cfg.priv = s;});
parser.option(0, "varch", 1, [&](const char* s){cfg.varch = s;});
parser.option(0, "device", 1, device_parser);
parser.option(0, "extension", 1, [&](const char* s){extensions.push_back(find_extension(s));});
- 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, "dump-dts", 0, [&](const char UNUSED *s){dump_dts = true;});
+ parser.option(0, "disable-dtb", 0, [&](const char UNUSED *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){cfg.bootargs = s;});
- parser.option(0, "real-time-clint", 0, [&](const char *s){cfg.real_time_clint = true;});
+ parser.option(0, "real-time-clint", 0, [&](const char UNUSED *s){cfg.real_time_clint = true;});
parser.option(0, "extlib", 1, [&](const char *s){
void *lib = dlopen(s, RTLD_NOW | RTLD_GLOBAL);
if (lib == NULL) {
@@ -369,23 +381,25 @@ int main(int argc, char** argv)
parser.option(0, "dm-progsize", 1,
[&](const char* s){dm_config.progbufsize = atoul_safe(s);});
parser.option(0, "dm-no-impebreak", 0,
- [&](const char* s){dm_config.support_impebreak = false;});
+ [&](const char UNUSED *s){dm_config.support_impebreak = false;});
parser.option(0, "dm-sba", 1,
[&](const char* s){dm_config.max_sba_data_width = atoul_safe(s);});
parser.option(0, "dm-auth", 0,
- [&](const char* s){dm_config.require_authentication = true;});
+ [&](const char UNUSED *s){dm_config.require_authentication = true;});
parser.option(0, "dmi-rti", 1,
[&](const char* s){dmi_rti = atoul_safe(s);});
parser.option(0, "dm-abstract-rti", 1,
[&](const char* s){dm_config.abstract_rti = atoul_safe(s);});
parser.option(0, "dm-no-hasel", 0,
- [&](const char* s){dm_config.support_hasel = false;});
+ [&](const char UNUSED *s){dm_config.support_hasel = false;});
parser.option(0, "dm-no-abstract-csr", 0,
- [&](const char* s){dm_config.support_abstract_csr_access = false;});
+ [&](const char UNUSED *s){dm_config.support_abstract_csr_access = false;});
+ parser.option(0, "dm-no-abstract-fpr", 0,
+ [&](const char UNUSED *s){dm_config.support_abstract_fpr_access = false;});
parser.option(0, "dm-no-halt-groups", 0,
- [&](const char* s){dm_config.support_haltgroups = false;});
+ [&](const char UNUSED *s){dm_config.support_haltgroups = false;});
parser.option(0, "log-commits", 0,
- [&](const char* s){log_commits = true;});
+ [&](const char UNUSED *s){log_commits = true;});
parser.option(0, "log", 1,
[&](const char* s){log_path = s;});
FILE *cmd_file = NULL;