/* 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 */