aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bbl/bbl.c3
-rw-r--r--machine/mentry.S9
-rw-r--r--machine/minit.c3
-rw-r--r--machine/mtrap.c2
-rw-r--r--machine/mtrap.h5
-rw-r--r--platform/platform_interface.h8
-rw-r--r--platform/spike.c2
7 files changed, 22 insertions, 10 deletions
diff --git a/bbl/bbl.c b/bbl/bbl.c
index 5ee95ad..b0a862d 100644
--- a/bbl/bbl.c
+++ b/bbl/bbl.c
@@ -5,6 +5,7 @@
#include "bits.h"
#include "config.h"
#include "fdt.h"
+#include "platform_interface.h"
#include <string.h>
static const void* entry_point;
@@ -23,7 +24,7 @@ static void filter_dtb(uintptr_t source)
memcpy((void*)dest, (void*)source, size);
// Remove information from the chained FDT
- filter_harts(dest, DISABLED_HART_MASK);
+ filter_harts(dest, platform__disabled_hart_mask);
filter_plic(dest);
filter_compat(dest, "riscv,clint0");
filter_compat(dest, "riscv,debug-013");
diff --git a/machine/mentry.S b/machine/mentry.S
index 64fb507..33d7be4 100644
--- a/machine/mentry.S
+++ b/machine/mentry.S
@@ -258,7 +258,11 @@ do_reset:
add sp, sp, a2
# Boot on the first unmasked hart
- li a4, (~DISABLED_HART_MASK & (DISABLED_HART_MASK+1))
+ la a4, platform__disabled_hart_mask
+ LOAD a4, 0(a4)
+ addi a5, a4, 1
+ not a4, a4
+ and a4, a4, a5
srl a4, a4, a3
andi a4, a4, 1
bnez a4, init_first_hart
@@ -273,7 +277,8 @@ do_reset:
wfi
# masked harts never start
- li a4, DISABLED_HART_MASK
+ la a4, platform__disabled_hart_mask
+ LOAD a4, 0(a4)
srl a4, a4, a3
andi a4, a4, 1
bnez a4, .LmultiHart
diff --git a/machine/minit.c b/machine/minit.c
index e78bbbb..0fb5f21 100644
--- a/machine/minit.c
+++ b/machine/minit.c
@@ -4,6 +4,7 @@
#include "fp_emulation.h"
#include "fdt.h"
#include "uart.h"
+#include "platform_interface.h"
#include <string.h>
#include <limits.h>
@@ -123,7 +124,7 @@ static void hart_plic_init()
static void wake_harts()
{
for (int hart = 0; hart < MAX_HARTS; ++hart)
- if ((((~DISABLED_HART_MASK & hart_mask) >> hart) & 1))
+ if ((((~platform__disabled_hart_mask & hart_mask) >> hart) & 1))
*OTHER_HLS(hart)->ipi = 1; // wakeup the hart
}
diff --git a/machine/mtrap.c b/machine/mtrap.c
index ff4eb60..62137ff 100644
--- a/machine/mtrap.c
+++ b/machine/mtrap.c
@@ -56,7 +56,7 @@ void printm(const char* s, ...)
static void send_ipi(uintptr_t recipient, int event)
{
- if (((DISABLED_HART_MASK >> recipient) & 1)) return;
+ if (((platform__disabled_hart_mask >> recipient) & 1)) return;
atomic_or(&OTHER_HLS(recipient)->mipi_pending, event);
mb();
*OTHER_HLS(recipient)->ipi = 1;
diff --git a/machine/mtrap.h b/machine/mtrap.h
index df71797..4ec0924 100644
--- a/machine/mtrap.h
+++ b/machine/mtrap.h
@@ -9,11 +9,6 @@
# define MAX_HARTS 1
#endif
-// These harts will be prevented from booting beyond bbl
-#ifndef DISABLED_HART_MASK
-#define DISABLED_HART_MASK 0x0UL
-#endif
-
#ifndef __ASSEMBLER__
#include <stdint.h>
diff --git a/platform/platform_interface.h b/platform/platform_interface.h
index dd521e3..f083085 100644
--- a/platform/platform_interface.h
+++ b/platform/platform_interface.h
@@ -1,6 +1,8 @@
#ifndef PLATFORM__PLATFORM_H
#define PLATFORM__PLATFORM_H
+#ifndef __ASSEMBLY__
+
/* This interface is designed to allow BBL/PK to be portable to multiple target
* platforms. The current interface has been hacked up based on SiFive's fork
* of pk that runs on our FPGA boards. The idea here is that rather than
@@ -18,4 +20,10 @@ const char *platform__get_logo(void);
/* Returns TRUE if it's valid to use the HTIF */
int platform__use_htif(void);
+/* The harts that should be excluded from booting to the target program and
+ * should intsead be held in a loop. */
+extern long platform__disabled_hart_mask;
+
+#endif
+
#endif
diff --git a/platform/spike.c b/platform/spike.c
index 159255f..4d9d397 100644
--- a/platform/spike.c
+++ b/platform/spike.c
@@ -25,6 +25,8 @@ static const char logo[] =
"\n"
" INSTRUCTION SETS WANT TO BE FREE\n";
+long platform__disabled_hart_mask = 0;
+
const char *platform__get_logo(void)
{
return logo;