AArch64 EL2 hypervisor for QEMU virt that boots at EL2
1#include "hv/string.h"
2
3void *hv_memset(void *dst, int value, size_t len)
4{
5 unsigned char *p = (unsigned char *)dst;
6 while (len-- != 0u) {
7 *p++ = (unsigned char)value;
8 }
9 return dst;
10}
11
12void *hv_memcpy(void *dst, const void *src, size_t len)
13{
14 unsigned char *d = (unsigned char *)dst;
15 const unsigned char *s = (const unsigned char *)src;
16 while (len-- != 0u) {
17 *d++ = *s++;
18 }
19 return dst;
20}
21
22void *hv_memmove(void *dst, const void *src, size_t len)
23{
24 unsigned char *d = (unsigned char *)dst;
25 const unsigned char *s = (const unsigned char *)src;
26 if (d == s || len == 0u) {
27 return dst;
28 }
29 if (d < s) {
30 while (len-- != 0u) {
31 *d++ = *s++;
32 }
33 } else {
34 d += len;
35 s += len;
36 while (len-- != 0u) {
37 *--d = *--s;
38 }
39 }
40 return dst;
41}
42
43int hv_memcmp(const void *a, const void *b, size_t len)
44{
45 const unsigned char *pa = (const unsigned char *)a;
46 const unsigned char *pb = (const unsigned char *)b;
47 for (size_t i = 0; i < len; i++) {
48 if (pa[i] != pb[i]) {
49 return (int)pa[i] - (int)pb[i];
50 }
51 }
52 return 0;
53}
54
55size_t hv_strlen(const char *s)
56{
57 size_t n = 0;
58 while (s[n] != '\0') {
59 n++;
60 }
61 return n;
62}
63
64int hv_strcmp(const char *a, const char *b)
65{
66 while (*a != '\0' && *a == *b) {
67 a++;
68 b++;
69 }
70 return (int)(unsigned char)*a - (int)(unsigned char)*b;
71}
72
73int hv_strncmp(const char *a, const char *b, size_t n)
74{
75 for (size_t i = 0; i < n; i++) {
76 if (a[i] == '\0' || a[i] != b[i]) {
77 return (int)(unsigned char)a[i] - (int)(unsigned char)b[i];
78 }
79 }
80 return 0;
81}
82
83void *memset(void *dst, int value, size_t len)
84{
85 return hv_memset(dst, value, len);
86}
87
88void *memcpy(void *dst, const void *src, size_t len)
89{
90 return hv_memcpy(dst, src, len);
91}
92
93void *memmove(void *dst, const void *src, size_t len)
94{
95 return hv_memmove(dst, src, len);
96}
97
98int memcmp(const void *a, const void *b, size_t len)
99{
100 return hv_memcmp(a, b, len);
101}