mirror of
https://github.com/CTCaer/hekate.git
synced 2024-11-22 18:06:40 +00:00
bdk: se: do not use heap for linked lists
This commit is contained in:
parent
3369dcd110
commit
b65b2d7f71
1 changed files with 33 additions and 57 deletions
90
bdk/sec/se.c
90
bdk/sec/se.c
|
@ -33,7 +33,8 @@ typedef struct _se_ll_t
|
||||||
vu32 size;
|
vu32 size;
|
||||||
} se_ll_t;
|
} se_ll_t;
|
||||||
|
|
||||||
se_ll_t *ll_dst, *ll_src;
|
se_ll_t ll_src, ll_dst;
|
||||||
|
se_ll_t *ll_src_ptr, *ll_dst_ptr; // Must be u32 aligned.
|
||||||
|
|
||||||
static void _gf256_mul_x(void *block)
|
static void _gf256_mul_x(void *block)
|
||||||
{
|
{
|
||||||
|
@ -74,7 +75,7 @@ static void _se_ll_init(se_ll_t *ll, u32 addr, u32 size)
|
||||||
ll->size = size;
|
ll->size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _se_ll_set(se_ll_t *dst, se_ll_t *src)
|
static void _se_ll_set(se_ll_t *src, se_ll_t *dst)
|
||||||
{
|
{
|
||||||
SE(SE_IN_LL_ADDR_REG) = (u32)src;
|
SE(SE_IN_LL_ADDR_REG) = (u32)src;
|
||||||
SE(SE_OUT_LL_ADDR_REG) = (u32)dst;
|
SE(SE_OUT_LL_ADDR_REG) = (u32)dst;
|
||||||
|
@ -92,10 +93,12 @@ static int _se_wait()
|
||||||
if ((SE(SE_INT_STATUS_REG) & SE_INT_ERR_STAT) ||
|
if ((SE(SE_INT_STATUS_REG) & SE_INT_ERR_STAT) ||
|
||||||
(SE(SE_STATUS_REG) & SE_STATUS_STATE_MASK) != SE_STATUS_STATE_IDLE ||
|
(SE(SE_STATUS_REG) & SE_STATUS_STATE_MASK) != SE_STATUS_STATE_IDLE ||
|
||||||
SE(SE_ERR_STATUS_REG) != 0)
|
SE(SE_ERR_STATUS_REG) != 0)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// T210B01: IRAM/TZRAM/DRAM AHB coherency WAR.
|
// T210B01: IRAM/TZRAM/DRAM AHB coherency WAR.
|
||||||
if (!tegra_t210 && ll_dst)
|
if (!tegra_t210 && ll_dst_ptr)
|
||||||
{
|
{
|
||||||
u32 timeout = get_tmr_us() + 1000000;
|
u32 timeout = get_tmr_us() + 1000000;
|
||||||
// Ensure data is out from SE.
|
// Ensure data is out from SE.
|
||||||
|
@ -107,7 +110,7 @@ static int _se_wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure data is out from AHB.
|
// Ensure data is out from AHB.
|
||||||
if(ll_dst->addr >= DRAM_START)
|
if(ll_dst_ptr->addr >= DRAM_START)
|
||||||
{
|
{
|
||||||
timeout = get_tmr_us() + 200000;
|
timeout = get_tmr_us() + 200000;
|
||||||
while (AHB_GIZMO(AHB_ARBITRATION_AHB_MEM_WRQUE_MST_ID) & MEM_WRQUE_SE_MST_ID)
|
while (AHB_GIZMO(AHB_ARBITRATION_AHB_MEM_WRQUE_MST_ID) & MEM_WRQUE_SE_MST_ID)
|
||||||
|
@ -122,24 +125,37 @@ static int _se_wait()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _se_execute_finalize()
|
||||||
|
{
|
||||||
|
int res = _se_wait();
|
||||||
|
|
||||||
|
// Invalidate data after OP is done.
|
||||||
|
bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, false);
|
||||||
|
|
||||||
|
ll_src_ptr = NULL;
|
||||||
|
ll_dst_ptr = NULL;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size, bool is_oneshot)
|
static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size, bool is_oneshot)
|
||||||
{
|
{
|
||||||
ll_dst = NULL;
|
ll_src_ptr = NULL;
|
||||||
ll_src = NULL;
|
ll_dst_ptr = NULL;
|
||||||
|
|
||||||
if (dst)
|
|
||||||
{
|
|
||||||
ll_dst = (se_ll_t *)malloc(sizeof(se_ll_t));
|
|
||||||
_se_ll_init(ll_dst, (u32)dst, dst_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (src)
|
if (src)
|
||||||
{
|
{
|
||||||
ll_src = (se_ll_t *)malloc(sizeof(se_ll_t));
|
ll_src_ptr = &ll_src;
|
||||||
_se_ll_init(ll_src, (u32)src, src_size);
|
_se_ll_init(ll_src_ptr, (u32)src, src_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
_se_ll_set(ll_dst, ll_src);
|
if (dst)
|
||||||
|
{
|
||||||
|
ll_dst_ptr = &ll_dst;
|
||||||
|
_se_ll_init(ll_dst_ptr, (u32)dst, dst_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
_se_ll_set(ll_src_ptr, ll_dst_ptr);
|
||||||
|
|
||||||
SE(SE_ERR_STATUS_REG) = SE(SE_ERR_STATUS_REG);
|
SE(SE_ERR_STATUS_REG) = SE(SE_ERR_STATUS_REG);
|
||||||
SE(SE_INT_STATUS_REG) = SE(SE_INT_STATUS_REG);
|
SE(SE_INT_STATUS_REG) = SE(SE_INT_STATUS_REG);
|
||||||
|
@ -150,50 +166,11 @@ static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src
|
||||||
SE(SE_OPERATION_REG) = op;
|
SE(SE_OPERATION_REG) = op;
|
||||||
|
|
||||||
if (is_oneshot)
|
if (is_oneshot)
|
||||||
{
|
return _se_execute_finalize();
|
||||||
int res = _se_wait();
|
|
||||||
|
|
||||||
// Invalidate data after OP is done.
|
|
||||||
bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, false);
|
|
||||||
|
|
||||||
if (src)
|
|
||||||
{
|
|
||||||
free(ll_src);
|
|
||||||
ll_src = NULL;
|
|
||||||
}
|
|
||||||
if (dst)
|
|
||||||
{
|
|
||||||
free(ll_dst);
|
|
||||||
ll_dst = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _se_execute_finalize()
|
|
||||||
{
|
|
||||||
int res = _se_wait();
|
|
||||||
|
|
||||||
// Invalidate data after OP is done.
|
|
||||||
bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, false);
|
|
||||||
|
|
||||||
if (ll_src)
|
|
||||||
{
|
|
||||||
free(ll_src);
|
|
||||||
ll_src = NULL;
|
|
||||||
}
|
|
||||||
if (ll_dst)
|
|
||||||
{
|
|
||||||
free(ll_dst);
|
|
||||||
ll_dst = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _se_execute_oneshot(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size)
|
static int _se_execute_oneshot(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size)
|
||||||
{
|
{
|
||||||
return _se_execute(op, dst, dst_size, src, src_size, true);
|
return _se_execute(op, dst, dst_size, src, src_size, true);
|
||||||
|
@ -204,8 +181,7 @@ static int _se_execute_one_block(u32 op, void *dst, u32 dst_size, const void *sr
|
||||||
if (!src || !dst)
|
if (!src || !dst)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
u8 *block = (u8 *)malloc(SE_AES_BLOCK_SIZE);
|
u8 *block = (u8 *)calloc(1, SE_AES_BLOCK_SIZE);
|
||||||
memset(block, 0, SE_AES_BLOCK_SIZE);
|
|
||||||
|
|
||||||
SE(SE_CRYPTO_BLOCK_COUNT_REG) = 1 - 1;
|
SE(SE_CRYPTO_BLOCK_COUNT_REG) = 1 - 1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue