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:
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,
static int __init early_defendkey_para(char *buf)
{
int ret;
+ struct page *page = NULL;
if (!buf)
return -EINVAL;
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);