lib: Add per-HART trap info pointer

This patch adds per-HART trap info pointer which can be used to
communicate trap information to sbi_trap_handler().

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
Anup Patel 2019-05-21 16:55:04 +05:30 committed by Anup Patel
parent a22c6891b7
commit bb915780ac
3 changed files with 40 additions and 4 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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();