forked from Imagelibrary/rtems
bsps/aarch64/mmu: Align dynamically mapped blocks
Dynamically mapped blocks must be aligned to the MMU page size just like startup-configured blocks. This was not being enforced and could cause a hang with bad input.
This commit is contained in:
committed by
Kinsey Moore
parent
a616d26d6d
commit
85ccfe24bf
@@ -48,12 +48,18 @@ rtems_status_code aarch64_mmu_map(
|
|||||||
{
|
{
|
||||||
rtems_status_code sc;
|
rtems_status_code sc;
|
||||||
ISR_Level level;
|
ISR_Level level;
|
||||||
|
uint64_t mapping_base;
|
||||||
|
uint64_t mapping_size;
|
||||||
uint64_t max_mappable = 1LLU << aarch64_mmu_get_cpu_pa_bits();
|
uint64_t max_mappable = 1LLU << aarch64_mmu_get_cpu_pa_bits();
|
||||||
|
|
||||||
if ( addr >= max_mappable || (addr + size) > max_mappable ) {
|
if ( addr >= max_mappable || (addr + size) > max_mappable ) {
|
||||||
return RTEMS_INVALID_ADDRESS;
|
return RTEMS_INVALID_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Adjust the address and size to multiples of the page table size */
|
||||||
|
mapping_base = RTEMS_ALIGN_DOWN(addr, MMU_PAGE_SIZE);
|
||||||
|
mapping_size = RTEMS_ALIGN_UP(size + addr - mapping_base, MMU_PAGE_SIZE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable interrupts so they don't run while the MMU tables are being
|
* Disable interrupts so they don't run while the MMU tables are being
|
||||||
* modified.
|
* modified.
|
||||||
@@ -63,8 +69,8 @@ rtems_status_code aarch64_mmu_map(
|
|||||||
sc = aarch64_mmu_map_block(
|
sc = aarch64_mmu_map_block(
|
||||||
(uint64_t *) bsp_translation_table_base,
|
(uint64_t *) bsp_translation_table_base,
|
||||||
0x0,
|
0x0,
|
||||||
addr,
|
mapping_base,
|
||||||
size,
|
mapping_size,
|
||||||
-1,
|
-1,
|
||||||
flags
|
flags
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user