mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 14:25:44 +00:00
Add fdt_add_reserved_memory() helper function
If a firmware component like TF-A reserves special memory regions for its own or secure payload services, it should announce the location and size of those regions to the non-secure world. This will avoid disappointment when some rich OS tries to acccess this memory, which will likely end in a crash. The traditional way of advertising reserved memory using device tree is using the special memreserve feature of the device tree blob (DTB). However by definition those regions mentioned there do not prevent the rich OS to map this memory, which may lead to speculative accesses to this memory and hence spurious bus errors. A safer way of carving out memory is to use the /reserved-memory node as part of the normal DT structure. Besides being easier to setup, this also defines an explicit "no-map" property to signify the secure-only nature of certain memory regions, which avoids the rich OS to accidentally step on it. Add a helper function to allow platform ports to easily add a region. Change-Id: I2b92676cf48fd3bdacda05b5c6b1c7952ebed68c Signed-off-by: Andre Przywara <andre.przywara@arm.com>
This commit is contained in:
parent
f240728b76
commit
3ef45dda88
2 changed files with 32 additions and 0 deletions
|
@ -9,6 +9,9 @@
|
||||||
* payloads like BL32 and BL33 (and further down the boot chain).
|
* payloads like BL32 and BL33 (and further down the boot chain).
|
||||||
* This allows to easily add PSCI nodes, when the original DT does not have
|
* This allows to easily add PSCI nodes, when the original DT does not have
|
||||||
* it or advertises another method.
|
* it or advertises another method.
|
||||||
|
* Also it supports to add reserved memory nodes to describe memory that
|
||||||
|
* is used by the secure world, so that non-secure software avoids using
|
||||||
|
* that.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -124,3 +127,30 @@ int dt_add_psci_cpu_enable_methods(void *fdt)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define HIGH_BITS(x) ((sizeof(x) > 4) ? ((x) >> 32) : (typeof(x))0)
|
||||||
|
|
||||||
|
int fdt_add_reserved_memory(void *dtb, const char *node_name,
|
||||||
|
uintptr_t base, size_t size)
|
||||||
|
{
|
||||||
|
int offs = fdt_path_offset(dtb, "/reserved-memory");
|
||||||
|
uint32_t addresses[3];
|
||||||
|
|
||||||
|
if (offs < 0) { /* create if not existing yet */
|
||||||
|
offs = fdt_add_subnode(dtb, 0, "reserved-memory");
|
||||||
|
if (offs < 0)
|
||||||
|
return offs;
|
||||||
|
fdt_setprop_u32(dtb, offs, "#address-cells", 2);
|
||||||
|
fdt_setprop_u32(dtb, offs, "#size-cells", 1);
|
||||||
|
fdt_setprop(dtb, offs, "ranges", NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
addresses[0] = cpu_to_fdt32(HIGH_BITS(base));
|
||||||
|
addresses[1] = cpu_to_fdt32(base & 0xffffffff);
|
||||||
|
addresses[2] = cpu_to_fdt32(size & 0xffffffff);
|
||||||
|
offs = fdt_add_subnode(dtb, offs, node_name);
|
||||||
|
fdt_setprop(dtb, offs, "no-map", NULL, 0);
|
||||||
|
fdt_setprop(dtb, offs, "reg", addresses, 12);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -9,5 +9,7 @@
|
||||||
|
|
||||||
int dt_add_psci_node(void *fdt);
|
int dt_add_psci_node(void *fdt);
|
||||||
int dt_add_psci_cpu_enable_methods(void *fdt);
|
int dt_add_psci_cpu_enable_methods(void *fdt);
|
||||||
|
int fdt_add_reserved_memory(void *dtb, const char *node_name,
|
||||||
|
uintptr_t base, size_t size);
|
||||||
|
|
||||||
#endif /* FDT_FIXUP_H */
|
#endif /* FDT_FIXUP_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue