1*51e65385Sjmcneill /*	$NetBSD: efirtlib.c,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $	*/
201d0c315Sjakllsch 
301d0c315Sjakllsch /*++
401d0c315Sjakllsch 
501d0c315Sjakllsch Copyright (c) 1999  Intel Corporation
601d0c315Sjakllsch 
701d0c315Sjakllsch Module Name:
801d0c315Sjakllsch 
901d0c315Sjakllsch     EfiRtLib.h
1001d0c315Sjakllsch 
1101d0c315Sjakllsch Abstract:
1201d0c315Sjakllsch 
1301d0c315Sjakllsch     EFI Runtime library functions
1401d0c315Sjakllsch 
1501d0c315Sjakllsch 
1601d0c315Sjakllsch 
1701d0c315Sjakllsch Revision History
1801d0c315Sjakllsch 
1901d0c315Sjakllsch --*/
2001d0c315Sjakllsch 
2101d0c315Sjakllsch #include "efi.h"
2201d0c315Sjakllsch #include "efilib.h"
2301d0c315Sjakllsch #include "efirtlib.h"
2401d0c315Sjakllsch 
2501d0c315Sjakllsch #ifndef __GNUC__
2601d0c315Sjakllsch #pragma RUNTIME_CODE(RtZeroMem)
2701d0c315Sjakllsch #endif
2801d0c315Sjakllsch VOID
2901d0c315Sjakllsch RUNTIMEFUNCTION
RtZeroMem(IN VOID * Buffer,IN UINTN Size)3001d0c315Sjakllsch RtZeroMem (
3101d0c315Sjakllsch     IN VOID     *Buffer,
3201d0c315Sjakllsch     IN UINTN     Size
3301d0c315Sjakllsch     )
3401d0c315Sjakllsch {
3501d0c315Sjakllsch     INT8        *pt;
3601d0c315Sjakllsch 
3701d0c315Sjakllsch     pt = Buffer;
3801d0c315Sjakllsch     while (Size--) {
3901d0c315Sjakllsch         *(pt++) = 0;
4001d0c315Sjakllsch     }
4101d0c315Sjakllsch }
4201d0c315Sjakllsch 
4301d0c315Sjakllsch #ifndef __GNUC__
4401d0c315Sjakllsch #pragma RUNTIME_CODE(RtSetMem)
4501d0c315Sjakllsch #endif
4601d0c315Sjakllsch VOID
4701d0c315Sjakllsch RUNTIMEFUNCTION
RtSetMem(IN VOID * Buffer,IN UINTN Size,IN UINT8 Value)4801d0c315Sjakllsch RtSetMem (
4901d0c315Sjakllsch     IN VOID     *Buffer,
5001d0c315Sjakllsch     IN UINTN    Size,
5101d0c315Sjakllsch     IN UINT8    Value
5201d0c315Sjakllsch     )
5301d0c315Sjakllsch {
5401d0c315Sjakllsch     INT8        *pt;
5501d0c315Sjakllsch 
5601d0c315Sjakllsch     pt = Buffer;
5701d0c315Sjakllsch     while (Size--) {
5801d0c315Sjakllsch         *(pt++) = Value;
5901d0c315Sjakllsch     }
6001d0c315Sjakllsch }
6101d0c315Sjakllsch 
6201d0c315Sjakllsch #ifndef __GNUC__
6301d0c315Sjakllsch #pragma RUNTIME_CODE(RtCopyMem)
6401d0c315Sjakllsch #endif
6501d0c315Sjakllsch VOID
6601d0c315Sjakllsch RUNTIMEFUNCTION
RtCopyMem(IN VOID * Dest,IN CONST VOID * Src,IN UINTN len)6701d0c315Sjakllsch RtCopyMem (
6801d0c315Sjakllsch     IN VOID        *Dest,
69974f52d2Sjmcneill     IN CONST VOID  *Src,
7001d0c315Sjakllsch     IN UINTN       len
7101d0c315Sjakllsch     )
7201d0c315Sjakllsch {
73*51e65385Sjmcneill     CHAR8 *d = (CHAR8*)Dest;
74*51e65385Sjmcneill     CHAR8 *s = (CHAR8*)Src;
75*51e65385Sjmcneill 
76*51e65385Sjmcneill     if (d == NULL || s == NULL || s == d)
77*51e65385Sjmcneill         return;
78*51e65385Sjmcneill 
79*51e65385Sjmcneill     // If the beginning of the destination range overlaps with the end of
80*51e65385Sjmcneill     // the source range, make sure to start the copy from the end so that
81*51e65385Sjmcneill     // we don't end up overwriting source data that we need for the copy.
82*51e65385Sjmcneill     if ((d > s) && (d < s + len)) {
83*51e65385Sjmcneill         for (d += len, s += len; len--; )
84*51e65385Sjmcneill             *--d = *--s;
85*51e65385Sjmcneill     } else {
86*51e65385Sjmcneill         while (len--)
87*51e65385Sjmcneill             *d++ = *s++;
8801d0c315Sjakllsch     }
8901d0c315Sjakllsch }
9001d0c315Sjakllsch 
9101d0c315Sjakllsch #ifndef __GNUC__
9201d0c315Sjakllsch #pragma RUNTIME_CODE(RtCompareMem)
9301d0c315Sjakllsch #endif
9401d0c315Sjakllsch INTN
9501d0c315Sjakllsch RUNTIMEFUNCTION
RtCompareMem(IN CONST VOID * Dest,IN CONST VOID * Src,IN UINTN len)9601d0c315Sjakllsch RtCompareMem (
97974f52d2Sjmcneill     IN CONST VOID     *Dest,
98974f52d2Sjmcneill     IN CONST VOID     *Src,
9901d0c315Sjakllsch     IN UINTN    len
10001d0c315Sjakllsch     )
10101d0c315Sjakllsch {
102974f52d2Sjmcneill     CONST CHAR8    *d = Dest, *s = Src;
10301d0c315Sjakllsch     while (len--) {
10401d0c315Sjakllsch         if (*d != *s) {
10501d0c315Sjakllsch             return *d - *s;
10601d0c315Sjakllsch         }
10701d0c315Sjakllsch 
10801d0c315Sjakllsch         d += 1;
10901d0c315Sjakllsch         s += 1;
11001d0c315Sjakllsch     }
11101d0c315Sjakllsch 
11201d0c315Sjakllsch     return 0;
11301d0c315Sjakllsch }
11401d0c315Sjakllsch 
11501d0c315Sjakllsch #ifndef __GNUC__
11601d0c315Sjakllsch #pragma RUNTIME_CODE(RtCompareGuid)
11701d0c315Sjakllsch #endif
11801d0c315Sjakllsch INTN
11901d0c315Sjakllsch RUNTIMEFUNCTION
RtCompareGuid(IN EFI_GUID * Guid1,IN EFI_GUID * Guid2)12001d0c315Sjakllsch RtCompareGuid (
12101d0c315Sjakllsch     IN EFI_GUID     *Guid1,
12201d0c315Sjakllsch     IN EFI_GUID     *Guid2
12301d0c315Sjakllsch     )
12401d0c315Sjakllsch /*++
12501d0c315Sjakllsch 
12601d0c315Sjakllsch Routine Description:
12701d0c315Sjakllsch 
12801d0c315Sjakllsch     Compares to GUIDs
12901d0c315Sjakllsch 
13001d0c315Sjakllsch Arguments:
13101d0c315Sjakllsch 
13201d0c315Sjakllsch     Guid1       - guid to compare
13301d0c315Sjakllsch     Guid2       - guid to compare
13401d0c315Sjakllsch 
13501d0c315Sjakllsch Returns:
13601d0c315Sjakllsch     = 0     if Guid1 == Guid2
13701d0c315Sjakllsch 
13801d0c315Sjakllsch --*/
13901d0c315Sjakllsch {
14001d0c315Sjakllsch     INT32       *g1, *g2, r;
14101d0c315Sjakllsch 
14201d0c315Sjakllsch     //
14301d0c315Sjakllsch     // Compare 32 bits at a time
14401d0c315Sjakllsch     //
14501d0c315Sjakllsch 
14601d0c315Sjakllsch     g1 = (INT32 *) Guid1;
14701d0c315Sjakllsch     g2 = (INT32 *) Guid2;
14801d0c315Sjakllsch 
14901d0c315Sjakllsch     r  = g1[0] - g2[0];
15001d0c315Sjakllsch     r |= g1[1] - g2[1];
15101d0c315Sjakllsch     r |= g1[2] - g2[2];
15201d0c315Sjakllsch     r |= g1[3] - g2[3];
15301d0c315Sjakllsch 
15401d0c315Sjakllsch     return r;
15501d0c315Sjakllsch }
15601d0c315Sjakllsch 
15701d0c315Sjakllsch 
158