Adds command line options to specify base addresses of clint and uart. Default is 0x1000'0000 for uart and 0x0200'0000 for clint. PiperOrigin-RevId: 673004774 Change-Id: I566ed6485ce62b1c65a2829ba4fbc1b1511d8875
diff --git a/cheriot/mpact_cheriot.cc b/cheriot/mpact_cheriot.cc index c8a5b0e..3401dd7 100644 --- a/cheriot/mpact_cheriot.cc +++ b/cheriot/mpact_cheriot.cc
@@ -153,6 +153,10 @@ // Enable RiscV Vector instructions + FP. ABSL_FLAG(bool, rvv_fp, false, "Enable RVV + FP"); +// Location of clint and uart. +ABSL_FLAG(uint64_t, clint, 0x0200'0000ULL, "Base address of clint"); +ABSL_FLAG(uint64_t, uart, 0x1000'0000ULL, "Base address of uart"); + constexpr char kStackEndSymbolName[] = "__stack_end"; constexpr char kStackSizeSymbolName[] = "__stack_size"; @@ -364,20 +368,16 @@ auto *uart = new SimpleUart(cheriot_top.state()); - CHECK_OK( - router->AddTarget<MemoryInterface>(uart, 0x1000'0000ULL, 0x1000'00ffULL)); + auto uart_base = absl::GetFlag(FLAGS_uart); + auto clint_base = absl::GetFlag(FLAGS_clint); + CHECK_OK(router->AddTarget<MemoryInterface>(uart, uart_base, + uart_base + 0x100ULL - 1)); auto *clint = new RiscVClint(/*period=*/100, cheriot_top.state()->mip()); cheriot_top.counter_num_cycles()->AddListener(clint); - CHECK_OK(router->AddTarget<AtomicMemoryOpInterface>( - atomic_memory, 0x0000'0000ULL, 0x01ff'ffffULL)); - CHECK_OK(router->AddTarget<TaggedMemoryInterface>( - tagged_memory, 0x0000'0000ULL, 0x01ff'ffffULL)); - CHECK_OK(router->AddTarget<MemoryInterface>(clint, 0x0200'0000ULL, - 0x0200'ffffULL)); - CHECK_OK(router->AddTarget<AtomicMemoryOpInterface>( - atomic_memory, 0x02001'0000ULL, 0xffff'ffffULL)); - CHECK_OK(router->AddTarget<TaggedMemoryInterface>( - tagged_memory, 0x0201'0000ULL, 0xffff'ffffULL)); + CHECK_OK(router->AddTarget<MemoryInterface>(clint, clint_base, + clint_base + 0x10000ULL - 1)); + CHECK_OK(router->AddDefaultTarget<AtomicMemoryOpInterface>(atomic_memory)); + CHECK_OK(router->AddDefaultTarget<TaggedMemoryInterface>(tagged_memory)); // Set up a dummy WFI handler. cheriot_top.state()->set_on_wfi([](const Instruction *) { return true; }); @@ -515,8 +515,13 @@ absl::Duration duration = t1 - t0; double sec = static_cast<double>(duration / absl::Milliseconds(100)) / 10; counter_sec.SetValue(sec); + uint64_t num_instructions = + cheriot_top.counter_num_instructions()->GetValue(); + double mips = static_cast<double>(num_instructions) / sec / 1000000.0; - std::cerr << absl::StrFormat("Simulation done: %0.1f sec\n", sec); + std::cerr << absl::StrFormat( + "Simulation done: %llu instructions in %0.1f sec (%0.1f MIPS)\n", + num_instructions, sec, mips); } // Write out memory use profile.