Sound Open Firmware
Loading...
Searching...
No Matches
string.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2022 Intel Corporation. All rights reserved.
4 */
5
6#ifndef __ZEPHYR_RTOS_STRING_H__
7#define __ZEPHYR_RTOS_STRING_H__
8
9/* Zephyr uses a C library so lets use it */
10#include <string.h>
11#include <stdint.h>
12#include <stddef.h>
13#include <errno.h>
14
15void *__vec_memcpy(void *dst, const void *src, size_t len);
16void *__vec_memset(void *dest, int data, size_t src_size);
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21/* missing from zephyr - TODO: convert to memset() */
22#define bzero(ptr, size) \
23 memset(ptr, 0, size)
24
25/* TODO: need converted to C library calling conventions */
26static inline int rstrlen(const char *s)
27{
28 return strlen(s);
29}
30
31/* TODO: need converted to C library calling conventions */
32static inline int rstrcmp(const char *s1, const char *s2)
33{
34 return strcmp(s1, s2);
35}
36
37/* C library does not have the "_s" versions used by Windows */
38static inline int memcpy_s(void *dest, size_t dest_size,
39 const void *src, size_t count)
40{
41 if (!dest || !src)
42 return -EINVAL;
43
44 if (count > dest_size)
45 return -EINVAL;
46
47 uintptr_t dest_addr = (uintptr_t)dest;
48 uintptr_t src_addr = (uintptr_t)src;
49
50 /* Check for overflow in pointer arithmetic */
51 if ((dest_addr + dest_size < dest_addr) || (src_addr + count < src_addr))
52 return -EINVAL;
53
54 /* Check for overlap without causing overflow */
55 if ((dest_addr >= src_addr && dest_addr < src_addr + count) ||
56 (src_addr >= dest_addr && src_addr < dest_addr + dest_size))
57 return -EINVAL;
58
59 memcpy(dest, src, count);
60
61 return 0;
62}
63
64static inline int memset_s(void *dest, size_t dest_size, int data, size_t count)
65{
66 if (!dest)
67 return -EINVAL;
68
69 if (count > dest_size)
70 return -EINVAL;
71
72 memset(dest, data, count);
73 /*
74 * Prevent compiler from optimizing away the memset.
75 * Memory barrier prevents dead store elimination.
76 */
77#if defined(CONFIG_XTENSA)
78 __asm__ __volatile__("memw" ::: "memory");
79#endif
80
81 return 0;
82}
83
84#ifdef __cplusplus
85} /* extern "C" */
86#endif
87
88#endif /* __ZEPHYR_RTOS_STRING_H__ */
uint32_t data[]
Definition debug_stream_slot.h:2
void * __vec_memcpy(void *dst, const void *src, size_t len)
static int rstrlen(const char *s)
Definition string.h:26
void * __vec_memset(void *dest, int data, size_t src_size)
static int memset_s(void *dest, size_t dest_size, int data, size_t count)
Definition string.h:64
static int memcpy_s(void *dest, size_t dest_size, const void *src, size_t count)
Definition string.h:38
static int rstrcmp(const char *s1, const char *s2)
Definition string.h:32