diff mbox series

[v4,15/16] lib: sbi: Display domain details in boot prints

Message ID 20201020093930.2551352-16-anup.patel@wdc.com
State Accepted
Headers show
Series OpenSBI domain support | expand

Commit Message

Anup Patel Oct. 20, 2020, 9:39 a.m. UTC
We extend boot prints to display details of each domain. In the
process, we remove sbi_hart_pmp_dump() because it shows redundant
information which domain details already show.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
---
 include/sbi/sbi_domain.h |  6 +++
 include/sbi/sbi_hart.h   |  4 +-
 lib/sbi/sbi_domain.c     | 94 ++++++++++++++++++++++++++++++++++++++++
 lib/sbi/sbi_hart.c       | 44 +++++--------------
 lib/sbi/sbi_init.c       | 27 +++++++-----
 5 files changed, 127 insertions(+), 48 deletions(-)

Comments

Atish Patra Oct. 20, 2020, 8:49 p.m. UTC | #1
On Tue, Oct 20, 2020 at 2:46 AM Anup Patel <anup.patel@wdc.com> wrote:
>
> We extend boot prints to display details of each domain. In the
> process, we remove sbi_hart_pmp_dump() because it shows redundant
> information which domain details already show.
>
> Signed-off-by: Anup Patel <anup.patel@wdc.com>
> ---
>  include/sbi/sbi_domain.h |  6 +++
>  include/sbi/sbi_hart.h   |  4 +-
>  lib/sbi/sbi_domain.c     | 94 ++++++++++++++++++++++++++++++++++++++++
>  lib/sbi/sbi_hart.c       | 44 +++++--------------
>  lib/sbi/sbi_init.c       | 27 +++++++-----
>  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;
> --
> 2.25.1
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi


Reviewed-by: Atish Patra <atish.patra@wdc.com>
Anup Patel Oct. 21, 2020, 7:07 a.m. UTC | #2
> -----Original Message-----
> From: Atish Patra <atishp@atishpatra.org>
> Sent: 21 October 2020 02:20
> To: Anup Patel <Anup.Patel@wdc.com>
> Cc: Atish Patra <Atish.Patra@wdc.com>; Alistair Francis
> <Alistair.Francis@wdc.com>; Anup Patel <anup@brainfault.org>; OpenSBI
> <opensbi@lists.infradead.org>
> Subject: Re: [PATCH v4 15/16] lib: sbi: Display domain details in boot prints
> 
> On Tue, Oct 20, 2020 at 2:46 AM Anup Patel <anup.patel@wdc.com> wrote:
> >
> > We extend boot prints to display details of each domain. In the
> > process, we remove sbi_hart_pmp_dump() because it shows redundant
> > information which domain details already show.
> >
> > Signed-off-by: Anup Patel <anup.patel@wdc.com>
> > ---
> >  include/sbi/sbi_domain.h |  6 +++
> >  include/sbi/sbi_hart.h   |  4 +-
> >  lib/sbi/sbi_domain.c     | 94
> ++++++++++++++++++++++++++++++++++++++++
> >  lib/sbi/sbi_hart.c       | 44 +++++--------------
> >  lib/sbi/sbi_init.c       | 27 +++++++-----
> >  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;
> > --
> > 2.25.1
> >
> >
> > --
> > opensbi mailing list
> > opensbi@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/opensbi
> 
> 
> Reviewed-by: Atish Patra <atish.patra@wdc.com>
> 
> --
> Regards,
> Atish

Applied this patch to the riscv/opensbi repo

Regards,
Anup
diff mbox series

Patch

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;