summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sbi/sbi_hart.h6
-rw-r--r--lib/sbi_hart.c34
-rw-r--r--lib/sbi_init.c4
3 files changed, 40 insertions, 4 deletions
diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h
index b282af9..4aa4a5c 100644
--- a/include/sbi/sbi_hart.h
+++ b/include/sbi/sbi_hart.h
@@ -14,7 +14,11 @@
struct sbi_scratch;
-int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid);
+int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot);
+
+void *sbi_hart_get_trap_info(struct sbi_scratch *scratch);
+
+void sbi_hart_set_trap_info(struct sbi_scratch *scratch, void *data);
void sbi_hart_pmp_dump(struct sbi_scratch *scratch);
diff --git a/lib/sbi_hart.c b/lib/sbi_hart.c
index b35d4fa..187b493 100644
--- a/lib/sbi_hart.c
+++ b/lib/sbi_hart.c
@@ -182,10 +182,19 @@ static int pmp_init(struct sbi_scratch *scratch, u32 hartid)
return 0;
}
-int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid)
+static unsigned long trap_info_offset;
+
+int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot)
{
int rc;
+ if (cold_boot) {
+ trap_info_offset = sbi_scratch_alloc_offset(__SIZEOF_POINTER__,
+ "HART_TRAP_INFO");
+ if (!trap_info_offset)
+ return SBI_ENOMEM;
+ }
+
mstatus_init(scratch, hartid);
rc = fp_init(hartid);
@@ -199,6 +208,29 @@ int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid)
return pmp_init(scratch, hartid);
}
+void *sbi_hart_get_trap_info(struct sbi_scratch *scratch)
+{
+ unsigned long *trap_info;
+
+ if (!trap_info_offset)
+ return NULL;
+
+ trap_info = sbi_scratch_offset_ptr(scratch, trap_info_offset);
+
+ return (void *)(*trap_info);
+}
+
+void sbi_hart_set_trap_info(struct sbi_scratch *scratch, void *data)
+{
+ unsigned long *trap_info;
+
+ if (!trap_info_offset)
+ return;
+
+ trap_info = sbi_scratch_offset_ptr(scratch, trap_info_offset);
+ *trap_info = (unsigned long)data;
+}
+
void __attribute__((noreturn)) sbi_hart_hang(void)
{
while (1)
diff --git a/lib/sbi_init.c b/lib/sbi_init.c
index 5c74b45..4f47a6c 100644
--- a/lib/sbi_init.c
+++ b/lib/sbi_init.c
@@ -66,7 +66,7 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
if (rc)
sbi_hart_hang();
- rc = sbi_hart_init(scratch, hartid);
+ rc = sbi_hart_init(scratch, hartid, TRUE);
if (rc)
sbi_hart_hang();
@@ -115,7 +115,7 @@ static void __noreturn init_warmboot(struct sbi_scratch *scratch, u32 hartid)
if (rc)
sbi_hart_hang();
- rc = sbi_hart_init(scratch, hartid);
+ rc = sbi_hart_init(scratch, hartid, FALSE);
if (rc)
sbi_hart_hang();