From 954674efead1121f4bb24a5d974e4bc0ec7f1df7 Mon Sep 17 00:00:00 2001 From: Zhongfu Luo Date: Thu, 27 Dec 2018 17:47:20 +0800 Subject: [PATCH] defendkey: script signing tool: support upgrade check [5/5] PD#SWPL-3204 Problem: GXL/TXLX/G12A/G12B: script signing tool need to support defendkey Solution: 1.change dtb decrypt process Verify: GXL/TXLX/G12A/G12B skt board verify pass Change-Id: I165db827dec82837edb8a4a5197090bbd79d536d Signed-off-by: Zhongfu Luo --- drivers/amlogic/defendkey/defendkey.c | 56 ++++++++++++++++++++++++----------- drivers/amlogic/defendkey/securekey.h | 1 + 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/drivers/amlogic/defendkey/defendkey.c b/drivers/amlogic/defendkey/defendkey.c index 1a71623..0a63c34 100644 --- a/drivers/amlogic/defendkey/defendkey.c +++ b/drivers/amlogic/defendkey/defendkey.c @@ -134,8 +134,8 @@ static long defendkey_compat_ioctl(struct file *filp, static ssize_t defendkey_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - int i, ret; - unsigned long copy_base, copy_size; + int ret; + unsigned long copy_base, copy_size, mem_base_phy, check_offset; switch (decrypt_dtb) { case e_upgrade_check: @@ -143,29 +143,44 @@ static ssize_t defendkey_read(struct file *file, return ret_error; case e_decrypt_dtb_success: { - for (i = 0; i <= count/mem_size; i++) { - copy_size = mem_size; - copy_base = (unsigned long)buf+i*mem_size; - if ((i+1)*mem_size > count) - copy_size = count - mem_size*i; - ret = copy_to_user((void __user *)copy_base, - (const void *)mem_base_virt, copy_size); - if (ret) { - pr_err("%s:copy_to_user fail! ret:%d\n", - __func__, ret); - return ret_fail; - } - //__dma_flush_area((const void *)mem_base_virt, copy_size); + mem_base_phy = virt_to_phys(mem_base_virt); + + check_offset = aml_sec_boot_check(AML_D_Q_IMG_SIG_HDR_SIZE, + mem_base_phy, mem_size, 0); + if (AML_D_Q_IMG_SIG_HDR_SIZE == (check_offset & 0xFFFF)) + check_offset = (check_offset >> 16) & 0xFFFF; + else + check_offset = 0; + + if (check_offset) + memmove((void *)mem_base_virt, + (void *)mem_base_virt + check_offset, mem_size); + + if (mem_size < count) { + pr_err("%s:data size overflow!\n", __func__); + return ret_fail; } - if (!ret) { + + copy_base = (unsigned long)buf; + copy_size = count; + ret = copy_to_user((void __user *)copy_base, + (const void *)mem_base_virt, copy_size); + if (ret) { + pr_err("%s:copy_to_user fail! ret:%d\n", + __func__, ret); + ret = ret_fail; + } else { pr_info("%s: copy data to user successfully!\n", __func__); - return ret_success; + ret = ret_success; } + } default: return ret_error; } + + return ret; } static ssize_t defendkey_write(struct file *file, @@ -357,6 +372,7 @@ static struct class defendkey_class = { static int __init early_defendkey_para(char *buf) { int ret; + struct page *page = NULL; if (!buf) return -EINVAL; @@ -368,6 +384,12 @@ static int __init early_defendkey_para(char *buf) return -EINVAL; } + page = pfn_to_page(defendkey_rmem.base >> PAGE_SHIFT); + if (PageHighMem(page)) { + pr_err("invalid boot args \"defendkey\"\n"); + return -EINVAL; + } + pr_info("%s, base:%lx, size:%lx\n", __func__, defendkey_rmem.base, defendkey_rmem.size); diff --git a/drivers/amlogic/defendkey/securekey.h b/drivers/amlogic/defendkey/securekey.h index 717352c..1473a59 100644 --- a/drivers/amlogic/defendkey/securekey.h +++ b/drivers/amlogic/defendkey/securekey.h @@ -18,6 +18,7 @@ #if (defined CONFIG_ARM64) || (defined CONFIG_ARM64_A32) #define AML_D_P_UPGRADE_CHECK (0x80) #define AML_D_P_IMG_DECRYPT (0x40) +#define AML_D_Q_IMG_SIG_HDR_SIZE (0x100) #define AML_DATA_PROCESS (0x820000FF) #define GET_SHARE_MEM_INPUT_BASE 0x82000020 -- 2.7.4