diff options
| author | Prashanth Mundkur | 2018-11-21 14:02:18 -0800 |
|---|---|---|
| committer | Prashanth Mundkur | 2018-11-21 14:19:21 -0800 |
| commit | 01a6e9b8ad00728fdbf12a76cda24144a75ec552 (patch) | |
| tree | 2026fcadd803d41fb1aac4a8de7f4b1a71a94c07 /riscv | |
| parent | b5cdd319822f9b2836a3bccf827121cb7ab0a105 (diff) | |
RISC-V: allow platform ram size to be configurable.
Diffstat (limited to 'riscv')
| -rw-r--r-- | riscv/platform.ml | 4 | ||||
| -rw-r--r-- | riscv/platform_impl.ml | 17 | ||||
| -rw-r--r-- | riscv/platform_main.ml | 3 | ||||
| -rw-r--r-- | riscv/riscv_sim.c | 26 |
4 files changed, 37 insertions, 13 deletions
diff --git a/riscv/platform.ml b/riscv/platform.ml index 06486ca2..f2e9f7b6 100644 --- a/riscv/platform.ml +++ b/riscv/platform.ml @@ -69,7 +69,7 @@ let bits_of_int64 i = let rom_size_ref = ref 0 let make_rom start_pc = let reset_vec = List.concat (List.map P.uint32_to_bytes (P.reset_vec_int start_pc)) in - let dtb = P.make_dtb P.dts in + let dtb = P.make_dtb (P.make_dts ()) in let rom = reset_vec @ dtb in ( rom_size_ref := List.length rom; (* @@ -89,7 +89,7 @@ let rom_base () = bits_of_int64 P.rom_base let rom_size () = bits_of_int !rom_size_ref let dram_base () = bits_of_int64 P.dram_base -let dram_size () = bits_of_int64 P.dram_size +let dram_size () = bits_of_int64 !P.dram_size_ref let htif_tohost () = bits_of_int64 (Big_int.to_int64 (Elf.elf_tohost ())) diff --git a/riscv/platform_impl.ml b/riscv/platform_impl.ml index c5cc3fff..3eb82179 100644 --- a/riscv/platform_impl.ml +++ b/riscv/platform_impl.ml @@ -41,11 +41,12 @@ let reset_vec_int start_pc = [ (* address map *) let dram_base = 0x80000000L;; (* Spike::DRAM_BASE *) -let dram_size = Int64.(shift_left 2048L 20) let clint_base = 0x02000000L;; (* Spike::CLINT_BASE *) let clint_size = 0x000c0000L;; (* Spike::CLINT_SIZE *) let rom_base = 0x00001000L;; (* Spike::DEFAULT_RSTVEC *) +let dram_size_ref = ref (Int64.(shift_left 2048L 20)) + type mem_region = { addr : Int64.t; size : Int64.t @@ -106,9 +107,10 @@ let spike_dts isa_spec cpu_hz insns_per_rtc_tick mems = let cpu_hz = 1000000000;; let insns_per_tick = 100;; -let mems = [ { addr = dram_base; - size = dram_size } ];; -let dts = spike_dts "rv64imac" cpu_hz insns_per_tick mems;; +let make_mems () = [{ addr = dram_base; + size = !dram_size_ref }];; + +let make_dts () = spike_dts "rv64imac" cpu_hz insns_per_tick (make_mems ());; let bytes_to_string bytes = String.init (List.length bytes) (fun i -> Char.chr (List.nth bytes i)) @@ -125,6 +127,9 @@ let set_dtc path = ( Printf.eprintf "Error accessing %s: %s\n%!" path (Unix.error_message e); exit 1) +let set_dram_size mb = + dram_size_ref := Int64.(shift_left (Int64.of_int mb) 20) + let make_dtb dts = (* Call the dtc compiler, assumed to be at /usr/bin/dtc *) try let cmd = Printf.sprintf "%s -I dts" !dtc_path in @@ -172,8 +177,8 @@ let rec term_read () = let show_bytes s = output_string stdout s -let dump_dts () = show_bytes dts -let dump_dtb () = show_bytes (bytes_to_string (make_dtb dts)) +let dump_dts () = show_bytes (make_dts ()) +let dump_dtb () = show_bytes (bytes_to_string (make_dtb (make_dts ()))) (* let save_string_to_file s fname = diff --git a/riscv/platform_main.ml b/riscv/platform_main.ml index b33247f1..1c9ba209 100644 --- a/riscv/platform_main.ml +++ b/riscv/platform_main.ml @@ -76,6 +76,9 @@ let options = Arg.align ([("-dump-dts", ("-mtval-has-illegal-inst-bits", Arg.Set P.config_mtval_has_illegal_inst_bits, " mtval stores instruction bits on an illegal instruction exception"); + ("-ram-size", + Arg.Int PI.set_dram_size, + " size of physical ram memory to use (in MB)"); ("-with-dtc", Arg.String PI.set_dtc, " full path to dtc to use") diff --git a/riscv/riscv_sim.c b/riscv/riscv_sim.c index 06f9bd66..394277a7 100644 --- a/riscv/riscv_sim.c +++ b/riscv/riscv_sim.c @@ -52,6 +52,7 @@ size_t spike_dtb_len = 0; static struct option options[] = { {"enable-dirty", no_argument, 0, 'd'}, {"enable-misaligned", no_argument, 0, 'm'}, + {"ram-size", required_argument, 0, 'z'}, {"mtval-has-illegal-inst-bits", no_argument, 0, 'i'}, {"dump-dts", no_argument, 0, 's'}, {"device-tree-blob", required_argument, 0, 'b'}, @@ -75,7 +76,7 @@ static void dump_dts(void) { #ifdef SPIKE size_t dts_len = 0; - struct tv_spike_t *s = tv_init("RV64IMAC", 0); + struct tv_spike_t *s = tv_init("RV64IMAC", rv_ram_size, 0); tv_get_dts(s, NULL, &dts_len); if (dts_len > 0) { unsigned char *dts = (unsigned char *)malloc(dts_len + 1); @@ -122,14 +123,17 @@ static void read_dtb(const char *path) char *process_args(int argc, char **argv) { int c, idx = 1; + uint64_t ram_size = 0; while(true) { - c = getopt_long(argc, argv, "dmsb:t:v:h", options, &idx); + c = getopt_long(argc, argv, "dmsz:b:t:v:h", options, &idx); if (c == -1) break; switch (c) { case 'd': + fprintf(stderr, "enabling dirty update.\n"); rv_enable_dirty_update = true; break; case 'm': + fprintf(stderr, "enabling misaligned access.\n"); rv_enable_misaligned = true; break; case 'i': @@ -137,6 +141,13 @@ char *process_args(int argc, char **argv) case 's': do_dump_dts = true; break; + case 'z': + ram_size = atol(optarg); + if (ram_size) { + fprintf(stderr, "setting ram-size to %ld MB\n", ram_size); + rv_ram_size = ram_size << 20; + } + break; case 'b': dtb_file = strdup(optarg); break; @@ -179,11 +190,11 @@ uint64_t load_sail(char *f) return entry; } -void init_spike(const char *f, uint64_t entry) +void init_spike(const char *f, uint64_t entry, uint64_t ram_size) { #ifdef SPIKE bool mismatch = false; - s = tv_init("RV64IMAC", 1); + s = tv_init("RV64IMAC", ram_size, 1); if (tv_is_dirty_enabled(s) != rv_enable_dirty_update) { mismatch = true; fprintf(stderr, "inconsistent enable-dirty-update setting: spike %s, sail %s\n", @@ -196,6 +207,11 @@ void init_spike(const char *f, uint64_t entry) tv_is_misaligned_enabled(s) ? "on" : "off", rv_enable_misaligned ? "on" : "off"); } + if (tv_ram_size(s) != rv_ram_size) { + mismatch = true; + fprintf(stderr, "inconsistent ram-size setting: spike %lx, sail %lx\n", + tv_ram_size(s), rv_ram_size); + } if (mismatch) exit(1); /* The initialization order below matters. */ @@ -491,7 +507,7 @@ int main(int argc, char **argv) /* initialize spike before sail so that we can access the device-tree blob, * until we roll our own. */ - init_spike(file, entry); + init_spike(file, entry, rv_ram_size); init_sail(entry); if (!init_check(s)) finish(1); |
