Skip to content

Commit

Permalink
tree-wide: use power-of-2 rounding macros where applicable
Browse files Browse the repository at this point in the history
Use ROUNDUP2(), ROUNDUP2_OVERFLOW(), ROUNDUP2_DIV() and ROUNDDOWN2() at
places where the rounding argument is a variable value and we want to
leverage the implementation of these routines optimized for a
power-of-2 rounding argument.

Signed-off-by: Etienne Carriere <[email protected]>
Reviewed-by: Jens Wiklander <[email protected]>
  • Loading branch information
etienne-lms authored and jforissier committed Dec 19, 2024
1 parent fa418fc commit 76d6685
Show file tree
Hide file tree
Showing 13 changed files with 43 additions and 43 deletions.
2 changes: 1 addition & 1 deletion core/drivers/clk/clk-stm32-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ static unsigned long stm32_div_get_rate(int div_id, unsigned long prate)
if (!div)
return prate;

return ROUNDUP_DIV((uint64_t)prate, div);
return ROUNDUP2_DIV((uint64_t)prate, div);
}

TEE_Result stm32_div_set_rate(int div_id, unsigned long rate,
Expand Down
8 changes: 4 additions & 4 deletions core/drivers/crypto/caam/utils/utils_dmaobj.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ static TEE_Result check_buffer_alignment(struct priv_dmaobj *priv,
}

va_start = (vaddr_t)entry->origbuf.data;
va_start_align = ROUNDUP(va_start, cacheline_size);
va_start_align = ROUNDUP2(va_start, cacheline_size);

if (va_start_align != va_start) {
DMAOBJ_TRACE("Start 0x%" PRIxVA " vs align 0x%" PRIxVA,
Expand Down Expand Up @@ -443,13 +443,13 @@ static TEE_Result check_buffer_alignment(struct priv_dmaobj *priv,
}

va_end = (vaddr_t)entry->origbuf.data + entry->origbuf.length;
va_end_align = ROUNDUP(va_end, cacheline_size);
va_end_align = ROUNDUP2(va_end, cacheline_size);

if (va_end != va_end_align) {
DMAOBJ_TRACE("End 0x%" PRIxVA " vs align 0x%" PRIxVA,
va_end, va_end_align);

va_end_align = ROUNDDOWN(va_end, cacheline_size);
va_end_align = ROUNDDOWN2(va_end, cacheline_size);
remlen = entry->origbuf.length - va_end_align;

if (remlen <= cacheline_size) {
Expand Down Expand Up @@ -1296,7 +1296,7 @@ TEE_Result caam_dmaobj_sgtbuf_build(struct caamdmaobj *obj, size_t *length,
max_length = *length;
if (priv->dmabuf.allocated && max_length > priv->dmabuf.allocated &&
priv->dmabuf.allocated > align)
max_length = ROUNDDOWN(priv->dmabuf.allocated, align);
max_length = ROUNDDOWN2(priv->dmabuf.allocated, align);

DMAOBJ_TRACE("Prepare SGT/Buffer to do %zu of %zu", max_length,
*length);
Expand Down
2 changes: 1 addition & 1 deletion core/drivers/crypto/caam/utils/utils_mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static void *mem_alloc(size_t size, uint8_t type)
&alloc_size))
return NULL;

if (ROUNDUP_OVERFLOW(alloc_size, cacheline_size, &alloc_size))
if (ROUNDUP2_OVERFLOW(alloc_size, cacheline_size, &alloc_size))
return NULL;

ptr = memalign(cacheline_size, alloc_size);
Expand Down
2 changes: 1 addition & 1 deletion core/drivers/crypto/stm32/stm32_cryp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1122,7 +1122,7 @@ TEE_Result stm32_cryp_update(struct stm32_cryp_context *ctx, bool last_block,
*/
if (last_block && algo_mode_is_ecb_cbc(ctx->cr) &&
is_encrypt(ctx->cr) &&
(ROUNDDOWN(data_size, ctx->block_u32 * sizeof(uint32_t)) !=
(ROUNDDOWN2(data_size, ctx->block_u32 * sizeof(uint32_t)) !=
data_size)) {
if (data_size < ctx->block_u32 * sizeof(uint32_t) * 2) {
/*
Expand Down
2 changes: 1 addition & 1 deletion core/kernel/tee_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ void *alloc_cache_aligned(size_t size)
uint32_t cacheline_size = 0;

cacheline_size = cache_get_max_line_size();
if (ROUNDUP_OVERFLOW(size, cacheline_size, &alloc_size))
if (ROUNDUP2_OVERFLOW(size, cacheline_size, &alloc_size))
return NULL;

ptr = memalign(cacheline_size, alloc_size);
Expand Down
12 changes: 6 additions & 6 deletions core/kernel/transfer_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -388,9 +388,9 @@ bool transfer_list_set_data_size(struct transfer_list_header *tl,
* of TL
*/
mov_dis = new_ev - old_ev;
if (ROUNDUP_OVERFLOW(mov_dis,
TL_ALIGNMENT_FROM_ORDER(tl->alignment),
&mov_dis) ||
if (ROUNDUP2_OVERFLOW(mov_dis,
TL_ALIGNMENT_FROM_ORDER(tl->alignment),
&mov_dis) ||
tl->size + mov_dis > tl->max_size) {
return false;
}
Expand All @@ -401,8 +401,8 @@ bool transfer_list_set_data_size(struct transfer_list_header *tl,
* Move distance should be rounded down to match the entry data
* alignment.
*/
mov_dis = ROUNDDOWN(old_ev - new_ev,
TL_ALIGNMENT_FROM_ORDER(tl->alignment));
mov_dis = ROUNDDOWN2(old_ev - new_ev,
TL_ALIGNMENT_FROM_ORDER(tl->alignment));
r_new_ev = old_ev - mov_dis;
tl->size -= mov_dis;
}
Expand Down Expand Up @@ -537,7 +537,7 @@ transfer_list_add_with_align(struct transfer_list_header *tl, uint16_t tag_id,
* alignment. Fill the gap with an empty transfer entry as a
* placeholder before adding the desired transfer entry
*/
new_tl_ev = ROUNDUP(ev, TL_ALIGNMENT_FROM_ORDER(alignment)) -
new_tl_ev = ROUNDUP2(ev, TL_ALIGNMENT_FROM_ORDER(alignment)) -
sizeof(struct transfer_list_entry);
assert(new_tl_ev - tl_ev > sizeof(struct transfer_list_entry));
dummy_te_data_sz = new_tl_ev - tl_ev -
Expand Down
4 changes: 2 additions & 2 deletions core/mm/boot_mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ static void *mem_alloc_tmp(struct boot_mem_desc *desc, size_t len, size_t align)
assert(IS_POWER_OF_TWO(align) && !(len % align));
if (SUB_OVERFLOW(desc->mem_end, len, &va))
panic();
va = ROUNDDOWN(va, align);
va = ROUNDDOWN2(va, align);
if (va < desc->mem_start)
panic();
desc->mem_end = va;
Expand All @@ -66,7 +66,7 @@ static void *mem_alloc(struct boot_mem_desc *desc, size_t len, size_t align)
runtime_assert(!IS_ENABLED(CFG_WITH_PAGER));
assert(desc && desc->mem_start && desc->mem_end);
assert(IS_POWER_OF_TWO(align) && !(len % align));
va = ROUNDUP(desc->mem_start, align);
va = ROUNDUP2(desc->mem_start, align);
if (ADD_OVERFLOW(va, len, &ve))
panic();
if (ve > desc->mem_end)
Expand Down
18 changes: 9 additions & 9 deletions core/mm/core_mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1288,7 +1288,7 @@ static bool assign_mem_va_dir(vaddr_t tee_ram_va, struct memory_map *mem_map,

if (SUB_OVERFLOW(va, map->size, &va))
return false;
va = ROUNDDOWN(va, map->region_size);
va = ROUNDDOWN2(va, map->region_size);
/*
* Make sure that va is aligned with pa for
* efficient pgdir mapping. Basically pa &
Expand Down Expand Up @@ -1320,7 +1320,7 @@ static bool assign_mem_va_dir(vaddr_t tee_ram_va, struct memory_map *mem_map,
return false;
}

if (ROUNDUP_OVERFLOW(va, map->region_size, &va))
if (ROUNDUP2_OVERFLOW(va, map->region_size, &va))
return false;
/*
* Make sure that va is aligned with pa for
Expand Down Expand Up @@ -2224,8 +2224,8 @@ TEE_Result core_mmu_remove_mapping(enum teecore_memtypes type, void *addr,
i = map - static_memory_map.map;

/* Check that we have a full match */
p = ROUNDDOWN(pa, granule);
l = ROUNDUP(len + pa - p, granule);
p = ROUNDDOWN2(pa, granule);
l = ROUNDUP2(len + pa - p, granule);
if (map->pa != p || map->size != l)
return TEE_ERROR_GENERIC;

Expand Down Expand Up @@ -2301,8 +2301,8 @@ void *core_mmu_add_mapping(enum teecore_memtypes type, paddr_t addr, size_t len)
return NULL;

granule = BIT64(tbl_info.shift);
p = ROUNDDOWN(addr, granule);
l = ROUNDUP(len + addr - p, granule);
p = ROUNDDOWN2(addr, granule);
l = ROUNDUP2(len + addr - p, granule);

/* Ban overflowing virtual addresses */
if (map->size < l)
Expand Down Expand Up @@ -2709,12 +2709,12 @@ void core_mmu_init_phys_mem(void)
* The VCORE macros are relocatable so we need to translate
* the addresses now that the MMU is enabled.
*/
end_pa = vaddr_to_phys(ROUNDUP(VCORE_FREE_END_PA,
align) - 1) + 1;
end_pa = vaddr_to_phys(ROUNDUP2(VCORE_FREE_END_PA,
align) - 1) + 1;
/* Carve out the part used by OP-TEE core */
carve_out_core_mem(vaddr_to_phys(VCORE_UNPG_RX_PA), end_pa);
if (IS_ENABLED(CFG_CORE_SANITIZE_KADDRESS)) {
pa = vaddr_to_phys(ROUNDUP(ASAN_MAP_PA, align));
pa = vaddr_to_phys(ROUNDUP2(ASAN_MAP_PA, align));
carve_out_core_mem(pa, pa + ASAN_MAP_SZ);
}

Expand Down
4 changes: 2 additions & 2 deletions core/mm/tee_mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ bool tee_mm_init(tee_mm_pool_t *pool, paddr_t lo, paddr_size_t size,
if (pool == NULL)
return false;

lo = ROUNDUP(lo, 1 << shift);
lo = ROUNDUP2(lo, 1 << shift);
rounded = lo - initial_lo;
size = ROUNDDOWN(size - rounded, 1 << shift);
size = ROUNDDOWN2(size - rounded, 1 << shift);

assert(((uint64_t)size >> shift) < (uint64_t)UINT32_MAX);

Expand Down
8 changes: 4 additions & 4 deletions core/mm/vm.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ static vaddr_t select_va_in_range(const struct vm_region *prev_reg,
if (ADD_OVERFLOW(prev_reg->va, prev_reg->size, &begin_va) ||
ADD_OVERFLOW(begin_va, pad_begin, &begin_va) ||
ADD_OVERFLOW(begin_va, pad, &begin_va) ||
ROUNDUP_OVERFLOW(begin_va, granul, &begin_va))
ROUNDUP2_OVERFLOW(begin_va, granul, &begin_va))
return 0;

if (reg->va) {
Expand All @@ -97,7 +97,7 @@ static vaddr_t select_va_in_range(const struct vm_region *prev_reg,
if (ADD_OVERFLOW(begin_va, reg->size, &end_va) ||
ADD_OVERFLOW(end_va, pad_end, &end_va) ||
ADD_OVERFLOW(end_va, pad, &end_va) ||
ROUNDUP_OVERFLOW(end_va, granul, &end_va))
ROUNDUP2_OVERFLOW(end_va, granul, &end_va))
return 0;

if (end_va <= next_reg->va) {
Expand Down Expand Up @@ -1178,7 +1178,7 @@ static TEE_Result tee_mmu_user_va2pa_attr(const struct user_mode_ctx *uctx,
assert(!granule || IS_POWER_OF_TWO(granule));

offset = region->offset +
ROUNDDOWN((vaddr_t)ua - region->va, granule);
ROUNDDOWN2((vaddr_t)ua - region->va, granule);

res = mobj_get_pa(region->mobj, offset, granule, &p);
if (res != TEE_SUCCESS)
Expand Down Expand Up @@ -1270,7 +1270,7 @@ TEE_Result vm_check_access_rights(const struct user_mode_ctx *uctx,
!vm_buf_is_inside_um_private(uctx, (void *)uaddr, len))
return TEE_ERROR_ACCESS_DENIED;

for (a = ROUNDDOWN(uaddr, addr_incr); a < end_addr; a += addr_incr) {
for (a = ROUNDDOWN2(uaddr, addr_incr); a < end_addr; a += addr_incr) {
uint32_t attr;
TEE_Result res;

Expand Down
6 changes: 3 additions & 3 deletions ldelf/ta_elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -962,10 +962,10 @@ static void parse_property_segment(struct ta_elf *elf)
!IS_POWER_OF_TWO(align))
return;

desc_offset = ROUNDUP(sizeof(*note) + sizeof(ELF_NOTE_GNU), align);
desc_offset = ROUNDUP2(sizeof(*note) + sizeof(ELF_NOTE_GNU), align);

if (desc_offset > elf->prop_memsz ||
ROUNDUP(desc_offset + note->n_descsz, align) > elf->prop_memsz)
ROUNDUP2(desc_offset + note->n_descsz, align) > elf->prop_memsz)
return;

desc = (char *)(va + desc_offset);
Expand All @@ -992,7 +992,7 @@ static void parse_property_segment(struct ta_elf *elf)
}
}

prop_offset += ROUNDUP(sizeof(*prop) + prop->pr_datasz, align);
prop_offset += ROUNDUP2(sizeof(*prop) + prop->pr_datasz, align);
} while (prop_offset < note->n_descsz);
}

Expand Down
4 changes: 2 additions & 2 deletions lib/libutee/tee_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ static TEE_Result map_tmp_param(struct utee_params *up, void **tmp_buf,
if (b && s &&
!TEE_CheckMemoryAccessRights(flags, b, s)) {
is_tmp_mem[n] = true;
tbl += ROUNDUP(s, tmp_align);
tbl += ROUNDUP2(s, tmp_align);
}
break;
default:
Expand All @@ -159,7 +159,7 @@ static TEE_Result map_tmp_param(struct utee_params *up, void **tmp_buf,
s = up->vals[n * 2 + 1];
b = (void *)(vaddr_t)up->vals[n * 2];
tmp_va[n] = tb;
tb += ROUNDUP(s, tmp_align);
tb += ROUNDUP2(s, tmp_align);
up->vals[n * 2] = (vaddr_t)tmp_va[n];
if (TEE_PARAM_TYPE_GET(up->types, n) !=
TEE_PARAM_TYPE_MEMREF_OUTPUT)
Expand Down
14 changes: 7 additions & 7 deletions lib/libutee/tee_api_operations.c
Original file line number Diff line number Diff line change
Expand Up @@ -1115,8 +1115,8 @@ static TEE_Result tee_buffer_update(
/* If we can feed from buffer */
if ((op->buffer_offs > 0) &&
((op->buffer_offs + slen) >= (buffer_size + buffer_left))) {
l = ROUNDUP(op->buffer_offs + slen - buffer_size,
op->block_size);
l = ROUNDUP2(op->buffer_offs + slen - buffer_size,
op->block_size);
l = MIN(op->buffer_offs, l);
/*
* If we're buffering only a single block, process it
Expand Down Expand Up @@ -1146,9 +1146,9 @@ static TEE_Result tee_buffer_update(
if (slen >= (buffer_size + buffer_left)) {
/* Buffer is empty, feed as much as possible from src */
if (op->buffer_two_blocks)
l = ROUNDUP(slen - buffer_size, op->block_size);
l = ROUNDUP2(slen - buffer_size, op->block_size);
else
l = ROUNDUP(slen - buffer_size + 1, op->block_size);
l = ROUNDUP2(slen - buffer_size + 1, op->block_size);

tmp_dlen = dlen;
res = update_func(op->state, src, l, dst, &tmp_dlen);
Expand Down Expand Up @@ -1216,7 +1216,7 @@ TEE_Result TEE_CipherUpdate(TEE_OperationHandle operation, const void *srcData,
operation->block_size * 2) {
req_dlen = operation->buffer_offs + srcLen -
operation->block_size * 2;
req_dlen = ROUNDUP(req_dlen, operation->block_size);
req_dlen = ROUNDUP2(req_dlen, operation->block_size);
} else {
req_dlen = 0;
}
Expand Down Expand Up @@ -1694,8 +1694,8 @@ static TEE_Result ae_update_helper(TEE_OperationHandle operation,
* can't restore sync with this API.
*/
if (operation->block_size > 1) {
req_dlen = ROUNDDOWN(operation->buffer_offs + slen,
operation->block_size);
req_dlen = ROUNDDOWN2(operation->buffer_offs + slen,
operation->block_size);
} else {
req_dlen = slen;
}
Expand Down

0 comments on commit 76d6685

Please sign in to comment.