Merge "platform: msm_shared: Fix cache flush issues"
diff --git a/include/debug.h b/include/debug.h
index d4bce54..59e7731 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -71,7 +71,7 @@
#define PANIC_UNIMPLEMENTED panic("%s unimplemented\n", __PRETTY_FUNCTION__)
-void * __stack_chk_guard;
+uintptr_t __stack_chk_guard;
/*
* Initialize the stack protector canary value.
diff --git a/platform/msm_shared/include/scm.h b/platform/msm_shared/include/scm.h
index 0bd7eda..2d454ed 100644
--- a/platform/msm_shared/include/scm.h
+++ b/platform/msm_shared/include/scm.h
@@ -400,7 +400,7 @@
int restore_secure_cfg(uint32_t id);
void scm_elexec_call(paddr_t kernel_entry, paddr_t dtb_offset);
-void *get_canary();
+uintptr_t get_canary();
/* API to configure XPU violations as fatal */
int scm_xpu_err_fatal_init();
diff --git a/platform/msm_shared/scm.c b/platform/msm_shared/scm.c
index df4b136..034d838 100644
--- a/platform/msm_shared/scm.c
+++ b/platform/msm_shared/scm.c
@@ -1059,53 +1059,57 @@
}
/* SCM Random Command */
-int scm_random(uint32_t * rbuf, uint32_t r_len)
+int scm_random(uintptr_t * rbuf, uint32_t r_len)
{
int ret;
struct tz_prng_data data;
scmcall_arg scm_arg = {0};
+ // Memory passed to TZ should be algined to cache line
+ BUF_DMA_ALIGN(rand_buf, sizeof(uintptr_t));
if (!scm_arm_support)
{
- data.out_buf = (uint8_t*) rbuf;
+ data.out_buf = (uint8_t*) rand_buf;
data.out_buf_size = r_len;
/*
* random buffer must be flushed/invalidated before and after TZ call.
*/
- arch_clean_invalidate_cache_range((addr_t) rbuf, r_len);
+ arch_clean_invalidate_cache_range((addr_t) rand_buf, r_len);
ret = scm_call(TZ_SVC_CRYPTO, PRNG_CMD_ID, &data, sizeof(data), NULL, 0);
/* Invalidate the updated random buffer */
- arch_clean_invalidate_cache_range((addr_t) rbuf, r_len);
+ arch_clean_invalidate_cache_range((addr_t) rand_buf, r_len);
}
else
{
scm_arg.x0 = MAKE_SIP_SCM_CMD(TZ_SVC_CRYPTO, PRNG_CMD_ID);
scm_arg.x1 = MAKE_SCM_ARGS(0x2,SMC_PARAM_TYPE_BUFFER_READWRITE);
- scm_arg.x2 = (uint32_t) rbuf;
+ scm_arg.x2 = (uint32_t) rand_buf;
scm_arg.x3 = r_len;
ret = scm_call2(&scm_arg, NULL);
if (!ret)
- arch_clean_invalidate_cache_range((addr_t) rbuf, r_len);
+ arch_clean_invalidate_cache_range((addr_t) rand_buf, r_len);
else
dprintf(CRITICAL, "Secure canary SCM failed: %x\n", ret);
}
+ //Copy back into the return buffer
+ *rbuf = *rand_buf;
return ret;
}
-void * get_canary()
+uintptr_t get_canary()
{
- void * canary;
- if(scm_random((uint32_t *)&canary, sizeof(canary))) {
+ uintptr_t canary;
+ if(scm_random(&canary, sizeof(canary))) {
dprintf(CRITICAL,"scm_call for random failed !!!");
/*
* fall back to use lib rand API if scm call failed.
*/
- canary = (void *)rand();
+ canary = rand();
}
return canary;
@@ -1195,14 +1199,14 @@
if ((arg->x1 & 0xF) > SCM_MAX_ARG_LEN - 1)
{
- indir_arg = memalign(CACHE_LINE, (SCM_INDIR_MAX_LEN * sizeof(uint32_t)));
+ indir_arg = memalign(CACHE_LINE, ROUNDUP((SCM_INDIR_MAX_LEN * sizeof(uint32_t)), CACHE_LINE));
ASSERT(indir_arg);
for (i = 0 ; i < SCM_INDIR_MAX_LEN; i++)
{
indir_arg[i] = arg->x5[i];
}
- arch_clean_invalidate_cache_range((addr_t) indir_arg, (SCM_INDIR_MAX_LEN * sizeof(uint32_t)));
+ arch_clean_invalidate_cache_range((addr_t) indir_arg, ROUNDUP((SCM_INDIR_MAX_LEN * sizeof(uint32_t)), CACHE_LINE));
x5 = (addr_t) indir_arg;
}
diff --git a/platform/msm_shared/ucs.c b/platform/msm_shared/ucs.c
index aaf17a8..63de398 100644
--- a/platform/msm_shared/ucs.c
+++ b/platform/msm_shared/ucs.c
@@ -446,9 +446,6 @@
return -UFS_FAILURE;
}
- /* Flush buffer. */
- arch_invalidate_cache_range((addr_t) param, SCSI_INQUIRY_LEN);
-
return UFS_SUCCESS;
}
@@ -468,7 +465,7 @@
STACKBUF_DMA_ALIGN(cdb, sizeof(struct scsi_sense_cdb));
struct scsi_req_build_type req_upiu;
struct scsi_sense_cdb *cdb_param;
- uint8_t buf[SCSI_SENSE_BUF_LEN];
+ STACKBUF_DMA_ALIGN(buf, SCSI_SENSE_BUF_LEN);
cdb_param = (struct scsi_sense_cdb *) cdb;