mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 15:31:22 +01:00
firmware: Move memcpy/memset mapping to fw_base.S
Some of the external firmwares using OpenSBI as library are facing issues with the weak memcpy() and memset() aliases in libsbi.a so we move these to fw_base.S. This way mapping of implicit memcpy() or memset() calls to sbi_memcpy() or sbi_memset() will only be done for OpenSBI firmwares. (Refer, https://github.com/riscv-software-src/opensbi/issues/234) In addition, we also add memmove() and memcmp() mappings in fw_base.S because as-per the GCC documentation the freestanding environment must provide memcpy(), memmove(), memset(), and memcmp(). Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atishp@rivosinc.com>
This commit is contained in:
@@ -561,6 +561,34 @@ fw_platform_init:
|
|||||||
add a0, a1, zero
|
add a0, a1, zero
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
/* Map implicit memcpy() added by compiler to sbi_memcpy() */
|
||||||
|
.section .text
|
||||||
|
.align 3
|
||||||
|
.globl memcpy
|
||||||
|
memcpy:
|
||||||
|
tail sbi_memcpy
|
||||||
|
|
||||||
|
/* Map implicit memset() added by compiler to sbi_memset() */
|
||||||
|
.section .text
|
||||||
|
.align 3
|
||||||
|
.globl memset
|
||||||
|
memset:
|
||||||
|
tail sbi_memset
|
||||||
|
|
||||||
|
/* Map implicit memmove() added by compiler to sbi_memmove() */
|
||||||
|
.section .text
|
||||||
|
.align 3
|
||||||
|
.globl memmove
|
||||||
|
memmove:
|
||||||
|
tail sbi_memmove
|
||||||
|
|
||||||
|
/* Map implicit memcmp() added by compiler to sbi_memcmp() */
|
||||||
|
.section .text
|
||||||
|
.align 3
|
||||||
|
.globl memcmp
|
||||||
|
memcmp:
|
||||||
|
tail sbi_memcmp
|
||||||
|
|
||||||
.macro TRAP_SAVE_AND_SETUP_SP_T0
|
.macro TRAP_SAVE_AND_SETUP_SP_T0
|
||||||
/* Swap TP and MSCRATCH */
|
/* Swap TP and MSCRATCH */
|
||||||
csrrw tp, CSR_MSCRATCH, tp
|
csrrw tp, CSR_MSCRATCH, tp
|
||||||
|
@@ -122,9 +122,6 @@ void *sbi_memset(void *s, int c, size_t count)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *memset(void *s, int c, size_t count) \
|
|
||||||
__attribute__((weak, alias("sbi_memset")));
|
|
||||||
|
|
||||||
void *sbi_memcpy(void *dest, const void *src, size_t count)
|
void *sbi_memcpy(void *dest, const void *src, size_t count)
|
||||||
{
|
{
|
||||||
char *temp1 = dest;
|
char *temp1 = dest;
|
||||||
@@ -138,9 +135,6 @@ void *sbi_memcpy(void *dest, const void *src, size_t count)
|
|||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *memcpy(void *dest, const void *src, size_t count) \
|
|
||||||
__attribute__((weak, alias("sbi_memcpy")));
|
|
||||||
|
|
||||||
void *sbi_memmove(void *dest, const void *src, size_t count)
|
void *sbi_memmove(void *dest, const void *src, size_t count)
|
||||||
{
|
{
|
||||||
char *temp1 = (char *)dest;
|
char *temp1 = (char *)dest;
|
||||||
|
Reference in New Issue
Block a user