diff mbox series

lib: utils: Mark only the largest region as reserved in FDT

Message ID 20230127041923.112164-1-hchauhan@ventanamicro.com
State Accepted
Headers show
Series lib: utils: Mark only the largest region as reserved in FDT | expand

Commit Message

Himanshu Chauhan Jan. 27, 2023, 4:19 a.m. UTC
In commit 230278dcf, RX and RW regions were marked separately.
When the RW region grows (e.g. with more harts) and it isn't a
power-of-two, sbi_domain_memregion_init will upgrade the region
to the next power-of-two. This will make RX and RW both start
at the same base address, like so (with 64 harts):
Domain0 Region01 : 0x0000000080000000-0x000000008001ffff M: (R,X) S/U: ()
Domain0 Region02 : 0x0000000080000000-0x00000000800fffff M: (R,W) S/U: ()

This doesn't break the permission enforcement because of static
priorities in PMP but makes the kernel complain about the regions
overlapping each other. Like so:
[    0.000000] OF: reserved mem: OVERLAP DETECTED!
[    0.000000] mmode_resv0@80000000 (0x0000000080000000--0x0000000080020000) \
	overlaps with mmode_resv1@80000000 (0x0000000080000000--0x0000000080100000)

To fix this warning, among the multiple regions having same base
address but different sizes, add only the largest region as reserved
region during fdt fixup.

Fixes: 230278dcf (lib: sbi: Add separate entries for firmware RX and RW regions)

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
---
 lib/utils/fdt/fdt_fixup.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

Comments

Anup Patel Feb. 8, 2023, 5:47 a.m. UTC | #1
On Fri, Jan 27, 2023 at 9:49 AM Himanshu Chauhan
<hchauhan@ventanamicro.com> wrote:
>
> In commit 230278dcf, RX and RW regions were marked separately.
> When the RW region grows (e.g. with more harts) and it isn't a
> power-of-two, sbi_domain_memregion_init will upgrade the region
> to the next power-of-two. This will make RX and RW both start
> at the same base address, like so (with 64 harts):
> Domain0 Region01 : 0x0000000080000000-0x000000008001ffff M: (R,X) S/U: ()
> Domain0 Region02 : 0x0000000080000000-0x00000000800fffff M: (R,W) S/U: ()
>
> This doesn't break the permission enforcement because of static
> priorities in PMP but makes the kernel complain about the regions
> overlapping each other. Like so:
> [    0.000000] OF: reserved mem: OVERLAP DETECTED!
> [    0.000000] mmode_resv0@80000000 (0x0000000080000000--0x0000000080020000) \
>         overlaps with mmode_resv1@80000000 (0x0000000080000000--0x0000000080100000)
>
> To fix this warning, among the multiple regions having same base
> address but different sizes, add only the largest region as reserved
> region during fdt fixup.
>
> Fixes: 230278dcf (lib: sbi: Add separate entries for firmware RX and RW regions)
>
> Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>

Looks good to me.

Reviewed-by: Anup Patel <anup@brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/utils/fdt/fdt_fixup.c | 34 ++++++++++++++++++++++++++++++----
>  1 file changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
> index 42692cc..4085762 100644
> --- a/lib/utils/fdt/fdt_fixup.c
> +++ b/lib/utils/fdt/fdt_fixup.c
> @@ -1,3 +1,4 @@
> +
>  // SPDX-License-Identifier: BSD-2-Clause
>  /*
>   * fdt_fixup.c - Flat Device Tree parsing helper routines
> @@ -14,6 +15,7 @@
>  #include <sbi/sbi_hart.h>
>  #include <sbi/sbi_scratch.h>
>  #include <sbi/sbi_string.h>
> +#include <sbi/sbi_error.h>
>  #include <sbi_utils/fdt/fdt_fixup.h>
>  #include <sbi_utils/fdt/fdt_pmu.h>
>  #include <sbi_utils/fdt/fdt_helper.h>
> @@ -200,8 +202,10 @@ int fdt_reserved_memory_fixup(void *fdt)
>         struct sbi_domain_memregion *reg;
>         struct sbi_domain *dom = sbi_domain_thishart_ptr();
>         struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
> +       unsigned long filtered_base[PMP_COUNT] = { 0 };
> +       unsigned char filtered_order[PMP_COUNT] = { 0 };
>         unsigned long addr, size;
> -       int err, parent, i;
> +       int err, parent, i, j;
>         int na = fdt_address_cells(fdt, 0);
>         int ns = fdt_size_cells(fdt, 0);
>
> @@ -266,11 +270,33 @@ int fdt_reserved_memory_fixup(void *fdt)
>                 if (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE)
>                         continue;
>
> +               if (i > PMP_COUNT) {
> +                       sbi_printf("%s: Too many memory regions to fixup.\n",
> +                                  __func__);
> +                       return SBI_ENOSPC;
> +               }
> +
>                 addr = reg->base;
> -               size = 1UL << reg->order;
> -               fdt_resv_memory_update_node(fdt, addr, size, i, parent,
> -                       (sbi_hart_pmp_count(scratch)) ? false : true);
> +               for (j = 0; j < i; j++) {
> +                       if (addr == filtered_base[j]
> +                           && filtered_order[j] < reg->order) {
> +                               filtered_order[j] = reg->order;
> +                               goto next_entry;
> +                       }
> +               }
> +
> +               filtered_base[i] = reg->base;
> +               filtered_order[i] = reg->order;
>                 i++;
> +       next_entry:
> +       }
> +
> +       for (j = 0; j < i; j++) {
> +               addr = filtered_base[j];
> +               size = 1UL << filtered_order[j];
> +               fdt_resv_memory_update_node(fdt, addr, size, j, parent,
> +                                           (sbi_hart_pmp_count(scratch))
> +                                           ? false : true);
>         }
>
>         return 0;
> --
> 2.39.1
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
wangliu Feb. 17, 2023, 7:55 a.m. UTC | #2
Hi,
I am trying to generate a fw_payload.bin, but the mainline opensbi 
failed to compile.
I have retried the operation in the newly installed system environment, 
please do let me know if more info are to be provided.

This is my server information:
    $ uname -a
    Linux debian 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21) 
x86_64 GNU/Linux
    $ cat /etc/debian_version
    11.5

This is my operation:
    $ make     CROSS_COMPILE=riscv64-linux-gnu-     PLATFORM=generic 
FW_PAYLOAD_PATH=../u-boot/u-boot.bin

And this is my log:

Loaded configuration 
'/home/snail/opensbi/platform/generic/configs/defconfig'
Configuration saved to 
'/home/snail/opensbi/build/platform/generic/kconfig/.config'
  CPP-DEP   platform/generic/firmware/fw_payload.elf.dep
  CPP-DEP   platform/generic/firmware/fw_jump.elf.dep
  CPP-DEP   platform/generic/firmware/fw_dynamic.elf.dep
  CPP-DEP   platform/generic/firmware/payloads/test.elf.dep
  AS-DEP    platform/generic/firmware/fw_payload.dep
  AS-DEP    platform/generic/firmware/fw_jump.dep
  AS-DEP    platform/generic/firmware/fw_dynamic.dep
  AS-DEP    platform/generic/firmware/payloads/test_head.dep
  CC-DEP    platform/generic/firmware/payloads/test_main.dep
  MERGE-DEP platform/generic/firmware/payloads/test.dep
  AS-DEP    lib/sbi/sbi_expected_trap.dep
  CC-DEP    lib/sbi/sbi_unpriv.dep
  CC-DEP    lib/sbi/sbi_trap.dep
  CC-DEP    lib/sbi/sbi_tlb.dep
  ...

  ...

  ...

  CC        platform/generic/lib/utils/ipi/fdt_ipi_drivers.o
  CC        platform/generic/lib/utils/ipi/fdt_ipi_mswi.o
  CC        platform/generic/lib/utils/ipi/fdt_ipi_plicsw.o
  CC        platform/generic/lib/utils/i2c/i2c.o
  CC        platform/generic/lib/utils/i2c/fdt_i2c.o
  CARRAY    platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.c
  CC        platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.o
  CC        platform/generic/lib/utils/i2c/fdt_i2c_sifive.o
  CC        platform/generic/lib/utils/gpio/fdt_gpio.o
  CARRAY    platform/generic/lib/utils/gpio/fdt_gpio_drivers.c
  CC        platform/generic/lib/utils/gpio/fdt_gpio_drivers.o
  CC        platform/generic/lib/utils/gpio/fdt_gpio_sifive.o
  CC        platform/generic/lib/utils/gpio/gpio.o
  CC        platform/generic/lib/utils/fdt/fdt_domain.o
  CC        platform/generic/lib/utils/fdt/fdt_pmu.o
  CC        platform/generic/lib/utils/fdt/fdt_helper.o
  CC        platform/generic/lib/utils/fdt/fdt_fixup.o
/home/snail/opensbi/lib/utils/fdt/fdt_fixup.c: In function 
‘fdt_reserved_memory_fixup’:
/home/snail/opensbi/lib/utils/fdt/fdt_fixup.c:376:2: error: label at end 
of compound statement
   376 |  next_entry:
       |  ^~~~~~~~~~
make: *** [Makefile:569: 
/home/snail/opensbi/build/platform/generic/lib/utils/fdt/fdt_fixup.o] 
Error 1

The opensbi v1.2 version I have success to build.
I try to revert this commit code 
(https://github.com/riscv-software-src/opensbi/commit/199189bd1c172aab5a9733c0ffaaa14bbebb3323), 
then the code build successful.
Rahul Pathak Feb. 17, 2023, 9:15 a.m. UTC | #3
For me gcc does not beak, but clang does

Can you try with this -

diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
index 619e4f5cbaf7..f00f3d6c94b6 100644
--- a/lib/utils/fdt/fdt_fixup.c
+++ b/lib/utils/fdt/fdt_fixup.c
@@ -374,6 +374,7 @@ int fdt_reserved_memory_fixup(void *fdt)
  filtered_order[i] = reg->order;
  i++;
  next_entry:
+ {}
  }

  for (j = 0; j < i; j++) {

On Fri, Feb 17, 2023 at 1:27 PM wangliu <wangliu@iscas.ac.cn> wrote:
>
> Hi,
> I am trying to generate a fw_payload.bin, but the mainline opensbi
> failed to compile.
> I have retried the operation in the newly installed system environment,
> please do let me know if more info are to be provided.
>
> This is my server information:
>     $ uname -a
>     Linux debian 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21)
> x86_64 GNU/Linux
>     $ cat /etc/debian_version
>     11.5
>
> This is my operation:
>     $ make     CROSS_COMPILE=riscv64-linux-gnu-     PLATFORM=generic
> FW_PAYLOAD_PATH=../u-boot/u-boot.bin
>
> And this is my log:
>
> Loaded configuration
> '/home/snail/opensbi/platform/generic/configs/defconfig'
> Configuration saved to
> '/home/snail/opensbi/build/platform/generic/kconfig/.config'
>   CPP-DEP   platform/generic/firmware/fw_payload.elf.dep
>   CPP-DEP   platform/generic/firmware/fw_jump.elf.dep
>   CPP-DEP   platform/generic/firmware/fw_dynamic.elf.dep
>   CPP-DEP   platform/generic/firmware/payloads/test.elf.dep
>   AS-DEP    platform/generic/firmware/fw_payload.dep
>   AS-DEP    platform/generic/firmware/fw_jump.dep
>   AS-DEP    platform/generic/firmware/fw_dynamic.dep
>   AS-DEP    platform/generic/firmware/payloads/test_head.dep
>   CC-DEP    platform/generic/firmware/payloads/test_main.dep
>   MERGE-DEP platform/generic/firmware/payloads/test.dep
>   AS-DEP    lib/sbi/sbi_expected_trap.dep
>   CC-DEP    lib/sbi/sbi_unpriv.dep
>   CC-DEP    lib/sbi/sbi_trap.dep
>   CC-DEP    lib/sbi/sbi_tlb.dep
>   ...
>
>   ...
>
>   ...
>
>   CC        platform/generic/lib/utils/ipi/fdt_ipi_drivers.o
>   CC        platform/generic/lib/utils/ipi/fdt_ipi_mswi.o
>   CC        platform/generic/lib/utils/ipi/fdt_ipi_plicsw.o
>   CC        platform/generic/lib/utils/i2c/i2c.o
>   CC        platform/generic/lib/utils/i2c/fdt_i2c.o
>   CARRAY    platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.c
>   CC        platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.o
>   CC        platform/generic/lib/utils/i2c/fdt_i2c_sifive.o
>   CC        platform/generic/lib/utils/gpio/fdt_gpio.o
>   CARRAY    platform/generic/lib/utils/gpio/fdt_gpio_drivers.c
>   CC        platform/generic/lib/utils/gpio/fdt_gpio_drivers.o
>   CC        platform/generic/lib/utils/gpio/fdt_gpio_sifive.o
>   CC        platform/generic/lib/utils/gpio/gpio.o
>   CC        platform/generic/lib/utils/fdt/fdt_domain.o
>   CC        platform/generic/lib/utils/fdt/fdt_pmu.o
>   CC        platform/generic/lib/utils/fdt/fdt_helper.o
>   CC        platform/generic/lib/utils/fdt/fdt_fixup.o
> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c: In function
> ‘fdt_reserved_memory_fixup’:
> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c:376:2: error: label at end
> of compound statement
>    376 |  next_entry:
>        |  ^~~~~~~~~~
> make: *** [Makefile:569:
> /home/snail/opensbi/build/platform/generic/lib/utils/fdt/fdt_fixup.o]
> Error 1
>
> The opensbi v1.2 version I have success to build.
> I try to revert this commit code
> (https://github.com/riscv-software-src/opensbi/commit/199189bd1c172aab5a9733c0ffaaa14bbebb3323),
> then the code build successful.
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
wangliu Feb. 17, 2023, 9:29 a.m. UTC | #4
It works, the opensbi can build successful.
This is the diff:
$ git diff
diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
index 619e4f5..1e84361 100644
--- a/lib/utils/fdt/fdt_fixup.c
+++ b/lib/utils/fdt/fdt_fixup.c
@@ -374,6 +374,7 @@ int fdt_reserved_memory_fixup(void *fdt)
                 filtered_order[i] = reg->order;
                 i++;
         next_entry:
+       {}
         }

         for (j = 0; j < i; j++) {



在 2/17/23 17:15, Rahul Pathak 写道:
> For me gcc does not beak, but clang does
> 
> Can you try with this -
> 
> diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
> index 619e4f5cbaf7..f00f3d6c94b6 100644
> --- a/lib/utils/fdt/fdt_fixup.c
> +++ b/lib/utils/fdt/fdt_fixup.c
> @@ -374,6 +374,7 @@ int fdt_reserved_memory_fixup(void *fdt)
>    filtered_order[i] = reg->order;
>    i++;
>    next_entry:
> + {}
>    }
> 
>    for (j = 0; j < i; j++) {
> 
> On Fri, Feb 17, 2023 at 1:27 PM wangliu <wangliu@iscas.ac.cn> wrote:
>>
>> Hi,
>> I am trying to generate a fw_payload.bin, but the mainline opensbi
>> failed to compile.
>> I have retried the operation in the newly installed system environment,
>> please do let me know if more info are to be provided.
>>
>> This is my server information:
>>      $ uname -a
>>      Linux debian 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21)
>> x86_64 GNU/Linux
>>      $ cat /etc/debian_version
>>      11.5
>>
>> This is my operation:
>>      $ make     CROSS_COMPILE=riscv64-linux-gnu-     PLATFORM=generic
>> FW_PAYLOAD_PATH=../u-boot/u-boot.bin
>>
>> And this is my log:
>>
>> Loaded configuration
>> '/home/snail/opensbi/platform/generic/configs/defconfig'
>> Configuration saved to
>> '/home/snail/opensbi/build/platform/generic/kconfig/.config'
>>    CPP-DEP   platform/generic/firmware/fw_payload.elf.dep
>>    CPP-DEP   platform/generic/firmware/fw_jump.elf.dep
>>    CPP-DEP   platform/generic/firmware/fw_dynamic.elf.dep
>>    CPP-DEP   platform/generic/firmware/payloads/test.elf.dep
>>    AS-DEP    platform/generic/firmware/fw_payload.dep
>>    AS-DEP    platform/generic/firmware/fw_jump.dep
>>    AS-DEP    platform/generic/firmware/fw_dynamic.dep
>>    AS-DEP    platform/generic/firmware/payloads/test_head.dep
>>    CC-DEP    platform/generic/firmware/payloads/test_main.dep
>>    MERGE-DEP platform/generic/firmware/payloads/test.dep
>>    AS-DEP    lib/sbi/sbi_expected_trap.dep
>>    CC-DEP    lib/sbi/sbi_unpriv.dep
>>    CC-DEP    lib/sbi/sbi_trap.dep
>>    CC-DEP    lib/sbi/sbi_tlb.dep
>>    ...
>>
>>    ...
>>
>>    ...
>>
>>    CC        platform/generic/lib/utils/ipi/fdt_ipi_drivers.o
>>    CC        platform/generic/lib/utils/ipi/fdt_ipi_mswi.o
>>    CC        platform/generic/lib/utils/ipi/fdt_ipi_plicsw.o
>>    CC        platform/generic/lib/utils/i2c/i2c.o
>>    CC        platform/generic/lib/utils/i2c/fdt_i2c.o
>>    CARRAY    platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.c
>>    CC        platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.o
>>    CC        platform/generic/lib/utils/i2c/fdt_i2c_sifive.o
>>    CC        platform/generic/lib/utils/gpio/fdt_gpio.o
>>    CARRAY    platform/generic/lib/utils/gpio/fdt_gpio_drivers.c
>>    CC        platform/generic/lib/utils/gpio/fdt_gpio_drivers.o
>>    CC        platform/generic/lib/utils/gpio/fdt_gpio_sifive.o
>>    CC        platform/generic/lib/utils/gpio/gpio.o
>>    CC        platform/generic/lib/utils/fdt/fdt_domain.o
>>    CC        platform/generic/lib/utils/fdt/fdt_pmu.o
>>    CC        platform/generic/lib/utils/fdt/fdt_helper.o
>>    CC        platform/generic/lib/utils/fdt/fdt_fixup.o
>> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c: In function
>> ‘fdt_reserved_memory_fixup’:
>> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c:376:2: error: label at end
>> of compound statement
>>     376 |  next_entry:
>>         |  ^~~~~~~~~~
>> make: *** [Makefile:569:
>> /home/snail/opensbi/build/platform/generic/lib/utils/fdt/fdt_fixup.o]
>> Error 1
>>
>> The opensbi v1.2 version I have success to build.
>> I try to revert this commit code
>> (https://github.com/riscv-software-src/opensbi/commit/199189bd1c172aab5a9733c0ffaaa14bbebb3323),
>> then the code build successful.
>>
>>
>> --
>> opensbi mailing list
>> opensbi@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/opensbi
Rahul Pathak Feb. 17, 2023, 9:34 a.m. UTC | #5
I am though surprised that for me it's not happening with gcc.
What is the gcc version for you?

I have 12.2.1

On Fri, Feb 17, 2023 at 2:59 PM wangliu <wangliu@iscas.ac.cn> wrote:
>
> It works, the opensbi can build successful.
> This is the diff:
> $ git diff
> diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
> index 619e4f5..1e84361 100644
> --- a/lib/utils/fdt/fdt_fixup.c
> +++ b/lib/utils/fdt/fdt_fixup.c
> @@ -374,6 +374,7 @@ int fdt_reserved_memory_fixup(void *fdt)
>                  filtered_order[i] = reg->order;
>                  i++;
>          next_entry:
> +       {}
>          }
>
>          for (j = 0; j < i; j++) {
>
>
>
> 在 2/17/23 17:15, Rahul Pathak 写道:
> > For me gcc does not beak, but clang does
> >
> > Can you try with this -
> >
> > diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
> > index 619e4f5cbaf7..f00f3d6c94b6 100644
> > --- a/lib/utils/fdt/fdt_fixup.c
> > +++ b/lib/utils/fdt/fdt_fixup.c
> > @@ -374,6 +374,7 @@ int fdt_reserved_memory_fixup(void *fdt)
> >    filtered_order[i] = reg->order;
> >    i++;
> >    next_entry:
> > + {}
> >    }
> >
> >    for (j = 0; j < i; j++) {
> >
> > On Fri, Feb 17, 2023 at 1:27 PM wangliu <wangliu@iscas.ac.cn> wrote:
> >>
> >> Hi,
> >> I am trying to generate a fw_payload.bin, but the mainline opensbi
> >> failed to compile.
> >> I have retried the operation in the newly installed system environment,
> >> please do let me know if more info are to be provided.
> >>
> >> This is my server information:
> >>      $ uname -a
> >>      Linux debian 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21)
> >> x86_64 GNU/Linux
> >>      $ cat /etc/debian_version
> >>      11.5
> >>
> >> This is my operation:
> >>      $ make     CROSS_COMPILE=riscv64-linux-gnu-     PLATFORM=generic
> >> FW_PAYLOAD_PATH=../u-boot/u-boot.bin
> >>
> >> And this is my log:
> >>
> >> Loaded configuration
> >> '/home/snail/opensbi/platform/generic/configs/defconfig'
> >> Configuration saved to
> >> '/home/snail/opensbi/build/platform/generic/kconfig/.config'
> >>    CPP-DEP   platform/generic/firmware/fw_payload.elf.dep
> >>    CPP-DEP   platform/generic/firmware/fw_jump.elf.dep
> >>    CPP-DEP   platform/generic/firmware/fw_dynamic.elf.dep
> >>    CPP-DEP   platform/generic/firmware/payloads/test.elf.dep
> >>    AS-DEP    platform/generic/firmware/fw_payload.dep
> >>    AS-DEP    platform/generic/firmware/fw_jump.dep
> >>    AS-DEP    platform/generic/firmware/fw_dynamic.dep
> >>    AS-DEP    platform/generic/firmware/payloads/test_head.dep
> >>    CC-DEP    platform/generic/firmware/payloads/test_main.dep
> >>    MERGE-DEP platform/generic/firmware/payloads/test.dep
> >>    AS-DEP    lib/sbi/sbi_expected_trap.dep
> >>    CC-DEP    lib/sbi/sbi_unpriv.dep
> >>    CC-DEP    lib/sbi/sbi_trap.dep
> >>    CC-DEP    lib/sbi/sbi_tlb.dep
> >>    ...
> >>
> >>    ...
> >>
> >>    ...
> >>
> >>    CC        platform/generic/lib/utils/ipi/fdt_ipi_drivers.o
> >>    CC        platform/generic/lib/utils/ipi/fdt_ipi_mswi.o
> >>    CC        platform/generic/lib/utils/ipi/fdt_ipi_plicsw.o
> >>    CC        platform/generic/lib/utils/i2c/i2c.o
> >>    CC        platform/generic/lib/utils/i2c/fdt_i2c.o
> >>    CARRAY    platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.c
> >>    CC        platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.o
> >>    CC        platform/generic/lib/utils/i2c/fdt_i2c_sifive.o
> >>    CC        platform/generic/lib/utils/gpio/fdt_gpio.o
> >>    CARRAY    platform/generic/lib/utils/gpio/fdt_gpio_drivers.c
> >>    CC        platform/generic/lib/utils/gpio/fdt_gpio_drivers.o
> >>    CC        platform/generic/lib/utils/gpio/fdt_gpio_sifive.o
> >>    CC        platform/generic/lib/utils/gpio/gpio.o
> >>    CC        platform/generic/lib/utils/fdt/fdt_domain.o
> >>    CC        platform/generic/lib/utils/fdt/fdt_pmu.o
> >>    CC        platform/generic/lib/utils/fdt/fdt_helper.o
> >>    CC        platform/generic/lib/utils/fdt/fdt_fixup.o
> >> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c: In function
> >> ‘fdt_reserved_memory_fixup’:
> >> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c:376:2: error: label at end
> >> of compound statement
> >>     376 |  next_entry:
> >>         |  ^~~~~~~~~~
> >> make: *** [Makefile:569:
> >> /home/snail/opensbi/build/platform/generic/lib/utils/fdt/fdt_fixup.o]
> >> Error 1
> >>
> >> The opensbi v1.2 version I have success to build.
> >> I try to revert this commit code
> >> (https://github.com/riscv-software-src/opensbi/commit/199189bd1c172aab5a9733c0ffaaa14bbebb3323),
> >> then the code build successful.
> >>
> >>
> >> --
> >> opensbi mailing list
> >> opensbi@lists.infradead.org
> >> http://lists.infradead.org/mailman/listinfo/opensbi
>
wangliu Feb. 17, 2023, 9:38 a.m. UTC | #6
My server's gcc version is 10.2.1, it seems like too old.

$ gcc --version
gcc (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



在 2/17/23 17:34, Rahul Pathak 写道:
> I am though surprised that for me it's not happening with gcc.
> What is the gcc version for you?
> 
> I have 12.2.1
> 
> On Fri, Feb 17, 2023 at 2:59 PM wangliu <wangliu@iscas.ac.cn> wrote:
>>
>> It works, the opensbi can build successful.
>> This is the diff:
>> $ git diff
>> diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
>> index 619e4f5..1e84361 100644
>> --- a/lib/utils/fdt/fdt_fixup.c
>> +++ b/lib/utils/fdt/fdt_fixup.c
>> @@ -374,6 +374,7 @@ int fdt_reserved_memory_fixup(void *fdt)
>>                   filtered_order[i] = reg->order;
>>                   i++;
>>           next_entry:
>> +       {}
>>           }
>>
>>           for (j = 0; j < i; j++) {
>>
>>
>>
>> 在 2/17/23 17:15, Rahul Pathak 写道:
>>> For me gcc does not beak, but clang does
>>>
>>> Can you try with this -
>>>
>>> diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
>>> index 619e4f5cbaf7..f00f3d6c94b6 100644
>>> --- a/lib/utils/fdt/fdt_fixup.c
>>> +++ b/lib/utils/fdt/fdt_fixup.c
>>> @@ -374,6 +374,7 @@ int fdt_reserved_memory_fixup(void *fdt)
>>>     filtered_order[i] = reg->order;
>>>     i++;
>>>     next_entry:
>>> + {}
>>>     }
>>>
>>>     for (j = 0; j < i; j++) {
>>>
>>> On Fri, Feb 17, 2023 at 1:27 PM wangliu <wangliu@iscas.ac.cn> wrote:
>>>>
>>>> Hi,
>>>> I am trying to generate a fw_payload.bin, but the mainline opensbi
>>>> failed to compile.
>>>> I have retried the operation in the newly installed system environment,
>>>> please do let me know if more info are to be provided.
>>>>
>>>> This is my server information:
>>>>       $ uname -a
>>>>       Linux debian 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21)
>>>> x86_64 GNU/Linux
>>>>       $ cat /etc/debian_version
>>>>       11.5
>>>>
>>>> This is my operation:
>>>>       $ make     CROSS_COMPILE=riscv64-linux-gnu-     PLATFORM=generic
>>>> FW_PAYLOAD_PATH=../u-boot/u-boot.bin
>>>>
>>>> And this is my log:
>>>>
>>>> Loaded configuration
>>>> '/home/snail/opensbi/platform/generic/configs/defconfig'
>>>> Configuration saved to
>>>> '/home/snail/opensbi/build/platform/generic/kconfig/.config'
>>>>     CPP-DEP   platform/generic/firmware/fw_payload.elf.dep
>>>>     CPP-DEP   platform/generic/firmware/fw_jump.elf.dep
>>>>     CPP-DEP   platform/generic/firmware/fw_dynamic.elf.dep
>>>>     CPP-DEP   platform/generic/firmware/payloads/test.elf.dep
>>>>     AS-DEP    platform/generic/firmware/fw_payload.dep
>>>>     AS-DEP    platform/generic/firmware/fw_jump.dep
>>>>     AS-DEP    platform/generic/firmware/fw_dynamic.dep
>>>>     AS-DEP    platform/generic/firmware/payloads/test_head.dep
>>>>     CC-DEP    platform/generic/firmware/payloads/test_main.dep
>>>>     MERGE-DEP platform/generic/firmware/payloads/test.dep
>>>>     AS-DEP    lib/sbi/sbi_expected_trap.dep
>>>>     CC-DEP    lib/sbi/sbi_unpriv.dep
>>>>     CC-DEP    lib/sbi/sbi_trap.dep
>>>>     CC-DEP    lib/sbi/sbi_tlb.dep
>>>>     ...
>>>>
>>>>     ...
>>>>
>>>>     ...
>>>>
>>>>     CC        platform/generic/lib/utils/ipi/fdt_ipi_drivers.o
>>>>     CC        platform/generic/lib/utils/ipi/fdt_ipi_mswi.o
>>>>     CC        platform/generic/lib/utils/ipi/fdt_ipi_plicsw.o
>>>>     CC        platform/generic/lib/utils/i2c/i2c.o
>>>>     CC        platform/generic/lib/utils/i2c/fdt_i2c.o
>>>>     CARRAY    platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.c
>>>>     CC        platform/generic/lib/utils/i2c/fdt_i2c_adapter_drivers.o
>>>>     CC        platform/generic/lib/utils/i2c/fdt_i2c_sifive.o
>>>>     CC        platform/generic/lib/utils/gpio/fdt_gpio.o
>>>>     CARRAY    platform/generic/lib/utils/gpio/fdt_gpio_drivers.c
>>>>     CC        platform/generic/lib/utils/gpio/fdt_gpio_drivers.o
>>>>     CC        platform/generic/lib/utils/gpio/fdt_gpio_sifive.o
>>>>     CC        platform/generic/lib/utils/gpio/gpio.o
>>>>     CC        platform/generic/lib/utils/fdt/fdt_domain.o
>>>>     CC        platform/generic/lib/utils/fdt/fdt_pmu.o
>>>>     CC        platform/generic/lib/utils/fdt/fdt_helper.o
>>>>     CC        platform/generic/lib/utils/fdt/fdt_fixup.o
>>>> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c: In function
>>>> ‘fdt_reserved_memory_fixup’:
>>>> /home/snail/opensbi/lib/utils/fdt/fdt_fixup.c:376:2: error: label at end
>>>> of compound statement
>>>>      376 |  next_entry:
>>>>          |  ^~~~~~~~~~
>>>> make: *** [Makefile:569:
>>>> /home/snail/opensbi/build/platform/generic/lib/utils/fdt/fdt_fixup.o]
>>>> Error 1
>>>>
>>>> The opensbi v1.2 version I have success to build.
>>>> I try to revert this commit code
>>>> (https://github.com/riscv-software-src/opensbi/commit/199189bd1c172aab5a9733c0ffaaa14bbebb3323),
>>>> then the code build successful.
>>>>
>>>>
>>>> --
>>>> opensbi mailing list
>>>> opensbi@lists.infradead.org
>>>> http://lists.infradead.org/mailman/listinfo/opensbi
>>
diff mbox series

Patch

diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
index 42692cc..4085762 100644
--- a/lib/utils/fdt/fdt_fixup.c
+++ b/lib/utils/fdt/fdt_fixup.c
@@ -1,3 +1,4 @@ 
+
 // SPDX-License-Identifier: BSD-2-Clause
 /*
  * fdt_fixup.c - Flat Device Tree parsing helper routines
@@ -14,6 +15,7 @@ 
 #include <sbi/sbi_hart.h>
 #include <sbi/sbi_scratch.h>
 #include <sbi/sbi_string.h>
+#include <sbi/sbi_error.h>
 #include <sbi_utils/fdt/fdt_fixup.h>
 #include <sbi_utils/fdt/fdt_pmu.h>
 #include <sbi_utils/fdt/fdt_helper.h>
@@ -200,8 +202,10 @@  int fdt_reserved_memory_fixup(void *fdt)
 	struct sbi_domain_memregion *reg;
 	struct sbi_domain *dom = sbi_domain_thishart_ptr();
 	struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
+	unsigned long filtered_base[PMP_COUNT] = { 0 };
+	unsigned char filtered_order[PMP_COUNT] = { 0 };
 	unsigned long addr, size;
-	int err, parent, i;
+	int err, parent, i, j;
 	int na = fdt_address_cells(fdt, 0);
 	int ns = fdt_size_cells(fdt, 0);
 
@@ -266,11 +270,33 @@  int fdt_reserved_memory_fixup(void *fdt)
 		if (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE)
 			continue;
 
+		if (i > PMP_COUNT) {
+			sbi_printf("%s: Too many memory regions to fixup.\n",
+				   __func__);
+			return SBI_ENOSPC;
+		}
+ 
 		addr = reg->base;
-		size = 1UL << reg->order;
-		fdt_resv_memory_update_node(fdt, addr, size, i, parent,
-			(sbi_hart_pmp_count(scratch)) ? false : true);
+		for (j = 0; j < i; j++) {
+			if (addr == filtered_base[j]
+			    && filtered_order[j] < reg->order) {
+				filtered_order[j] = reg->order;
+				goto next_entry;
+			}
+		}
+
+		filtered_base[i] = reg->base;
+		filtered_order[i] = reg->order;
 		i++;
+	next_entry:
+	}
+
+	for (j = 0; j < i; j++) {
+		addr = filtered_base[j];
+		size = 1UL << filtered_order[j];
+		fdt_resv_memory_update_node(fdt, addr, size, j, parent,
+					    (sbi_hart_pmp_count(scratch))
+					    ? false : true);
 	}
 
 	return 0;