Re: git: f1e18f331923 - main - riscv: Exclude OpenSBI memory regions when booting with EFI
Date: Mon, 21 Apr 2025 17:56:13 UTC
On 16 Apr 2025, at 15:30, Jessica Clarke <jrtc27@FreeBSD.org> wrote:
>
> On 16 Apr 2025, at 15:21, Bojan Novković <bnovkov@FreeBSD.org> wrote:
>>
>> The branch main has been updated by bnovkov:
>>
>> URL: https://cgit.FreeBSD.org/src/commit/?id=f1e18f331923041980149fef46cdb2736e61debb
>>
>> commit f1e18f331923041980149fef46cdb2736e61debb
>> Author: Bojan Novković <bnovkov@FreeBSD.org>
>> AuthorDate: 2025-04-15 16:28:05 +0000
>> Commit: Bojan Novković <bnovkov@FreeBSD.org>
>> CommitDate: 2025-04-16 14:20:13 +0000
>>
>> riscv: Exclude OpenSBI memory regions when booting with EFI
>>
>> OpenSBI uses the first PMP entry to prevent buggy supervisor
>> software from overwriting the firmware [1]. However, this
>> region may not be properly marked as reserved in the EFI map, leading
>> to an access violation exception whenever the kernel
>> attempts to write to a page from that region.
>>
>> Fix this by preemptively excluding first EFI memory map entry
>> if it is marked as "BootServicesData".
>>
>> [1] https://github.com/riscv-non-isa/riscv-sbi-doc/pull/37
>>
>> Reported by: tuexen
>> Tested by: tuexen
>> Fixes: a2e2178402af
>> Reviewed by: imp, jrtc27
>
> No I didn’t, I left a comment saying I didn’t like the concept.
>
>> Differential Revision: https://reviews.freebsd.org/D49839
>> ---
>> sys/riscv/riscv/machdep.c | 32 ++++++++++++++++++++++++++++++--
>> 1 file changed, 30 insertions(+), 2 deletions(-)
>>
>> diff --git a/sys/riscv/riscv/machdep.c b/sys/riscv/riscv/machdep.c
>> index 516dbde5ffaa..f253bc9a853b 100644
>> --- a/sys/riscv/riscv/machdep.c
>> +++ b/sys/riscv/riscv/machdep.c
>> @@ -541,6 +541,22 @@ fdt_physmem_exclude_region_cb(const struct mem_region *mr, void *arg __unused)
>> }
>> #endif
>>
>> +static void
>> +efi_exclude_sbi_pmp_cb(struct efi_md *p, void *argp)
>> +{
>> + bool *first = (bool *)argp;
>> +
>> + if (!*first)
>> + return;
>> +
>> + *first = false;
>> + if (p->md_type == EFI_MD_TYPE_BS_DATA) {
>> + physmem_exclude_region(p->md_phys,
>> + min(p->md_pages * EFI_PAGE_SIZE, L2_SIZE),
>> + EXFLAG_NOALLOC);
>
> Doesn’t this need EXFLAG_NODUMP like the FDT case?
Ping.
Jess