blob: 21a630107d1ba9c404a8df64a20d362ac266b547 [file] [log] [blame]
/*
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include "crt_impl_private.h"
void *memcpy(void *dest, const void *src, size_t n)
{
union tfm_mem_addr_t p_dest, p_src;
p_dest.uint_addr = (uintptr_t)dest;
p_src.uint_addr = (uintptr_t)src;
/* Byte copy for unaligned address. check the last bit of address. */
while (n && (GET_MEM_ADDR_BIT0(p_dest.uint_addr) ||
GET_MEM_ADDR_BIT0(p_src.uint_addr))) {
*p_dest.p_byte++ = *p_src.p_byte++;
n--;
}
/*
* Double byte copy for aligned address.
* Check the 2nd last bit of address.
*/
while (n >= sizeof(uint16_t) && (GET_MEM_ADDR_BIT1(p_dest.uint_addr) ||
GET_MEM_ADDR_BIT1(p_src.uint_addr))) {
*(p_dest.p_dbyte)++ = *(p_src.p_dbyte)++;
n -= sizeof(uint16_t);
}
/* Quad byte copy for aligned address. */
while (n >= sizeof(uint32_t)) {
*(p_dest.p_qbyte)++ = *(p_src.p_qbyte)++;
n -= sizeof(uint32_t);
}
/* Byte copy for the remaining bytes. */
while (n--) {
*p_dest.p_byte++ = *p_src.p_byte++;
}
return dest;
}