303 lines
7.4 KiB
C
303 lines
7.4 KiB
C
/* GRUB compatibility header
|
|
*
|
|
* taken from filo and grub.
|
|
*/
|
|
|
|
/*
|
|
* GRUB -- GRand Unified Bootloader
|
|
* Copyright (C) 1999,2000,2001,2003 Free Software Foundation, Inc.
|
|
*
|
|
* This program 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 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
/* This disables some portion of code */
|
|
#define STAGE1_5 1
|
|
|
|
#if defined CONFIG_X86
|
|
/*
|
|
* ffz = Find First Zero in word. Undefined if no zero exists,
|
|
* so code should check against ~0UL first..
|
|
*/
|
|
static __inline__ unsigned int
|
|
ffz (unsigned int word)
|
|
{
|
|
__asm__ ("bsfl %1,%0"
|
|
: "=r" (word)
|
|
: "r" (~word));
|
|
return word;
|
|
}
|
|
|
|
static __inline__ unsigned int
|
|
log2 (unsigned int word)
|
|
{
|
|
__asm__ ("bsfl %1,%0"
|
|
: "=r" (word)
|
|
: "r" (word));
|
|
return word;
|
|
}
|
|
|
|
#elif defined (CONFIG_PPC)
|
|
static __inline__ unsigned long
|
|
__ilog2(unsigned long x)
|
|
{
|
|
unsigned long lz;
|
|
|
|
asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
|
|
return 31 - lz;
|
|
}
|
|
|
|
static __inline__ unsigned long
|
|
ffz(unsigned long x)
|
|
{
|
|
if ((x = ~x) == 0)
|
|
return 32;
|
|
|
|
return __ilog2(x & -x);
|
|
}
|
|
|
|
#define log2(n) ffz(~(n))
|
|
|
|
#else
|
|
|
|
static __inline__ unsigned int log2(unsigned int word)
|
|
{
|
|
/* assume 8 bits per byte. */
|
|
unsigned int i = 1 << (sizeof(word)*8 - 1);
|
|
unsigned int pow = sizeof(word) * 8 - 1;
|
|
|
|
if (! word) {
|
|
/* invalid parameter */
|
|
return -1;
|
|
}
|
|
for(; i > word; i >>= 1, pow--) ;
|
|
|
|
return pow;
|
|
}
|
|
|
|
#define ffz(n) log2(~(n))
|
|
|
|
#endif
|
|
|
|
static inline int
|
|
substring (const char *s1, const char *s2)
|
|
{
|
|
while (*s1 == *s2)
|
|
{
|
|
/* The strings match exactly. */
|
|
if (! *(s1++))
|
|
return 0;
|
|
s2 ++;
|
|
}
|
|
|
|
/* S1 is a substring of S2. */
|
|
if (*s1 == 0)
|
|
return -1;
|
|
|
|
/* S1 isn't a substring. */
|
|
return 1;
|
|
}
|
|
|
|
#define grub_memmove memmove
|
|
#define grub_strcmp strcmp
|
|
|
|
#define MAXINT 0x7fffffff
|
|
|
|
/* This is only used by fsys_* to determine if it's hard disk. If it is,
|
|
* they try to guess filesystem type by partition type. I guess it is
|
|
* not necessory, so hardcoded to 0 (first floppy) --ts1 */
|
|
#define current_drive 0
|
|
#define current_slice 0
|
|
#define current_partition 0
|
|
|
|
/* we fake this for now, assuming that the filesystem is not corrupt */
|
|
#define part_length -1
|
|
extern int filepos;
|
|
extern int filemax;
|
|
extern int fsmax;
|
|
|
|
/* Error codes (descriptions are in common.c) */
|
|
typedef enum
|
|
{
|
|
ERR_NONE = 0,
|
|
ERR_BAD_FILENAME,
|
|
ERR_BAD_FILETYPE,
|
|
ERR_BAD_GZIP_DATA,
|
|
ERR_BAD_GZIP_HEADER,
|
|
ERR_BAD_PART_TABLE,
|
|
ERR_BAD_VERSION,
|
|
ERR_BELOW_1MB,
|
|
ERR_BOOT_COMMAND,
|
|
ERR_BOOT_FAILURE,
|
|
ERR_BOOT_FEATURES,
|
|
ERR_DEV_FORMAT,
|
|
ERR_DEV_VALUES,
|
|
ERR_EXEC_FORMAT,
|
|
ERR_FILELENGTH,
|
|
ERR_FILE_NOT_FOUND,
|
|
ERR_FSYS_CORRUPT,
|
|
ERR_FSYS_MOUNT,
|
|
ERR_GEOM,
|
|
ERR_NEED_LX_KERNEL,
|
|
ERR_NEED_MB_KERNEL,
|
|
ERR_NO_DISK,
|
|
ERR_NO_PART,
|
|
ERR_NUMBER_PARSING,
|
|
ERR_OUTSIDE_PART,
|
|
ERR_READ,
|
|
ERR_SYMLINK_LOOP,
|
|
ERR_UNRECOGNIZED,
|
|
ERR_WONT_FIT,
|
|
ERR_WRITE,
|
|
ERR_BAD_ARGUMENT,
|
|
ERR_UNALIGNED,
|
|
ERR_PRIVILEGED,
|
|
ERR_DEV_NEED_INIT,
|
|
ERR_NO_DISK_SPACE,
|
|
ERR_NUMBER_OVERFLOW,
|
|
|
|
MAX_ERR_NUM
|
|
} grub_error_t;
|
|
|
|
extern grub_error_t errnum;
|
|
|
|
#define grub_open file_open
|
|
#define grub_read file_read
|
|
#define grub_seek file_seek
|
|
#define grub_close file_close
|
|
|
|
/* instrumentation variables */
|
|
/* (Not used in FILO) */
|
|
extern void (*disk_read_hook) (int, int, int);
|
|
extern void (*disk_read_func) (int, int, int);
|
|
|
|
#define FSYS_BUFLEN 0x8000
|
|
extern char FSYS_BUF[FSYS_BUFLEN];
|
|
|
|
#define print_possibilities 0
|
|
|
|
#define SECTOR_SIZE 512
|
|
#define SECTOR_BITS 9
|
|
|
|
#ifdef CONFIG_FSYS_FAT
|
|
int fat_mount (void);
|
|
int fat_read (char *buf, int len);
|
|
int fat_dir (char *dirname);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSYS_EXT2FS
|
|
int ext2fs_mount (void);
|
|
int ext2fs_read (char *buf, int len);
|
|
int ext2fs_dir (char *dirname);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSYS_MINIX
|
|
int minix_mount (void);
|
|
int minix_read (char *buf, int len);
|
|
int minix_dir (char *dirname);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSYS_REISERFS
|
|
int reiserfs_mount (void);
|
|
int reiserfs_read (char *buf, int len);
|
|
int reiserfs_dir (char *dirname);
|
|
int reiserfs_embed (int *start_sector, int needed_sectors);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSYS_JFS
|
|
int jfs_mount (void);
|
|
int jfs_read (char *buf, int len);
|
|
int jfs_dir (char *dirname);
|
|
int jfs_embed (int *start_sector, int needed_sectors);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSYS_XFS
|
|
int xfs_mount (void);
|
|
int xfs_read (char *buf, int len);
|
|
int xfs_dir (char *dirname);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSYS_UFS
|
|
int ufs_mount (void);
|
|
int ufs_read (char *buf, int len);
|
|
int ufs_dir (char *dirname);
|
|
int ufs_embed (int *start_sector, int needed_sectors);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSYS_ISO9660
|
|
int iso9660_mount (void);
|
|
int iso9660_read (char *buf, int len);
|
|
int iso9660_dir (char *dirname);
|
|
#endif
|
|
|
|
/* This is not a flag actually, but used as if it were a flag. */
|
|
#define PC_SLICE_TYPE_HIDDEN_FLAG 0x10
|
|
|
|
#define PC_SLICE_TYPE_NONE 0
|
|
#define PC_SLICE_TYPE_FAT12 1
|
|
#define PC_SLICE_TYPE_FAT16_LT32M 4
|
|
#define PC_SLICE_TYPE_EXTENDED 5
|
|
#define PC_SLICE_TYPE_FAT16_GT32M 6
|
|
#define PC_SLICE_TYPE_FAT32 0xb
|
|
#define PC_SLICE_TYPE_FAT32_LBA 0xc
|
|
#define PC_SLICE_TYPE_FAT16_LBA 0xe
|
|
#define PC_SLICE_TYPE_WIN95_EXTENDED 0xf
|
|
#define PC_SLICE_TYPE_EZD 0x55
|
|
#define PC_SLICE_TYPE_MINIX 0x80
|
|
#define PC_SLICE_TYPE_LINUX_MINIX 0x81
|
|
#define PC_SLICE_TYPE_EXT2FS 0x83
|
|
#define PC_SLICE_TYPE_LINUX_EXTENDED 0x85
|
|
#define PC_SLICE_TYPE_VSTAFS 0x9e
|
|
#define PC_SLICE_TYPE_DELL_UTIL 0xde
|
|
#define PC_SLICE_TYPE_LINUX_RAID 0xfd
|
|
|
|
/* For convinience. */
|
|
/* Check if TYPE is a FAT partition type. Clear the hidden flag before
|
|
the check, to allow the user to mount a hidden partition in GRUB. */
|
|
#define IS_PC_SLICE_TYPE_FAT(type) \
|
|
({ int _type = (type) & ~PC_SLICE_TYPE_HIDDEN_FLAG; \
|
|
_type == PC_SLICE_TYPE_FAT12 \
|
|
|| _type == PC_SLICE_TYPE_FAT16_LT32M \
|
|
|| _type == PC_SLICE_TYPE_FAT16_GT32M \
|
|
|| _type == PC_SLICE_TYPE_FAT16_LBA \
|
|
|| _type == PC_SLICE_TYPE_FAT32 \
|
|
|| _type == PC_SLICE_TYPE_FAT32_LBA \
|
|
|| _type == PC_SLICE_TYPE_DELL_UTIL; })
|
|
|
|
#define IS_PC_SLICE_TYPE_MINIX(type) \
|
|
(((type) == PC_SLICE_TYPE_MINIX) \
|
|
|| ((type) == PC_SLICE_TYPE_LINUX_MINIX))
|
|
|
|
#define IS_PC_SLICE_TYPE_BSD_WITH_FS(type,fs) 0
|
|
|
|
/* possible values for the *BSD-style partition type */
|
|
#define FS_UNUSED 0 /* unused */
|
|
#define FS_SWAP 1 /* swap */
|
|
#define FS_V6 2 /* Sixth Edition */
|
|
#define FS_V7 3 /* Seventh Edition */
|
|
#define FS_SYSV 4 /* System V */
|
|
#define FS_V71K 5 /* V7 with 1K blocks (4.1, 2.9) */
|
|
#define FS_V8 6 /* Eighth Edition, 4K blocks */
|
|
#define FS_BSDFFS 7 /* 4.2BSD fast file system */
|
|
#define FS_MSDOS 8 /* MSDOS file system */
|
|
#define FS_BSDLFS 9 /* 4.4BSD log-structured file system */
|
|
#define FS_OTHER 10 /* in use, but unknown/unsupported */
|
|
#define FS_HPFS 11 /* OS/2 high-performance file system */
|
|
#define FS_ISO9660 12 /* ISO 9660, normally CD-ROM */
|
|
#define FS_BOOT 13 /* partition contains bootstrap */
|
|
#define FS_ADOS 14 /* AmigaDOS fast file system */
|
|
#define FS_HFS 15 /* Macintosh HFS */
|
|
#define FS_FILECORE 16 /* Acorn Filecore Filing System */
|
|
#define FS_EXT2FS 17 /* Linux Extended 2 file system */
|