esp32s2: IRAM/DRAM memory protection
* new mem_prot API * mem_prot on & locked by default (see Kconfig) * feature activated in start_cpu0_default() JIRA IDF-1355
This commit is contained in:
@@ -29,7 +29,7 @@ extern soc_reserved_region_t soc_reserved_memory_region_end;
|
||||
static size_t s_get_num_reserved_regions(void)
|
||||
{
|
||||
return ( &soc_reserved_memory_region_end
|
||||
- &soc_reserved_memory_region_start );
|
||||
- &soc_reserved_memory_region_start );
|
||||
}
|
||||
|
||||
size_t soc_get_available_memory_region_max_count(void)
|
||||
@@ -63,20 +63,19 @@ static void s_prepare_reserved_regions(soc_reserved_region_t *reserved, size_t c
|
||||
&soc_reserved_memory_region_start,
|
||||
&soc_reserved_memory_region_end);
|
||||
ESP_EARLY_LOGD(TAG, "Checking %d reserved memory ranges:", count);
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
ESP_EARLY_LOGD(TAG, "Reserved memory range 0x%08x - 0x%08x",
|
||||
reserved[i].start, reserved[i].end);
|
||||
reserved[i].start = reserved[i].start & ~3; /* expand all reserved areas to word boundaries */
|
||||
reserved[i].end = (reserved[i].end + 3) & ~3;
|
||||
assert(reserved[i].start < reserved[i].end);
|
||||
if (i < count - 1) {
|
||||
assert(reserved[i+1].start > reserved[i].start);
|
||||
if (reserved[i].end > reserved[i+1].start) {
|
||||
assert(reserved[i + 1].start > reserved[i].start);
|
||||
if (reserved[i].end > reserved[i + 1].start) {
|
||||
ESP_EARLY_LOGE(TAG, "SOC_RESERVE_MEMORY_REGION region range " \
|
||||
"0x%08x - 0x%08x overlaps with 0x%08x - 0x%08x",
|
||||
reserved[i].start, reserved[i].end, reserved[i+1].start,
|
||||
reserved[i+1].end);
|
||||
reserved[i].start, reserved[i].end, reserved[i + 1].start,
|
||||
reserved[i + 1].end);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
@@ -101,7 +100,7 @@ size_t soc_get_available_memory_regions(soc_memory_region_t *regions)
|
||||
region, and then copy them to an out_region once trimmed
|
||||
*/
|
||||
ESP_EARLY_LOGD(TAG, "Building list of available memory regions:");
|
||||
while(in_region != in_regions + soc_memory_region_count) {
|
||||
while (in_region != in_regions + soc_memory_region_count) {
|
||||
soc_memory_region_t in = *in_region;
|
||||
ESP_EARLY_LOGV(TAG, "Examining memory region 0x%08x - 0x%08x", in.start, in.start + in.size);
|
||||
intptr_t in_start = in.start;
|
||||
@@ -113,21 +112,18 @@ size_t soc_get_available_memory_regions(soc_memory_region_t *regions)
|
||||
if (reserved[i].end <= in_start) {
|
||||
/* reserved region ends before 'in' starts */
|
||||
continue;
|
||||
}
|
||||
else if (reserved[i].start >= in_end) {
|
||||
} else if (reserved[i].start >= in_end) {
|
||||
/* reserved region starts after 'in' ends */
|
||||
break;
|
||||
}
|
||||
else if (reserved[i].start <= in_start &&
|
||||
reserved[i].end >= in_end) { /* reserved covers all of 'in' */
|
||||
} else if (reserved[i].start <= in_start &&
|
||||
reserved[i].end >= in_end) { /* reserved covers all of 'in' */
|
||||
ESP_EARLY_LOGV(TAG, "Region 0x%08x - 0x%08x inside of reserved 0x%08x - 0x%08x",
|
||||
in_start, in_end, reserved[i].start, reserved[i].end);
|
||||
/* skip 'in' entirely */
|
||||
copy_in_to_out = false;
|
||||
break;
|
||||
}
|
||||
else if (in_start < reserved[i].start &&
|
||||
in_end > reserved[i].end) { /* reserved contained inside 'in', need to "hole punch" */
|
||||
} else if (in_start < reserved[i].start &&
|
||||
in_end > reserved[i].end) { /* reserved contained inside 'in', need to "hole punch" */
|
||||
ESP_EARLY_LOGV(TAG, "Region 0x%08x - 0x%08x contains reserved 0x%08x - 0x%08x",
|
||||
in_start, in_end, reserved[i].start, reserved[i].end);
|
||||
assert(in_start < reserved[i].start);
|
||||
@@ -145,15 +141,13 @@ size_t soc_get_available_memory_regions(soc_memory_region_t *regions)
|
||||
/* add first region, then re-run while loop with the updated in_region */
|
||||
move_to_next = false;
|
||||
break;
|
||||
}
|
||||
else if (reserved[i].start <= in_start) { /* reserved overlaps start of 'in' */
|
||||
} else if (reserved[i].start <= in_start) { /* reserved overlaps start of 'in' */
|
||||
ESP_EARLY_LOGV(TAG, "Start of region 0x%08x - 0x%08x overlaps reserved 0x%08x - 0x%08x",
|
||||
in_start, in_end, reserved[i].start, reserved[i].end);
|
||||
in.start = reserved[i].end;
|
||||
in_start = in.start;
|
||||
in.size = in_end - in_start;
|
||||
}
|
||||
else { /* reserved overlaps end of 'in' */
|
||||
} else { /* reserved overlaps end of 'in' */
|
||||
ESP_EARLY_LOGV(TAG, "End of region 0x%08x - 0x%08x overlaps reserved 0x%08x - 0x%08x",
|
||||
in_start, in_end, reserved[i].start, reserved[i].end);
|
||||
in_end = reserved[i].start;
|
||||
@@ -161,6 +155,11 @@ size_t soc_get_available_memory_regions(soc_memory_region_t *regions)
|
||||
}
|
||||
}
|
||||
|
||||
/* ignore regions smaller than 16B */
|
||||
if (in.size <= 16) {
|
||||
copy_in_to_out = false;
|
||||
}
|
||||
|
||||
if (copy_in_to_out) {
|
||||
ESP_EARLY_LOGD(TAG, "Available memory region 0x%08x - 0x%08x", in.start, in.start + in.size);
|
||||
*out_region++ = in;
|
||||
|
||||
Reference in New Issue
Block a user