/* * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include /* * 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; }