summaryrefslogtreecommitdiff
path: root/lib/sbi/sbi_hart.c
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-03-19 14:43:16 +0300
committerAnup Patel <anup@brainfault.org>2020-03-28 11:01:53 +0300
commit1de66d170e71fb94732ffc80dcf4e70e623c4f7a (patch)
tree8b43a209cd287f5c9cdc0ec5761be6982f1ee664 /lib/sbi/sbi_hart.c
parent160c88535f07084051ebba97689fc4a7b2e9037c (diff)
downloadopensbi-1de66d170e71fb94732ffc80dcf4e70e623c4f7a.tar.xz
lib: Optimize unpriv load/store implementation
This patch optimize unpriv load/store implementation by having dedicated unpriv trap handler (just like KVM RISC-V). As a result of this optimization: 1. We have reduced roughly 13+ instruction in all unpriv load/store functions. The reduced instruction also include two function calls. 2. Per-HART trap info pointer in scratch space is now redundant hence removed. 3. The sbi_trap_handler() is now much cleaner because we don't have to handle unpriv load/store traps. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'lib/sbi/sbi_hart.c')
-rw-r--r--lib/sbi/sbi_hart.c36
1 files changed, 7 insertions, 29 deletions
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index e71725c..b0f9919 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -17,6 +17,11 @@
#include <sbi/sbi_hart.h>
#include <sbi/sbi_platform.h>
+extern void __sbi_unpriv_trap(void);
+extern void __sbi_unpriv_trap_hext(void);
+
+void (*sbi_hart_unpriv_trap)(void) = &__sbi_unpriv_trap;
+
static void mstatus_init(struct sbi_scratch *scratch, u32 hartid)
{
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
@@ -203,17 +208,13 @@ static int pmp_init(struct sbi_scratch *scratch, u32 hartid)
return 0;
}
-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;
+ if (misa_extension('H'))
+ sbi_hart_unpriv_trap = &__sbi_unpriv_trap_hext;
}
mstatus_init(scratch, hartid);
@@ -229,29 +230,6 @@ int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot)
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)