mirror of
https://github.com/CTCaer/switch-l4t-atf.git
synced 2024-12-03 16:10:51 +00:00
43cbaf0615
This commit introduces a new type (mem_region_t) used to describe memory regions and it adds two utility functions: - clear_mem_regions: This function clears (write 0) to a set of regions described with an array of mem_region_t. - mem_region_in_array_chk This function checks if a region is covered by some of the regions described with an array of mem_region_t. Change-Id: I12ce549f5e81dd15ac0981645f6e08ee7c120811 Signed-off-by: Roberto Vargas <roberto.vargas@arm.com>
79 lines
2.1 KiB
C
79 lines
2.1 KiB
C
/*
|
|
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <utils.h>
|
|
|
|
/*
|
|
* All the regions defined in mem_region_t must have the following properties
|
|
*
|
|
* - Any contiguous regions must be merged into a single entry.
|
|
* - The number of bytes of each region must be greater than zero.
|
|
* - The calculation of the highest address within the region (base + nbytes-1)
|
|
* doesn't produce an overflow.
|
|
*
|
|
* These conditions must be fulfilled by the caller and they aren't checked
|
|
* at runtime.
|
|
*/
|
|
|
|
/*
|
|
* zero_normalmem all the regions defined in tbl.
|
|
* It assumes that MMU is enabled and the memory is Normal memory.
|
|
* tbl must be a valid pointer to a memory mem_region_t array,
|
|
* nregions is the size of the array.
|
|
*/
|
|
void clear_mem_regions(mem_region_t *tbl, size_t nregions)
|
|
{
|
|
size_t i;
|
|
|
|
assert(tbl);
|
|
assert(nregions > 0);
|
|
|
|
for (i = 0; i < nregions; i++) {
|
|
assert(tbl->nbytes > 0);
|
|
assert(!check_uptr_overflow(tbl->base, tbl->nbytes-1));
|
|
zero_normalmem((void *) (tbl->base), tbl->nbytes);
|
|
tbl++;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* This function checks that a region (addr + nbytes-1) of memory is totally
|
|
* covered by one of the regions defined in tbl.
|
|
* tbl must be a valid pointer to a memory mem_region_t array, nregions
|
|
* is the size of the array and the region described by addr and nbytes must
|
|
* not generate an overflow.
|
|
* Returns:
|
|
* -1 means that the region is not covered by any of the regions
|
|
* described in tbl.
|
|
* 0 the region (addr + nbytes-1) is covered by one of the regions described
|
|
* in tbl
|
|
*/
|
|
int mem_region_in_array_chk(mem_region_t *tbl, size_t nregions,
|
|
uintptr_t addr, size_t nbytes)
|
|
{
|
|
uintptr_t region_start, region_end, start, end;
|
|
size_t i;
|
|
|
|
assert(tbl);
|
|
assert(nbytes > 0);
|
|
assert(!check_uptr_overflow(addr, nbytes-1));
|
|
|
|
region_start = addr;
|
|
region_end = addr + (nbytes - 1);
|
|
for (i = 0; i < nregions; i++) {
|
|
assert(tbl->nbytes > 0);
|
|
assert(!check_uptr_overflow(tbl->base, tbl->nbytes-1));
|
|
start = tbl->base;
|
|
end = start + (tbl->nbytes - 1);
|
|
if (region_start >= start && region_end <= end)
|
|
return 0;
|
|
tbl++;
|
|
}
|
|
|
|
return -1;
|
|
}
|