From 532b5fece258134d82a71cb0dcd4c9e4ba3e2eee Mon Sep 17 00:00:00 2001 From: Zhenhua Huang Date: Wed, 22 Jul 2020 11:29:39 +0800 Subject: [PATCH 1/2] soc: qcom: secure_buffer: track all hyp based secure pages To track all secure pages which are not stage 2 mapped to APPS, add a MAGIC in page->private. Change-Id: I4674f74eca95eeb36f004185a5d9cb0d63d558b0 Signed-off-by: Zhenhua Huang --- drivers/soc/qcom/secure_buffer.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/drivers/soc/qcom/secure_buffer.c b/drivers/soc/qcom/secure_buffer.c index 7d6d2ecdbdf6..6697fca0c3f2 100644 --- a/drivers/soc/qcom/secure_buffer.c +++ b/drivers/soc/qcom/secure_buffer.c @@ -145,6 +145,22 @@ static int batched_hyp_assign(struct sg_table *table, u32 *source_vmids, return ret; } +static inline void set_each_page_of_sg(struct sg_table *table, u64 flag) +{ + struct scatterlist *sg; + int npages; + int i = 0; + + for_each_sg(table->sgl, sg, table->nents, i) { + npages = sg->length / PAGE_SIZE; + if (sg->length % PAGE_SIZE) + npages++; + while (npages--) + set_page_private(nth_page(sg_page(sg), npages), flag); + } +} + +#define SECURE_PAGE_MAGIC 0xEEEEEEEE /* * When -EADDRNOTAVAIL is returned the memory may no longer be in * a usable state and should no longer be accessed by the HLOS. @@ -206,6 +222,19 @@ int hyp_assign_table(struct sg_table *table, ret = batched_hyp_assign(table, source_vm_copy, source_vm_copy_size, dest_vm_copy, dest_vm_copy_size); + if (!ret) { + while (dest_nelems--) { + if (dest_vmids[dest_nelems] == VMID_HLOS) + break; + } + + if (dest_nelems == -1) + set_each_page_of_sg(table, SECURE_PAGE_MAGIC); + else + set_each_page_of_sg(table, 0); + } + + dma_unmap_single(qcom_secure_buffer_dev, dest_dma_addr, dest_vm_copy_size, DMA_TO_DEVICE); out_free_dest: From 724d27beefe988f953810fcd8bcbc90a2c18dc9e Mon Sep 17 00:00:00 2001 From: Zhenhua Huang Date: Wed, 22 Jul 2020 16:57:08 +0800 Subject: [PATCH 2/2] soc: qcom: secure_buffer: add API page_accessible Add page_accessible to check if page is secure or not. It is used to avoid EL2 fault for dumping memory region. Change-Id: If71a810997fc97722722339a25839249bd05d9e2 Signed-off-by: Zhenhua Huang --- drivers/soc/qcom/secure_buffer.c | 10 ++++++++++ include/soc/qcom/secure_buffer.h | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/soc/qcom/secure_buffer.c b/drivers/soc/qcom/secure_buffer.c index 6697fca0c3f2..cb7c130c97db 100644 --- a/drivers/soc/qcom/secure_buffer.c +++ b/drivers/soc/qcom/secure_buffer.c @@ -161,6 +161,16 @@ static inline void set_each_page_of_sg(struct sg_table *table, u64 flag) } #define SECURE_PAGE_MAGIC 0xEEEEEEEE +int page_accessible(unsigned long pfn) +{ + struct page *page = pfn_to_page(pfn); + + if (page->private == SECURE_PAGE_MAGIC) + return 0; + else + return 1; +} + /* * When -EADDRNOTAVAIL is returned the memory may no longer be in * a usable state and should no longer be accessed by the HLOS. diff --git a/include/soc/qcom/secure_buffer.h b/include/soc/qcom/secure_buffer.h index 3c8b3c7146ee..2d28674a3cb9 100644 --- a/include/soc/qcom/secure_buffer.h +++ b/include/soc/qcom/secure_buffer.h @@ -54,6 +54,7 @@ int hyp_assign_phys(phys_addr_t addr, u64 size, int *dest_vmids, int *dest_perms, int dest_nelems); const char *msm_secure_vmid_to_string(int secure_vmid); u32 msm_secure_get_vmid_perms(u32 vmid); +int page_accessible(unsigned long pfn); #else static inline int hyp_assign_table(struct sg_table *table, u32 *source_vm_list, int source_nelems, @@ -79,5 +80,10 @@ static inline u32 msm_secure_get_vmid_perms(u32 vmid) { return 0; } + +static inline int page_accessible(unsigned long pfn) +{ + return 1; +} #endif #endif