Add locking for the hypervisor's page table.
Bug: 133217279
Change-Id: I04216838006b02b03a8f3f900d4dbd18521d5db2
diff --git a/src/fdt_handler.c b/src/fdt_handler.c
index fa789b2..a87226e 100644
--- a/src/fdt_handler.c
+++ b/src/fdt_handler.c
@@ -245,14 +245,16 @@
/* TODO: Check for "reserved-memory" nodes. */
}
-struct fdt_header *fdt_map(paddr_t fdt_addr, struct fdt_node *n,
+struct fdt_header *fdt_map(struct mm_stage1_locked stage1_locked,
+ paddr_t fdt_addr, struct fdt_node *n,
struct mpool *ppool)
{
struct fdt_header *fdt;
/* Map the fdt header in. */
- fdt = mm_identity_map(fdt_addr, pa_add(fdt_addr, fdt_header_size()),
- MM_MODE_R, ppool);
+ fdt = mm_identity_map(stage1_locked, fdt_addr,
+ pa_add(fdt_addr, fdt_header_size()), MM_MODE_R,
+ ppool);
if (!fdt) {
dlog("Unable to map FDT header.\n");
return NULL;
@@ -264,8 +266,9 @@
}
/* Map the rest of the fdt in. */
- fdt = mm_identity_map(fdt_addr, pa_add(fdt_addr, fdt_total_size(fdt)),
- MM_MODE_R, ppool);
+ fdt = mm_identity_map(stage1_locked, fdt_addr,
+ pa_add(fdt_addr, fdt_total_size(fdt)), MM_MODE_R,
+ ppool);
if (!fdt) {
dlog("Unable to map full FDT.\n");
goto fail;
@@ -274,19 +277,22 @@
return fdt;
fail:
- mm_unmap(fdt_addr, pa_add(fdt_addr, fdt_header_size()), ppool);
+ mm_unmap(stage1_locked, fdt_addr, pa_add(fdt_addr, fdt_header_size()),
+ ppool);
return NULL;
}
-bool fdt_unmap(struct fdt_header *fdt, struct mpool *ppool)
+bool fdt_unmap(struct mm_stage1_locked stage1_locked, struct fdt_header *fdt,
+ struct mpool *ppool)
{
paddr_t fdt_addr = pa_from_va(va_from_ptr(fdt));
- return mm_unmap(fdt_addr, pa_add(fdt_addr, fdt_total_size(fdt)), ppool);
+ return mm_unmap(stage1_locked, fdt_addr,
+ pa_add(fdt_addr, fdt_total_size(fdt)), ppool);
}
-bool fdt_patch(paddr_t fdt_addr, struct boot_params_update *p,
- struct mpool *ppool)
+bool fdt_patch(struct mm_stage1_locked stage1_locked, paddr_t fdt_addr,
+ struct boot_params_update *p, struct mpool *ppool)
{
struct fdt_header *fdt;
struct fdt_node n;
@@ -294,8 +300,9 @@
size_t i;
/* Map the fdt header in. */
- fdt = mm_identity_map(fdt_addr, pa_add(fdt_addr, fdt_header_size()),
- MM_MODE_R, ppool);
+ fdt = mm_identity_map(stage1_locked, fdt_addr,
+ pa_add(fdt_addr, fdt_header_size()), MM_MODE_R,
+ ppool);
if (!fdt) {
dlog("Unable to map FDT header.\n");
return false;
@@ -307,7 +314,7 @@
}
/* Map the fdt (+ a page) in r/w mode in preparation for updating it. */
- fdt = mm_identity_map(fdt_addr,
+ fdt = mm_identity_map(stage1_locked, fdt_addr,
pa_add(fdt_addr, fdt_total_size(fdt) + PAGE_SIZE),
MM_MODE_R | MM_MODE_W, ppool);
if (!fdt) {
@@ -363,7 +370,7 @@
out_unmap_fdt:
/* Unmap FDT. */
- if (!mm_unmap(fdt_addr,
+ if (!mm_unmap(stage1_locked, fdt_addr,
pa_add(fdt_addr, fdt_total_size(fdt) + PAGE_SIZE),
ppool)) {
dlog("Unable to unmap writable FDT.\n");
@@ -372,6 +379,7 @@
return ret;
err_unmap_fdt_header:
- mm_unmap(fdt_addr, pa_add(fdt_addr, fdt_header_size()), ppool);
+ mm_unmap(stage1_locked, fdt_addr, pa_add(fdt_addr, fdt_header_size()),
+ ppool);
return false;
}