aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-05-03 18:49:46 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-05-03 18:49:46 -0700
commitee610c0ff858b73b01a3e54d14e640fe08de092d (patch)
tree06cd2bce7165273e20cd39d1117c162805b6aa63
parent2001632142a11d9a940eee7e3bfbe7c0186fe6ce (diff)
downloadriscv-pk-ee610c0ff858b73b01a3e54d14e640fe08de092d.zip
riscv-pk-ee610c0ff858b73b01a3e54d14e640fe08de092d.tar.gz
riscv-pk-ee610c0ff858b73b01a3e54d14e640fe08de092d.tar.bz2
Find IPI address in configuration string
-rw-r--r--machine/configstring.c3
-rw-r--r--machine/encoding.h6
-rw-r--r--machine/mtrap.c3
-rw-r--r--machine/mtrap.h1
4 files changed, 4 insertions, 9 deletions
diff --git a/machine/configstring.c b/machine/configstring.c
index 6e34f6a..843053c 100644
--- a/machine/configstring.c
+++ b/machine/configstring.c
@@ -25,11 +25,12 @@ static void query_harts(const char* config_string)
for (int core = 0, hart; ; core++) {
for (hart = 0; ; hart++) {
char buf[32];
- snprintf(buf, sizeof buf, "core{%d{%d{isa", core, hart);
+ snprintf(buf, sizeof buf, "core{%d{%d{ipi", core, hart);
query_result res = query_config_string(config_string, buf);
if (!res.start)
break;
hls_t* hls = hls_init(num_harts);
+ hls->ipi = (void*)get_uint(res);
snprintf(buf, sizeof buf, "core{%d{%d{timecmp", core, hart);
res = query_config_string(config_string, buf);
diff --git a/machine/encoding.h b/machine/encoding.h
index 5cb7ff5..5405148 100644
--- a/machine/encoding.h
+++ b/machine/encoding.h
@@ -661,7 +661,6 @@
#define CSR_MCAUSE 0x342
#define CSR_MBADADDR 0x343
#define CSR_MIP 0x344
-#define CSR_MIPI 0x345
#define CSR_MUCOUNTEREN 0x310
#define CSR_MSCOUNTEREN 0x311
#define CSR_MUCYCLE_DELTA 0x700
@@ -678,8 +677,6 @@
#define CSR_MARCHID 0xf12
#define CSR_MIMPID 0xf13
#define CSR_MHARTID 0xf14
-#define CSR_MTOHOST 0x7c0
-#define CSR_MFROMHOST 0x7c1
#define CSR_MRESET 0x7c2
#define CSR_CYCLEH 0xc80
#define CSR_TIMEH 0xc81
@@ -966,7 +963,6 @@ DECLARE_CSR(mepc, CSR_MEPC)
DECLARE_CSR(mcause, CSR_MCAUSE)
DECLARE_CSR(mbadaddr, CSR_MBADADDR)
DECLARE_CSR(mip, CSR_MIP)
-DECLARE_CSR(mipi, CSR_MIPI)
DECLARE_CSR(mucounteren, CSR_MUCOUNTEREN)
DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN)
DECLARE_CSR(mucycle_delta, CSR_MUCYCLE_DELTA)
@@ -983,8 +979,6 @@ DECLARE_CSR(mvendorid, CSR_MVENDORID)
DECLARE_CSR(marchid, CSR_MARCHID)
DECLARE_CSR(mimpid, CSR_MIMPID)
DECLARE_CSR(mhartid, CSR_MHARTID)
-DECLARE_CSR(mtohost, CSR_MTOHOST)
-DECLARE_CSR(mfromhost, CSR_MFROMHOST)
DECLARE_CSR(mreset, CSR_MRESET)
DECLARE_CSR(cycleh, CSR_CYCLEH)
DECLARE_CSR(timeh, CSR_TIMEH)
diff --git a/machine/mtrap.c b/machine/mtrap.c
index 15ecf8f..5c835cb 100644
--- a/machine/mtrap.c
+++ b/machine/mtrap.c
@@ -96,8 +96,7 @@ static void send_ipi(uintptr_t recipient, int event)
{
if ((atomic_or(&OTHER_HLS(recipient)->mipi_pending, event) & event) == 0) {
mb();
- if (recipient != read_const_csr(mhartid))
- assert(!"IPIs temporarily missing");
+ *OTHER_HLS(recipient)->ipi = 1;
}
}
diff --git a/machine/mtrap.h b/machine/mtrap.h
index 514df98..b859a63 100644
--- a/machine/mtrap.h
+++ b/machine/mtrap.h
@@ -35,6 +35,7 @@ extern volatile uint64_t* mtime;
typedef struct {
uint64_t* timecmp;
+ uint32_t* ipi;
volatile int mipi_pending;
volatile int sipi_pending;
int console_ibuf;