riscv: spike: allow base == 0

The sanity check on base doesn't allow htif to be mapped @0. Check if the
symbol exists instead so we can map it where we want.

Reviewed-by: Michael Clark <mjc@sifive.com>
Signed-off-by: KONRAD Frederic <frederic.konrad@adacore.com>
Signed-off-by: Michael Clark <mjc@sifive.com>

Message-Id: <1525360636-18229-2-git-send-email-frederic.konrad@adacore.com>
This commit is contained in:
KONRAD Frederic 2018-05-03 17:17:14 +02:00 committed by Michael Clark
parent c8b7e627b4
commit 17b9751e85
No known key found for this signature in database
GPG Key ID: 6BF1D7B357EF3E4F

View File

@ -41,17 +41,20 @@
} while (0) } while (0)
static uint64_t fromhost_addr, tohost_addr; static uint64_t fromhost_addr, tohost_addr;
static int address_symbol_set;
void htif_symbol_callback(const char *st_name, int st_info, uint64_t st_value, void htif_symbol_callback(const char *st_name, int st_info, uint64_t st_value,
uint64_t st_size) uint64_t st_size)
{ {
if (strcmp("fromhost", st_name) == 0) { if (strcmp("fromhost", st_name) == 0) {
address_symbol_set |= 1;
fromhost_addr = st_value; fromhost_addr = st_value;
if (st_size != 8) { if (st_size != 8) {
error_report("HTIF fromhost must be 8 bytes"); error_report("HTIF fromhost must be 8 bytes");
exit(1); exit(1);
} }
} else if (strcmp("tohost", st_name) == 0) { } else if (strcmp("tohost", st_name) == 0) {
address_symbol_set |= 2;
tohost_addr = st_value; tohost_addr = st_value;
if (st_size != 8) { if (st_size != 8) {
error_report("HTIF tohost must be 8 bytes"); error_report("HTIF tohost must be 8 bytes");
@ -248,7 +251,7 @@ HTIFState *htif_mm_init(MemoryRegion *address_space, MemoryRegion *main_mem,
qemu_chr_fe_init(&s->chr, chr, &error_abort); qemu_chr_fe_init(&s->chr, chr, &error_abort);
qemu_chr_fe_set_handlers(&s->chr, htif_can_recv, htif_recv, htif_event, qemu_chr_fe_set_handlers(&s->chr, htif_can_recv, htif_recv, htif_event,
htif_be_change, s, NULL, true); htif_be_change, s, NULL, true);
if (base) { if (address_symbol_set == 3) {
memory_region_init_io(&s->mmio, NULL, &htif_mm_ops, s, memory_region_init_io(&s->mmio, NULL, &htif_mm_ops, s,
TYPE_HTIF_UART, size); TYPE_HTIF_UART, size);
memory_region_add_subregion(address_space, base, &s->mmio); memory_region_add_subregion(address_space, base, &s->mmio);