aboutsummaryrefslogblamecommitdiffstats
path: root/EFI/BOOT/osdetect.cfg
blob: 40bfd28809dc22a850f0181c6c917d8c98080dce (plain) (tree)





































































































































































































































































































































































































                                                                                                           
# Sample GRUB script to autodetect operating systems
#
# Copyright (C) 2010  Free Software Foundation, Inc.
# Copyright (C) 2011, 2012 Jordan Uggla
# Copyright (C) 2011, 2012 Adrian Gibanel
# Copyright (C) 2013 Niall Walsh
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

source "${prefix}/tools.cfg"

set saved_root=$root

function freebsd_ufs_variants {
    set device=$1
    set fstype=$2
    set uuid=$3

    menuentry "FreeBSD ($fstype $device)" $device $uuid {
	set root=$2
	set uuid=$3

	kfreebsd /boot/kernel/kernel
	set kFreeBSD.acpi_load=YES
	set kFreeBSD.hint.acpi.0.disabled=0
	set kFreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid
	kfreebsd_loadenv /boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (single)" $device $uuid {
	set root=$2
	set uuid=$3

	kfreebsd /boot/kernel/kernel -s
	set kFreeBSD.acpi_load=YES
	set kFreeBSD.hint.acpi.0.disabled=0
	set kFreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid
	kfreebsd_loadenv /boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (verbose)" $device $uuid {
	set root=$2
	set uuid=$3

	kfreebsd /boot/kernel/kernel -v
	set kFreeBSD.acpi_load=YES
	set kFreeBSD.hint.acpi.0.disabled=0
	set kFreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid
	kfreebsd_loadenv /boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (no ACPI)" $device $uuid {
	set root=$2
	set uuid=$3

	kfreebsd /boot/kernel/kernel -v
	unset kFreeBSD.acpi_load
	set kFreeBSD.hint.acpi.0.disabled=1
	set kFreeBSD.loader.acpi_disabled_by_user=1
	set kFreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid
	kfreebsd_loadenv /boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (safe mode)" $device $uuid {
	set root=$2
	set uuid=$3

	kfreebsd /boot/kernel/kernel -v
	unset kFreeBSD.acpi_load
	set kFreeBSD.hint.acpi.0.disabled=1
	set kFreeBSD.loader.acpi_disabled_by_user=1
	set kFreeBSD.hint.apic.0.disabled=1
	set kFreeBSD.hw.ata.ata_dma=0
	set kFreeBSD.hw.ata.atapi_dma=0
	set kFreeBSD.hw.ata.wc=0
	set kFreeBSD.hw.eisa_slots=0
	set kFreeBSD.hint.kbdmux.0.disabled=1
	set kFreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid
	kfreebsd_loadenv /boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (Default boot loader)" $device $uuid {
	set root=$2

	kfreebsd /boot/loader
    }
}

function freebsd_zfs_variants {
    set device=$1
    set fstype=zfs

    menuentry "FreeBSD ($fstype $device)" $device {
	set root=$2

	kfreebsd /@/boot/kernel/kernel
	set kFreeBSD.acpi_load=YES
	set kFreeBSD.hint.acpi.0.disabled=0
	kfreebsd_module_elf /@/boot/kernel/opensolaris.ko
	kfreebsd_module_elf /@/boot/kernel/zfs.ko
	kfreebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
	probe -l -s name $root
	set kFreeBSD.vfs.root.mountfrom=zfs:$name
	kfreebsd_loadenv /@/boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (single)" $device {
	set root=$2

	kfreebsd /@/boot/kernel/kernel -s
	set kFreeBSD.acpi_load=YES
	set kFreeBSD.hint.acpi.0.disabled=0
	kfreebsd_module_elf /@/boot/kernel/opensolaris.ko
	kfreebsd_module_elf /@/boot/kernel/zfs.ko
	kfreebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
	probe -l -s name $root
	set kFreeBSD.vfs.root.mountfrom=zfs:$name
	kfreebsd_loadenv /@/boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (verbose)" $device {
	set root=$2

	kfreebsd /@/boot/kernel/kernel -v
	set kFreeBSD.acpi_load=YES
	set kFreeBSD.hint.acpi.0.disabled=0
	kfreebsd_module_elf /@/boot/kernel/opensolaris.ko
	kfreebsd_module_elf /@/boot/kernel/zfs.ko
	kfreebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
	probe -l -s name $root
	set kFreeBSD.vfs.root.mountfrom=zfs:$name
	kfreebsd_loadenv /@/boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (no ACPI)" $device {
	set root=$2

	kfreebsd /@/boot/kernel/kernel -v
	unset kFreeBSD.acpi_load
	set kFreeBSD.hint.acpi.0.disabled=1
	set kFreeBSD.loader.acpi_disabled_by_user=1
	kfreebsd_module_elf /@/boot/kernel/opensolaris.ko
	kfreebsd_module_elf /@/boot/kernel/zfs.ko
	kfreebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
	probe -l -s name $root
	set kFreeBSD.vfs.root.mountfrom=zfs:$name
	kfreebsd_loadenv /@/boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (safe mode)" $device {
	set root=$2

	kfreebsd /@/boot/kernel/kernel -v
	unset kFreeBSD.acpi_load
	set kFreeBSD.hint.acpi.0.disabled=1
	set kFreeBSD.loader.acpi_disabled_by_user=1
	set kFreeBSD.hint.apic.0.disabled=1
	set kFreeBSD.hw.ata.ata_dma=0
	set kFreeBSD.hw.ata.atapi_dma=0
	set kFreeBSD.hw.ata.wc=0
	set kFreeBSD.hw.eisa_slots=0
	set kFreeBSD.hint.kbdmux.0.disabled=1
	kfreebsd_module_elf /@/boot/kernel/opensolaris.ko
	kfreebsd_module_elf /@/boot/kernel/zfs.ko
	kfreebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
	probe -l -s name $root
	set kFreeBSD.vfs.root.mountfrom=zfs:$name
	kfreebsd_loadenv /@/boot/device.hints
    }

    menuentry "FreeBSD ($fstype $device) (Default boot loader)" $device $uuid {
	set root=$2

	kfreebsd /@/boot/loader
    }

}

function get_efis {
	blockdev="$1"
	blockfs="$2"
	efis=""
	if [ "$blockfs" = "fat" ]; then
		for efi in ($blockdev)/efi/*/*.efi ($blockdev)/efi/*/*/*.efi \
		  ($blockdev)/*.efi ($blockdev)/*/*.efi ; do
			if [ -f "$efi" ] ; then
				efis="$efis $efi"
			fi
		done
		if [ -n "$efis" ]; then
			return 0
		fi
	fi
	return 1
}

insmod regexp


for dev in (*); do
    # $device: parenthesis removed from $dev
    regexp -s device '\((.*)\)' $dev
    # Discard floppy and cdrom devices in search
    # But search them if their search has been inforced

    if searchindevice "$device" ; then


	# $fstype: filesystem type identified
	probe -s fstype -f $dev
	# uuid: filesystem UUID
	probe -s uuid -u $dev

	if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then
	    menuentry "Windows Vista ($device)" $device {
		set root=$2
		chainloader +1
	    }
	elif test -f ($device)/ntldr -a \
	    -e ($device)/ntdetect.com -a -f ($device)/boot.ini; then
	    menuentry "Windows NT/2000/XP ($device)" $device {
		set root=$2
		regexp -s devnum 'hd([0-9]+)' $root
		if test "$devnum" != "0"; then
		    drivemap -s hd0 $root
		fi
		chainloader +1
	    }
	elif test -f ($device)/windows/win.com; then
	    menuentry "Windows 98/ME ($device)" $device {
		set root=$2
		regexp -s devnum 'hd([0-9]+)' $root
		if test "$devnum" != "0"; then
		    drivemap -s hd0 $root
		fi
		chainloader +1
	    }
	elif test -f ($device)/io.sys -a -f ($device)/command.com; then
	    menuentry "MS-DOS ($device)" $device {
		set root=$2
		regexp -s devnum 'hd([0-9]+)' $root
		if test "$devnum" != "0"; then
		    drivemap -s hd0 $root
		fi
		chainloader +1
	    }
	elif test -f ($device)/kernel.sys; then
	    menuentry "FreeDOS ($device)" $device {
		set root=$2
		regexp -s type '([fh])d[0-9]+' $root
		regexp -s devnum '[fh]d([0-9]+)' $root
		if test $type = 'h' -a "$devnum" != "0"; then
		    drivemap -s hd0 $root
		fi
		chainloader +1
	    }
	elif test "$fstype" = ufs1 -o "$fstype" = ufs2 -a \
	    -e ($device)/boot/kernel/kernel -a \
	    -e ($device)/boot/device.hints; then

	    freebsd_ufs_variants $device $fstype $uuid

	elif test "$fstype" = zfs -a \
	    -e ($device)/@/boot/kernel/kernel -a \
	    -e ($device)/@/boot/device.hints; then

	    freebsd_zfs_variants $device

	elif test "$fstype" = hfsplus -a -f ($device)/mach_kernel; then
	    menuentry "Mac OS X/Darwin" $device $uuid {
		set root=$2
		set uuid=$3

		insmod vbe
		do_resume=0
		if [ /var/vm/sleepimage -nt10 / ]; then
		    if xnu_resume /var/vm/sleepimage; then
			do_resume=1
		    fi
		fi
		if [ $do_resume = 1 ]; then
		    xnu_uuid $uuid uuid
		    if [ -f /Extra/DSDT.aml ]; then
			acpi -e /Extra/DSDT.aml
		    fi
		    xnu_kernel /mach_kernel boot-uuid=${uuid} rd=*uuid
		    if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
			xnu_mkext /System/Library/Extensions.mkext
		    else
			xnu_mkext /System/Library/Extensions
		    fi
		    if [ -f /Extra/Extensions.mkext ]; then
			xnu_mkext /Extra/Extensions.mkext
		    fi
		    if [ -d /Extra/Extensions ]; then
			xnu_kextdir /Extra/Extensions
		    fi
		    if [ -f /Extra/devtree.txt ]; then
			xnu_devtree /Extra/devtree.txt
		    fi
		    if [ -f /Extra/splash.jpg ]; then
			insmod jpeg
			xnu_splash /Extra/splash.jpg
		    fi
		    if [ -f /Extra/splash.png ]; then
			insmod png
			xnu_splash /Extra/splash.png
		    fi
		    if [ -f /Extra/splash.tga ]; then
			insmod tga
			xnu_splash /Extra/splash.tga
		    fi
		fi
	    }
	elif get_efis $device $fstype; then
		for efi in $efis; do
			menuentry "$efi" "$device" {
				efi_device="$2"
				efi="$1"
				if [ "$grub_platform" = "efi" ]; then
					root="$efi_device"
					chainloader "$efi"
				else
					echo $"Sorry, but we are booted via BIOS and can not load this OS."
					echo $"Please try booting SG2D via UEFI."
					echo $"Press escape to return to the menu"
					sleep --interruptible 9999
				fi
			}
		done
	else
	    set root=$device
	    for file in /boot/vmlinuz-* /boot/linux-*; do
		if test -f $file; then
		    regexp -s version '/boot/vmlinuz-(.*)' $file
		    regexp -s version '/boot/linux-(.*)' $file

		    menuentry "Linux $file" $device $uuid $file $version {
			set root=$2
			set uuid=$3
			set kernel=$4
			set version=$5

			linux $kernel root=UUID=$uuid ro
			if test -f /boot/initrd-$version.img; then
			    initrd /boot/initrd-$version.img
			elif test -f /boot/initrd.img-$version; then
			    initrd /boot/initrd.img-$version
			elif test -f /boot/initrd-$version; then
			    initrd /boot/initrd-$version
			elif test -f /boot/initrd.gz; then
			    initrd /boot/initrd.gz
			fi
		    }

		    menuentry "Linux $file (single)" $device $uuid $file $version {
			set root=$2
			set uuid=$3
			set kernel=$4
			set version=$5

			linux $kernel root=UUID=$uuid ro single
			if test -f /boot/initrd-$version.img; then
			    initrd /boot/initrd-$version.img
			elif test -f /boot/initrd.img-$version; then
			    initrd /boot/initrd.img-$version
			elif test -f /boot/initrd-$version; then
			    initrd /boot/initrd-$version
			elif test -f /boot/initrd.gz; then
			    initrd /boot/initrd.gz
			fi
		    }
		fi
	    done
	fi
    fi
done

set root=$saved_root