Fork TF-A's libc
Create a fork of "Trusted Firmware-A" libc to be used by
trusted-services SWd components.
URL: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
SHA: f2735ebccf5173f74c0458736ec526276106097e
Paths: trusted-firmware-a/lib/libc and trusted-firmware-a/include/lib/libc
Signed-off-by: Gabor Ambrus <gabor.ambrus@arm.com>
Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: I2f3b6cbf739265c4441fbba06ea6c9db339022c4
diff --git a/components/common/libc/src/memcpy_s.c b/components/common/libc/src/memcpy_s.c
new file mode 100644
index 0000000..26953bf
--- /dev/null
+++ b/components/common/libc/src/memcpy_s.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2023, Intel Corporation. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <errno.h>
+#include <stddef.h>
+#include <string.h>
+
+int memcpy_s(void *dst, size_t dsize, void *src, size_t ssize)
+{
+ unsigned int *s = (unsigned int *)src;
+ unsigned int *d = (unsigned int *)dst;
+
+ /*
+ * Check source and destination size is NULL
+ */
+ if ((dst == NULL) || (src == NULL)) {
+ return -ENOMEM;
+ }
+
+ /*
+ * Check source and destination size validity
+ */
+ if ((dsize == 0) || (ssize == 0)) {
+ return -ERANGE;
+ }
+
+ /*
+ * Check both source and destination size range
+ */
+ if ((ssize > dsize) || (dsize > ssize)) {
+ return -EINVAL;
+ }
+
+ /*
+ * Check both source and destination address overlapping
+ * When (s > d < s + ssize)
+ * Or (d > s < d + dsize)
+ */
+
+ if (d > s) {
+ if ((d) < (s + ssize)) {
+ return -EOPNOTSUPP;
+ }
+ }
+
+ if (s > d) {
+ if ((s) < (d + dsize)) {
+ return -EOPNOTSUPP;
+ }
+ }
+
+ /*
+ * Start copy process when there is no error
+ */
+ while (ssize--) {
+ d[ssize] = s[ssize];
+ }
+
+ return 0;
+}