diff -urN efiboot/configure esxboot-xcat/configure --- efiboot/configure 2011-08-04 14:30:15.000000000 -0400 +++ esxboot-xcat/configure 2011-08-18 10:04:50.025299093 -0400 @@ -43,23 +43,23 @@ # # Delete this line once the tool chain is setup. -$(error Please setup your toolchain in env/toolchain.mk) +#$(error Please setup your toolchain in env/toolchain.mk) # Known to work with gcc 4.4.3. -CC := -GCCINC := +CC := gcc +GCCINC := /usr/lib/gcc/x86_64-redhat-linux/4.4.4/include # Known to work with binutils 2.20.1. -LD := -AR := -OBJCOPY := +LD := ld +AR := ar +OBJCOPY := objcopy # Known to work with nasm 2.01. -AS := +AS := nasm # Known to work with libbfd 2.17.50. -LIBBFD := -LIBBFDINC := ' +LIBBFD := /usr/lib/libbfd.a -lz +LIBBFDINC := /usr/include' makfile='# # Master Makefile diff -urN efiboot/env/common.mk esxboot-xcat/env/common.mk --- efiboot/env/common.mk 2011-08-04 14:30:15.000000000 -0400 +++ esxboot-xcat/env/common.mk 2011-08-18 10:03:05.448299277 -0400 @@ -43,7 +43,7 @@ APP_EXT := .efi ifeq ($(BUILDENV),uefi64) - ARCH := em64t + ARCH := x64 else ifeq ($(BUILDENV),uefi32) ARCH := ia32 @@ -66,7 +66,7 @@ ifeq ($(FIRMWARE),bios) RELOCS := $(TOOLS_DIR)/relocs else - ifeq ($(ARCH),em64t) + ifeq ($(ARCH),x64) ELF2EFI := $(TOOLS_DIR)/elf2efi32 endif @@ -78,7 +78,7 @@ # #-- Compilation flags ---------------------------------------------------------- # -ifeq ($(ARCH),em64t) +ifeq ($(ARCH),x64) AFLAGS := -f elf64 CFLAGS := -m64 -mno-red-zone LDFLAGS := -m elf_x86_64 @@ -137,11 +137,11 @@ EDK2INC := $(TOPDIR)/uefi/edk2/MdePkg UEFIINC := $(TOPDIR)/uefi $(EDK2INC)/Include $(EDK2INC)/Include/Protocol -ifeq ($(ARCH),em64t) +ifeq ($(ARCH),x64) UEFIINC += $(EDK2INC)/Include/X64 endif ifeq ($(ARCH),ia32) UEFIINC += $(EDK2INC)/Include/Ia32 endif -endif # !BUILDENV \ No newline at end of file +endif # !BUILDENV diff -urN efiboot/include/efiutils.h esxboot-xcat/include/efiutils.h --- efiboot/include/efiutils.h 2011-08-04 14:30:15.000000000 -0400 +++ esxboot-xcat/include/efiutils.h 2011-08-18 10:03:05.450298097 -0400 @@ -192,6 +192,7 @@ EXTERN EFI_STATUS gpxe_file_load(EFI_HANDLE Volume, const char *filepath, int (*callback)(size_t), VOID **Buffer, UINTN *BufSize); +EXTERN BOOLEAN gpxe_supported(EFI_HANDLE Volume); /* * loadfile.c @@ -212,13 +213,6 @@ UINTN *BufSize); /* - * file.c - */ -EXTERN EFI_STATUS efi_file_read(EFI_HANDLE Volume, const CHAR16 *FilePath, - int (*callback)(size_t), VOID **Buffer, - UINTN *BufLen); - -/* * image.c */ EXTERN EFI_STATUS image_get_info(EFI_HANDLE Handle, EFI_LOADED_IMAGE **Image); diff -urN efiboot/mboot/Makefile esxboot-xcat/mboot/Makefile --- efiboot/mboot/Makefile 2011-08-04 14:30:15.000000000 -0400 +++ esxboot-xcat/mboot/Makefile 2011-08-18 10:03:05.453321052 -0400 @@ -35,7 +35,7 @@ system.c \ trampoline.s -BASENAME := mboot +BASENAME := esxboot TARGETTYPE := app LIBS := $(BOOTLIB) $(ENV_LIB) diff -urN efiboot/uefi/efiutils/file.c esxboot-xcat/uefi/efiutils/file.c --- efiboot/uefi/efiutils/file.c 2011-08-04 14:30:15.000000000 -0400 +++ esxboot-xcat/uefi/efiutils/file.c 2011-08-18 10:03:05.454298458 -0400 @@ -78,42 +78,6 @@ return EFI_SUCCESS; } -/*-- filepath_efi_to_ascii ----------------------------------------------------- - * - * Convert a formatted UEFI path to an ascii string. Every occurrence of a - * '\\' is replaced with a '/' - * - * Parameters - * IN EfiPath: pointer to the UEFI path UCS-2 string - * OUT ascii_path: pointer to the freshly allocated ascii path - * - * Results - * EFI_SUCCESS, or an UEFI error status. - *----------------------------------------------------------------------------*/ -static EFI_STATUS filepath_efi_to_ascii(const CHAR16 *EfiPath, - char **ascii_path) -{ - char *ascii; - EFI_STATUS Status; - - ascii = NULL; - Status = ucs2_to_ascii(EfiPath, &ascii); - if (EFI_ERROR(Status)) { - return Status; - } - - *ascii_path = ascii; - - while (*ascii != '\0') { - if (*ascii == '\\') { - *ascii = '/'; - } - ascii++; - } - - return EFI_SUCCESS; -} - /*-- efi_file_read ------------------------------------------------------------- * * Read a file. @@ -133,17 +97,17 @@ * Results * EFI_SUCCESS, or an UEFI error status. *----------------------------------------------------------------------------*/ -EFI_STATUS efi_file_read(EFI_HANDLE Volume, const CHAR16 *FilePath, - int (*callback)(size_t), VOID **Buffer, UINTN *BufLen) +static EFI_STATUS efi_file_read(EFI_HANDLE Volume, const char *ascii_path, + int (*callback)(size_t), VOID **Buffer, + UINTN *BufLen) { - char *ascii_path; + CHAR16 *FilePath; int try; EFI_STATUS Status; - ascii_path = NULL; - Status = filepath_efi_to_ascii(FilePath, &ascii_path); + Status = filepath_unix_to_efi(ascii_path, &FilePath); if (EFI_ERROR(Status)) { - return Status; + return error_efi_to_generic(Status); } for (try = 0; try < 4; try++) { @@ -167,7 +131,7 @@ } } - sys_free(ascii_path); + sys_free(FilePath); return Status; } @@ -190,7 +154,6 @@ void **buffer, size_t *buflen) { EFI_HANDLE Volume; - CHAR16 *Path; EFI_STATUS Status; Status = get_boot_volume(&Volume); @@ -198,15 +161,7 @@ return error_efi_to_generic(Status); } - Status = filepath_unix_to_efi(filepath, &Path); - if (EFI_ERROR(Status)) { - return error_efi_to_generic(Status); - } - - Status = efi_file_read(Volume, Path, callback, buffer, buflen); - - sys_free(Path); - + Status = efi_file_read(Volume, filepath, callback, buffer, buflen); return error_efi_to_generic(Status); } @@ -248,6 +203,10 @@ return error_efi_to_generic(Status); } + if (gpxe_supported(Volume)) { + return ERR_UNSUPPORTED; + } + for (try = 0; try < 3; try++) { if (try == 0) { Status = simple_file_get_size(Volume, Path, &size); diff -urN efiboot/uefi/efiutils/gpxefile.c esxboot-xcat/uefi/efiutils/gpxefile.c --- efiboot/uefi/efiutils/gpxefile.c 2011-08-04 14:30:15.000000000 -0400 +++ esxboot-xcat/uefi/efiutils/gpxefile.c 2011-08-18 10:03:05.459297937 -0400 @@ -171,3 +171,27 @@ return EFI_SUCCESS; } + +/*-- gpxe_supported ------------------------------------------------------------ + * + * Check if the gPXE protocol is supported on the given handle. + * + * Parameters + * IN Volume: handle to the volume + * + * Results + * TRUE or FALSE + *----------------------------------------------------------------------------*/ +BOOLEAN gpxe_supported(EFI_HANDLE Volume) +{ + EFI_GUID GpxeDownloadProto = GPXE_DOWNLOAD_PROTOCOL_GUID; + GPXE_DOWNLOAD_PROTOCOL *gpxe; + EFI_STATUS Status; + + Status = get_protocol_interface(Volume, &GpxeDownloadProto, (void **)&gpxe); + if (EFI_ERROR(Status)) { + return FALSE; + } + + return TRUE; +}