aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPalmer Dabbelt <palmer@dabbelt.com>2017-08-02 10:29:44 -0700
committerPalmer Dabbelt <palmer@dabbelt.com>2017-08-02 12:32:45 -0700
commit298984cbe6ffd7ab8507fa40e15199c7d5386aab (patch)
tree0f4e8b669c46c49a6f345b31b962613ebfb96026
parent62effc6bfe4f1a7e8a771c49966c4ab7755d6612 (diff)
downloadriscv-pk-298984cbe6ffd7ab8507fa40e15199c7d5386aab.zip
riscv-pk-298984cbe6ffd7ab8507fa40e15199c7d5386aab.tar.gz
riscv-pk-298984cbe6ffd7ab8507fa40e15199c7d5386aab.tar.bz2
Move DISABLED_HART_MASK to the platform
Some platforms can't boot Linux on all the harts. This commit allows platforms to define the set of harts that should be prevented from booting past BBL. This is essentially just a new mechanism for defining the DISABLED_HART_MASK.
-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;