2004-05-10 Robert Millan <robertmh@gnu.org>
* lib/device.c: Mangle __FreeBSD_* macro usage to support kFreeBSD-based non-FreeBSD systems (i.e. GNU/kFreeBSD). Implement runtime detection of version of kFreeBSD. Now if we build against kFreeBSD 5.x headers the GRUB shell will work on both 4.x and 5.x. Replace `u_int_t' types with portable `unsigned int' and old reference to `geometry' structure to new `geom' one. * docs/menu.lst: Split GNU/kFreeBSD and GNU/kNetBSD as separate options than FreeBSD and NetBSD, respectively. There are minor differences now (different paths).
This commit is contained in:
parent
6355ac9d94
commit
7b676b85ea
3 changed files with 114 additions and 51 deletions
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
||||||
|
2004-05-10 Robert Millan <robertmh@gnu.org>
|
||||||
|
|
||||||
|
* lib/device.c: Mangle __FreeBSD_* macro usage to support
|
||||||
|
kFreeBSD-based non-FreeBSD systems (i.e. GNU/kFreeBSD).
|
||||||
|
|
||||||
|
Implement runtime detection of version of kFreeBSD. Now if
|
||||||
|
we build against kFreeBSD 5.x headers the GRUB shell will work on
|
||||||
|
both 4.x and 5.x.
|
||||||
|
|
||||||
|
Replace `u_int_t' types with portable `unsigned int' and old
|
||||||
|
reference to `geometry' structure to new `geom' one.
|
||||||
|
|
||||||
|
* docs/menu.lst: Split GNU/kFreeBSD and GNU/kNetBSD as separate
|
||||||
|
options than FreeBSD and NetBSD, respectively. There are minor
|
||||||
|
differences now (different paths).
|
||||||
|
|
||||||
2004-05-03 Pavel Roskin <proski@gnu.org>
|
2004-05-03 Pavel Roskin <proski@gnu.org>
|
||||||
|
|
||||||
* stage2/char_io.c (convert_to_ascii): Remove "%b" support.
|
* stage2/char_io.c (convert_to_ascii): Remove "%b" support.
|
||||||
|
|
|
@ -23,6 +23,16 @@ root (hd1,0)
|
||||||
kernel /vmlinuz root=/dev/hdb1
|
kernel /vmlinuz root=/dev/hdb1
|
||||||
#initrd /initrd.img
|
#initrd /initrd.img
|
||||||
|
|
||||||
|
# For booting GNU/kFreeBSD
|
||||||
|
title GNU/kFreeBSD
|
||||||
|
root (hd0,2,a)
|
||||||
|
kernel /boot/loader.gz
|
||||||
|
|
||||||
|
# For booting GNU/kNetBSD
|
||||||
|
title GNU/kNetBSD
|
||||||
|
root (hd0,2,a)
|
||||||
|
kernel --type=netbsd /boot/knetbsd.gz
|
||||||
|
|
||||||
# For booting Mach (getting kernel from floppy)
|
# For booting Mach (getting kernel from floppy)
|
||||||
title Utah Mach4 multiboot
|
title Utah Mach4 multiboot
|
||||||
root (hd0,2)
|
root (hd0,2)
|
||||||
|
@ -30,13 +40,13 @@ pause Insert the diskette now!!
|
||||||
kernel (fd0)/boot/kernel root=hd0s3
|
kernel (fd0)/boot/kernel root=hd0s3
|
||||||
module (fd0)/boot/bootstrap
|
module (fd0)/boot/bootstrap
|
||||||
|
|
||||||
# For booting FreeBSD or GNU/KFreeBSD
|
# For booting FreeBSD
|
||||||
title FreeBSD / GNU/KFreeBSD
|
title FreeBSD
|
||||||
root (hd0,2,a)
|
root (hd0,2,a)
|
||||||
kernel /boot/loader
|
kernel /boot/loader
|
||||||
|
|
||||||
# For booting NetBSD or GNU/KNetBSD
|
# For booting NetBSD
|
||||||
title NetBSD / GNU/KNetBSD
|
title NetBSD
|
||||||
root (hd0,2,a)
|
root (hd0,2,a)
|
||||||
kernel --type=netbsd /netbsd
|
kernel --type=netbsd /netbsd
|
||||||
|
|
||||||
|
|
131
lib/device.c
131
lib/device.c
|
@ -74,17 +74,54 @@ struct hd_geometry
|
||||||
# endif /* ! BLKGETSIZE */
|
# endif /* ! BLKGETSIZE */
|
||||||
#endif /* __linux__ */
|
#endif /* __linux__ */
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
/* Use __FreeBSD_kernel__ instead of __FreeBSD__ for compatibility with
|
||||||
|
kFreeBSD-based non-FreeBSD systems (e.g. GNU/kFreeBSD) */
|
||||||
|
#if defined(__FreeBSD__) && ! defined(__FreeBSD_kernel__)
|
||||||
|
# define __FreeBSD_kernel__
|
||||||
|
#endif
|
||||||
|
#ifdef __FreeBSD_kernel__
|
||||||
|
/* Obtain version of kFreeBSD headers */
|
||||||
|
# include <osreldate.h>
|
||||||
|
# ifndef __FreeBSD_kernel_version
|
||||||
|
# define __FreeBSD_kernel_version __FreeBSD_version
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Runtime detection of kernel */
|
||||||
|
# include <sys/utsname.h>
|
||||||
|
int
|
||||||
|
get_kfreebsd_version ()
|
||||||
|
{
|
||||||
|
struct utsname uts;
|
||||||
|
int major; int minor, v[2];
|
||||||
|
|
||||||
|
uname (&uts);
|
||||||
|
sscanf (uts.release, "%d.%d", &major, &minor);
|
||||||
|
|
||||||
|
if (major >= 9)
|
||||||
|
major = 9;
|
||||||
|
if (major >= 5)
|
||||||
|
{
|
||||||
|
v[0] = minor/10; v[1] = minor%10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
v[0] = minor%10; v[1] = minor/10;
|
||||||
|
}
|
||||||
|
return major*100000+v[0]*10000+v[1]*1000;
|
||||||
|
}
|
||||||
|
#endif /* __FreeBSD_kernel__ */
|
||||||
|
|
||||||
|
#if defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
# include <sys/ioctl.h> /* ioctl */
|
# include <sys/ioctl.h> /* ioctl */
|
||||||
# include <sys/disklabel.h>
|
# include <sys/disklabel.h>
|
||||||
# include <sys/cdio.h> /* CDIOCCLRDEBUG */
|
# include <sys/cdio.h> /* CDIOCCLRDEBUG */
|
||||||
# if defined(__FreeBSD__)
|
# if defined(__FreeBSD_kernel__)
|
||||||
# include <sys/param.h>
|
# include <sys/param.h>
|
||||||
# if __FreeBSD_version >= 500040
|
# if __FreeBSD_kernel_version >= 500040
|
||||||
# include <sys/disk.h>
|
# include <sys/disk.h>
|
||||||
# endif
|
# endif
|
||||||
# endif /* __FreeBSD__ */
|
# endif /* __FreeBSD_kernel__ */
|
||||||
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
|
#endif /* __FreeBSD_kernel__ || __NetBSD__ || __OpenBSD__ */
|
||||||
|
|
||||||
#ifdef HAVE_OPENDISK
|
#ifdef HAVE_OPENDISK
|
||||||
# include <util.h>
|
# include <util.h>
|
||||||
|
@ -132,12 +169,14 @@ get_drive_geometry (struct geometry *geom, char **map, int drive)
|
||||||
goto success;
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__FreeBSD__) && __FreeBSD_version >= 500040
|
#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
/* FreeBSD version 5 and later */
|
# if defined(__FreeBSD_kernel__) && __FreeBSD_kernel_version >= 500040
|
||||||
|
/* kFreeBSD version 5 or later */
|
||||||
|
if (get_kfreebsd_version () >= 500040)
|
||||||
{
|
{
|
||||||
u_int sector_size;
|
unsigned int sector_size;
|
||||||
off_t media_size;
|
off_t media_size;
|
||||||
uint_t tmp;
|
unsigned int tmp;
|
||||||
|
|
||||||
if(ioctl (fd, DIOCGSECTORSIZE, §or_size) != 0)
|
if(ioctl (fd, DIOCGSECTORSIZE, §or_size) != 0)
|
||||||
sector_size = 512;
|
sector_size = 512;
|
||||||
|
@ -145,30 +184,31 @@ get_drive_geometry (struct geometry *geom, char **map, int drive)
|
||||||
if (ioctl (fd, DIOCGMEDIASIZE, &media_size) != 0)
|
if (ioctl (fd, DIOCGMEDIASIZE, &media_size) != 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
geometry->total_sectors = media_size / sector_size;
|
geom->total_sectors = media_size / sector_size;
|
||||||
|
|
||||||
if (ioctl (fd, DIOCGFWSECTORS, &tmp) == 0)
|
if (ioctl (fd, DIOCGFWSECTORS, &tmp) == 0)
|
||||||
geometry->sectors = tmp;
|
geom->sectors = tmp;
|
||||||
else
|
else
|
||||||
geometry->sectors = 63;
|
geom->sectors = 63;
|
||||||
if (ioctl (fd, DIOCGFWHEADS, &tmp) == 0)
|
if (ioctl (fd, DIOCGFWHEADS, &tmp) == 0)
|
||||||
geometry->heads = tmp;
|
geom->heads = tmp;
|
||||||
else if (geometry->total_sectors <= 63 * 1 * 1024)
|
else if (geom->total_sectors <= 63 * 1 * 1024)
|
||||||
geometry->heads = 1;
|
geom->heads = 1;
|
||||||
else if (geometry->total_sectors <= 63 * 16 * 1024)
|
else if (geom->total_sectors <= 63 * 16 * 1024)
|
||||||
geometry->heads = 16;
|
geom->heads = 16;
|
||||||
else
|
else
|
||||||
geometry->heads = 255;
|
geom->heads = 255;
|
||||||
|
|
||||||
geometry->cylinders = (geometry->total_sectors
|
geom->cylinders = (geom->total_sectors
|
||||||
/ geometry->heads
|
/ geom->heads
|
||||||
/ geometry->sectors);
|
/ geom->sectors);
|
||||||
|
|
||||||
goto success;
|
goto success;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
#endif /* defined(__FreeBSD_kernel__) && __FreeBSD_kernel_version >= 500040 */
|
||||||
/* FreeBSD, NetBSD or OpenBSD */
|
|
||||||
|
/* kFreeBSD < 5, NetBSD or OpenBSD */
|
||||||
{
|
{
|
||||||
struct disklabel hdg;
|
struct disklabel hdg;
|
||||||
if (ioctl (fd, DIOCGDINFO, &hdg))
|
if (ioctl (fd, DIOCGDINFO, &hdg))
|
||||||
|
@ -250,13 +290,12 @@ get_floppy_disk_name (char *name, int unit)
|
||||||
#elif defined(__GNU__)
|
#elif defined(__GNU__)
|
||||||
/* GNU/Hurd */
|
/* GNU/Hurd */
|
||||||
sprintf (name, "/dev/fd%d", unit);
|
sprintf (name, "/dev/fd%d", unit);
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD_kernel__)
|
||||||
/* FreeBSD */
|
/* kFreeBSD */
|
||||||
# if __FreeBSD__ >= 4
|
if (get_kfreebsd_version () >= 400000)
|
||||||
sprintf (name, "/dev/fd%d", unit);
|
sprintf (name, "/dev/fd%d", unit);
|
||||||
# else /* __FreeBSD__ < 4 */
|
else
|
||||||
sprintf (name, "/dev/rfd%d", unit);
|
sprintf (name, "/dev/rfd%d", unit);
|
||||||
# endif /* __FreeBSD__ < 4 */
|
|
||||||
#elif defined(__NetBSD__)
|
#elif defined(__NetBSD__)
|
||||||
/* NetBSD */
|
/* NetBSD */
|
||||||
/* opendisk() doesn't work for floppies. */
|
/* opendisk() doesn't work for floppies. */
|
||||||
|
@ -283,13 +322,12 @@ get_ide_disk_name (char *name, int unit)
|
||||||
#elif defined(__GNU__)
|
#elif defined(__GNU__)
|
||||||
/* GNU/Hurd */
|
/* GNU/Hurd */
|
||||||
sprintf (name, "/dev/hd%d", unit);
|
sprintf (name, "/dev/hd%d", unit);
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD_kernel__)
|
||||||
/* FreeBSD */
|
/* kFreeBSD */
|
||||||
# if __FreeBSD__ >= 4
|
if (get_kfreebsd_version () >= 400000)
|
||||||
sprintf (name, "/dev/ad%d", unit);
|
sprintf (name, "/dev/ad%d", unit);
|
||||||
# else /* __FreeBSD__ <= 3 */
|
else
|
||||||
sprintf (name, "/dev/rwd%d", unit);
|
sprintf (name, "/dev/rwd%d", unit);
|
||||||
# endif /* __FreeBSD__ <= 3 */
|
|
||||||
#elif defined(__NetBSD__) && defined(HAVE_OPENDISK)
|
#elif defined(__NetBSD__) && defined(HAVE_OPENDISK)
|
||||||
/* NetBSD */
|
/* NetBSD */
|
||||||
char shortname[16];
|
char shortname[16];
|
||||||
|
@ -325,13 +363,12 @@ get_scsi_disk_name (char *name, int unit)
|
||||||
#elif defined(__GNU__)
|
#elif defined(__GNU__)
|
||||||
/* GNU/Hurd */
|
/* GNU/Hurd */
|
||||||
sprintf (name, "/dev/sd%d", unit);
|
sprintf (name, "/dev/sd%d", unit);
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD_kernel__)
|
||||||
/* FreeBSD */
|
/* kFreeBSD */
|
||||||
# if __FreeBSD__ >= 4
|
if (get_kfreebsd_version () >= 400000)
|
||||||
sprintf (name, "/dev/da%d", unit);
|
sprintf (name, "/dev/da%d", unit);
|
||||||
# else /* __FreeBSD__ < 4 */
|
else
|
||||||
sprintf (name, "/dev/rda%d", unit);
|
sprintf (name, "/dev/rda%d", unit);
|
||||||
# endif /* __FreeBSD__ < 4 */
|
|
||||||
#elif defined(__NetBSD__) && defined(HAVE_OPENDISK)
|
#elif defined(__NetBSD__) && defined(HAVE_OPENDISK)
|
||||||
/* NetBSD */
|
/* NetBSD */
|
||||||
char shortname[16];
|
char shortname[16];
|
||||||
|
@ -434,12 +471,12 @@ check_device (const char *device)
|
||||||
# endif /* ! CDROM_GET_CAPABILITY */
|
# endif /* ! CDROM_GET_CAPABILITY */
|
||||||
#endif /* __linux__ */
|
#endif /* __linux__ */
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
#if defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
# ifdef CDIOCCLRDEBUG
|
# ifdef CDIOCCLRDEBUG
|
||||||
if (ioctl (fileno (fp), CDIOCCLRDEBUG, 0) >= 0)
|
if (ioctl (fileno (fp), CDIOCCLRDEBUG, 0) >= 0)
|
||||||
return 0;
|
return 0;
|
||||||
# endif /* CDIOCCLRDEBUG */
|
# endif /* CDIOCCLRDEBUG */
|
||||||
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
|
#endif /* __FreeBSD_kernel__ || __NetBSD__ || __OpenBSD__ */
|
||||||
|
|
||||||
/* Attempt to read the first sector. */
|
/* Attempt to read the first sector. */
|
||||||
if (fread (buf, 1, 512, fp) != 512)
|
if (fread (buf, 1, 512, fp) != 512)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue