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