|
|
1.1 root 1: /* GRUB compatibility header
2: *
3: * taken from filo and grub.
4: */
5:
6: /*
7: * GRUB -- GRand Unified Bootloader
8: * Copyright (C) 1999,2000,2001,2003 Free Software Foundation, Inc.
9: *
10: * This program is free software; you can redistribute it and/or modify
11: * it under the terms of the GNU General Public License as published by
12: * the Free Software Foundation; either version 2 of the License, or
13: * (at your option) any later version.
14: *
15: * This program is distributed in the hope that it will be useful,
16: * but WITHOUT ANY WARRANTY; without even the implied warranty of
17: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: * GNU General Public License for more details.
19: *
20: * You should have received a copy of the GNU General Public License
21: * along with this program; if not, write to the Free Software
22: * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23: * MA 02110-1301, USA.
24: */
25:
26: /* This disables some portion of code */
27: #define STAGE1_5 1
28:
29: #if defined CONFIG_X86
30: /*
31: * ffz = Find First Zero in word. Undefined if no zero exists,
32: * so code should check against ~0UL first..
33: */
34: static __inline__ unsigned int
35: ffz (unsigned int word)
36: {
37: __asm__ ("bsfl %1,%0"
38: : "=r" (word)
39: : "r" (~word));
40: return word;
41: }
42:
43: static __inline__ unsigned int
44: log2 (unsigned int word)
45: {
46: __asm__ ("bsfl %1,%0"
47: : "=r" (word)
48: : "r" (word));
49: return word;
50: }
51:
52: #elif defined (CONFIG_PPC)
53: static __inline__ unsigned long
54: __ilog2(unsigned long x)
55: {
56: unsigned long lz;
57:
58: asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
59: return 31 - lz;
60: }
61:
62: static __inline__ unsigned long
63: ffz(unsigned long x)
64: {
65: if ((x = ~x) == 0)
66: return 32;
67:
68: return __ilog2(x & -x);
69: }
70:
71: #define log2(n) ffz(~(n))
72:
73: #else
74:
75: static __inline__ unsigned int log2(unsigned int word)
76: {
77: /* assume 8 bits per byte. */
78: unsigned int i = 1 << (sizeof(word)*8 - 1);
79: unsigned int pow = sizeof(word) * 8 - 1;
80:
81: if (! word) {
82: /* invalid parameter */
83: return -1;
84: }
85: for(; i > word; i >>= 1, pow--) ;
86:
87: return pow;
88: }
89:
90: #define ffz(n) log2(~(n))
91:
92: #endif
93:
94: static inline int
95: substring (const char *s1, const char *s2)
96: {
97: while (*s1 == *s2)
98: {
99: /* The strings match exactly. */
100: if (! *(s1++))
101: return 0;
102: s2 ++;
103: }
104:
105: /* S1 is a substring of S2. */
106: if (*s1 == 0)
107: return -1;
108:
109: /* S1 isn't a substring. */
110: return 1;
111: }
112:
113: #define grub_memmove memmove
114: #define grub_strcmp strcmp
115:
116: #define MAXINT 0x7fffffff
117:
118: /* This is only used by fsys_* to determine if it's hard disk. If it is,
119: * they try to guess filesystem type by partition type. I guess it is
120: * not necessory, so hardcoded to 0 (first floppy) --ts1 */
121: #define current_drive 0
122: #define current_slice 0
123: #define current_partition 0
124:
125: /* we fake this for now, assuming that the filesystem is not corrupt */
126: #define part_length -1
127: extern int filepos;
128: extern int filemax;
129: extern int fsmax;
130:
131: /* Error codes (descriptions are in common.c) */
132: typedef enum
133: {
134: ERR_NONE = 0,
135: ERR_BAD_FILENAME,
136: ERR_BAD_FILETYPE,
137: ERR_BAD_GZIP_DATA,
138: ERR_BAD_GZIP_HEADER,
139: ERR_BAD_PART_TABLE,
140: ERR_BAD_VERSION,
141: ERR_BELOW_1MB,
142: ERR_BOOT_COMMAND,
143: ERR_BOOT_FAILURE,
144: ERR_BOOT_FEATURES,
145: ERR_DEV_FORMAT,
146: ERR_DEV_VALUES,
147: ERR_EXEC_FORMAT,
148: ERR_FILELENGTH,
149: ERR_FILE_NOT_FOUND,
150: ERR_FSYS_CORRUPT,
151: ERR_FSYS_MOUNT,
152: ERR_GEOM,
153: ERR_NEED_LX_KERNEL,
154: ERR_NEED_MB_KERNEL,
155: ERR_NO_DISK,
156: ERR_NO_PART,
157: ERR_NUMBER_PARSING,
158: ERR_OUTSIDE_PART,
159: ERR_READ,
160: ERR_SYMLINK_LOOP,
161: ERR_UNRECOGNIZED,
162: ERR_WONT_FIT,
163: ERR_WRITE,
164: ERR_BAD_ARGUMENT,
165: ERR_UNALIGNED,
166: ERR_PRIVILEGED,
167: ERR_DEV_NEED_INIT,
168: ERR_NO_DISK_SPACE,
169: ERR_NUMBER_OVERFLOW,
170:
171: MAX_ERR_NUM
172: } grub_error_t;
173:
174: extern grub_error_t errnum;
175:
176: #define grub_open file_open
177: #define grub_read file_read
178: #define grub_seek file_seek
179: #define grub_close file_close
180:
181: /* instrumentation variables */
182: /* (Not used in FILO) */
183: extern void (*disk_read_hook) (int, int, int);
184: extern void (*disk_read_func) (int, int, int);
185:
186: #define FSYS_BUFLEN 0x8000
187: extern char FSYS_BUF[FSYS_BUFLEN];
188:
189: #define print_possibilities 0
190:
191: #define SECTOR_SIZE 512
192: #define SECTOR_BITS 9
193:
194: #ifdef CONFIG_FSYS_FAT
195: int fat_mount (void);
196: int fat_read (char *buf, int len);
197: int fat_dir (char *dirname);
198: #endif
199:
200: #ifdef CONFIG_FSYS_EXT2FS
201: int ext2fs_mount (void);
202: int ext2fs_read (char *buf, int len);
203: int ext2fs_dir (char *dirname);
204: #endif
205:
206: #ifdef CONFIG_FSYS_MINIX
207: int minix_mount (void);
208: int minix_read (char *buf, int len);
209: int minix_dir (char *dirname);
210: #endif
211:
212: #ifdef CONFIG_FSYS_REISERFS
213: int reiserfs_mount (void);
214: int reiserfs_read (char *buf, int len);
215: int reiserfs_dir (char *dirname);
216: int reiserfs_embed (int *start_sector, int needed_sectors);
217: #endif
218:
219: #ifdef CONFIG_FSYS_JFS
220: int jfs_mount (void);
221: int jfs_read (char *buf, int len);
222: int jfs_dir (char *dirname);
223: int jfs_embed (int *start_sector, int needed_sectors);
224: #endif
225:
226: #ifdef CONFIG_FSYS_XFS
227: int xfs_mount (void);
228: int xfs_read (char *buf, int len);
229: int xfs_dir (char *dirname);
230: #endif
231:
232: #ifdef CONFIG_FSYS_UFS
233: int ufs_mount (void);
234: int ufs_read (char *buf, int len);
235: int ufs_dir (char *dirname);
236: int ufs_embed (int *start_sector, int needed_sectors);
237: #endif
238:
239: #ifdef CONFIG_FSYS_ISO9660
240: int iso9660_mount (void);
241: int iso9660_read (char *buf, int len);
242: int iso9660_dir (char *dirname);
243: #endif
244:
245: /* This is not a flag actually, but used as if it were a flag. */
246: #define PC_SLICE_TYPE_HIDDEN_FLAG 0x10
247:
248: #define PC_SLICE_TYPE_NONE 0
249: #define PC_SLICE_TYPE_FAT12 1
250: #define PC_SLICE_TYPE_FAT16_LT32M 4
251: #define PC_SLICE_TYPE_EXTENDED 5
252: #define PC_SLICE_TYPE_FAT16_GT32M 6
253: #define PC_SLICE_TYPE_FAT32 0xb
254: #define PC_SLICE_TYPE_FAT32_LBA 0xc
255: #define PC_SLICE_TYPE_FAT16_LBA 0xe
256: #define PC_SLICE_TYPE_WIN95_EXTENDED 0xf
257: #define PC_SLICE_TYPE_EZD 0x55
258: #define PC_SLICE_TYPE_MINIX 0x80
259: #define PC_SLICE_TYPE_LINUX_MINIX 0x81
260: #define PC_SLICE_TYPE_EXT2FS 0x83
261: #define PC_SLICE_TYPE_LINUX_EXTENDED 0x85
262: #define PC_SLICE_TYPE_VSTAFS 0x9e
263: #define PC_SLICE_TYPE_DELL_UTIL 0xde
264: #define PC_SLICE_TYPE_LINUX_RAID 0xfd
265:
266: /* For convinience. */
267: /* Check if TYPE is a FAT partition type. Clear the hidden flag before
268: the check, to allow the user to mount a hidden partition in GRUB. */
269: #define IS_PC_SLICE_TYPE_FAT(type) \
270: ({ int _type = (type) & ~PC_SLICE_TYPE_HIDDEN_FLAG; \
271: _type == PC_SLICE_TYPE_FAT12 \
272: || _type == PC_SLICE_TYPE_FAT16_LT32M \
273: || _type == PC_SLICE_TYPE_FAT16_GT32M \
274: || _type == PC_SLICE_TYPE_FAT16_LBA \
275: || _type == PC_SLICE_TYPE_FAT32 \
276: || _type == PC_SLICE_TYPE_FAT32_LBA \
277: || _type == PC_SLICE_TYPE_DELL_UTIL; })
278:
279: #define IS_PC_SLICE_TYPE_MINIX(type) \
280: (((type) == PC_SLICE_TYPE_MINIX) \
281: || ((type) == PC_SLICE_TYPE_LINUX_MINIX))
282:
283: #define IS_PC_SLICE_TYPE_BSD_WITH_FS(type,fs) 0
284:
285: /* possible values for the *BSD-style partition type */
286: #define FS_UNUSED 0 /* unused */
287: #define FS_SWAP 1 /* swap */
288: #define FS_V6 2 /* Sixth Edition */
289: #define FS_V7 3 /* Seventh Edition */
290: #define FS_SYSV 4 /* System V */
291: #define FS_V71K 5 /* V7 with 1K blocks (4.1, 2.9) */
292: #define FS_V8 6 /* Eighth Edition, 4K blocks */
293: #define FS_BSDFFS 7 /* 4.2BSD fast file system */
294: #define FS_MSDOS 8 /* MSDOS file system */
295: #define FS_BSDLFS 9 /* 4.4BSD log-structured file system */
296: #define FS_OTHER 10 /* in use, but unknown/unsupported */
297: #define FS_HPFS 11 /* OS/2 high-performance file system */
298: #define FS_ISO9660 12 /* ISO 9660, normally CD-ROM */
299: #define FS_BOOT 13 /* partition contains bootstrap */
300: #define FS_ADOS 14 /* AmigaDOS fast file system */
301: #define FS_HFS 15 /* Macintosh HFS */
302: #define FS_FILECORE 16 /* Acorn Filecore Filing System */
303: #define FS_EXT2FS 17 /* Linux Extended 2 file system */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.