[PATCH 11/19] mmu: introduce pbl_remap_range()

Ahmad Fatoum a.fatoum at pengutronix.de
Tue Jan 6 00:50:04 PST 2026


On 1/5/26 13:15, Ahmad Fatoum wrote:
> On 1/5/26 12:26 PM, Sascha Hauer wrote:
>> Add PBL-specific memory remapping function that always uses page-wise
>> mapping (ARCH_MAP_FLAG_PAGEWISE) for fine-grained permissions on
>> adjacent ELF segments with different protection requirements.
>>
>> Wraps arch-specific __arch_remap_range() for ARMv7 (4KB pages) and
>> ARMv8 (page tables with BBM). Needed for ELF segment permission setup.
>>
>> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> 
> Reviewed-by: Ahmad Fatoum <a.fatoum at pengutronix.de>


Hmm, a question: Why do we need to preemptively break up pages?
Doesn't normal remapping do that already? My understanding was
that we only did it here to allow remapping while executing from
it, but in the PBL ELF loader we are not executing from there,
so there should not be an issue.

Thanks,
Ahmad

> 
>> ---
>>  arch/arm/cpu/mmu_32.c | 7 +++++++
>>  arch/arm/cpu/mmu_64.c | 8 ++++++++
>>  include/mmu.h         | 3 +++
>>  3 files changed, 18 insertions(+)
>>
>> diff --git a/arch/arm/cpu/mmu_32.c b/arch/arm/cpu/mmu_32.c
>> index 97c7107290ce95ddb21a322a5d0e74f3d324c528..86a55d165ba3cec5154c345a1a3a9cb959f0996f 100644
>> --- a/arch/arm/cpu/mmu_32.c
>> +++ b/arch/arm/cpu/mmu_32.c
>> @@ -435,6 +435,13 @@ static void early_remap_range(u32 addr, size_t size, maptype_t map_type)
>>  	__arch_remap_range((void *)addr, addr, size, map_type);
>>  }
>>  
>> +void pbl_remap_range(void *virt_addr, phys_addr_t phys_addr, size_t size,
>> +		     maptype_t map_type)
>> +{
>> +	__arch_remap_range(virt_addr, phys_addr, size,
>> +			   map_type | ARCH_MAP_FLAG_PAGEWISE);
>> +}
>> +
>>  static bool pte_is_cacheable(uint32_t pte, int level)
>>  {
>>  	return	(level == 2 && (pte & PTE_CACHEABLE)) ||
>> diff --git a/arch/arm/cpu/mmu_64.c b/arch/arm/cpu/mmu_64.c
>> index afb3d2d7efd0bc7ecde1177d1544f54d751b5dc1..63faaa46703697e527eae766392e7ea7ae186b3d 100644
>> --- a/arch/arm/cpu/mmu_64.c
>> +++ b/arch/arm/cpu/mmu_64.c
>> @@ -282,6 +282,14 @@ static void early_remap_range(uint64_t addr, size_t size, maptype_t map_type)
>>  	__arch_remap_range(addr, addr, size, map_type, false);
>>  }
>>  
>> +void pbl_remap_range(void *virt_addr, phys_addr_t phys_addr, size_t size,
>> +		     maptype_t map_type)
>> +{
>> +	__arch_remap_range((uint64_t)virt_addr, phys_addr,
>> +			   (uint64_t)size, map_type | ARCH_MAP_FLAG_PAGEWISE,
>> +			   true);
>> +}
>> +
>>  int arch_remap_range(void *virt_addr, phys_addr_t phys_addr, size_t size, maptype_t map_type)
>>  {
>>  	map_type = arm_mmu_maybe_skip_permissions(map_type);
>> diff --git a/include/mmu.h b/include/mmu.h
>> index 53603b7956c229b4c715c57b19d0398931eb2d6b..37df7b482e1d83e94e61997db6cf9834d8cf7f3c 100644
>> --- a/include/mmu.h
>> +++ b/include/mmu.h
>> @@ -64,6 +64,9 @@ static inline bool arch_can_remap(void)
>>  }
>>  #endif
>>  
>> +void pbl_remap_range(void *virt_addr, phys_addr_t phys_addr, size_t size,
>> +		     maptype_t map_type);
>> +
>>  static inline int remap_range(void *start, size_t size, maptype_t map_type)
>>  {
>>  	return arch_remap_range(start, virt_to_phys(start), size, map_type);
>>
> 


-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list