blob: 01e88b01870dc5d62d1104937e32b84dc123d278 [file] [log] [blame]
Jit Loon Lim410c4512023-05-28 16:33:28 +08001/*
2 * Copyright (c) 2013-2023, ARM Limited and Contributors. All rights reserved.
3 * Copyright (c) 2023, Intel Corporation. All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#include <errno.h>
9#include <stddef.h>
10#include <string.h>
11
12int memcpy_s(void *dst, size_t dsize, void *src, size_t ssize)
13{
14 unsigned int *s = (unsigned int *)src;
15 unsigned int *d = (unsigned int *)dst;
16
17 /*
18 * Check source and destination size is NULL
19 */
20 if ((dst == NULL) || (src == NULL)) {
21 return -ENOMEM;
22 }
23
24 /*
25 * Check source and destination size validity
26 */
27 if ((dsize == 0) || (ssize == 0)) {
28 return -ERANGE;
29 }
30
31 /*
32 * Check both source and destination size range
33 */
34 if ((ssize > dsize) || (dsize > ssize)) {
35 return -EINVAL;
36 }
37
38 /*
39 * Check both source and destination address overlapping
40 * When (s > d < s + ssize)
41 * Or (d > s < d + dsize)
42 */
43
44 if (d > s) {
45 if ((d) < (s + ssize)) {
46 return -EOPNOTSUPP;
47 }
48 }
49
50 if (s > d) {
51 if ((s) < (d + dsize)) {
52 return -EOPNOTSUPP;
53 }
54 }
55
56 /*
57 * Start copy process when there is no error
58 */
59 while (ssize--) {
60 d[ssize] = s[ssize];
61 }
62
63 return 0;
64}