You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.1 KiB
83 lines
2.1 KiB
/*
|
|
* Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
#include <common/debug.h>
|
|
#include <lib/utils_def.h>
|
|
#include <lib/xlat_tables/xlat_tables_defs.h>
|
|
#include <lib/xlat_tables/xlat_tables_v2.h>
|
|
#include "xlat_mpu_private.h"
|
|
|
|
#include <fvp_r_arch_helpers.h>
|
|
#include <platform_def.h>
|
|
|
|
#warning "xlat_mpu library is currently experimental and its API may change in future."
|
|
|
|
|
|
void xlat_mmap_print(__unused const mmap_region_t *mmap)
|
|
{
|
|
/* Empty */
|
|
}
|
|
|
|
#if LOG_LEVEL < LOG_LEVEL_VERBOSE
|
|
|
|
void xlat_tables_print(__unused xlat_ctx_t *ctx)
|
|
{
|
|
/* Empty */
|
|
}
|
|
|
|
#else /* if LOG_LEVEL >= LOG_LEVEL_VERBOSE */
|
|
|
|
static void xlat_tables_print_internal(__unused xlat_ctx_t *ctx)
|
|
{
|
|
int region_to_use = 0;
|
|
uintptr_t region_base;
|
|
size_t region_size;
|
|
uint64_t prenr_el2_value = 0U;
|
|
|
|
/*
|
|
* Keep track of how many invalid descriptors are counted in a row.
|
|
* Whenever multiple invalid descriptors are found, only the first one
|
|
* is printed, and a line is added to inform about how many descriptors
|
|
* have been omitted.
|
|
*/
|
|
|
|
/*
|
|
* TODO: Remove this WARN() and comment when these API calls are more
|
|
* completely implemented and tested!
|
|
*/
|
|
WARN("%s in this early version of xlat_mpu library may not produce reliable results!",
|
|
__func__);
|
|
|
|
/*
|
|
* Sequence through all regions and print those in-use (PRENR has an
|
|
* enable bit for each MPU region, 1 for in-use or 0 for unused):
|
|
*/
|
|
prenr_el2_value = read_prenr_el2();
|
|
for (region_to_use = 0; region_to_use < N_MPU_REGIONS;
|
|
region_to_use++) {
|
|
if (((prenr_el2_value >> region_to_use) & 1U) == 0U) {
|
|
continue;
|
|
}
|
|
region_base = read_prbar_el2() & PRBAR_PRLAR_ADDR_MASK;
|
|
region_size = read_prlar_el2() & PRBAR_PRLAR_ADDR_MASK;
|
|
printf("Address: 0x%llx, size: 0x%llx ",
|
|
(long long) region_base,
|
|
(long long) region_size);
|
|
}
|
|
}
|
|
|
|
void xlat_tables_print(__unused xlat_ctx_t *ctx)
|
|
{
|
|
xlat_tables_print_internal(ctx);
|
|
}
|
|
|
|
#endif /* LOG_LEVEL >= LOG_LEVEL_VERBOSE */
|
|
|