This->DriverBindingHandle,
ControllerHandle);
}
-
return Status;
}
FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)vol->host_data;
EFI_STATUS Status = EFI_SUCCESS;
BOOLEAN ReadOneBlock = FALSE;
- fsw_u64 StartRead = phys_bno * vol->phys_blocksize;
+ UINT64 StartRead = (UINT64) phys_bno * (UINT64) vol->phys_blocksize;
if (buffer == NULL)
return (fsw_status_t) EFI_BAD_BUFFER_SIZE;
i = 0;
do {
if ((Caches[i].Volume == Volume) &&
- (Caches[i].CacheValid == TRUE) &&
+ (Caches[i].CacheValid == TRUE) &&
(StartRead >= Caches[i].CacheStart) &&
((StartRead + vol->phys_blocksize) <= (Caches[i].CacheStart + CACHE_SIZE))) {
ReadCache = i;
if (Caches[ReadCache].Cache == NULL)
Caches[ReadCache].Cache = AllocatePool(CACHE_SIZE);
if (Caches[ReadCache].Cache != NULL) {
+ // TODO: Below call hangs on my 32-bit Mac Mini when compiled with GNU-EFI.
+ // The same binary is fine under VirtualBox, and the same call is fine when
+ // compiled with Tianocore. Further clue: Omitting "Status =" avoids the
+ // hang but produces a failure to mount the filesystem, even when the same
+ // change is made to later similar call. Calling Volume->DiskIo->ReadDisk()
+ // directly (without refit_call5_wrapper()) changes nothing. FIGURE THIS OUT!
Status = refit_call5_wrapper(Volume->DiskIo->ReadDisk, Volume->DiskIo, Volume->MediaId,
- StartRead, CACHE_SIZE, Caches[ReadCache].Cache);
+ StartRead, (UINTN) CACHE_SIZE, (VOID*) Caches[ReadCache].Cache);
if (!EFI_ERROR(Status)) {
Caches[ReadCache].CacheStart = StartRead;
Caches[ReadCache].CacheValid = TRUE;
if (ReadOneBlock) { // Something's failed, so try a simple disk read of one block....
Status = refit_call5_wrapper(Volume->DiskIo->ReadDisk, Volume->DiskIo, Volume->MediaId,
phys_bno * vol->phys_blocksize,
- vol->phys_blocksize,
- buffer);
+ (UINTN) vol->phys_blocksize,
+ (VOID*) buffer);
}
Volume->LastIOStatus = Status;
# Revision history:
#
# 0.10.1 -- Improve extraction of default kernel options from /proc/cmdline.
+# Add support for AMD64 (aka AARCH64, aa64) platform.
# 0.10.0 -- Enable running under OS X's recovery system & add warning about
# SIP & brief instructions on how to deal with it if SIP is
# detected to be enabled. Also change way refind_linux.conf default
fi
}
+# Determine what CPU type and EFI bit depth we're using.
+# Sets Platform global variable to lowercase EFI platform code (currently
+# "x64", "ia32", or "aa64") -- the same code used in filenames.
+DeterminePlatform() {
+ local CpuType
+ case "$OSTYPE" in
+ darwin*)
+ CpuType=`ioreg -l -p IODeviceTree | grep firmware-abi | cut -d "\"" -f 4`
+ if [[ "$CpuType" == EFI32 ]] ; then
+ Platform="ia32"
+ else
+ Platform="x64"
+ fi
+ ;;
+ linux*)
+ CpuType=`uname -m`
+ case "$CpuType" in
+ aarch64)
+ Platform="aa64"
+ ;;
+ x86_64)
+ Platform="x64"
+ ;;
+ i?86)
+ Platform="ia32"
+ # If we're in EFI mode, do some sanity checks, and alert the user or even
+ # abort. Not in BIOS mode, though, since that could be used on an emergency
+ # disc to try to recover a troubled Linux installation.
+ if [[ -d /sys/firmware/efi ]] ; then
+ if [[ "$ShimSource" != "none" && "$TargetDir" != "/BOOT/EFI" ]] ; then
+ echo ""
+ echo "CAUTION: shim does not currently supports 32-bit systems, so you should not"
+ echo "use the --shim option to install on such systems. Aborting!"
+ echo ""
+ exit 1
+ fi
+ echo
+ echo "CAUTION: This Linux installation uses a 32-bit kernel. 32-bit EFI-based"
+ echo "computers are VERY RARE. If you've installed a 32-bit version of Linux"
+ echo "on a 64-bit computer, you should manually install the 64-bit version of"
+ echo "rEFInd. If you're positive you want to continue with this installation,"
+ echo "answer 'Y' to the following question..."
+ echo
+ echo -n "Are you sure you want to continue (Y/N)? "
+ ReadYesNo
+ if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
+ echo "OK; continuing with the installation..."
+ else
+ exit 0
+ fi
+ fi # In EFI mode
+ ;;
+ *)
+ echo "Unknown CPU type '$CpuType'; aborting!"
+ exit 1
+ ;;
+ esac # case "$CpuType"....
+ ;;
+ *)
+ echo "Unknown OS; aborting!"
+ exit 1
+ ;;
+ esac # case "$OSTYPE"....
+} # DeterminePlatform()
+
# Abort if the rEFInd files can't be found.
# Also sets $ConfFile to point to the configuration file,
# $IconsDir to point to the icons directory,
;;
esac
RefindDir="$ThisDir/refind"
- # Note: This check is satisfied if EITHER the 32- or the 64-bit version
- # is found, even on the wrong platform. This is because the platform
- # hasn't yet been determined. This could obviously be improved, but it
- # would mean restructuring lots more code....
- if [[ ! -f "$RefindDir/refind_ia32.efi" && ! -f "$RefindDir/refind_x64.efi" ]] ; then
+
+ if [[ ! -f "$RefindDir/refind_$Platform.efi" ]] ; then
echo "The rEFInd binary file is missing! Aborting installation!"
exit 1
fi
if [[ -f "$ShimSource" ]] ; then
if [[ $ShimType == "shimx64.efi" || $ShimType == "shim.efi" ]] ; then
TargetX64="grubx64.efi"
+ TargetAARCH64="grubaa64.efi"
MokManagerSource=`dirname "$ShimSource"`/MokManager.efi
elif [[ $ShimType == "preloader.efi" || $ShimType == "PreLoader.efi" ]] ; then
TargetX64="loader.efi"
if [[ $ShimSource == "none" ]] ; then
TargetX64="bootx64.efi"
TargetIA32="bootia32.efi"
+ TargetAARCH64="bootaa64.efi"
else
- if [[ $ShimType == "shim.efi" || $ShimType == "shimx64.efi" ]] ; then
+ if [[ $ShimType == "shim.efi" || $ShimType == "shimx64.efi" || $ShimType = "shimaa64.efi" ]] ; then
TargetX64="grubx64.efi"
+ TargetAARCH64="grubaa64.efi"
elif [[ $ShimType == "preloader.efi" || $ShimType == "PreLoader.efi" ]] ; then
TargetX64="loader.efi"
else
exit 1
fi
TargetIA32="bootia32.efi"
- TargetShim="bootx64.efi"
+ TargetShim="boot$Platform.efi"
fi
if [[ $KeepName == 1 ]] ; then
echo "Installation is to /EFI/BOOT, which is incompatible with --keepname! Aborting!"
if [[ $ShimSource == "none" ]] ; then
TargetX64="bootmgfw.efi"
TargetIA32="bootmgfw.efi"
+ TargetAARCH64="bootmgfw.efi"
else
- if [[ $ShimType == "shim.efi" || $ShimType == "shimx64.efi" ]] ; then
+ if [[ $ShimType == "shim.efi" || $ShimType == "shimx64.efi" || $ShimType == "shimaa64.efi" ]] ; then
TargetX64="grubx64.efi"
+ TargetAARCH64="grubaa64.efi"
elif [[ $ShimType == "preloader.efi" || $ShimType == "PreLoader.efi" ]] ; then
TargetX64="loader.efi"
else
if [[ $ShimSource == "none" || $KeepName == 1 ]] ; then
TargetX64="refind_x64.efi"
TargetIA32="refind_ia32.efi"
+ TargetAARCH64="refind_aa64.efi"
fi
Upgrade=1
fi
if [[ $? != 0 ]] ; then
Problems=1
fi
+ cp "$RefindDir/refind_aa64.efi" "$InstallDir/$TargetDir/$TargetAARCH64" 2> /dev/null
+ if [[ $? != 0 && $Platform == "aa64" ]] ; then
+ Problems=1
+ fi
if [[ "$ShimSource" != "none" ]] ; then
TargetShim="bootx64.efi"
CopyShimFiles
cp -r "$RefindDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
cp -r "$ThisDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
elif [[ $Upgrade == 1 || $InstallToEspOnMac == 1 ]] ; then
- if [[ $Platform == 'EFI64' ]] ; then
- CopyDrivers x64
- CopyTools x64
- else
- CopyDrivers ia32
- CopyTools ia32
- fi
- fi
- Refind=""
- if [[ $Platform == 'EFI64' ]] ; then
- Refind='bootx64.efi'
- elif [[ $Platform == 'EFI32' ]] ; then
- Refind='bootia32.efi'
+ CopyDrivers "$Platform"
+ CopyTools "$Platform"
fi
+ Refind="boot$Platform.efi"
CopyKeys
- elif [[ $Platform == 'EFI64' || $TargetDir == "/EFI/Microsoft/Boot" ]] ; then
+ elif [[ $Platform == 'x64' || $TargetDir == "/EFI/Microsoft/Boot" ]] ; then
cp "$RefindDir/refind_x64.efi" "$InstallDir/$TargetDir/$TargetX64"
if [[ $? != 0 ]] ; then
Problems=1
if [[ "$TargetDir" == '/System/Library/CoreServices' ]] ; then
SetupMacHfs $TargetX64
fi
- elif [[ $Platform == 'EFI32' ]] ; then
- cp "$RefindDir/refind_ia32.efi" "$InstallDir/$TargetDir/$TargetIA32"
- if [[ $? != 0 ]] ; then
- Problems=1
+ elif [[ $Platform == 'ia32' || $Platform == 'aa64' ]] ; then
+ if [[ $Platform == 'ia32' ]] ; then
+ cp "$RefindDir/refind_ia32.efi" "$InstallDir/$TargetDir/$TargetIA32"
+ if [[ $? != 0 ]] ; then
+ Problems=1
+ fi
+ else
+ cp "$RefindDir/refind_aa64.efi" "$InstallDir/$TargetDir/$TargetAARCH64"
+ if [[ $? != 0 ]] ; then
+ Problems=1
+ fi
fi
- CopyDrivers ia32
- CopyTools ia32
- Refind="refind_ia32.efi"
+ CopyDrivers $Platform
+ CopyTools $Platform
+ Refind="refind_$Platform.efi"
if [[ "$TargetDir" == '/System/Library/CoreServices' ]] ; then
SetupMacHfs $TargetIA32
fi
echo "Installing rEFInd to the partition mounted at $InstallDir"
DetermineTargetDir
CheckForSIP
- Platform=`ioreg -l -p IODeviceTree | grep firmware-abi | cut -d "\"" -f 4`
CopyRefindFiles
cp "$ThisDir/mountesp" /usr/local/bin &> /dev/null
if [[ $InstallToEspOnMac == "1" ]] ; then
echo "Not deleting rEFItBlesser."
fi
fi
- echo
- echo "WARNING: If you have an Advanced Format disk, *DO NOT* attempt to check the"
- echo "bless status with 'bless --info', since this is known to cause disk corruption"
- echo "on some systems!!"
- echo
} # InstallOnOSX()
exit 1
fi
GenerateKeys
- mkdir -p "$TempDir/drivers_x64"
+ mkdir -p "$TempDir/drivers_$Platform"
cp "$RefindDir/refind.conf-sample $TempDir" 2> /dev/null
cp "$ThisDir/refind.conf-sample $TempDir" 2> /dev/null
cp "$RefindDir/refind_ia32.efi $TempDir" 2> /dev/null
cp -a "$RefindDir/drivers_ia32 $TempDir" 2> /dev/null
cp -a "$ThisDir/drivers_ia32 $TempDir" 2> /dev/null
- SignOneBinary "$RefindDir/refind_x64.efi" "$TempDir/refind_x64.efi"
+ SignOneBinary "$RefindDir/refind_$Platform.efi" "$TempDir/refind_$Platform.efi"
SaveIFS=$IFS
IFS=$(echo -en "\n\b")
- for Driver in `ls "$RefindDir"/drivers_x64/*.efi "$ThisDir"/drivers_x64/*.efi 2> /dev/null` ; do
+ for Driver in `ls "$RefindDir"/drivers_$Platform/*.efi "$ThisDir"/drivers_$Platform/*.efi 2> /dev/null` ; do
TempName=`basename "$Driver"`
- SignOneBinary "$Driver" "$TempDir/drivers_x64/$TempName"
+ SignOneBinary "$Driver" "$TempDir/drivers_$Platform/$TempName"
done
IFS=$SaveIFS
RefindDir="$TempDir"
if [[ $EfibootmgrProblems ]] ; then
echo
echo "ALERT: There were problems running the efibootmgr program! You may need to"
- echo "rename the $Refind binary to the default name (EFI/boot/bootx64.efi"
- echo "on x86-64 systems or EFI/boot/bootia32.efi on x86 systems) to have it run!"
+ echo "rename the $Refind binary to the default name (EFI/BOOT/bootx64.efi"
+ echo "on x86-64 systems, EFI/BOOT/bootia32.efi on x86 systems, or"
+ echo "EFI/BOOT/bootaa64.efi on ARM64 systems) to have it run!"
echo
else
echo "rEFInd has been set as the default boot manager."
FindMountedESP
DetermineTargetDir
fi
- CpuType=`uname -m`
- if [[ $CpuType == 'x86_64' ]] ; then
- Platform="EFI64"
- elif [[ ($CpuType == 'i386' || $CpuType == 'i486' || $CpuType == 'i586' || $CpuType == 'i686') ]] ; then
- Platform="EFI32"
- # If we're in EFI mode, do some sanity checks, and alert the user or even
- # abort. Not in BIOS mode, though, since that could be used on an emergency
- # disc to try to recover a troubled Linux installation.
- if [[ -d /sys/firmware/efi ]] ; then
- if [[ "$ShimSource" != "none" && "$TargetDir" != "/BOOT/EFI" ]] ; then
- echo ""
- echo "CAUTION: shim does not currently supports 32-bit systems, so you should not"
- echo "use the --shim option to install on such systems. Aborting!"
- echo ""
- exit 1
- fi
- echo
- echo "CAUTION: This Linux installation uses a 32-bit kernel. 32-bit EFI-based"
- echo "computers are VERY RARE. If you've installed a 32-bit version of Linux"
- echo "on a 64-bit computer, you should manually install the 64-bit version of"
- echo "rEFInd. If you're positive you want to continue with this installation,"
- echo "answer 'Y' to the following question..."
- echo
- echo -n "Are you sure you want to continue (Y/N)? "
- ReadYesNo
- if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
- echo "OK; continuing with the installation..."
- else
- exit 0
- fi
- fi # in EFI mode
- else
- echo "Unknown CPU type '$CpuType'; aborting!"
- exit 1
- fi
if [[ $LocalKeys == 1 ]] ; then
ReSignBinaries
exit 0
fi
fi
+DeterminePlatform
CheckForFiles
case "$OSTYPE" in
darwin*)