aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Wiklander <jens.wiklander@linaro.org>2018-06-14 11:11:59 +0200
committerJérôme Forissier <jerome.forissier@linaro.org>2018-06-18 10:01:13 +0200
commitb8d0b26e700584b85819b33306d93811deb48800 (patch)
tree99ea9fdc26b448cad350f09b9ac1a00e0d13f3b2
parent4d06c2f8e270af214c1979efaff8bd32fcfdd66b (diff)
core: split tee_pager_init()
Splits tee_pager_init() into tee_pager_set_alias_area() and tee_pager_generate_authenc_key(). The former function is called where tee_pager_init() used to be called and the latter function is called after the crypto API and RNG has been initialized. Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
-rw-r--r--core/arch/arm/include/mm/tee_pager.h17
-rw-r--r--core/arch/arm/kernel/generic_boot.c2
-rw-r--r--core/arch/arm/mm/tee_pager.c10
-rw-r--r--core/arch/arm/tee/init.c7
4 files changed, 25 insertions, 11 deletions
diff --git a/core/arch/arm/include/mm/tee_pager.h b/core/arch/arm/include/mm/tee_pager.h
index 9b38617b..0d877168 100644
--- a/core/arch/arm/include/mm/tee_pager.h
+++ b/core/arch/arm/include/mm/tee_pager.h
@@ -44,13 +44,26 @@ bool tee_pager_get_table_info(vaddr_t va, struct core_mmu_table_info *ti);
void *tee_pager_phys_to_virt(paddr_t pa);
/*
- * tee_pager_init() - Initialized the pager
+ * tee_pager_set_alias_area() - Initialize pager alias area
* @mm_alias: The alias area where all physical pages managed by the
* pager are aliased
*
* Panics if called twice or some other error occurs.
*/
-void tee_pager_init(tee_mm_entry_t *mm_alias);
+void tee_pager_set_alias_area(tee_mm_entry_t *mm_alias);
+
+/*
+ * tee_pager_generate_authenc_key() - Generates authenc key for r/w paging
+ *
+ * Needs to draw random from RNG, panics if some error occurs.
+ */
+#ifdef CFG_WITH_PAGER
+void tee_pager_generate_authenc_key(void);
+#else
+static inline void tee_pager_generate_authenc_key(void)
+{
+}
+#endif
/*
* tee_pager_add_core_area() - Adds a pageable core area
diff --git a/core/arch/arm/kernel/generic_boot.c b/core/arch/arm/kernel/generic_boot.c
index e2fb97d0..b46489e1 100644
--- a/core/arch/arm/kernel/generic_boot.c
+++ b/core/arch/arm/kernel/generic_boot.c
@@ -407,7 +407,7 @@ static void init_runtime(unsigned long pageable_part)
mm = tee_mm_alloc2(&tee_mm_vcore,
(vaddr_t)tee_mm_vcore.hi - TZSRAM_SIZE, TZSRAM_SIZE);
assert(mm);
- tee_pager_init(mm);
+ tee_pager_set_alias_area(mm);
/*
* Claim virtual memory which isn't paged.
diff --git a/core/arch/arm/mm/tee_pager.c b/core/arch/arm/mm/tee_pager.c
index 370c2bf6..d1caa139 100644
--- a/core/arch/arm/mm/tee_pager.c
+++ b/core/arch/arm/mm/tee_pager.c
@@ -332,7 +332,7 @@ static struct pgt *find_core_pgt(vaddr_t va)
return &find_pager_table(va)->pgt;
}
-static void set_alias_area(tee_mm_entry_t *mm)
+void tee_pager_set_alias_area(tee_mm_entry_t *mm)
{
struct pager_table *pt;
unsigned idx;
@@ -367,7 +367,7 @@ out:
tlbi_mva_range(smem, nbytes, SMALL_PAGE_SIZE);
}
-static void generate_ae_key(void)
+void tee_pager_generate_authenc_key(void)
{
uint8_t key[PAGER_AE_KEY_BITS / 8];
@@ -443,12 +443,6 @@ void tee_pager_early_init(void)
}
}
-void tee_pager_init(tee_mm_entry_t *mm_alias)
-{
- set_alias_area(mm_alias);
- generate_ae_key();
-}
-
static void *pager_add_alias_page(paddr_t pa)
{
unsigned idx;
diff --git a/core/arch/arm/tee/init.c b/core/arch/arm/tee/init.c
index be3ed129..20aba013 100644
--- a/core/arch/arm/tee/init.c
+++ b/core/arch/arm/tee/init.c
@@ -10,6 +10,7 @@
#include <malloc.h> /* required for inits */
#include <mm/core_memprot.h>
#include <mm/tee_mmu.h>
+#include <mm/tee_pager.h>
#include <sm/tee_mon.h>
#include <tee/tee_fs.h>
#include <tee/tee_svc.h>
@@ -60,6 +61,12 @@ TEE_Result __weak init_teecore(void)
/* call pre-define initcall routines */
call_initcalls();
+ /*
+ * Now that RNG is initialized generate the key needed for r/w
+ * paging.
+ */
+ tee_pager_generate_authenc_key();
+
IMSG("Initialized");
return TEE_SUCCESS;
}