Date: Wednesday, November 7, 2012 @ 12:59:59 Author: tpowa Revision: 170420
upgpkg: refind-efi 0.4.7-2 depend on tianocore, instead of gnu-efi-libs fixes many issues Added: refind-efi/trunk/UDK-MdePkg-Revert-PathNodeCount.patch Modified: refind-efi/trunk/PKGBUILD refind-efi/trunk/refind-efi.install refind-efi/trunk/refind_include_more_shell_paths.patch ---------------------------------------+ PKGBUILD | 208 ++++++++-- UDK-MdePkg-Revert-PathNodeCount.patch | 660 ++++++++++++++++++++++++++++++++ refind-efi.install | 2 refind_include_more_shell_paths.patch | 4 4 files changed, 848 insertions(+), 26 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2012-11-07 16:02:08 UTC (rev 170419) +++ PKGBUILD 2012-11-07 17:59:59 UTC (rev 170420) @@ -2,54 +2,212 @@ # Maintainer: Tobias Powalowski <[email protected]> # Contributor: Keshav P R <(the.ridikulus.rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)> +####### +_TIANOCORE_SVN_URL="https://edk2.svn.sourceforge.net/svnroot/edk2/branches/UDK2010.SR1" +_TIANOCORE_PKG="Mde" +_TIANOCORE_TARGET="RELEASE" +_UDK_TARGET="${_TIANOCORE_PKG}Pkg/${_TIANOCORE_PKG}Pkg.dsc" +_COMPILER="GCC46" +####### + pkgname="refind-efi" pkgver="0.4.7" -pkgrel="1" -pkgdesc="Rod Smith's fork of rEFIt UEFI Boot Manager" +pkgrel="2" +pkgdesc="Rod Smith's fork of rEFIt UEFI Boot Manager - built with Tianocore UDK libs" url="http://www.rodsbooks.com/refind/index.html" arch=('any') license=('GPL3' 'custom') -makedepends=('gnu-efi-libs>=3.0q') +makedepends=('subversion' 'python2') depends=('dosfstools' 'efibootmgr') optdepends=('mactel-boot: For bless command in Apple Mac systems') conflicts=('refind-efi-x86_64' 'refind-efi-i386') provides=('refind-efi-x86_64' 'refind-efi-i386') replaces=('refind-efi-x86_64' 'refind-efi-i386') -options=('!strip' 'docs') +options=('!strip' 'docs' '!makeflags') install="${pkgname}.install" source=("http://downloads.sourceforge.net/refind/refind-src-${pkgver}.zip" + 'UDK-MdePkg-Revert-PathNodeCount.patch' 'refind_include_more_shell_paths.patch' 'refind_linux.conf') -build() { - if [[ "${CARCH}" != "x86_64" ]]; then - msg "refind-efi can be built only in an x86_64 system. Exiting." - exit 1 +_update_tianocore_udk_svn() { + + if [[ -d "${srcdir}/${_TIANO_DIR_}/${_DIR_}" ]]; then + cd "${srcdir}/${_TIANO_DIR_}/${_DIR_}" + svn update || true + echo + else + cd "${srcdir}/${_TIANO_DIR_}/" + svn checkout "${_TIANOCORE_SVN_URL}/${_DIR_}" "${srcdir}/${_TIANO_DIR_}/${_DIR_}" + echo fi + unset _DIR_ + +} + +_tianocore_udk_common() { + + _TIANO_DIR_="tianocore-udk-svn" + + mkdir -p "${srcdir}/${_TIANO_DIR_}/" + cd "${srcdir}/${_TIANO_DIR_}/" + + for _DIR_ in BaseTools MdePkg MdeModulePkg IntelFrameworkPkg IntelFrameworkModulePkg ; do + _update_tianocore_udk_svn + done + + unset _DIR_ + + ## Setup UDK Environment variables + export _UDK_DIR="${srcdir}/${_TIANO_DIR_}_build" + export EDK_TOOLS_PATH="${_UDK_DIR}/BaseTools" + + rm -rf "${_UDK_DIR}/" || true + cp -r "${srcdir}/${_TIANO_DIR_}" "${_UDK_DIR}" + + cd "${_UDK_DIR}/" + + patch -Np1 -R -i "${srcdir}/UDK-MdePkg-Revert-PathNodeCount.patch" + echo + + ## Cleanup UDK config files + rm -rf "${_UDK_DIR}/Build/" || true + rm -rf "${_UDK_DIR}/Conf/" || true + mkdir -p "${_UDK_DIR}/Conf/" + mkdir -p "${_UDK_DIR}/Build/" + + ## UDK BaseTools requires python2 + sed 's|python |python2 |g' -i "${EDK_TOOLS_PATH}/BinWrappers/PosixLike"/* || true + sed 's|python |python2 |g' -i "${EDK_TOOLS_PATH}/Tests/GNUmakefile" + + ## Fix GCC Warning as error + sed 's|-Werror |-Wno-error -Wno-unused-but-set-variable |g' -i "${EDK_TOOLS_PATH}/Source/C/Makefiles/header.makefile" || true + sed 's|-Werror |-Wno-error -Wno-unused-but-set-variable |g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true + + ## Fix GCC 4.7 error - gcc: error: unrecognized command line option '-melf_x86_64' + sed 's| -m64 --64 -melf_x86_64| -m64|g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true + sed 's|--64 | |g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true + sed 's| -m64 -melf_x86_64| -m64|g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true + + ## Remove GCC -g debug option and add -0s -mabi=ms + sed 's|DEFINE GCC_ALL_CC_FLAGS = -g |DEFINE GCC_ALL_CC_FLAGS = -Os -mabi=ms |g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true + sed 's|DEFINE GCC44_ALL_CC_FLAGS = -g |DEFINE GCC44_ALL_CC_FLAGS = -Os -mabi=ms |g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true + + ## Fix UDK Target Platform + sed "s|ACTIVE_PLATFORM = Nt32Pkg/Nt32Pkg.dsc|ACTIVE_PLATFORM = ${_UDK_TARGET}|g" -i "${EDK_TOOLS_PATH}/Conf/target.template" || true + sed "s|TARGET = DEBUG|TARGET = ${_TIANOCORE_TARGET}|g" -i "${EDK_TOOLS_PATH}/Conf/target.template" || true + sed "s|TOOL_CHAIN_TAG = MYTOOLS|TOOL_CHAIN_TAG = ${_COMPILER}|g" -i "${EDK_TOOLS_PATH}/Conf/target.template" || true + + ## Fix UDK Target ARCH + sed 's|IA32|X64|g' -i "${EDK_TOOLS_PATH}/Conf/target.template" || true + + ## Setup UDK Environment + chmod +x "${_UDK_DIR}/BaseTools/BuildEnv" + source "${_UDK_DIR}/BaseTools/BuildEnv" BaseTools + echo + + ## Compile UDK BaseTools + make -C "${EDK_TOOLS_PATH}" + echo + + ## Compile UDK x86_64-UEFI Libraries + "${EDK_TOOLS_PATH}/BinWrappers/PosixLike/build" -p "${_UDK_TARGET}" -a "X64" -b "${_TIANOCORE_TARGET}" -t "${_COMPILER}" + echo + + ## Compile UDK i386-UEFI Libraries + "${EDK_TOOLS_PATH}/BinWrappers/PosixLike/build" -p "${_UDK_TARGET}" -a "IA32" -b "${_TIANOCORE_TARGET}" -t "${_COMPILER}" + echo + +} + +_refind_changes() { + cd "${srcdir}/refind-${pkgver}/" + patch -Np1 -i "${srcdir}/refind_include_more_shell_paths.patch" + echo - sed 's|/usr/local/include/efi|/usr/include/efi|g' -i "${srcdir}/refind-${pkgver}/Make.common" - sed 's|/usr/local/lib|/usr/lib|g' -i "${srcdir}/refind-${pkgver}/Make.common" - sed 's|ARCH :=|ARCH ?=|g' -i "${srcdir}/refind-${pkgver}/Make.common" - sed 's|ARCH =|ARCH ?=|g' -i "${srcdir}/refind-${pkgver}/refind/Makefile" + ## Use passed ARCH variable value + sed 's|ARCH :=|ARCH ?=|g' -i "${srcdir}/refind-${pkgver}/Make.tiano" || true + sed 's|ARCH :=|ARCH ?=|g' -i "${srcdir}/refind-${pkgver}/filesystems/Make.tiano" || true - cp -r "${srcdir}/refind-${pkgver}" "${srcdir}/refind-${pkgver}-x86_64" - cd "${srcdir}/refind-${pkgver}-x86_64/" - ARCH="x86_64" make gnuefi + ## Fix UDK Target Platform in rEFInd Makefiles + sed "s|EFILIB = \$(EDK2BASE)/Build/MdeModule/|EFILIB = \$(EDK2BASE)/Build/${_TIANOCORE_PKG}/|g" -i "${srcdir}/refind-${pkgver}/refind/Make.tiano" || true + sed "s|EFILIB = \$(EDK2BASE)/Build/MdeModule/|EFILIB = \$(EDK2BASE)/Build/${_TIANOCORE_PKG}/|g" -i "${srcdir}/refind-${pkgver}/filesystems/Make.tiano" || true - cp -r "${srcdir}/refind-${pkgver}" "${srcdir}/refind-${pkgver}-i386" - cd "${srcdir}/refind-${pkgver}-i386/" - ARCH="ia32" make gnuefi } -package() { +_build_refind-efi-common() { + + rm -rf "${srcdir}/refind-${pkgver}_${_UEFI_ARCH}/" || true + cp -r "${srcdir}/refind-${pkgver}" "${srcdir}/refind-${pkgver}_${_UEFI_ARCH}/" + + cd "${srcdir}/refind-${pkgver}_${_UEFI_ARCH}/" + + ## Fix UDK Target ARCH + sed "s|IA32|${_SPEC_ARCH}|g" -i "${_UDK_DIR}/Conf/target.txt" || true + sed "s|X64|${_SPEC_ARCH}|g" -i "${_UDK_DIR}/Conf/target.txt" || true + + ## Fix UDK Path in rEFInd Makefiles + sed "s|EDK2BASE = /usr/local/UDK2010/MyWorkSpace|EDK2BASE = ${_UDK_DIR}|g" -i "${srcdir}/refind-${pkgver}_${_UEFI_ARCH}/Make.tiano" || true + sed "s|EDK2BASE = /usr/local/UDK2010/MyWorkSpace|EDK2BASE = ${_UDK_DIR}|g" -i "${srcdir}/refind-${pkgver}_${_UEFI_ARCH}/filesystems/Make.tiano" || true + + ## Fix ld "-m elf_ARCH" parameter + sed "s|LDFLAGS = |LDFLAGS = -m elf_${_ARCH} |g" -i "${srcdir}/refind-${pkgver}_${_UEFI_ARCH}/Make.tiano" || true + sed "s|LDFLAGS = |LDFLAGS = -m elf_${_ARCH} |g" -i "${srcdir}/refind-${pkgver}_${_UEFI_ARCH}/filesystems/Make.tiano" || true + + ARCH="${_UEFI_ARCH}" make clean || true + echo + + ARCH="${_UEFI_ARCH}" make tiano + echo + + ARCH="${_UEFI_ARCH}" make fs + echo + +} + +build() { + + if [[ "${CARCH}" != "x86_64" ]]; then + echo "${pkgname} package can be built only in a x86_64 system. Exiting." + exit 1 + fi + + _tianocore_udk_common + echo + + _refind_changes + echo + + _UEFI_ARCH="x86_64" + _SPEC_ARCH="X64" + _ARCH="x86_64" + _build_refind-efi-common + echo + + _UEFI_ARCH="ia32" + _SPEC_ARCH="IA32" + _ARCH="i386" + _build_refind-efi-common + echo + +} + +package() { + ## install the rEFInd UEFI applications install -d "${pkgdir}/usr/lib/refind/" - install -D -m0644 "${srcdir}/refind-${pkgver}-x86_64/refind/refind_x64.efi" "${pkgdir}/usr/lib/refind/refindx64.efi" - install -D -m0644 "${srcdir}/refind-${pkgver}-i386/refind/refind_ia32.efi" "${pkgdir}/usr/lib/refind/refindia32.efi" + install -D -m0644 "${srcdir}/refind-${pkgver}_x86_64/refind/refind_x64.efi" "${pkgdir}/usr/lib/refind/refindx64.efi" + install -D -m0644 "${srcdir}/refind-${pkgver}_ia32/refind/refind_ia32.efi" "${pkgdir}/usr/lib/refind/refindia32.efi" + ## Install UEFI drivers built from rEFInd + install -d "${pkgdir}/usr/lib/refind/drivers_x64/" + install -d "${pkgdir}/usr/lib/refind/drivers_ia32/" + install -D -m0644 "${srcdir}/refind-${pkgver}_x86_64/drivers"/*_x64.efi "${pkgdir}/usr/lib/refind/drivers_x64/" + install -D -m0644 "${srcdir}/refind-${pkgver}_ia32/drivers"/*_ia32.efi "${pkgdir}/usr/lib/refind/drivers_ia32/" + ## install the rEFInd config file install -d "${pkgdir}/usr/lib/refind/config/" install -D -m0644 "${srcdir}/refind-${pkgver}/refind.conf-sample" "${pkgdir}/usr/lib/refind/config/refind.conf" @@ -66,12 +224,14 @@ install -D -m0644 "${srcdir}/refind-${pkgver}/docs/Styles"/* "${pkgdir}/usr/share/refind/docs/Styles/" install -D -m0644 "${srcdir}/refind-${pkgver}/README.txt" "${pkgdir}/usr/share/refind/docs/README" install -D -m0644 "${srcdir}/refind-${pkgver}/NEWS.txt" "${pkgdir}/usr/share/refind/docs/NEWS" - rm -f "${pkgdir}/usr/share/refind/docs/html/.DS_Store" + rm -f "${pkgdir}/usr/share/refind/docs/html/.DS_Store" || true ## install the rEFIt license file, since rEFInd is a fork of rEFIt install -d "${pkgdir}/usr/share/licenses/refind/" - install -D -m0644 "${srcdir}/refind-${pkgver}/LICENSE.txt" "${pkgdir}/usr/share/licenses/refind/LICENSE" + install -D -m0644 "${srcdir}/refind-${pkgver}/LICENSE.txt" "${pkgdir}/usr/share/licenses/refind/LICENSE" + } md5sums=('d79f875ab2a2c20696581ee3cc6f6739' - '8da259d08ea1dc0a3a4c572913e453f9' + '98291849f9530c8ddb71b6563c61fb24' + '9051a5235ec58f5448a1b58727601e98' 'a83e45b10d5efbca1c93a63851728712') Added: UDK-MdePkg-Revert-PathNodeCount.patch =================================================================== --- UDK-MdePkg-Revert-PathNodeCount.patch (rev 0) +++ UDK-MdePkg-Revert-PathNodeCount.patch 2012-11-07 17:59:59 UTC (rev 170420) @@ -0,0 +1,660 @@ +commit 771729c77fa49cf0ff17491f371003c4f5d66f85 +Author: niruiyu <niruiyu@6f19259b-4bc3-4df7-8a09-765794883524> +Date: Mon Sep 24 03:20:35 2012 +0000 + + Add new API IsDevicePathValid() to UefiDevicePathLib. + + Signed-off-by: Ruiyu Ni<[email protected]> + Reviewed-by: Liming Gao<[email protected]> + Reviewed-by: Kinney Michael D<[email protected]> + + git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13737 6f19259b-4bc3-4df7-8a09-765794883524 + +diff --git a/MdePkg/Include/Library/DevicePathLib.h b/MdePkg/Include/Library/DevicePathLib.h +index 68b1f1b..37acd45 100644 +--- a/MdePkg/Include/Library/DevicePathLib.h ++++ b/MdePkg/Include/Library/DevicePathLib.h +@@ -4,7 +4,7 @@ + This library provides defines, macros, and functions to help create and parse + EFI_DEVICE_PATH_PROTOCOL structures. + +-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> ++Copyright (c) 2006 - 2012, 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 that accompanies this distribution. + The full text of the license may be found at +@@ -21,6 +21,28 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + #define END_DEVICE_PATH_LENGTH (sizeof (EFI_DEVICE_PATH_PROTOCOL)) + + /** ++ Determine whether a given device path is valid. ++ If DevicePath is NULL, then ASSERT(). ++ ++ @param DevicePath A pointer to a device path data structure. ++ @param MaxSize The maximum size of the device path data structure. ++ ++ @retval TRUE DevicePath is valid. ++ @retval FALSE The length of any node node in the DevicePath is less ++ than sizeof (EFI_DEVICE_PATH_PROTOCOL). ++ @retval FALSE If MaxSize is not zero, the size of the DevicePath ++ exceeds MaxSize. ++ @retval FALSE If PcdMaximumDevicePathNodeCount is not zero, the node ++ count of the DevicePath exceeds PcdMaximumDevicePathNodeCount. ++**/ ++BOOLEAN ++EFIAPI ++IsDevicePathValid ( ++ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, ++ IN UINTN MaxSize ++ ); ++ ++/** + Returns the Type field of a device path node. + + Returns the Type field of the device path node specified by Node. +@@ -123,7 +145,8 @@ IsDevicePathEndType ( + Determines if a device path node is an end node of an entire device path. + + Determines if a device path node specified by Node is an end node of an entire device path. +- If Node represents the end of an entire device path, then TRUE is returned. Otherwise, FALSE is returned. ++ If Node represents the end of an entire device path, then TRUE is returned. ++ Otherwise, FALSE is returned. + + If Node is NULL, then ASSERT(). + +@@ -143,7 +166,8 @@ IsDevicePathEnd ( + Determines if a device path node is an end node of a device path instance. + + Determines if a device path node specified by Node is an end node of a device path instance. +- If Node represents the end of a device path instance, then TRUE is returned. Otherwise, FALSE is returned. ++ If Node represents the end of a device path instance, then TRUE is returned. ++ Otherwise, FALSE is returned. + + If Node is NULL, then ASSERT(). + +@@ -169,6 +193,7 @@ IsDevicePathEndInstance ( + + If Node is NULL, then ASSERT(). + If NodeLength >= 0x10000, then ASSERT(). ++ If NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL), then ASSERT(). + + @param Node A pointer to a device path node data structure. + @param Length The length, in bytes, of the device path node. +@@ -208,13 +233,14 @@ SetDevicePathEndNode ( + /** + Returns the size of a device path in bytes. + +- This function returns the size, in bytes, of the device path data structure specified by +- DevicePath including the end of device path node. If DevicePath is NULL, then 0 is returned. ++ This function returns the size, in bytes, of the device path data structure ++ specified by DevicePath including the end of device path node. ++ If DevicePath is NULL or invalid, then 0 is returned. + +- @param DevicePath A pointer to a device path data structure. +- +- @retval 0 DevicePath is NULL. +- @retval Others The size of a device path in bytes. ++ @param DevicePath A pointer to a device path data structure. ++ ++ @retval 0 If DevicePath is NULL or invalid. ++ @retval Others The size of a device path in bytes. + + **/ + UINTN +@@ -235,7 +261,7 @@ GetDevicePathSize ( + + @param DevicePath A pointer to a device path data structure. + +- @retval NULL DevicePath is NULL. ++ @retval NULL DevicePath is NULL or invalid. + @retval Others A pointer to the duplicated device path. + + **/ +@@ -263,6 +289,7 @@ DuplicateDevicePath ( + @param SecondDevicePath A pointer to a device path data structure. + + @retval NULL If there is not enough memory for the newly allocated buffer. ++ @retval NULL If FirstDevicePath or SecondDevicePath is invalid. + @retval Others A pointer to the new device path if success. + Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL. + +@@ -316,6 +343,7 @@ AppendDevicePathNode ( + and a new end-of-device-path-instance node is inserted between. + If DevicePath is NULL, then a copy if DevicePathInstance is returned. + If DevicePathInstance is NULL, then NULL is returned. ++ If DevicePath or DevicePathInstance is invalid, then NULL is returned. + If there is not enough memory to allocate space for the new device path, then NULL is returned. + The memory is allocated from EFI boot services memory. It is the responsibility of the caller to + free the memory allocated. +@@ -341,6 +369,7 @@ AppendDevicePathInstance ( + point to the next device path instance in the device path (or NULL if no more) and updates Size + to hold the size of the device path instance copy. + If DevicePath is NULL, then NULL is returned. ++ If DevicePath points to a invalid device path, then NULL is returned. + If there is not enough memory to allocate space for the new device path, then NULL is returned. + The memory is allocated from EFI boot services memory. It is the responsibility of the caller to + free the memory allocated. +@@ -394,12 +423,13 @@ CreateDeviceNode ( + Determines if a device path is single or multi-instance. + + This function returns TRUE if the device path specified by DevicePath is multi-instance. +- Otherwise, FALSE is returned. If DevicePath is NULL, then FALSE is returned. ++ Otherwise, FALSE is returned. ++ If DevicePath is NULL or invalid, then FALSE is returned. + + @param DevicePath A pointer to a device path data structure. + + @retval TRUE DevicePath is multi-instance. +- @retval FALSE DevicePath is not multi-instance, or DevicePath is NULL. ++ @retval FALSE DevicePath is not multi-instance, or DevicePath is NULL or invalid. + + **/ + BOOLEAN +diff --git a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.c b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.c +index db065e4..a91a7a3 100644 +--- a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.c ++++ b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.c +@@ -8,7 +8,7 @@ + environment varibles. Multi-instance device paths should never be placed + on a Handle. + +- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> ++ Copyright (c) 2006 - 2012, 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 +@@ -28,6 +28,7 @@ + #include <Library/MemoryAllocationLib.h> + #include <Library/UefiBootServicesTableLib.h> + #include <Library/BaseLib.h> ++#include <Library/PcdLib.h> + + // + // Template for an end-of-device path node. +@@ -42,6 +43,61 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_DEVICE_PATH_PROTOCOL mUefiDevicePathLib + }; + + /** ++ Determine whether a given device path is valid. ++ If DevicePath is NULL, then ASSERT(). ++ ++ @param DevicePath A pointer to a device path data structure. ++ @param MaxSize The maximum size of the device path data structure. ++ ++ @retval TRUE DevicePath is valid. ++ @retval FALSE The length of any node node in the DevicePath is less ++ than sizeof (EFI_DEVICE_PATH_PROTOCOL). ++ @retval FALSE If MaxSize is not zero, the size of the DevicePath ++ exceeds MaxSize. ++ @retval FALSE If PcdMaximumDevicePathNodeCount is not zero, the node ++ count of the DevicePath exceeds PcdMaximumDevicePathNodeCount. ++**/ ++BOOLEAN ++EFIAPI ++IsDevicePathValid ( ++ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, ++ IN UINTN MaxSize ++ ) ++{ ++ UINTN Count; ++ UINTN Size; ++ UINTN NodeLength; ++ ++ ASSERT (DevicePath != NULL); ++ ++ for (Count = 0, Size = 0; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) { ++ NodeLength = DevicePathNodeLength (DevicePath); ++ if (NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) { ++ return FALSE; ++ } ++ ++ if (MaxSize > 0) { ++ Size += NodeLength; ++ if (Size + END_DEVICE_PATH_LENGTH > MaxSize) { ++ return FALSE; ++ } ++ } ++ ++ if (PcdGet32 (PcdMaximumDevicePathNodeCount) > 0) { ++ Count++; ++ if (Count >= PcdGet32 (PcdMaximumDevicePathNodeCount)) { ++ return FALSE; ++ } ++ } ++ } ++ ++ // ++ // Only return TRUE when the End Device Path node is valid. ++ // ++ return (BOOLEAN) (DevicePathNodeLength (DevicePath) == END_DEVICE_PATH_LENGTH); ++} ++ ++/** + Returns the Type field of a device path node. + + Returns the Type field of the device path node specified by Node. +@@ -106,8 +162,12 @@ DevicePathNodeLength ( + IN CONST VOID *Node + ) + { ++ UINTN Length; ++ + ASSERT (Node != NULL); +- return ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]); ++ Length = ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]); ++ ASSERT (Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL)); ++ return Length; + } + + /** +@@ -227,7 +287,8 @@ IsDevicePathEndInstance ( + be used to set the contents of the Length field. + + If Node is NULL, then ASSERT(). +- If NodeLength >= 0x10000, then ASSERT(). ++ If NodeLength >= SIZE_64KB, then ASSERT(). ++ If NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL), then ASSERT(). + + @param Node A pointer to a device path node data structure. + @param Length The length, in bytes, of the device path node. +@@ -243,7 +304,7 @@ SetDevicePathNodeLength ( + ) + { + ASSERT (Node != NULL); +- ASSERT (Length < 0x10000); ++ ASSERT ((Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL)) && (Length < SIZE_64KB)); + return WriteUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0], (UINT16)(Length)); + } + +@@ -277,12 +338,12 @@ SetDevicePathEndNode ( + Returns the size of a device path in bytes. + + This function returns the size, in bytes, of the device path data structure +- specified by DevicePath including the end of device path node. If DevicePath +- is NULL, then 0 is returned. ++ specified by DevicePath including the end of device path node. ++ If DevicePath is NULL or invalid, then 0 is returned. + + @param DevicePath A pointer to a device path data structure. +- +- @retval 0 If DevicePath is NULL. ++ ++ @retval 0 If DevicePath is NULL or invalid. + @retval Others The size of a device path in bytes. + + **/ +@@ -298,6 +359,10 @@ GetDevicePathSize ( + return 0; + } + ++ if (!IsDevicePathValid (DevicePath, 0)) { ++ return 0; ++ } ++ + // + // Search for the end of the device path structure + // +@@ -324,7 +389,7 @@ GetDevicePathSize ( + + @param DevicePath A pointer to a device path data structure. + +- @retval NULL If DevicePath is NULL. ++ @retval NULL DevicePath is NULL or invalid. + @retval Others A pointer to the duplicated device path. + + **/ +@@ -370,6 +435,7 @@ DuplicateDevicePath ( + @param SecondDevicePath A pointer to a device path data structure. + + @retval NULL If there is not enough memory for the newly allocated buffer. ++ @retval NULL If FirstDevicePath or SecondDevicePath is invalid. + @retval Others A pointer to the new device path if success. + Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL. + +@@ -398,6 +464,10 @@ AppendDevicePath ( + return DuplicateDevicePath (FirstDevicePath); + } + ++ if (!IsDevicePathValid (FirstDevicePath, 0) || !IsDevicePathValid (SecondDevicePath, 0)) { ++ return NULL; ++ } ++ + // + // Allocate space for the combined device path. It only has one end node of + // length EFI_DEVICE_PATH_PROTOCOL. +@@ -500,6 +570,7 @@ AppendDevicePathNode ( + path instance and a new end-of-device-path-instance node is inserted between. + If DevicePath is NULL, then a copy if DevicePathInstance is returned. + If DevicePathInstance is NULL, then NULL is returned. ++ If DevicePath or DevicePathInstance is invalid, then NULL is returned. + If there is not enough memory to allocate space for the new device path, then + NULL is returned. + The memory is allocated from EFI boot services memory. It is the responsibility +@@ -531,6 +602,10 @@ AppendDevicePathInstance ( + return NULL; + } + ++ if (!IsDevicePathValid (DevicePath, 0) || !IsDevicePathValid (DevicePathInstance, 0)) { ++ return NULL; ++ } ++ + SrcSize = GetDevicePathSize (DevicePath); + InstanceSize = GetDevicePathSize (DevicePathInstance); + +@@ -559,6 +634,7 @@ AppendDevicePathInstance ( + DevicePath to point to the next device path instance in the device path (or NULL + if no more) and updates Size to hold the size of the device path instance copy. + If DevicePath is NULL, then NULL is returned. ++ If DevicePath points to a invalid device path, then NULL is returned. + If there is not enough memory to allocate space for the new device path, then + NULL is returned. + The memory is allocated from EFI boot services memory. It is the responsibility +@@ -596,6 +672,10 @@ GetNextDevicePathInstance ( + return NULL; + } + ++ if (!IsDevicePathValid (*DevicePath, 0)) { ++ return NULL; ++ } ++ + // + // Find the end of the device path instance + // +@@ -681,13 +761,14 @@ CreateDeviceNode ( + + This function returns TRUE if the device path specified by DevicePath is + multi-instance. +- Otherwise, FALSE is returned. If DevicePath is NULL, then FALSE is returned. ++ Otherwise, FALSE is returned. ++ If DevicePath is NULL or invalid, then FALSE is returned. + + @param DevicePath A pointer to a device path data structure. + + @retval TRUE DevicePath is multi-instance. +- @retval FALSE DevicePath is not multi-instance or DevicePath +- is NULL. ++ @retval FALSE DevicePath is not multi-instance, or DevicePath ++ is NULL or invalid. + + **/ + BOOLEAN +@@ -702,6 +783,10 @@ IsDevicePathMultiInstance ( + return FALSE; + } + ++ if (!IsDevicePathValid (DevicePath, 0)) { ++ return FALSE; ++ } ++ + Node = DevicePath; + while (!IsDevicePathEnd (Node)) { + if (IsDevicePathEndInstance (Node)) { +@@ -776,15 +861,14 @@ FileDevicePath ( + IN CONST CHAR16 *FileName + ) + { +- UINT16 Size; ++ UINTN Size; + FILEPATH_DEVICE_PATH *FilePath; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_DEVICE_PATH_PROTOCOL *FileDevicePath; + + DevicePath = NULL; + +- Size = (UINT16) StrSize (FileName); +- ++ Size = StrSize (FileName); + FileDevicePath = AllocatePool (Size + SIZE_OF_FILEPATH_DEVICE_PATH + END_DEVICE_PATH_LENGTH); + if (FileDevicePath != NULL) { + FilePath = (FILEPATH_DEVICE_PATH *) FileDevicePath; +diff --git a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf +index c34301d..2ae151d 100644 +--- a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf ++++ b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf +@@ -3,7 +3,7 @@ + # + # Device Path Library that layers on top of the Memory Allocation Library. + # +-# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR> ++# Copyright (c) 2007 - 2012, 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 +@@ -42,8 +42,10 @@ + MemoryAllocationLib + DebugLib + BaseMemoryLib +- ++ PcdLib + + [Protocols] + gEfiDevicePathProtocolGuid ## CONSUMES + ++[Pcd] ++ gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount +diff --git a/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLib.c b/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLib.c +index 8275dd6..1052988 100644 +--- a/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLib.c ++++ b/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLib.c +@@ -2,7 +2,7 @@ + Library instance that implement UEFI Device Path Library class based on protocol + gEfiDevicePathUtilitiesProtocolGuid. + +- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> ++ Copyright (c) 2006 - 2012, 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 +@@ -24,6 +24,7 @@ + #include <Library/MemoryAllocationLib.h> + #include <Library/BaseMemoryLib.h> + #include <Library/UefiBootServicesTableLib.h> ++#include <Library/PcdLib.h> + + EFI_DEVICE_PATH_UTILITIES_PROTOCOL *mDevicePathUtilities = NULL; + +@@ -72,6 +73,61 @@ DevicePathLibConstructor ( + } + + /** ++ Determine whether a given device path is valid. ++ If DevicePath is NULL, then ASSERT(). ++ ++ @param DevicePath A pointer to a device path data structure. ++ @param MaxSize The maximum size of the device path data structure. ++ ++ @retval TRUE DevicePath is valid. ++ @retval FALSE The length of any node node in the DevicePath is less ++ than sizeof (EFI_DEVICE_PATH_PROTOCOL). ++ @retval FALSE If MaxSize is not zero, the size of the DevicePath ++ exceeds MaxSize. ++ @retval FALSE If PcdMaximumDevicePathNodeCount is not zero, the node ++ count of the DevicePath exceeds PcdMaximumDevicePathNodeCount. ++**/ ++BOOLEAN ++EFIAPI ++IsDevicePathValid ( ++ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, ++ IN UINTN MaxSize ++ ) ++{ ++ UINTN Count; ++ UINTN Size; ++ UINTN NodeLength; ++ ++ ASSERT (DevicePath != NULL); ++ ++ for (Count = 0, Size = 0; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) { ++ NodeLength = DevicePathNodeLength (DevicePath); ++ if (NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) { ++ return FALSE; ++ } ++ ++ if (MaxSize > 0) { ++ Size += NodeLength; ++ if (Size + END_DEVICE_PATH_LENGTH > MaxSize) { ++ return FALSE; ++ } ++ } ++ ++ if (PcdGet32 (PcdMaximumDevicePathNodeCount) > 0) { ++ Count++; ++ if (Count >= PcdGet32 (PcdMaximumDevicePathNodeCount)) { ++ return FALSE; ++ } ++ } ++ } ++ ++ // ++ // Only return TRUE when the End Device Path node is valid. ++ // ++ return (BOOLEAN) (DevicePathNodeLength (DevicePath) == END_DEVICE_PATH_LENGTH); ++} ++ ++/** + Returns the Type field of a device path node. + + Returns the Type field of the device path node specified by Node. +@@ -136,8 +192,12 @@ DevicePathNodeLength ( + IN CONST VOID *Node + ) + { ++ UINTN Length; ++ + ASSERT (Node != NULL); +- return ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]); ++ Length = ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]); ++ ASSERT (Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL)); ++ return Length; + } + + /** +@@ -256,7 +316,8 @@ IsDevicePathEndInstance ( + be used to set the contents of the Length field. + + If Node is NULL, then ASSERT(). +- If NodeLength >= 0x10000, then ASSERT(). ++ If NodeLength >= SIZE_64KB, then ASSERT(). ++ If NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL), then ASSERT(). + + @param Node A pointer to a device path node data structure. + @param Length The length, in bytes, of the device path node. +@@ -272,7 +333,7 @@ SetDevicePathNodeLength ( + ) + { + ASSERT (Node != NULL); +- ASSERT (Length < 0x10000); ++ ASSERT ((Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL)) && (Length < SIZE_64KB)); + return WriteUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0], (UINT16)(Length)); + } + +@@ -305,13 +366,14 @@ SetDevicePathEndNode ( + /** + Returns the size of a device path in bytes. + +- This function returns the size, in bytes, of the device path data structure specified by +- DevicePath including the end of device path node. If DevicePath is NULL, then 0 is returned. ++ This function returns the size, in bytes, of the device path data structure ++ specified by DevicePath including the end of device path node. ++ If DevicePath is NULL or invalid, then 0 is returned. + +- @param DevicePath A pointer to a device path data structure. +- +- @retval 0 If DevicePath is NULL. +- @retval Others The size of a device path in bytes. ++ @param DevicePath A pointer to a device path data structure. ++ ++ @retval 0 If DevicePath is NULL or invalid. ++ @retval Others The size of a device path in bytes. + + **/ + UINTN +@@ -336,7 +398,7 @@ GetDevicePathSize ( + + @param DevicePath A pointer to a device path data structure. + +- @retval NULL If DevicePath is NULL. ++ @retval NULL If DevicePath is NULL or invalid. + @retval Others A pointer to the duplicated device path. + + **/ +@@ -367,6 +429,7 @@ DuplicateDevicePath ( + @param SecondDevicePath A pointer to a device path data structure. + + @retval NULL If there is not enough memory for the newly allocated buffer. ++ @retval NULL If FirstDevicePath or SecondDevicePath is invalid. + @retval Others A pointer to the new device path if success. + Or a copy an end-of-device-path if both FirstDevicePath and + SecondDevicePath are NULL. +@@ -431,6 +494,7 @@ AppendDevicePathNode ( + path instance and a new end-of-device-path-instance node is inserted between. + If DevicePath is NULL, then a copy if DevicePathInstance is returned. + If DevicePathInstance is NULL, then NULL is returned. ++ If DevicePath or DevicePathInstance is invalid, then NULL is returned. + If there is not enough memory to allocate space for the new device path, then + NULL is returned. + The memory is allocated from EFI boot services memory. It is the responsibility +@@ -524,15 +588,16 @@ CreateDeviceNode ( + /** + Determines if a device path is single or multi-instance. + +- This function returns TRUE if the device path specified by DevicePath is ++ This function returns TRUE if the device path specified by DevicePath is + multi-instance. +- Otherwise, FALSE is returned. If DevicePath is NULL, then FALSE is returned. ++ Otherwise, FALSE is returned. ++ If DevicePath is NULL or invalid, then FALSE is returned. + + @param DevicePath A pointer to a device path data structure. + + @retval TRUE DevicePath is multi-instance. +- @retval FALSE DevicePath is not multi-instance or DevicePath +- is NULL. ++ @retval FALSE DevicePath is not multi-instance, or DevicePath ++ is NULL or invalid. + + **/ + BOOLEAN +diff --git a/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf b/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf +index 3393830..16b47e3 100644 +--- a/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf ++++ b/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf +@@ -4,7 +4,7 @@ + # Device Path Library that layers on top of the UEFI 2.0 Device Path Protocol. + # This library is not available for EFI 1.10 modules. + # +-# Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR> ++# Copyright (c) 2007 - 2012, 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 +@@ -44,11 +44,14 @@ + MemoryAllocationLib + BaseLib + DebugLib +- ++ PcdLib + + [Protocols] + gEfiDevicePathProtocolGuid ## CONSUMES + gEfiDevicePathUtilitiesProtocolGuid ## CONSUMES + ++[Pcd] ++ gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount ++ + [Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] + gEfiDevicePathUtilitiesProtocolGuid +diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec +index b29cb01..aefba3f 100644 +--- a/MdePkg/MdePkg.dec ++++ b/MdePkg/MdePkg.dec +@@ -1287,6 +1287,9 @@ + ## Indicates the maximum node number of linked list + gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000|UINT32|0x00000003 + ++ ## Indicates the maximum node number of device path ++ gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount|0|UINT32|0x00000029 ++ + ## Indicates the timeout tick of holding spin lock + gEfiMdePkgTokenSpaceGuid.PcdSpinLockTimeout|10000000|UINT32|0x00000004 + Modified: refind-efi.install =================================================================== --- refind-efi.install 2012-11-07 16:02:08 UTC (rev 170419) +++ refind-efi.install 2012-11-07 17:59:59 UTC (rev 170420) @@ -4,6 +4,8 @@ refind-efi applications have been installed at /usr/lib/refind/*.efi +UEFI FS drivers have deen installed at /usr/lib/refind/drivers_*/ + Copy the efi application (according to your UEFI ARCH) and /usr/lib/refind/config/refind.conf to a sub-directory of <EFISYS>/EFI/ and add an entry to firmware boot menu using efibootmgr or mactel-boot (for Macs) Modified: refind_include_more_shell_paths.patch =================================================================== --- refind_include_more_shell_paths.patch 2012-11-07 16:02:08 UTC (rev 170419) +++ refind_include_more_shell_paths.patch 2012-11-07 17:59:59 UTC (rev 170420) @@ -1,8 +1,8 @@ diff --git a/refind/main.c b/refind/main.c -index 9558655..3f54b4f 100644 +index beac3bf..1a2cf58 100644 --- a/refind/main.c +++ b/refind/main.c -@@ -58,13 +58,13 @@ +@@ -62,13 +62,13 @@ #define MACOSX_LOADER_PATH L"System\\Library\\CoreServices\\boot.efi" #if defined (EFIX64)
