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