TF-M Reference Manual  1.2.0
TrustedFirmware-M
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
tfm_core_utils.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include <stdint.h>
9 #include "utilities.h"
10 
11 #define GET_MEM_ADDR_BIT0(x) ((x) & 0x1)
12 #define GET_MEM_ADDR_BIT1(x) ((x) & 0x2)
13 
14 union tfm_mem_addr_t {
15  uintptr_t uint_addr; /* Address */
16  uint8_t *p_byte; /* Byte copy */
17  uint16_t *p_dbyte; /* Double byte copy */
18  uint32_t *p_qbyte; /* Quad byte copy */
19 };
20 
21 void *spm_memcpy(void *dest, const void *src, size_t n)
22 {
23  union tfm_mem_addr_t p_dest, p_src;
24 
25  p_dest.uint_addr = (uintptr_t)dest;
26  p_src.uint_addr = (uintptr_t)src;
27 
28  /* Byte copy for unaligned address. check the last bit of address. */
29  while (n && (GET_MEM_ADDR_BIT0(p_dest.uint_addr) ||
30  GET_MEM_ADDR_BIT0(p_src.uint_addr))) {
31  *p_dest.p_byte++ = *p_src.p_byte++;
32  n--;
33  }
34 
35  /*
36  * Double byte copy for aligned address.
37  * Check the 2nd last bit of address.
38  */
39  while (n >= sizeof(uint16_t) && (GET_MEM_ADDR_BIT1(p_dest.uint_addr) ||
40  GET_MEM_ADDR_BIT1(p_src.uint_addr))) {
41  *(p_dest.p_dbyte)++ = *(p_src.p_dbyte)++;
42  n -= sizeof(uint16_t);
43  }
44 
45  /* Quad byte copy for aligned address. */
46  while (n >= sizeof(uint32_t)) {
47  *(p_dest.p_qbyte)++ = *(p_src.p_qbyte)++;
48  n -= sizeof(uint32_t);
49  }
50 
51  /* Byte copy for the remaining bytes. */
52  while (n--) {
53  *p_dest.p_byte++ = *p_src.p_byte++;
54  }
55 
56  return dest;
57 }
58 
59 void *spm_memset(void *s, int c, size_t n)
60 {
61  union tfm_mem_addr_t p_mem;
62  uint32_t quad_pattern;
63 
64  p_mem.p_byte = (uint8_t *)s;
65  quad_pattern = (((uint8_t)c) << 24) | (((uint8_t)c) << 16) |
66  (((uint8_t)c) << 8) | ((uint8_t)c);
67 
68  while (n && (p_mem.uint_addr & (sizeof(uint32_t) - 1))) {
69  *p_mem.p_byte++ = (uint8_t)c;
70  n--;
71  }
72 
73  while (n >= sizeof(uint32_t)) {
74  *p_mem.p_qbyte++ = quad_pattern;
75  n -= sizeof(uint32_t);
76  }
77 
78  while (n--) {
79  *p_mem.p_byte++ = (uint8_t)c;
80  }
81 
82  return s;
83 }
uint16_t * p_dbyte
uintptr_t uint_addr
uint32_t * p_qbyte
void * spm_memcpy(void *dest, const void *src, size_t n)
Memory copy function for TF-M core.
void * spm_memset(void *s, int c, size_t n)
Memory set function for TF-M core.
#define GET_MEM_ADDR_BIT1(x)
#define GET_MEM_ADDR_BIT0(x)