Merge pull request #25 from gmbr3/RuntimeError

Multiple fixes
This commit is contained in:
Nigel Croxon 2024-05-20 09:02:57 -04:00 committed by GitHub
commit 34754d941f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 787 additions and 623 deletions

View File

@ -69,7 +69,7 @@ TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi t7.efi t8.efi \
tcc.efi printenv.efi modelist.efi route80h.efi route80h.efi \
drv0_use.efi AllocPages.efi exit.efi FreePages.efi bltgrid.efi \
lfbgrid.efi setdbg.efi unsetdbg.efi ctors_test.efi \
ctors_dtors_priority_test.efi
ctors_dtors_priority_test.efi old_ABI.efi
ifeq ($(IS_MINGW32),)
TARGET_APPS += setjmp.efi debughook.efi debughook.efi.debug
endif

View File

@ -1,29 +1,29 @@
#include <efi.h>
#include <efilib.h>
// 101 in init_array, 65434 in ctors
static void __attribute__((constructor(101))) EFI_NO_TAIL_CALL ctors101() {
Print(L"1) ctor with lower numbered priority \r\n");
}
// 65434 in init_array, 101 in ctors
static void __attribute__((constructor(65434))) EFI_NO_TAIL_CALL ctors65434() {
Print(L"2) ctor with higher numbered priority \r\n");
}
// 101 in fini_array, 65434 in dtors
static void __attribute__((destructor(101))) EFI_NO_TAIL_CALL dtors101() {
Print(L"4) dtor with lower numbered priority \r\n");
}
// 65434 in fini_array, 101 in dtors
static void __attribute__((destructor(65434))) EFI_NO_TAIL_CALL dtors65434() {
Print(L"3) dtor with higher numbered priority \r\n");
}
EFI_STATUS
efi_main (EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED)
{
Print(L"Main function \r\n");
return EFI_SUCCESS;
}
#include <efi.h>
#include <efilib.h>
// 101 in init_array, 65434 in ctors
static void __attribute__((constructor(101))) EFI_NO_TAIL_CALL ctors101() {
Print(L"1) ctor with lower numbered priority \r\n");
}
// 65434 in init_array, 101 in ctors
static void __attribute__((constructor(65434))) EFI_NO_TAIL_CALL ctors65434() {
Print(L"2) ctor with higher numbered priority \r\n");
}
// 101 in fini_array, 65434 in dtors
static void __attribute__((destructor(101))) EFI_NO_TAIL_CALL dtors101() {
Print(L"4) dtor with lower numbered priority \r\n");
}
// 65434 in fini_array, 101 in dtors
static void __attribute__((destructor(65434))) EFI_NO_TAIL_CALL dtors65434() {
Print(L"3) dtor with higher numbered priority \r\n");
}
EFI_STATUS
efi_main (EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED)
{
Print(L"Main function \r\n");
return EFI_SUCCESS;
}

22
apps/old_ABI.c Normal file
View File

@ -0,0 +1,22 @@
#define GNU_EFI_USE_REALLOCATEPOOL_ABI 0
#define GNU_EFI_USE_COPYMEM_ABI 0
#include <efi.h>
#include <efilib.h>
EFI_STATUS
efi_main (EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED)
{
CHAR16 *Dest = 0;
EFI_UNUSED CHAR16 *Copy = 0;
UINTN test_str_size = 0;
CONST CHAR16 *test_str = L"Hello World!";
test_str_size = StrSize(test_str);
Dest = AllocatePool(test_str_size);
CopyMem(Dest, test_str, test_str_size);
Copy = ReallocatePool(Dest, test_str_size, test_str_size+10);
Print(L"Done!\r\n");
return EFI_SUCCESS;
}

View File

@ -46,6 +46,37 @@ FILES = reloc_$(ARCH)
OBJS = $(FILES:%=%.o)
ifneq ($(HAVE_EFI_OBJCOPY),)
gnu_efi_default_is_objcopy=true
else
gnu_efi_default_is_objcopy=false
endif
# https://uefi.org/specs/UEFI/2.10/03_Boot_Manager.html#uefi-image-types
ifeq ($(ARCH),x86_64)
efi_machine_type_name=x64
endif
ifeq ($(ARCH),ia32)
efi_machine_type_name=ia32
endif
ifeq ($(ARCH),arm)
efi_machine_type_name=arm
endif
ifeq ($(ARCH),aarch64)
efi_machine_type_name=aa64
endif
ifeq ($(ARCH),ia64)
efi_machine_type_name=ia64
endif
ifeq ($(ARCH),riscv64)
efi_machine_type_name=riscv64
endif
ifeq ($(ARCH),loongarch64)
efi_machine_type_name=loongarch64
endif
ifeq ($(ARCH),mips64el)
efi_machine_type_name=mips64
endif
# on aarch64, avoid jump tables before all relocations have been processed
reloc_aarch64.o: CFLAGS += -fno-jump-tables
@ -63,6 +94,9 @@ gnu-efi.pc:
-e 's:@INCLUDEDIR@:$(INCLUDEDIR):g' \
-e 's:@LIBDIR@:$(LIBDIR):g' \
-e 's:@VERSION@:$(VERSION):g' \
-e 's:@efi_machine_type_name@:$(efi_machine_type_name):g' \
-e 's:@gnu_efi_arch@:$(ARCH):g' \
-e 's:@gnu_efi_default_is_objcopy@:$(gnu_efi_default_is_objcopy):g' \
$(SRCDIR)/gnu-efi.pc.in > gnu-efi.pc

View File

@ -1,10 +1,13 @@
prefix=@PREFIX@
exec_prefix=@EXEC_PREFIX@
includedir=@INCLUDEDIR@
libdir=@LIBDIR@
Name: gnu-efi
Description: EFI development toolkit
Version: @VERSION@
Cflags: -I${includedir}/efi
Libs: -lefi
prefix=@PREFIX@
exec_prefix=@EXEC_PREFIX@
includedir=@INCLUDEDIR@
libdir=@LIBDIR@
efi_machine_type_name=@efi_machine_type_name@
gnu_efi_arch=@gnu_efi_arch@
gnu_efi_default_is_objcopy=@gnu_efi_default_is_objcopy@
Name: gnu-efi
Description: EFI development toolkit
Version: @VERSION@
Cflags: -I${includedir}/efi
Libs: -lefi

View File

@ -64,6 +64,7 @@ extern "C" {
#include "eficompiler.h"
#include "efidef.h"
#include "legacy.h"
#include "efidevp.h"
#include "efipciio.h"
#include "efiprot.h"

View File

@ -297,12 +297,19 @@ SetMem (
);
VOID EFIAPI
CopyMem (
CopyMem_1 (
IN VOID *Dest,
IN VOID *Src,
IN UINTN len
);
VOID EFIAPI
CopyMemC (
IN VOID *Dest,
IN CONST VOID *Src,
IN UINTN len
);
INTN
CompareMem (
IN CONST VOID *Dest,
@ -505,11 +512,12 @@ AllocateZeroPool (
);
VOID *
ReallocatePool (
IN VOID *OldPool,
IN UINTN OldSize,
IN UINTN NewSize
);
EFIAPI
ReallocatePool_1 (
IN UINTN OldSize,
IN UINTN NewSize,
IN VOID *OldPool OPTIONAL
);
VOID
FreePool (

View File

@ -1,115 +1,115 @@
/* Copyright (C) 2014 by John Cronin
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef _EFI_POINT_H
#define _EFI_POINT_H
#define EFI_SIMPLE_POINTER_PROTOCOL_GUID \
{ 0x31878c87, 0xb75, 0x11d5, { 0x9a, 0x4f, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
INTERFACE_DECL(_EFI_SIMPLE_POINTER);
typedef struct {
INT32 RelativeMovementX;
INT32 RelativeMovementY;
INT32 RelativeMovementZ;
BOOLEAN LeftButton;
BOOLEAN RightButton;
} EFI_SIMPLE_POINTER_STATE;
typedef struct {
UINT64 ResolutionX;
UINT64 ResolutionY;
UINT64 ResolutionZ;
BOOLEAN LeftButton;
BOOLEAN RightButton;
} EFI_SIMPLE_POINTER_MODE;
typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_POINTER_RESET) (
IN struct _EFI_SIMPLE_POINTER *This,
IN BOOLEAN ExtendedVerification
);
typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_POINTER_GET_STATE) (
IN struct _EFI_SIMPLE_POINTER *This,
IN OUT EFI_SIMPLE_POINTER_STATE *State
);
typedef struct _EFI_SIMPLE_POINTER {
EFI_SIMPLE_POINTER_RESET Reset;
EFI_SIMPLE_POINTER_GET_STATE GetState;
EFI_EVENT WaitForInput;
EFI_SIMPLE_POINTER_MODE *Mode;
} EFI_SIMPLE_POINTER_PROTOCOL;
#define EFI_ABSOLUTE_POINTER_PROTOCOL_GUID \
{ 0x8D59D32B, 0xC655, 0x4AE9, { 0x9B, 0x15, 0xF2, 0x59, 0x04, 0x99, 0x2A, 0x43 } }
INTERFACE_DECL(_EFI_ABSOLUTE_POINTER_PROTOCOL);
typedef struct {
UINT64 AbsoluteMinX;
UINT64 AbsoluteMinY;
UINT64 AbsoluteMinZ;
UINT64 AbsoluteMaxX;
UINT64 AbsoluteMaxY;
UINT64 AbsoluteMaxZ;
UINT32 Attributes;
} EFI_ABSOLUTE_POINTER_MODE;
typedef struct {
UINT64 CurrentX;
UINT64 CurrentY;
UINT64 CurrentZ;
UINT32 ActiveButtons;
} EFI_ABSOLUTE_POINTER_STATE;
#define EFI_ABSP_SupportsAltActive 0x00000001
#define EFI_ABSP_SupportsPressureAsZ 0x00000002
#define EFI_ABSP_TouchActive 0x00000001
#define EFI_ABS_AltActive 0x00000002
typedef
EFI_STATUS
(EFIAPI *EFI_ABSOLUTE_POINTER_RESET) (
IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This,
IN BOOLEAN ExtendedVerification
);
typedef
EFI_STATUS
(EFIAPI *EFI_ABSOLUTE_POINTER_GET_STATE) (
IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This,
IN OUT EFI_ABSOLUTE_POINTER_STATE *State
);
typedef struct _EFI_ABSOLUTE_POINTER_PROTOCOL {
EFI_ABSOLUTE_POINTER_RESET Reset;
EFI_ABSOLUTE_POINTER_GET_STATE GetState;
EFI_EVENT WaitForInput;
EFI_ABSOLUTE_POINTER_MODE *Mode;
} EFI_ABSOLUTE_POINTER_PROTOCOL;
#endif
/* Copyright (C) 2014 by John Cronin
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef _EFI_POINT_H
#define _EFI_POINT_H
#define EFI_SIMPLE_POINTER_PROTOCOL_GUID \
{ 0x31878c87, 0xb75, 0x11d5, { 0x9a, 0x4f, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
INTERFACE_DECL(_EFI_SIMPLE_POINTER);
typedef struct {
INT32 RelativeMovementX;
INT32 RelativeMovementY;
INT32 RelativeMovementZ;
BOOLEAN LeftButton;
BOOLEAN RightButton;
} EFI_SIMPLE_POINTER_STATE;
typedef struct {
UINT64 ResolutionX;
UINT64 ResolutionY;
UINT64 ResolutionZ;
BOOLEAN LeftButton;
BOOLEAN RightButton;
} EFI_SIMPLE_POINTER_MODE;
typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_POINTER_RESET) (
IN struct _EFI_SIMPLE_POINTER *This,
IN BOOLEAN ExtendedVerification
);
typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_POINTER_GET_STATE) (
IN struct _EFI_SIMPLE_POINTER *This,
IN OUT EFI_SIMPLE_POINTER_STATE *State
);
typedef struct _EFI_SIMPLE_POINTER {
EFI_SIMPLE_POINTER_RESET Reset;
EFI_SIMPLE_POINTER_GET_STATE GetState;
EFI_EVENT WaitForInput;
EFI_SIMPLE_POINTER_MODE *Mode;
} EFI_SIMPLE_POINTER_PROTOCOL;
#define EFI_ABSOLUTE_POINTER_PROTOCOL_GUID \
{ 0x8D59D32B, 0xC655, 0x4AE9, { 0x9B, 0x15, 0xF2, 0x59, 0x04, 0x99, 0x2A, 0x43 } }
INTERFACE_DECL(_EFI_ABSOLUTE_POINTER_PROTOCOL);
typedef struct {
UINT64 AbsoluteMinX;
UINT64 AbsoluteMinY;
UINT64 AbsoluteMinZ;
UINT64 AbsoluteMaxX;
UINT64 AbsoluteMaxY;
UINT64 AbsoluteMaxZ;
UINT32 Attributes;
} EFI_ABSOLUTE_POINTER_MODE;
typedef struct {
UINT64 CurrentX;
UINT64 CurrentY;
UINT64 CurrentZ;
UINT32 ActiveButtons;
} EFI_ABSOLUTE_POINTER_STATE;
#define EFI_ABSP_SupportsAltActive 0x00000001
#define EFI_ABSP_SupportsPressureAsZ 0x00000002
#define EFI_ABSP_TouchActive 0x00000001
#define EFI_ABS_AltActive 0x00000002
typedef
EFI_STATUS
(EFIAPI *EFI_ABSOLUTE_POINTER_RESET) (
IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This,
IN BOOLEAN ExtendedVerification
);
typedef
EFI_STATUS
(EFIAPI *EFI_ABSOLUTE_POINTER_GET_STATE) (
IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This,
IN OUT EFI_ABSOLUTE_POINTER_STATE *State
);
typedef struct _EFI_ABSOLUTE_POINTER_PROTOCOL {
EFI_ABSOLUTE_POINTER_RESET Reset;
EFI_ABSOLUTE_POINTER_GET_STATE GetState;
EFI_EVENT WaitForInput;
EFI_ABSOLUTE_POINTER_MODE *Mode;
} EFI_ABSOLUTE_POINTER_PROTOCOL;
#endif

View File

@ -62,6 +62,15 @@ RtCopyMem (
IN UINTN len
);
VOID
EFIAPI
RUNTIMEFUNCTION
RtCopyMemC (
IN VOID *Dest,
IN CONST VOID *Src,
IN UINTN len
);
INTN
RUNTIMEFUNCTION
RtCompareMem (

View File

@ -1,94 +1,94 @@
/** @file
SHELL_INTERFACE_PROTOCOL from EDK shell (no spec).
Shell Interface - additional information (over image_info) provided
to an application started by the shell.
ConIo provides a file-style interface to the console.
The shell interface's and data (including ConIo) are only valid during
the applications Entry Point. Once the application returns from it's
entry point the data is freed by the invoking shell.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
/*
* This is based on ShellPkg/Include/Protocol/EfiShellInterface.h from EDK II.
*/
#ifndef _SHELLINTERFACE_H_
#define _SHELLINTERFACE_H_
#define SHELL_INTERFACE_PROTOCOL_GUID \
{ \
0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} \
}
///
/// Bit definitions for EFI_SHELL_ARG_INFO
///
typedef enum {
ARG_NO_ATTRIB = 0x0,
ARG_IS_QUOTED = 1<<0,
ARG_PARTIALLY_QUOTED = 1<<1,
ARG_FIRST_HALF_QUOTED = 1<<2,
ARG_FIRST_CHAR_IS_ESC = 1<<3
} EFI_SHELL_ARG_INFO_TYPES;
///
/// Attributes for an argument.
///
typedef struct _EFI_SHELL_ARG_INFO {
UINT32 Attributes;
} EFI_SHELL_ARG_INFO;
///
/// This protocol provides access to additional information about a shell application.
///
typedef struct {
///
/// Handle back to original image handle & image information.
///
EFI_HANDLE ImageHandle;
EFI_LOADED_IMAGE *Info;
///
/// Parsed arg list converted more C-like format.
///
CHAR16 **Argv;
UINTN Argc;
///
/// Storage for file redirection args after parsing.
///
CHAR16 **RedirArgv;
UINTN RedirArgc;
///
/// A file style handle for console io.
///
EFI_FILE *StdIn;
EFI_FILE *StdOut;
EFI_FILE *StdErr;
///
/// List of attributes for each argument.
///
EFI_SHELL_ARG_INFO *ArgInfo;
///
/// Whether we are echoing.
///
BOOLEAN EchoOn;
} EFI_SHELL_INTERFACE;
#endif
/** @file
SHELL_INTERFACE_PROTOCOL from EDK shell (no spec).
Shell Interface - additional information (over image_info) provided
to an application started by the shell.
ConIo provides a file-style interface to the console.
The shell interface's and data (including ConIo) are only valid during
the applications Entry Point. Once the application returns from it's
entry point the data is freed by the invoking shell.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
/*
* This is based on ShellPkg/Include/Protocol/EfiShellInterface.h from EDK II.
*/
#ifndef _SHELLINTERFACE_H_
#define _SHELLINTERFACE_H_
#define SHELL_INTERFACE_PROTOCOL_GUID \
{ \
0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} \
}
///
/// Bit definitions for EFI_SHELL_ARG_INFO
///
typedef enum {
ARG_NO_ATTRIB = 0x0,
ARG_IS_QUOTED = 1<<0,
ARG_PARTIALLY_QUOTED = 1<<1,
ARG_FIRST_HALF_QUOTED = 1<<2,
ARG_FIRST_CHAR_IS_ESC = 1<<3
} EFI_SHELL_ARG_INFO_TYPES;
///
/// Attributes for an argument.
///
typedef struct _EFI_SHELL_ARG_INFO {
UINT32 Attributes;
} EFI_SHELL_ARG_INFO;
///
/// This protocol provides access to additional information about a shell application.
///
typedef struct {
///
/// Handle back to original image handle & image information.
///
EFI_HANDLE ImageHandle;
EFI_LOADED_IMAGE *Info;
///
/// Parsed arg list converted more C-like format.
///
CHAR16 **Argv;
UINTN Argc;
///
/// Storage for file redirection args after parsing.
///
CHAR16 **RedirArgv;
UINTN RedirArgc;
///
/// A file style handle for console io.
///
EFI_FILE *StdIn;
EFI_FILE *StdOut;
EFI_FILE *StdErr;
///
/// List of attributes for each argument.
///
EFI_SHELL_ARG_INFO *ArgInfo;
///
/// Whether we are echoing.
///
BOOLEAN EchoOn;
} EFI_SHELL_INTERFACE;
#endif

View File

@ -1,23 +1,23 @@
INC_DEPS = $(INC_DEPS) \
efi.h \
efiapi.h \
efibind.h \
eficon.h \
efidebug.h \
efidef.h \
efidevp.h \
efierr.h \
efifs.h \
efilib.h \
efipart.h \
efipciio.h \
efiprot.h \
efipxe.h \
efivar.h \
pe.h \
INC_DEPS = $(INC_DEPS) \
efi.h \
efiapi.h \
efibind.h \
eficon.h \
efidebug.h \
efidef.h \
efidevp.h \
efierr.h \
efifs.h \
efilib.h \
efipart.h \
efipciio.h \
efiprot.h \
efipxe.h \
efivar.h \
pe.h \
efiip.h \
efiudp.h \
efitcp.h \
stdarg.h
stdarg.h

60
inc/legacy.h Normal file
View File

@ -0,0 +1,60 @@
#ifndef _EFI_LEGACY_H
#define _EFI_LEGACY_H
/*
ABIs:
Default ABI will be highest number
Older versions can be selected via compiler defines
*/
/* ReallocatePool */
#ifndef GNU_EFI_USE_REALLOCATEPOOL_ABI
#define GNU_EFI_USE_REALLOCATEPOOL_ABI 1
#endif
#if GNU_EFI_USE_REALLOCATEPOOL_ABI == 0
#define ReallocatePool ReallocatePool_0
#else
#define ReallocatePool ReallocatePool_1
#endif
/* prevent circular headers */
VOID *
EFIAPI
ReallocatePool_1 (
IN UINTN OldSize,
IN UINTN NewSize,
IN VOID *OldPool OPTIONAL
);
inline
VOID *
EFIAPI
ReallocatePool_0 (
IN VOID *OldPool,
IN UINTN OldSize,
IN UINTN NewSize
)
{
return ReallocatePool_1(OldSize, NewSize, OldPool);
}
/* end ReallocatePool */
/* CopyMem */
/* CopyMemC isn't deprecated - serves different purpose to CopyMem */
#ifndef GNU_EFI_USE_COPYMEM_ABI
#define GNU_EFI_USE_COPYMEM_ABI 1
#endif
#if GNU_EFI_USE_COPYMEM_ABI == 0
#define CopyMem CopyMemC
#else
#define CopyMem CopyMem_1
#endif
/* end CopyMem */
#endif

View File

@ -1,33 +1,33 @@
#
#
#
[sources]
efi.h
efiapi.h
eficon.h
efidebug.h
efidef.h
efidevp.h
efierr.h
efifs.h
efilib.h
efipart.h
efipciio.h
efiprot.h
efipxebc.h
efistdarg.h
efinet.h
#
#
#
[sources]
efi.h
efiapi.h
eficon.h
efidebug.h
efidef.h
efidevp.h
efierr.h
efifs.h
efilib.h
efipart.h
efipciio.h
efiprot.h
efipxebc.h
efistdarg.h
efinet.h
efiip.h
efiudp.h
efitcp.h
[ia32sources]
efibind.h
pe.h
efilibplat.h
[ia64sources]
efibind.h
pe.h
efilibplat.h
[ia32sources]
efibind.h
pe.h
efilibplat.h
[ia64sources]
efibind.h
pe.h
efilibplat.h

View File

@ -1,48 +1,48 @@
#
# This is a machine generated file - DO NOT EDIT
# Generated by genmake.exe
# Generated from make.inf
# Copyright (c) 1998 Intel Corporation
#
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\efi.h \
$(SDK_INSTALL_DIR)\include\efi\efiapi.h \
$(SDK_INSTALL_DIR)\include\efi\eficon.h \
$(SDK_INSTALL_DIR)\include\efi\efidebug.h \
$(SDK_INSTALL_DIR)\include\efi\efidef.h \
$(SDK_INSTALL_DIR)\include\efi\efidevp.h \
$(SDK_INSTALL_DIR)\include\efi\efierr.h \
$(SDK_INSTALL_DIR)\include\efi\efifs.h \
$(SDK_INSTALL_DIR)\include\efi\efilib.h \
$(SDK_INSTALL_DIR)\include\efi\efipart.h \
$(SDK_INSTALL_DIR)\include\efi\efipciio.h \
$(SDK_INSTALL_DIR)\include\efi\efiprot.h \
$(SDK_INSTALL_DIR)\include\efi\efipxebc.h \
$(SDK_INSTALL_DIR)\include\efi\efistdarg.h \
$(SDK_INSTALL_DIR)\include\efi\efinet.h \
#
# This is a machine generated file - DO NOT EDIT
# Generated by genmake.exe
# Generated from make.inf
# Copyright (c) 1998 Intel Corporation
#
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\efi.h \
$(SDK_INSTALL_DIR)\include\efi\efiapi.h \
$(SDK_INSTALL_DIR)\include\efi\eficon.h \
$(SDK_INSTALL_DIR)\include\efi\efidebug.h \
$(SDK_INSTALL_DIR)\include\efi\efidef.h \
$(SDK_INSTALL_DIR)\include\efi\efidevp.h \
$(SDK_INSTALL_DIR)\include\efi\efierr.h \
$(SDK_INSTALL_DIR)\include\efi\efifs.h \
$(SDK_INSTALL_DIR)\include\efi\efilib.h \
$(SDK_INSTALL_DIR)\include\efi\efipart.h \
$(SDK_INSTALL_DIR)\include\efi\efipciio.h \
$(SDK_INSTALL_DIR)\include\efi\efiprot.h \
$(SDK_INSTALL_DIR)\include\efi\efipxebc.h \
$(SDK_INSTALL_DIR)\include\efi\efistdarg.h \
$(SDK_INSTALL_DIR)\include\efi\efinet.h \
$(SDK_INSTALL_DIR)\include\efi\efiip.h \
$(SDK_INSTALL_DIR)\include\efi\efiudp.h \
$(SDK_INSTALL_DIR)\include\efi\efitcp.h \
!IF "$(PROCESSOR)" == "Ia32"
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\Ia32\efibind.h \
$(SDK_INSTALL_DIR)\include\efi\Ia32\pe.h \
$(SDK_INSTALL_DIR)\include\efi\Ia32\efilibplat.h \
!ENDIF
!IF "$(PROCESSOR)" == "Ia64"
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\Ia64\efibind.h \
$(SDK_INSTALL_DIR)\include\efi\Ia64\pe.h \
$(SDK_INSTALL_DIR)\include\efi\Ia64\efilibplat.h \
!ENDIF
!IF "$(PROCESSOR)" == "Ia32"
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\Ia32\efibind.h \
$(SDK_INSTALL_DIR)\include\efi\Ia32\pe.h \
$(SDK_INSTALL_DIR)\include\efi\Ia32\efilibplat.h \
!ENDIF
!IF "$(PROCESSOR)" == "Ia64"
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\Ia64\efibind.h \
$(SDK_INSTALL_DIR)\include\efi\Ia64\pe.h \
$(SDK_INSTALL_DIR)\include\efi\Ia64\efilibplat.h \
!ENDIF

View File

@ -1,208 +1,208 @@
/*
* Copyright (c) 1999, 2000
* Intel Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
*
* This product includes software developed by Intel Corporation and
* its contributors.
*
* 4. Neither the name of Intel Corporation or its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef _EFICONTEXT_H_
#define _EFICONTEXT_H_
//
// IA-64 processor exception types
//
#define EXCPT_ALT_DTLB 4
#define EXCPT_DNESTED_TLB 5
#define EXCPT_BREAKPOINT 11
#define EXCPT_EXTERNAL_INTERRUPT 12
#define EXCPT_GEN_EXCEPT 24
#define EXCPT_NAT_CONSUMPTION 26
#define EXCPT_DEBUG_EXCEPT 29
#define EXCPT_UNALIGNED_ACCESS 30
#define EXCPT_FP_FAULT 32
#define EXCPT_FP_TRAP 33
#define EXCPT_TAKEN_BRANCH 35
#define EXCPT_SINGLE_STEP 36
//
// IA-64 processor context definition - must be 512 byte aligned!!!
//
typedef
struct {
UINT64 reserved; // necessary to preserve alignment for the correct bits in UNAT and to insure F2 is 16 byte aligned...
UINT64 r1;
UINT64 r2;
UINT64 r3;
UINT64 r4;
UINT64 r5;
UINT64 r6;
UINT64 r7;
UINT64 r8;
UINT64 r9;
UINT64 r10;
UINT64 r11;
UINT64 r12;
UINT64 r13;
UINT64 r14;
UINT64 r15;
UINT64 r16;
UINT64 r17;
UINT64 r18;
UINT64 r19;
UINT64 r20;
UINT64 r21;
UINT64 r22;
UINT64 r23;
UINT64 r24;
UINT64 r25;
UINT64 r26;
UINT64 r27;
UINT64 r28;
UINT64 r29;
UINT64 r30;
UINT64 r31;
UINT64 f2[2];
UINT64 f3[2];
UINT64 f4[2];
UINT64 f5[2];
UINT64 f6[2];
UINT64 f7[2];
UINT64 f8[2];
UINT64 f9[2];
UINT64 f10[2];
UINT64 f11[2];
UINT64 f12[2];
UINT64 f13[2];
UINT64 f14[2];
UINT64 f15[2];
UINT64 f16[2];
UINT64 f17[2];
UINT64 f18[2];
UINT64 f19[2];
UINT64 f20[2];
UINT64 f21[2];
UINT64 f22[2];
UINT64 f23[2];
UINT64 f24[2];
UINT64 f25[2];
UINT64 f26[2];
UINT64 f27[2];
UINT64 f28[2];
UINT64 f29[2];
UINT64 f30[2];
UINT64 f31[2];
UINT64 pr;
UINT64 b0;
UINT64 b1;
UINT64 b2;
UINT64 b3;
UINT64 b4;
UINT64 b5;
UINT64 b6;
UINT64 b7;
// application registers
UINT64 ar_rsc;
UINT64 ar_bsp;
UINT64 ar_bspstore;
UINT64 ar_rnat;
UINT64 ar_fcr;
UINT64 ar_eflag;
UINT64 ar_csd;
UINT64 ar_ssd;
UINT64 ar_cflg;
UINT64 ar_fsr;
UINT64 ar_fir;
UINT64 ar_fdr;
UINT64 ar_ccv;
UINT64 ar_unat;
UINT64 ar_fpsr;
UINT64 ar_pfs;
UINT64 ar_lc;
UINT64 ar_ec;
// control registers
UINT64 cr_dcr;
UINT64 cr_itm;
UINT64 cr_iva;
UINT64 cr_pta;
UINT64 cr_ipsr;
UINT64 cr_isr;
UINT64 cr_iip;
UINT64 cr_ifa;
UINT64 cr_itir;
UINT64 cr_iipa;
UINT64 cr_ifs;
UINT64 cr_iim;
UINT64 cr_iha;
// debug registers
UINT64 dbr0;
UINT64 dbr1;
UINT64 dbr2;
UINT64 dbr3;
UINT64 dbr4;
UINT64 dbr5;
UINT64 dbr6;
UINT64 dbr7;
UINT64 ibr0;
UINT64 ibr1;
UINT64 ibr2;
UINT64 ibr3;
UINT64 ibr4;
UINT64 ibr5;
UINT64 ibr6;
UINT64 ibr7;
// virtual registers
UINT64 int_nat; // nat bits for R1-R31
} SYSTEM_CONTEXT;
#endif /* _EFI_CONTEXT_H_ */
/*
* Copyright (c) 1999, 2000
* Intel Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
*
* This product includes software developed by Intel Corporation and
* its contributors.
*
* 4. Neither the name of Intel Corporation or its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef _EFICONTEXT_H_
#define _EFICONTEXT_H_
//
// IA-64 processor exception types
//
#define EXCPT_ALT_DTLB 4
#define EXCPT_DNESTED_TLB 5
#define EXCPT_BREAKPOINT 11
#define EXCPT_EXTERNAL_INTERRUPT 12
#define EXCPT_GEN_EXCEPT 24
#define EXCPT_NAT_CONSUMPTION 26
#define EXCPT_DEBUG_EXCEPT 29
#define EXCPT_UNALIGNED_ACCESS 30
#define EXCPT_FP_FAULT 32
#define EXCPT_FP_TRAP 33
#define EXCPT_TAKEN_BRANCH 35
#define EXCPT_SINGLE_STEP 36
//
// IA-64 processor context definition - must be 512 byte aligned!!!
//
typedef
struct {
UINT64 reserved; // necessary to preserve alignment for the correct bits in UNAT and to insure F2 is 16 byte aligned...
UINT64 r1;
UINT64 r2;
UINT64 r3;
UINT64 r4;
UINT64 r5;
UINT64 r6;
UINT64 r7;
UINT64 r8;
UINT64 r9;
UINT64 r10;
UINT64 r11;
UINT64 r12;
UINT64 r13;
UINT64 r14;
UINT64 r15;
UINT64 r16;
UINT64 r17;
UINT64 r18;
UINT64 r19;
UINT64 r20;
UINT64 r21;
UINT64 r22;
UINT64 r23;
UINT64 r24;
UINT64 r25;
UINT64 r26;
UINT64 r27;
UINT64 r28;
UINT64 r29;
UINT64 r30;
UINT64 r31;
UINT64 f2[2];
UINT64 f3[2];
UINT64 f4[2];
UINT64 f5[2];
UINT64 f6[2];
UINT64 f7[2];
UINT64 f8[2];
UINT64 f9[2];
UINT64 f10[2];
UINT64 f11[2];
UINT64 f12[2];
UINT64 f13[2];
UINT64 f14[2];
UINT64 f15[2];
UINT64 f16[2];
UINT64 f17[2];
UINT64 f18[2];
UINT64 f19[2];
UINT64 f20[2];
UINT64 f21[2];
UINT64 f22[2];
UINT64 f23[2];
UINT64 f24[2];
UINT64 f25[2];
UINT64 f26[2];
UINT64 f27[2];
UINT64 f28[2];
UINT64 f29[2];
UINT64 f30[2];
UINT64 f31[2];
UINT64 pr;
UINT64 b0;
UINT64 b1;
UINT64 b2;
UINT64 b3;
UINT64 b4;
UINT64 b5;
UINT64 b6;
UINT64 b7;
// application registers
UINT64 ar_rsc;
UINT64 ar_bsp;
UINT64 ar_bspstore;
UINT64 ar_rnat;
UINT64 ar_fcr;
UINT64 ar_eflag;
UINT64 ar_csd;
UINT64 ar_ssd;
UINT64 ar_cflg;
UINT64 ar_fsr;
UINT64 ar_fir;
UINT64 ar_fdr;
UINT64 ar_ccv;
UINT64 ar_unat;
UINT64 ar_fpsr;
UINT64 ar_pfs;
UINT64 ar_lc;
UINT64 ar_ec;
// control registers
UINT64 cr_dcr;
UINT64 cr_itm;
UINT64 cr_iva;
UINT64 cr_pta;
UINT64 cr_ipsr;
UINT64 cr_isr;
UINT64 cr_iip;
UINT64 cr_ifa;
UINT64 cr_itir;
UINT64 cr_iipa;
UINT64 cr_ifs;
UINT64 cr_iim;
UINT64 cr_iha;
// debug registers
UINT64 dbr0;
UINT64 dbr1;
UINT64 dbr2;
UINT64 dbr3;
UINT64 dbr4;
UINT64 dbr5;
UINT64 dbr6;
UINT64 dbr7;
UINT64 ibr0;
UINT64 ibr1;
UINT64 ibr2;
UINT64 ibr3;
UINT64 ibr4;
UINT64 ibr5;
UINT64 ibr6;
UINT64 ibr7;
// virtual registers
UINT64 int_nat; // nat bits for R1-R31
} SYSTEM_CONTEXT;
#endif /* _EFI_CONTEXT_H_ */

View File

@ -1,13 +1,13 @@
#
#
#
[sources]
efivar.h
legacyboot.h
VgaClass.h
intload.h
[ia32sources]
[ia64sources]
#
#
#
[sources]
efivar.h
legacyboot.h
VgaClass.h
intload.h
[ia32sources]
[ia64sources]

View File

@ -1,29 +1,29 @@
#
# This is a machine generated file - DO NOT EDIT
# Generated by genmake.exe
# Generated from make.inf
# Copyright (c) 1998 Intel Corporation
#
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\protocol\efivar.h \
$(SDK_INSTALL_DIR)\include\efi\protocol\legacyboot.h \
$(SDK_INSTALL_DIR)\include\efi\protocol\vgaclass.h \
$(SDK_INSTALL_DIR)\include\efi\protocol\efidbg.h \
!IF "$(PROCESSOR)" == "Ia32"
INC_DEPS = $(INC_DEPS) \
!ENDIF
!IF "$(PROCESSOR)" == "Ia64"
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\protocol\$(PROCESSOR)\eficontext.h \
!ENDIF
#
# This is a machine generated file - DO NOT EDIT
# Generated by genmake.exe
# Generated from make.inf
# Copyright (c) 1998 Intel Corporation
#
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\protocol\efivar.h \
$(SDK_INSTALL_DIR)\include\efi\protocol\legacyboot.h \
$(SDK_INSTALL_DIR)\include\efi\protocol\vgaclass.h \
$(SDK_INSTALL_DIR)\include\efi\protocol\efidbg.h \
!IF "$(PROCESSOR)" == "Ia32"
INC_DEPS = $(INC_DEPS) \
!ENDIF
!IF "$(PROCESSOR)" == "Ia64"
INC_DEPS = $(INC_DEPS) \
$(SDK_INSTALL_DIR)\include\efi\protocol\$(PROCESSOR)\eficontext.h \
!ENDIF

View File

@ -1,3 +1,3 @@
The protocol directory contains non Architectural
Protocols that span the FW, Platform, or application
The protocol directory contains non Architectural
Protocols that span the FW, Platform, or application
space.

View File

@ -1202,7 +1202,7 @@ DevicePathToStr (
FreePool (DevPath);
NewSize = (Str.len + 1) * sizeof(CHAR16);
Str.str = ReallocatePool (Str.str, NewSize, NewSize);
Str.str = ReallocatePool (NewSize, NewSize, Str.str);
Str.str[Str.len] = 0;
return Str.str;
}

View File

@ -54,11 +54,12 @@ AllocateZeroPool (
}
VOID *
ReallocatePool (
IN VOID *OldPool,
IN UINTN OldSize,
IN UINTN NewSize
)
EFIAPI
ReallocatePool_1 (
IN UINTN OldSize,
IN UINTN NewSize,
IN VOID *OldPool OPTIONAL
)
{
VOID *NewPool;
@ -109,7 +110,7 @@ SetMem (
}
VOID EFIAPI
CopyMem (
CopyMem_1 (
IN VOID *Dest,
IN VOID *Src,
IN UINTN len
@ -118,6 +119,16 @@ CopyMem (
RtCopyMem (Dest, Src, len);
}
VOID EFIAPI
CopyMemC (
IN VOID *Dest,
IN CONST VOID *Src,
IN UINTN len
)
{
RtCopyMemC (Dest, Src, len);
}
INTN
CompareMem (
IN CONST VOID *Dest,

View File

@ -378,9 +378,9 @@ _PoolPrint (
newlen += PRINT_STRING_LEN;
spc->maxlen = newlen;
spc->str = ReallocatePool (
spc->str,
spc->len * sizeof(CHAR16),
spc->maxlen * sizeof(CHAR16)
spc->maxlen * sizeof(CHAR16),
spc->str
);
if (!spc->str) {

View File

@ -88,6 +88,30 @@ RtCopyMem (
}
}
#ifndef __GNUC__
#pragma RUNTIME_CODE(RtCopyMemC)
#endif
VOID
EFIAPI
RUNTIMEFUNCTION
RtCopyMemC (
IN VOID *Dest,
IN CONST VOID *Src,
IN UINTN len
)
{
CHAR8 *d = (CHAR8*)Dest;
CONST CHAR8 *s = (CONST CHAR8*)Src;
if (d == NULL || s == NULL || s == d)
return;
/* CONST Src: UB if Src and Dest overlap */
while (len--)
*d++ = *s++;
}
#ifndef __GNUC__
#pragma RUNTIME_CODE(RtCompareMem)
#endif

View File

@ -69,13 +69,11 @@ RtStrnCpy (
)
// copy strings
{
CHAR16 CopySrc = *Src;
CHAR16 *PCopySrc = &CopySrc;
UINTN Size = RtStrnLen(Src, Len);
if (Size != Len)
RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0');
RtCopyMem(Dest, PCopySrc, Size * sizeof(CHAR16));
RtCopyMemC(Dest, Src, Size * sizeof(CHAR16));
}
#ifndef __GNUC__
@ -108,13 +106,11 @@ RtStpnCpy (
)
// copy strings
{
CHAR16 CopySrc = *Src;
CHAR16 *PCopySrc = &CopySrc;
UINTN Size = RtStrnLen(Src, Len);
if (Size != Len)
RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0');
RtCopyMem(Dest, PCopySrc, Size * sizeof(CHAR16));
RtCopyMemC(Dest, Src, Size * sizeof(CHAR16));
return Dest + Size;
}
@ -143,12 +139,10 @@ RtStrnCat (
)
{
UINTN DestSize, Size;
CHAR16 CopySrc = *Src;
CHAR16 *PCopySrc = &CopySrc;
DestSize = RtStrLen(Dest);
Size = RtStrnLen(Src, Len);
RtCopyMem(Dest + DestSize, PCopySrc, Size * sizeof(CHAR16));
RtCopyMemC(Dest + DestSize, Src, Size * sizeof(CHAR16));
Dest[DestSize + Size] = '\0';
}

View File

@ -201,13 +201,11 @@ StrDuplicate (
{
CHAR16 *Dest;
UINTN Size;
CHAR16 CopySrc = *Src;
CHAR16 *PCopySrc = &CopySrc;
Size = StrSize(Src);
Dest = AllocatePool (Size);
if (Dest) {
CopyMem (Dest, PCopySrc, Size);
CopyMemC (Dest, Src, Size);
}
return Dest;
}