# 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