summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sbi/sbi_domain.h6
-rw-r--r--include/sbi/sbi_hart.h4
-rw-r--r--lib/sbi/sbi_domain.c94
-rw-r--r--lib/sbi/sbi_hart.c44
-rw-r--r--lib/sbi/sbi_init.c27
5 files changed, 127 insertions, 48 deletions
diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
index 4bb08dc..6f90b26 100644
--- a/include/sbi/sbi_domain.h
+++ b/include/sbi/sbi_domain.h
@@ -138,6 +138,12 @@ bool sbi_domain_check_addr(const struct sbi_domain *dom,
unsigned long addr, unsigned long mode,
unsigned long access_flags);
+/** Dump domain details on the console */
+void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix);
+
+/** Dump all domain details on the console */
+void sbi_domain_dump_all(const char *suffix);
+
/** Finalize domain tables and startup non-root domains */
int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid);
diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h
index 79d745a..3ac1500 100644
--- a/include/sbi/sbi_hart.h
+++ b/include/sbi/sbi_hart.h
@@ -36,9 +36,9 @@ static inline ulong sbi_hart_expected_trap_addr(void)
}
unsigned int sbi_hart_mhpm_count(struct sbi_scratch *scratch);
-void sbi_hart_delegation_dump(struct sbi_scratch *scratch);
+void sbi_hart_delegation_dump(struct sbi_scratch *scratch,
+ const char *prefix, const char *suffix);
unsigned int sbi_hart_pmp_count(struct sbi_scratch *scratch);
-void sbi_hart_pmp_dump(struct sbi_scratch *scratch);
int sbi_hart_pmp_configure(struct sbi_scratch *scratch);
bool sbi_hart_has_feature(struct sbi_scratch *scratch, unsigned long feature);
void sbi_hart_get_features_str(struct sbi_scratch *scratch,
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index 9bde5fb..d4b82fe 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -8,6 +8,7 @@
*/
#include <sbi/riscv_asm.h>
+#include <sbi/sbi_console.h>
#include <sbi/sbi_domain.h>
#include <sbi/sbi_hartmask.h>
#include <sbi/sbi_hsm.h>
@@ -243,6 +244,99 @@ static int sanitize_domain(const struct sbi_platform *plat,
return 0;
}
+void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
+{
+ u32 i, k;
+ unsigned long rstart, rend;
+ struct sbi_domain_memregion *reg;
+
+ sbi_printf("Domain%d Name %s: %s\n",
+ dom->index, suffix, dom->name);
+
+ sbi_printf("Domain%d Boot HART %s: %d\n",
+ dom->index, suffix, dom->boot_hartid);
+
+ k = 0;
+ sbi_printf("Domain%d HARTs %s: ", dom->index, suffix);
+ sbi_hartmask_for_each_hart(i, dom->possible_harts)
+ sbi_printf("%s%d%s", (k++) ? "," : "",
+ i, sbi_domain_is_assigned_hart(dom, i) ? "*" : "");
+ sbi_printf("\n");
+
+ i = 0;
+ sbi_domain_for_each_memregion(dom, reg) {
+ rstart = reg->base;
+ rend = (reg->order < __riscv_xlen) ?
+ rstart + ((1UL << reg->order) - 1) : -1UL;
+
+#if __riscv_xlen == 32
+ sbi_printf("Domain%d Region%02d %s: 0x%08lx-0x%08lx ",
+#else
+ sbi_printf("Domain%d Region%02d %s: 0x%016lx-0x%016lx ",
+#endif
+ dom->index, i, suffix, rstart, rend);
+
+ k = 0;
+ if (reg->flags & SBI_DOMAIN_MEMREGION_MMODE)
+ sbi_printf("%cM", (k++) ? ',' : '(');
+ if (reg->flags & SBI_DOMAIN_MEMREGION_MMIO)
+ sbi_printf("%cI", (k++) ? ',' : '(');
+ if (reg->flags & SBI_DOMAIN_MEMREGION_READABLE)
+ sbi_printf("%cR", (k++) ? ',' : '(');
+ if (reg->flags & SBI_DOMAIN_MEMREGION_WRITEABLE)
+ sbi_printf("%cW", (k++) ? ',' : '(');
+ if (reg->flags & SBI_DOMAIN_MEMREGION_EXECUTABLE)
+ sbi_printf("%cX", (k++) ? ',' : '(');
+ sbi_printf("%s\n", (k++) ? ")" : "()");
+
+ i++;
+ }
+
+#if __riscv_xlen == 32
+ sbi_printf("Domain%d Next Address%s: 0x%08lx\n",
+#else
+ sbi_printf("Domain%d Next Address%s: 0x%016lx\n",
+#endif
+ dom->index, suffix, dom->next_addr);
+
+#if __riscv_xlen == 32
+ sbi_printf("Domain%d Next Arg1 %s: 0x%08lx\n",
+#else
+ sbi_printf("Domain%d Next Arg1 %s: 0x%016lx\n",
+#endif
+ dom->index, suffix, dom->next_arg1);
+
+ sbi_printf("Domain%d Next Mode %s: ", dom->index, suffix);
+ switch (dom->next_mode) {
+ case PRV_M:
+ sbi_printf("M-mode\n");
+ break;
+ case PRV_S:
+ sbi_printf("S-mode\n");
+ break;
+ case PRV_U:
+ sbi_printf("U-mode\n");
+ break;
+ default:
+ sbi_printf("Unknown\n");
+ break;
+ };
+
+ sbi_printf("Domain%d SysReset %s: %s\n",
+ dom->index, suffix, (dom->system_reset_allowed) ? "yes" : "no");
+}
+
+void sbi_domain_dump_all(const char *suffix)
+{
+ u32 i;
+ const struct sbi_domain *dom;
+
+ sbi_domain_for_each(i, dom) {
+ sbi_domain_dump(dom, suffix);
+ sbi_printf("\n");
+ }
+}
+
int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid)
{
int rc;
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index 1871a1e..ff18c9d 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -123,18 +123,23 @@ static int delegate_traps(struct sbi_scratch *scratch)
return 0;
}
-void sbi_hart_delegation_dump(struct sbi_scratch *scratch)
+void sbi_hart_delegation_dump(struct sbi_scratch *scratch,
+ const char *prefix, const char *suffix)
{
if (!misa_extension('S'))
/* No delegation possible as mideleg does not exist*/
return;
#if __riscv_xlen == 32
- sbi_printf("MIDELEG : 0x%08lx\n", csr_read(CSR_MIDELEG));
- sbi_printf("MEDELEG : 0x%08lx\n", csr_read(CSR_MEDELEG));
+ sbi_printf("%sMIDELEG%s: 0x%08lx\n",
+ prefix, suffix, csr_read(CSR_MIDELEG));
+ sbi_printf("%sMEDELEG%s: 0x%08lx\n",
+ prefix, suffix, csr_read(CSR_MEDELEG));
#else
- sbi_printf("MIDELEG : 0x%016lx\n", csr_read(CSR_MIDELEG));
- sbi_printf("MEDELEG : 0x%016lx\n", csr_read(CSR_MEDELEG));
+ sbi_printf("%sMIDELEG%s: 0x%016lx\n",
+ prefix, suffix, csr_read(CSR_MIDELEG));
+ sbi_printf("%sMEDELEG%s: 0x%016lx\n",
+ prefix, suffix, csr_read(CSR_MEDELEG));
#endif
}
@@ -154,35 +159,6 @@ unsigned int sbi_hart_pmp_count(struct sbi_scratch *scratch)
return hfeatures->pmp_count;
}
-void sbi_hart_pmp_dump(struct sbi_scratch *scratch)
-{
- unsigned long prot, addr, size, log2size;
- unsigned int i, pmp_count;
-
- pmp_count = sbi_hart_pmp_count(scratch);
- for (i = 0; i < pmp_count; i++) {
- pmp_get(i, &prot, &addr, &log2size);
- if (!(prot & PMP_A))
- continue;
- size = (log2size < __riscv_xlen) ? 1UL << log2size : 0;
-#if __riscv_xlen == 32
- sbi_printf("PMP%d : 0x%08lx-0x%08lx (A",
-#else
- sbi_printf("PMP%d : 0x%016lx-0x%016lx (A",
-#endif
- i, addr, addr + size - 1);
- if (prot & PMP_L)
- sbi_printf(",L");
- if (prot & PMP_R)
- sbi_printf(",R");
- if (prot & PMP_W)
- sbi_printf(",W");
- if (prot & PMP_X)
- sbi_printf(",X");
- sbi_printf(")\n");
- }
-}
-
int sbi_hart_pmp_configure(struct sbi_scratch *scratch)
{
struct sbi_domain_memregion *reg;
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 406cb3f..5151d36 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -39,6 +39,7 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid)
{
int xlen;
char str[128];
+ const struct sbi_domain *dom = sbi_domain_thishart_ptr();
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
#ifdef OPENSBI_VERSION_GIT
@@ -64,27 +65,29 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid)
sbi_printf("Platform HART Count : %u\n",
sbi_platform_hart_count(plat));
- /* Boot HART details */
- sbi_printf("Boot HART ID : %u\n", hartid);
- misa_string(xlen, str, sizeof(str));
- sbi_printf("Boot HART ISA : %s\n", str);
- sbi_hart_get_features_str(scratch, str, sizeof(str));
- sbi_printf("BOOT HART Features : %s\n", str);
- sbi_printf("BOOT HART PMP Count : %d\n", sbi_hart_pmp_count(scratch));
- sbi_printf("BOOT HART MHPM Count: %d\n", sbi_hart_mhpm_count(scratch));
-
/* Firmware details */
sbi_printf("Firmware Base : 0x%lx\n", scratch->fw_start);
sbi_printf("Firmware Size : %d KB\n",
(u32)(scratch->fw_size / 1024));
- /* Generic details */
+ /* SBI details */
sbi_printf("Runtime SBI Version : %d.%d\n",
sbi_ecall_version_major(), sbi_ecall_version_minor());
sbi_printf("\n");
- sbi_hart_delegation_dump(scratch);
- sbi_hart_pmp_dump(scratch);
+ /* Domain details */
+ sbi_domain_dump_all("");
+
+ /* Boot HART details */
+ sbi_printf("Boot HART ID : %u\n", hartid);
+ sbi_printf("Boot HART Domain : %s\n", dom->name);
+ misa_string(xlen, str, sizeof(str));
+ sbi_printf("Boot HART ISA : %s\n", str);
+ sbi_hart_get_features_str(scratch, str, sizeof(str));
+ sbi_printf("Boot HART Features : %s\n", str);
+ sbi_printf("Boot HART PMP Count : %d\n", sbi_hart_pmp_count(scratch));
+ sbi_printf("Boot HART MHPM Count: %d\n", sbi_hart_mhpm_count(scratch));
+ sbi_hart_delegation_dump(scratch, "Boot HART ", " ");
}
static spinlock_t coldboot_lock = SPIN_LOCK_INITIALIZER;