xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/lib/runtime/efirtlib.c (revision 1eb4b21779cd330f45cea12cb60eb09e852039cb)
1 /*	$NetBSD: efirtlib.c,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $	*/
2 
3 /*++
4 
5 Copyright (c) 1999  Intel Corporation
6 
7 Module Name:
8 
9     EfiRtLib.h
10 
11 Abstract:
12 
13     EFI Runtime library functions
14 
15 
16 
17 Revision History
18 
19 --*/
20 
21 #include "efi.h"
22 #include "efilib.h"
23 #include "efirtlib.h"
24 
25 #ifndef __GNUC__
26 #pragma RUNTIME_CODE(RtZeroMem)
27 #endif
28 VOID
29 RUNTIMEFUNCTION
RtZeroMem(IN VOID * Buffer,IN UINTN Size)30 RtZeroMem (
31     IN VOID     *Buffer,
32     IN UINTN     Size
33     )
34 {
35     INT8        *pt;
36 
37     pt = Buffer;
38     while (Size--) {
39         *(pt++) = 0;
40     }
41 }
42 
43 #ifndef __GNUC__
44 #pragma RUNTIME_CODE(RtSetMem)
45 #endif
46 VOID
47 RUNTIMEFUNCTION
RtSetMem(IN VOID * Buffer,IN UINTN Size,IN UINT8 Value)48 RtSetMem (
49     IN VOID     *Buffer,
50     IN UINTN    Size,
51     IN UINT8    Value
52     )
53 {
54     INT8        *pt;
55 
56     pt = Buffer;
57     while (Size--) {
58         *(pt++) = Value;
59     }
60 }
61 
62 #ifndef __GNUC__
63 #pragma RUNTIME_CODE(RtCopyMem)
64 #endif
65 VOID
66 RUNTIMEFUNCTION
RtCopyMem(IN VOID * Dest,IN CONST VOID * Src,IN UINTN len)67 RtCopyMem (
68     IN VOID        *Dest,
69     IN CONST VOID  *Src,
70     IN UINTN       len
71     )
72 {
73     CHAR8 *d = (CHAR8*)Dest;
74     CHAR8 *s = (CHAR8*)Src;
75 
76     if (d == NULL || s == NULL || s == d)
77         return;
78 
79     // If the beginning of the destination range overlaps with the end of
80     // the source range, make sure to start the copy from the end so that
81     // we don't end up overwriting source data that we need for the copy.
82     if ((d > s) && (d < s + len)) {
83         for (d += len, s += len; len--; )
84             *--d = *--s;
85     } else {
86         while (len--)
87             *d++ = *s++;
88     }
89 }
90 
91 #ifndef __GNUC__
92 #pragma RUNTIME_CODE(RtCompareMem)
93 #endif
94 INTN
95 RUNTIMEFUNCTION
RtCompareMem(IN CONST VOID * Dest,IN CONST VOID * Src,IN UINTN len)96 RtCompareMem (
97     IN CONST VOID     *Dest,
98     IN CONST VOID     *Src,
99     IN UINTN    len
100     )
101 {
102     CONST CHAR8    *d = Dest, *s = Src;
103     while (len--) {
104         if (*d != *s) {
105             return *d - *s;
106         }
107 
108         d += 1;
109         s += 1;
110     }
111 
112     return 0;
113 }
114 
115 #ifndef __GNUC__
116 #pragma RUNTIME_CODE(RtCompareGuid)
117 #endif
118 INTN
119 RUNTIMEFUNCTION
RtCompareGuid(IN EFI_GUID * Guid1,IN EFI_GUID * Guid2)120 RtCompareGuid (
121     IN EFI_GUID     *Guid1,
122     IN EFI_GUID     *Guid2
123     )
124 /*++
125 
126 Routine Description:
127 
128     Compares to GUIDs
129 
130 Arguments:
131 
132     Guid1       - guid to compare
133     Guid2       - guid to compare
134 
135 Returns:
136     = 0     if Guid1 == Guid2
137 
138 --*/
139 {
140     INT32       *g1, *g2, r;
141 
142     //
143     // Compare 32 bits at a time
144     //
145 
146     g1 = (INT32 *) Guid1;
147     g2 = (INT32 *) Guid2;
148 
149     r  = g1[0] - g2[0];
150     r |= g1[1] - g2[1];
151     r |= g1[2] - g2[2];
152     r |= g1[3] - g2[3];
153 
154     return r;
155 }
156 
157 
158