]>
Commit | Line | Data |
---|---|---|
bba7212c MT |
1 | Submitted By: Jim Gifford <jim@linuxfromscratch.org> |
2 | Date: 05-28-2006 | |
3 | Initial Package Version: 0.97 | |
4 | Upstream Status: Unknown | |
5 | Origin: Fedora and Mandriva | |
6 | Description: This patch fixes issues with disk geometry not being | |
7 | detected properly. Part of this patch also fixes | |
8 | gcc 4 compile errors, which are a part of the issue. | |
9 | ||
10 | diff -Naur grub-0.97.orig/configure grub-0.97/configure | |
11 | --- grub-0.97.orig/configure 2005-05-07 19:48:12.000000000 -0700 | |
12 | +++ grub-0.97/configure 2006-05-28 20:29:36.025466751 -0700 | |
13 | @@ -3485,9 +3485,9 @@ | |
14 | echo "$as_me:$LINENO: result: $size_flag" >&5 | |
15 | echo "${ECHO_T}$size_flag" >&6 | |
16 | if test "x$size_flag" = xyes; then | |
17 | - STAGE2_CFLAGS="-Os" | |
18 | + STAGE2_CFLAGS="-Os -fno-strict-aliasing" | |
19 | else | |
20 | - STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops" | |
21 | + STAGE2_CFLAGS="-O2 -fno-strict-aliasing -fno-strength-reduce -fno-unroll-loops" | |
22 | fi | |
23 | # OpenBSD has a GCC extension for protecting applications from | |
24 | # stack smashing attacks, but GRUB doesn't want this feature. | |
25 | diff -Naur grub-0.97.orig/configure.ac grub-0.97/configure.ac | |
26 | --- grub-0.97.orig/configure.ac 2005-05-07 19:36:03.000000000 -0700 | |
27 | +++ grub-0.97/configure.ac 2006-05-28 20:28:41.538819726 -0700 | |
28 | @@ -93,9 +93,9 @@ | |
29 | CFLAGS=$saved_CFLAGS | |
30 | ]) | |
31 | if test "x$size_flag" = xyes; then | |
32 | - STAGE2_CFLAGS="-Os" | |
33 | + STAGE2_CFLAGS="-Os -fno-strict-aliasing" | |
34 | else | |
35 | - STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops" | |
36 | + STAGE2_CFLAGS="-O2 -fno-strict-aliasing -fno-strength-reduce -fno-unroll-loops" | |
37 | fi | |
38 | # OpenBSD has a GCC extension for protecting applications from | |
39 | # stack smashing attacks, but GRUB doesn't want this feature. | |
40 | diff -Naur grub-0.97.orig/lib/device.c grub-0.97/lib/device.c | |
41 | --- grub-0.97.orig/lib/device.c 2005-03-27 15:14:25.000000000 -0800 | |
42 | +++ grub-0.97/lib/device.c 2006-05-28 20:34:03.546804777 -0700 | |
43 | @@ -131,6 +131,152 @@ | |
44 | #include <shared.h> | |
45 | #include <device.h> | |
46 | ||
47 | +#if defined(__linux__) | |
48 | +/* The 2.6 kernel has removed all of the geometry handling for IDE drives | |
49 | + * that did fixups for LBA, etc. This means that the geometry we get | |
50 | + * with the ioctl has a good chance of being wrong. So, we get to | |
51 | + * also know about partition tables and try to read what the geometry | |
52 | + * is there. *grumble* Very closely based on code from cfdisk | |
53 | + */ | |
54 | +static void get_kernel_geometry(int fd, long long *cyl, int *heads, int *sectors) { | |
55 | + struct hd_geometry hdg; | |
56 | + | |
57 | + if (ioctl (fd, HDIO_GETGEO, &hdg)) | |
58 | + return; | |
59 | + | |
60 | + *cyl = hdg.cylinders; | |
61 | + *heads = hdg.heads; | |
62 | + *sectors = hdg.sectors; | |
63 | +} | |
64 | + | |
65 | +struct partition { | |
66 | + unsigned char boot_ind; /* 0x80 - active */ | |
67 | + unsigned char head; /* starting head */ | |
68 | + unsigned char sector; /* starting sector */ | |
69 | + unsigned char cyl; /* starting cylinder */ | |
70 | + unsigned char sys_ind; /* What partition type */ | |
71 | + unsigned char end_head; /* end head */ | |
72 | + unsigned char end_sector; /* end sector */ | |
73 | + unsigned char end_cyl; /* end cylinder */ | |
74 | + unsigned char start4[4]; /* starting sector counting from 0 */ | |
75 | + unsigned char size4[4]; /* nr of sectors in partition */ | |
76 | +}; | |
77 | + | |
78 | +#define ALIGNMENT 2 | |
79 | +typedef union { | |
80 | + struct { | |
81 | + unsigned char align[ALIGNMENT]; | |
82 | + unsigned char b[SECTOR_SIZE]; | |
83 | + } c; | |
84 | + struct { | |
85 | + unsigned char align[ALIGNMENT]; | |
86 | + unsigned char buffer[0x1BE]; | |
87 | + struct partition part[4]; | |
88 | + unsigned char magicflag[2]; | |
89 | + } p; | |
90 | +} partition_table; | |
91 | + | |
92 | +#define PART_TABLE_FLAG0 0x55 | |
93 | +#define PART_TABLE_FLAG1 0xAA | |
94 | + | |
95 | +static void | |
96 | +get_partition_table_geometry(partition_table *bufp, long long *cyl, int *heads, | |
97 | + int *sectors) { | |
98 | + struct partition *p; | |
99 | + int i,h,s,hh,ss; | |
100 | + int first = 1; | |
101 | + int bad = 0; | |
102 | + | |
103 | + if (bufp->p.magicflag[0] != PART_TABLE_FLAG0 || | |
104 | + bufp->p.magicflag[1] != PART_TABLE_FLAG1) { | |
105 | + /* Matthew Wilcox: slightly friendlier version of | |
106 | + fatal(_("Bad signature on partition table"), 3); | |
107 | + */ | |
108 | + fprintf(stderr, "Unknown partition table signature\n"); | |
109 | + return; | |
110 | + } | |
111 | + | |
112 | + hh = ss = 0; | |
113 | + for (i=0; i<4; i++) { | |
114 | + p = &(bufp->p.part[i]); | |
115 | + if (p->sys_ind != 0) { | |
116 | + h = p->end_head + 1; | |
117 | + s = (p->end_sector & 077); | |
118 | + if (first) { | |
119 | + hh = h; | |
120 | + ss = s; | |
121 | + first = 0; | |
122 | + } else if (hh != h || ss != s) | |
123 | + bad = 1; | |
124 | + } | |
125 | + } | |
126 | + | |
127 | + if (!first && !bad) { | |
128 | + *heads = hh; | |
129 | + *sectors = ss; | |
130 | + } | |
131 | +} | |
132 | + | |
133 | +static long long my_lseek (unsigned int fd, long long offset, | |
134 | + unsigned int origin) | |
135 | +{ | |
136 | +#if defined(__linux__) && (!defined(__GLIBC__) || \ | |
137 | + ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) | |
138 | + /* Maybe libc doesn't have large file support. */ | |
139 | + loff_t offset, result; | |
140 | + static int _llseek (uint filedes, ulong hi, ulong lo, | |
141 | + loff_t *res, uint wh); | |
142 | + _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo, | |
143 | + loff_t *, res, uint, wh); | |
144 | + | |
145 | + if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET) < 0) | |
146 | + return (long long) -1; | |
147 | + return result; | |
148 | +#else | |
149 | + return lseek(fd, offset, SEEK_SET); | |
150 | +#endif | |
151 | +} | |
152 | + | |
153 | +static void get_linux_geometry (int fd, struct geometry *geom) { | |
154 | + long long kern_cyl = 0; int kern_head = 0, kern_sectors = 0; | |
155 | + long long pt_cyl = 0; int pt_head = 0, pt_sectors = 0; | |
156 | + partition_table bufp; | |
157 | + char *buff, *buf_unaligned; | |
158 | + | |
159 | + buf_unaligned = malloc(sizeof(partition_table) + 4095); | |
160 | + buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) & | |
161 | + (~(4096-1))); | |
162 | + | |
163 | + get_kernel_geometry(fd, &kern_cyl, &kern_head, &kern_sectors); | |
164 | + | |
165 | + if (my_lseek (fd, 0*SECTOR_SIZE, SEEK_SET) < 0) { | |
166 | + fprintf(stderr, "Unable to seek"); | |
167 | + } | |
168 | + | |
169 | + if (read(fd, buff, SECTOR_SIZE) == SECTOR_SIZE) { | |
170 | + memcpy(bufp.c.b, buff, SECTOR_SIZE); | |
171 | + get_partition_table_geometry(&bufp, &pt_cyl, &pt_head, &pt_sectors); | |
172 | + } else { | |
173 | + fprintf(stderr, "Unable to read partition table: %s\n", strerror(errno)); | |
174 | + } | |
175 | + | |
176 | + if (pt_head && pt_sectors) { | |
177 | + int cyl_size; | |
178 | + | |
179 | + geom->heads = pt_head; | |
180 | + geom->sectors = pt_sectors; | |
181 | + cyl_size = pt_head * pt_sectors; | |
182 | + geom->cylinders = geom->total_sectors/cyl_size; | |
183 | + } else { | |
184 | + geom->heads = kern_head; | |
185 | + geom->sectors = kern_sectors; | |
186 | + geom->cylinders = kern_cyl; | |
187 | + } | |
188 | + | |
189 | + return; | |
190 | +} | |
191 | +#endif | |
192 | + | |
193 | /* Get the geometry of a drive DRIVE. */ | |
194 | void | |
195 | get_drive_geometry (struct geometry *geom, char **map, int drive) | |
196 | @@ -151,21 +297,16 @@ | |
197 | #if defined(__linux__) | |
198 | /* Linux */ | |
199 | { | |
200 | - struct hd_geometry hdg; | |
201 | unsigned long nr; | |
202 | - | |
203 | - if (ioctl (fd, HDIO_GETGEO, &hdg)) | |
204 | - goto fail; | |
205 | ||
206 | if (ioctl (fd, BLKGETSIZE, &nr)) | |
207 | goto fail; | |
208 | ||
209 | /* Got the geometry, so save it. */ | |
210 | - geom->cylinders = hdg.cylinders; | |
211 | - geom->heads = hdg.heads; | |
212 | - geom->sectors = hdg.sectors; | |
213 | geom->total_sectors = nr; | |
214 | - | |
215 | + get_linux_geometry(fd, geom); | |
216 | + if (!geom->heads && !geom->cylinders && !geom->sectors) | |
217 | + goto fail; | |
218 | goto success; | |
219 | } | |
220 | ||
221 | @@ -844,6 +985,7 @@ | |
222 | { | |
223 | char dev[PATH_MAX]; /* XXX */ | |
224 | int fd; | |
225 | + off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; | |
226 | ||
227 | if ((partition & 0x00FF00) != 0x00FF00) | |
228 | { | |
229 | @@ -870,35 +1012,13 @@ | |
230 | errnum = ERR_NO_PART; | |
231 | return 0; | |
232 | } | |
233 | - | |
234 | -#if defined(__linux__) && (!defined(__GLIBC__) || \ | |
235 | - ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) | |
236 | - /* Maybe libc doesn't have large file support. */ | |
237 | - { | |
238 | - loff_t offset, result; | |
239 | - static int _llseek (uint filedes, ulong hi, ulong lo, | |
240 | - loff_t *res, uint wh); | |
241 | - _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo, | |
242 | - loff_t *, res, uint, wh); | |
243 | ||
244 | - offset = (loff_t) sector * (loff_t) SECTOR_SIZE; | |
245 | - if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET)) | |
246 | - { | |
247 | - errnum = ERR_DEV_VALUES; | |
248 | - return 0; | |
249 | - } | |
250 | - } | |
251 | -#else | |
252 | - { | |
253 | - off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; | |
254 | ||
255 | - if (lseek (fd, offset, SEEK_SET) != offset) | |
256 | - { | |
257 | - errnum = ERR_DEV_VALUES; | |
258 | - return 0; | |
259 | - } | |
260 | - } | |
261 | -#endif | |
262 | + if (my_lseek(fd, offset, SEEK_SET) != offset) | |
263 | + { | |
264 | + errnum = ERR_DEV_VALUES; | |
265 | + return 0; | |
266 | + } | |
267 | ||
268 | if (write (fd, buf, size * SECTOR_SIZE) != (size * SECTOR_SIZE)) | |
269 | { | |
270 | diff -Naur grub-0.97.orig/stage2/Makefile.am grub-0.97/stage2/Makefile.am | |
271 | --- grub-0.97.orig/stage2/Makefile.am 2005-02-02 12:37:35.000000000 -0800 | |
272 | +++ grub-0.97/stage2/Makefile.am 2006-05-28 20:28:41.590818435 -0700 | |
273 | @@ -24,7 +24,8 @@ | |
274 | -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \ | |
275 | -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \ | |
276 | -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \ | |
277 | - -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 | |
278 | + -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 \ | |
279 | + -fno-strict-aliasing | |
280 | ||
281 | # Stage 2 and Stage 1.5's. | |
282 | pkglibdir = $(libdir)/$(PACKAGE)/$(host_cpu)-$(host_vendor) | |
283 | diff -Naur grub-0.97.orig/stage2/boot.c grub-0.97/stage2/boot.c | |
284 | --- grub-0.97.orig/stage2/boot.c 2004-03-30 03:44:08.000000000 -0800 | |
285 | +++ grub-0.97/stage2/boot.c 2006-05-28 20:33:30.123638792 -0700 | |
286 | @@ -55,7 +55,7 @@ | |
287 | pu; | |
288 | /* presuming that MULTIBOOT_SEARCH is large enough to encompass an | |
289 | executable header */ | |
290 | - unsigned char buffer[MULTIBOOT_SEARCH]; | |
291 | + char buffer[MULTIBOOT_SEARCH]; | |
292 | ||
293 | /* sets the header pointer to point to the beginning of the | |
294 | buffer by default */ | |
295 | @@ -98,7 +98,7 @@ | |
296 | /* ELF loading supported if multiboot, FreeBSD and NetBSD. */ | |
297 | if ((type == KERNEL_TYPE_MULTIBOOT | |
298 | || pu.elf->e_ident[EI_OSABI] == ELFOSABI_FREEBSD | |
299 | - || grub_strcmp (pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0 | |
300 | + || grub_strcmp ((char *) pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0 | |
301 | || suggested_type == KERNEL_TYPE_NETBSD) | |
302 | && len > sizeof (Elf32_Ehdr) | |
303 | && BOOTABLE_I386_ELF ((*((Elf32_Ehdr *) buffer)))) | |
304 | @@ -824,8 +824,12 @@ | |
305 | moveto = (mbi.mem_upper + 0x400) << 10; | |
306 | ||
307 | moveto = (moveto - len) & 0xfffff000; | |
308 | +#if 0 | |
309 | max_addr = (lh->header == LINUX_MAGIC_SIGNATURE && lh->version >= 0x0203 | |
310 | ? lh->initrd_addr_max : LINUX_INITRD_MAX_ADDRESS); | |
311 | +#else | |
312 | + max_addr = LINUX_INITRD_MAX_ADDRESS; | |
313 | +#endif | |
314 | if (moveto + len >= max_addr) | |
315 | moveto = (max_addr - len) & 0xfffff000; | |
316 | ||
317 | diff -Naur grub-0.97.orig/stage2/disk_io.c grub-0.97/stage2/disk_io.c | |
318 | --- grub-0.97.orig/stage2/disk_io.c 2004-05-23 09:35:24.000000000 -0700 | |
319 | +++ grub-0.97/stage2/disk_io.c 2006-05-28 20:28:41.582818634 -0700 | |
320 | @@ -127,12 +127,19 @@ | |
321 | int filepos; | |
322 | int filemax; | |
323 | ||
324 | -static inline unsigned long | |
325 | -log2 (unsigned long word) | |
326 | +#define log2(n) ffz(~(n)) | |
327 | + | |
328 | +/* include/asm-i386/bitops.h */ | |
329 | +/* | |
330 | + * ffz = Find First Zero in word. Undefined if no zero exists, | |
331 | + * so code should check against ~0UL first.. | |
332 | + */ | |
333 | +static __inline__ unsigned long | |
334 | +ffz (unsigned long word) | |
335 | { | |
336 | - asm volatile ("bsfl %1,%0" | |
337 | - : "=r" (word) | |
338 | - : "r" (word)); | |
339 | + __asm__ ("bsfl %1,%0" | |
340 | +: "=r" (word) | |
341 | +: "r" (~word)); | |
342 | return word; | |
343 | } | |
344 | ||
345 | diff -Naur grub-0.97.orig/stage2/freebsd.h grub-0.97/stage2/freebsd.h | |
346 | --- grub-0.97.orig/stage2/freebsd.h 2003-07-09 04:45:52.000000000 -0700 | |
347 | +++ grub-0.97/stage2/freebsd.h 2006-05-28 20:28:41.582818634 -0700 | |
348 | @@ -78,7 +78,7 @@ | |
349 | struct bootinfo | |
350 | { | |
351 | unsigned int bi_version; | |
352 | - unsigned char *bi_kernelname; | |
353 | + char *bi_kernelname; | |
354 | struct nfs_diskless *bi_nfs_diskless; | |
355 | /* End of fields that are always present. */ | |
356 | #define bi_endcommon bi_n_bios_used | |
357 | diff -Naur grub-0.97.orig/stage2/fsys_fat.c grub-0.97/stage2/fsys_fat.c | |
358 | --- grub-0.97.orig/stage2/fsys_fat.c 2005-03-15 08:52:00.000000000 -0800 | |
359 | +++ grub-0.97/stage2/fsys_fat.c 2006-05-28 20:28:41.582818634 -0700 | |
360 | @@ -54,12 +54,19 @@ | |
361 | ||
362 | #define FAT_CACHE_SIZE 2048 | |
363 | ||
364 | +#define log2(n) ffz(~(n)) | |
365 | + | |
366 | +/* include/asm-i386/bitops.h */ | |
367 | +/* | |
368 | + * ffz = Find First Zero in word. Undefined if no zero exists, | |
369 | + * so code should check against ~0UL first.. | |
370 | + */ | |
371 | static __inline__ unsigned long | |
372 | -log2 (unsigned long word) | |
373 | +ffz (unsigned long word) | |
374 | { | |
375 | __asm__ ("bsfl %1,%0" | |
376 | - : "=r" (word) | |
377 | - : "r" (word)); | |
378 | +: "=r" (word) | |
379 | +: "r" (~word)); | |
380 | return word; | |
381 | } | |
382 | ||
383 | diff -Naur grub-0.97.orig/stage2/fsys_iso9660.c grub-0.97/stage2/fsys_iso9660.c | |
384 | --- grub-0.97.orig/stage2/fsys_iso9660.c 2004-05-11 05:11:19.000000000 -0700 | |
385 | +++ grub-0.97/stage2/fsys_iso9660.c 2006-05-28 20:28:41.582818634 -0700 | |
386 | @@ -55,13 +55,19 @@ | |
387 | #define RRCONT_BUF ((unsigned char *)(FSYS_BUF + 6144)) | |
388 | #define NAME_BUF ((unsigned char *)(FSYS_BUF + 8192)) | |
389 | ||
390 | +#define log2(n) ffz(~(n)) | |
391 | ||
392 | -static inline unsigned long | |
393 | -log2 (unsigned long word) | |
394 | +/* include/asm-i386/bitops.h */ | |
395 | +/* | |
396 | + * ffz = Find First Zero in word. Undefined if no zero exists, | |
397 | + * so code should check against ~0UL first.. | |
398 | + */ | |
399 | +static __inline__ unsigned long | |
400 | +ffz (unsigned long word) | |
401 | { | |
402 | - asm volatile ("bsfl %1,%0" | |
403 | - : "=r" (word) | |
404 | - : "r" (word)); | |
405 | + __asm__ ("bsfl %1,%0" | |
406 | +: "=r" (word) | |
407 | +: "r" (~word)); | |
408 | return word; | |
409 | } | |
410 | ||
411 | @@ -120,7 +126,7 @@ | |
412 | break; | |
413 | /* check ISO_VD_PRIMARY and ISO_STANDARD_ID */ | |
414 | if (PRIMDESC->type.l == ISO_VD_PRIMARY | |
415 | - && !memcmp(PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id))) | |
416 | + && !memcmp((char *) PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id))) | |
417 | { | |
418 | ISO_SUPER->vol_sector = sector; | |
419 | INODE->file_start = 0; | |
420 | @@ -175,7 +181,7 @@ | |
421 | for (; idr->length.l > 0; | |
422 | idr = (struct iso_directory_record *)((char *)idr + idr->length.l) ) | |
423 | { | |
424 | - const char *name = idr->name; | |
425 | + const u_int8_t *name = idr->name; | |
426 | unsigned int name_len = idr->name_len.l; | |
427 | ||
428 | file_type = (idr->flags.l & 2) ? ISO_DIRECTORY : ISO_REGULAR; | |
429 | @@ -198,7 +204,7 @@ | |
430 | rr_len = (idr->length.l - idr->name_len.l | |
431 | - sizeof(struct iso_directory_record) | |
432 | + sizeof(idr->name)); | |
433 | - rr_ptr.ptr = ((unsigned char *)idr + idr->name_len.l | |
434 | + rr_ptr.ptr = ((char *)idr + idr->name_len.l | |
435 | + sizeof(struct iso_directory_record) | |
436 | - sizeof(idr->name)); | |
437 | if (rr_ptr.i & 1) | |
438 | @@ -331,9 +337,9 @@ | |
439 | memcpy(NAME_BUF, name, name_len); | |
440 | name = NAME_BUF; | |
441 | } | |
442 | - rr_ptr.ptr = RRCONT_BUF + ce_ptr->u.ce.offset.l; | |
443 | + rr_ptr.ptr = (char *) RRCONT_BUF + ce_ptr->u.ce.offset.l; | |
444 | rr_len = ce_ptr->u.ce.size.l; | |
445 | - if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, RRCONT_BUF)) | |
446 | + if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, (char *) RRCONT_BUF)) | |
447 | { | |
448 | errnum = 0; /* this is not fatal. */ | |
449 | break; | |
450 | @@ -344,7 +350,7 @@ | |
451 | ||
452 | filemax = MAXINT; | |
453 | if (name_len >= pathlen | |
454 | - && !memcmp(name, dirname, pathlen)) | |
455 | + && !memcmp((char *) name, dirname, pathlen)) | |
456 | { | |
457 | if (dirname[pathlen] == '/' || !print_possibilities) | |
458 | { | |
459 | @@ -381,7 +387,7 @@ | |
460 | print_possibilities = -print_possibilities; | |
461 | memcpy(NAME_BUF, name, name_len); | |
462 | NAME_BUF[name_len] = '\0'; | |
463 | - print_a_completion (NAME_BUF); | |
464 | + print_a_completion ((char *) NAME_BUF); | |
465 | #endif | |
466 | } | |
467 | } | |
468 | diff -Naur grub-0.97.orig/stage2/fsys_reiserfs.c grub-0.97/stage2/fsys_reiserfs.c | |
469 | --- grub-0.97.orig/stage2/fsys_reiserfs.c 2004-02-18 14:09:10.000000000 -0800 | |
470 | +++ grub-0.97/stage2/fsys_reiserfs.c 2006-05-28 20:28:41.586818535 -0700 | |
471 | @@ -365,13 +365,19 @@ | |
472 | #define JOURNAL_START ((__u32 *) (INFO + 1)) | |
473 | #define JOURNAL_END ((__u32 *) (FSYS_BUF + FSYS_BUFLEN)) | |
474 | ||
475 | +#define log2(n) ffz(~(n)) | |
476 | ||
477 | +/* include/asm-i386/bitops.h */ | |
478 | +/* | |
479 | + * ffz = Find First Zero in word. Undefined if no zero exists, | |
480 | + * so code should check against ~0UL first.. | |
481 | + */ | |
482 | static __inline__ unsigned long | |
483 | -log2 (unsigned long word) | |
484 | +ffz (unsigned long word) | |
485 | { | |
486 | __asm__ ("bsfl %1,%0" | |
487 | - : "=r" (word) | |
488 | - : "r" (word)); | |
489 | +: "=r" (word) | |
490 | +: "r" (~word)); | |
491 | return word; | |
492 | } | |
493 | ||
494 | diff -Naur grub-0.97.orig/stage2/fsys_vstafs.c grub-0.97/stage2/fsys_vstafs.c | |
495 | --- grub-0.97.orig/stage2/fsys_vstafs.c 2003-07-09 04:45:53.000000000 -0700 | |
496 | +++ grub-0.97/stage2/fsys_vstafs.c 2006-05-28 20:28:41.586818535 -0700 | |
497 | @@ -186,35 +186,35 @@ | |
498 | int | |
499 | vstafs_read (char *addr, int len) | |
500 | { | |
501 | - struct alloc *a; | |
502 | + struct alloc *b; | |
503 | int size, ret = 0, offset, curr_len = 0; | |
504 | - int curr_ext; | |
505 | + int curr_exten; | |
506 | char extent; | |
507 | int ext_size; | |
508 | char *curr_pos; | |
509 | ||
510 | get_file_info (f_sector); | |
511 | size = FILE_INFO->len-VSTAFS_START_DATA; | |
512 | - a = FILE_INFO->blocks; | |
513 | + b = FILE_INFO->blocks; | |
514 | ||
515 | if (filepos > 0) | |
516 | { | |
517 | - if (filepos < a[0].a_len * 512 - VSTAFS_START_DATA) | |
518 | + if (filepos < b[0].a_len * 512 - VSTAFS_START_DATA) | |
519 | { | |
520 | offset = filepos + VSTAFS_START_DATA; | |
521 | extent = 0; | |
522 | - curr_len = a[0].a_len * 512 - offset - filepos; | |
523 | + curr_len = b[0].a_len * 512 - offset - filepos; | |
524 | } | |
525 | else | |
526 | { | |
527 | - ext_size = a[0].a_len * 512 - VSTAFS_START_DATA; | |
528 | + ext_size = b[0].a_len * 512 - VSTAFS_START_DATA; | |
529 | offset = filepos - ext_size; | |
530 | extent = 1; | |
531 | do | |
532 | { | |
533 | curr_len -= ext_size; | |
534 | offset -= ext_size; | |
535 | - ext_size = a[extent+1].a_len * 512; | |
536 | + ext_size = b[extent+1].a_len * 512; | |
537 | } | |
538 | while (extent < FILE_INFO->extents && offset>ext_size); | |
539 | } | |
540 | @@ -223,16 +223,16 @@ | |
541 | { | |
542 | offset = VSTAFS_START_DATA; | |
543 | extent = 0; | |
544 | - curr_len = a[0].a_len * 512 - offset; | |
545 | + curr_len = b[0].a_len * 512 - offset; | |
546 | } | |
547 | ||
548 | curr_pos = addr; | |
549 | if (curr_len > len) | |
550 | curr_len = len; | |
551 | ||
552 | - for (curr_ext=extent; | |
553 | - curr_ext < FILE_INFO->extents; | |
554 | - curr_len = a[curr_ext].a_len * 512, curr_pos += curr_len, curr_ext++) | |
555 | + for (curr_exten = extent; | |
556 | + curr_exten < FILE_INFO->extents; | |
557 | + curr_len = b[curr_exten].a_len * 512, curr_pos += curr_len, curr_exten++) | |
558 | { | |
559 | ret += curr_len; | |
560 | size -= curr_len; | |
561 | @@ -242,7 +242,7 @@ | |
562 | curr_len += size; | |
563 | } | |
564 | ||
565 | - devread (a[curr_ext].a_start,offset, curr_len, curr_pos); | |
566 | + devread (b[curr_exten].a_start, offset, curr_len, curr_pos); | |
567 | offset = 0; | |
568 | } | |
569 | ||
570 | diff -Naur grub-0.97.orig/stage2/fsys_xfs.c grub-0.97/stage2/fsys_xfs.c | |
571 | --- grub-0.97.orig/stage2/fsys_xfs.c 2005-05-07 19:15:55.000000000 -0700 | |
572 | +++ grub-0.97/stage2/fsys_xfs.c 2006-05-28 20:28:41.586818535 -0700 | |
573 | @@ -97,7 +97,7 @@ | |
574 | return ino & XFS_INO_MASK(XFS_INO_OFFSET_BITS); | |
575 | } | |
576 | ||
577 | -static inline __const__ xfs_uint16_t | |
578 | +static inline __attribute__((const)) xfs_uint16_t | |
579 | le16 (xfs_uint16_t x) | |
580 | { | |
581 | __asm__("xchgb %b0,%h0" \ | |
582 | @@ -106,7 +106,7 @@ | |
583 | return x; | |
584 | } | |
585 | ||
586 | -static inline __const__ xfs_uint32_t | |
587 | +static inline __attribute__((const)) xfs_uint32_t | |
588 | le32 (xfs_uint32_t x) | |
589 | { | |
590 | #if 0 | |
591 | @@ -122,7 +122,7 @@ | |
592 | return x; | |
593 | } | |
594 | ||
595 | -static inline __const__ xfs_uint64_t | |
596 | +static inline __attribute__((const)) xfs_uint64_t | |
597 | le64 (xfs_uint64_t x) | |
598 | { | |
599 | xfs_uint32_t h = x >> 32; | |
600 | @@ -368,7 +368,7 @@ | |
601 | default: | |
602 | namelen = sfe->namelen; | |
603 | *ino = sf_ino ((char *)sfe, namelen); | |
604 | - name = sfe->name; | |
605 | + name = (char *) sfe->name; | |
606 | sfe = (xfs_dir2_sf_entry_t *) | |
607 | ((char *)sfe + namelen + 11 - xfs.i8param); | |
608 | } | |
609 | diff -Naur grub-0.97.orig/stage2/gunzip.c grub-0.97/stage2/gunzip.c | |
610 | --- grub-0.97.orig/stage2/gunzip.c 2003-07-09 04:45:53.000000000 -0700 | |
611 | +++ grub-0.97/stage2/gunzip.c 2006-05-28 20:28:41.586818535 -0700 | |
612 | @@ -277,7 +277,7 @@ | |
613 | * is a compressed file, and simply mark it as such. | |
614 | */ | |
615 | if (no_decompression | |
616 | - || grub_read (buf, 10) != 10 | |
617 | + || grub_read ((char *) buf, 10) != 10 | |
618 | || ((*((unsigned short *) buf) != GZIP_HDR_LE) | |
619 | && (*((unsigned short *) buf) != OLD_GZIP_HDR_LE))) | |
620 | { | |
621 | @@ -293,7 +293,7 @@ | |
622 | if (buf[2] != DEFLATED | |
623 | || (buf[3] & UNSUPP_FLAGS) | |
624 | || ((buf[3] & EXTRA_FIELD) | |
625 | - && (grub_read (buf, 2) != 2 | |
626 | + && (grub_read ((char *) buf, 2) != 2 | |
627 | || bad_field (*((unsigned short *) buf)))) | |
628 | || ((buf[3] & ORIG_NAME) && bad_field (-1)) | |
629 | || ((buf[3] & COMMENT) && bad_field (-1))) | |
630 | @@ -308,7 +308,7 @@ | |
631 | ||
632 | filepos = filemax - 8; | |
633 | ||
634 | - if (grub_read (buf, 8) != 8) | |
635 | + if (grub_read ((char *) buf, 8) != 8) | |
636 | { | |
637 | if (! errnum) | |
638 | errnum = ERR_BAD_GZIP_HEADER; | |
639 | @@ -485,8 +485,8 @@ | |
640 | ||
641 | #define INBUFSIZ 0x2000 | |
642 | ||
643 | -static uch inbuf[INBUFSIZ]; | |
644 | -static int bufloc; | |
645 | +static unsigned char inbuf[INBUFSIZ]; | |
646 | +static int bufloc; | |
647 | ||
648 | static int | |
649 | get_byte (void) | |
650 | @@ -494,7 +494,7 @@ | |
651 | if (filepos == gzip_data_offset || bufloc == INBUFSIZ) | |
652 | { | |
653 | bufloc = 0; | |
654 | - grub_read (inbuf, INBUFSIZ); | |
655 | + grub_read ((char *) inbuf, INBUFSIZ); | |
656 | } | |
657 | ||
658 | return inbuf[bufloc++]; | |
659 | @@ -925,7 +925,7 @@ | |
660 | unsigned m; /* mask for bit lengths table */ | |
661 | unsigned n; /* number of lengths to get */ | |
662 | unsigned nb; /* number of bit length codes */ | |
663 | - unsigned nl; /* number of literal/length codes */ | |
664 | + unsigned nc; /* number of literal/length codes */ | |
665 | unsigned nd; /* number of distance codes */ | |
666 | unsigned ll[286 + 30]; /* literal/length and distance code lengths */ | |
667 | register ulg b; /* bit buffer */ | |
668 | @@ -937,7 +937,7 @@ | |
669 | ||
670 | /* read in table lengths */ | |
671 | NEEDBITS (5); | |
672 | - nl = 257 + ((unsigned) b & 0x1f); /* number of literal/length codes */ | |
673 | + nc = 257 + ((unsigned) b & 0x1f); /* number of literal/length codes */ | |
674 | DUMPBITS (5); | |
675 | NEEDBITS (5); | |
676 | nd = 1 + ((unsigned) b & 0x1f); /* number of distance codes */ | |
677 | @@ -945,7 +945,7 @@ | |
678 | NEEDBITS (4); | |
679 | nb = 4 + ((unsigned) b & 0xf); /* number of bit length codes */ | |
680 | DUMPBITS (4); | |
681 | - if (nl > 286 || nd > 30) | |
682 | + if (nc > 286 || nd > 30) | |
683 | { | |
684 | errnum = ERR_BAD_GZIP_DATA; | |
685 | return; | |
686 | @@ -970,7 +970,7 @@ | |
687 | } | |
688 | ||
689 | /* read in literal and distance code lengths */ | |
690 | - n = nl + nd; | |
691 | + n = nc + nd; | |
692 | m = mask_bits[bl]; | |
693 | i = l = 0; | |
694 | while ((unsigned) i < n) | |
695 | @@ -1034,7 +1034,7 @@ | |
696 | ||
697 | /* build the decoding tables for literal/length and distance codes */ | |
698 | bl = lbits; | |
699 | - if ((i = huft_build (ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) | |
700 | + if ((i = huft_build (ll, nc, 257, cplens, cplext, &tl, &bl)) != 0) | |
701 | { | |
702 | #if 0 | |
703 | if (i == 1) | |
704 | @@ -1045,7 +1045,7 @@ | |
705 | return; | |
706 | } | |
707 | bd = dbits; | |
708 | - if ((i = huft_build (ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) | |
709 | + if ((i = huft_build (ll + nc, nd, 0, cpdist, cpdext, &td, &bd)) != 0) | |
710 | { | |
711 | #if 0 | |
712 | if (i == 1) | |
713 | diff -Naur grub-0.97.orig/stage2/md5.c grub-0.97/stage2/md5.c | |
714 | --- grub-0.97.orig/stage2/md5.c 2003-07-09 04:45:53.000000000 -0700 | |
715 | +++ grub-0.97/stage2/md5.c 2006-05-28 20:28:41.590818435 -0700 | |
716 | @@ -166,7 +166,7 @@ | |
717 | inputlen -= 64 - buflen; | |
718 | while (inputlen >= 64) | |
719 | { | |
720 | - md5_transform (input); | |
721 | + md5_transform ((unsigned char *) input); | |
722 | input += 64; | |
723 | inputlen -= 64; | |
724 | } | |
725 | @@ -211,7 +211,7 @@ | |
726 | char *p; | |
727 | int saltlen; | |
728 | int i, n; | |
729 | - unsigned char alt_result[16]; | |
730 | + char alt_result[16]; | |
731 | unsigned char *digest; | |
732 | ||
733 | if (check) | |
734 | diff -Naur grub-0.97.orig/stage2/start_eltorito.S grub-0.97/stage2/start_eltorito.S | |
735 | --- grub-0.97.orig/stage2/start_eltorito.S 2004-03-27 08:14:20.000000000 -0800 | |
736 | +++ grub-0.97/stage2/start_eltorito.S 2006-05-28 20:31:17.770936712 -0700 | |
737 | @@ -40,9 +40,9 @@ | |
738 | #define ABS(x) (x-_start+BOOTSEC_LOCATION) | |
739 | ||
740 | #ifdef STAGE1_5 | |
741 | -# define STAGE_ADDR 0x2000 | |
742 | +# define STAGE_ADDR 0x2200 | |
743 | #else | |
744 | -# define STAGE_ADDR 0x8000 | |
745 | +# define STAGE_ADDR 0x8200 | |
746 | #endif /* STAGE1_5 */ | |
747 | ||
748 | /* Print message string */ | |
749 | @@ -71,12 +71,14 @@ | |
750 | . = _start + 8 /* Pad to file offset 8 */ | |
751 | ||
752 | /* This table gets filled in by mkisofs using the | |
753 | - -boot-info-table option */ | |
754 | -bi_pvd: .long 0xDEADBEEF /* LBA of primary volume descript */ | |
755 | -bi_file: .long 0xDEADBEEF /* LBA of boot file */ | |
756 | -bi_length: .long 0xDEADBEEF /* Length of boot file */ | |
757 | -bi_csum: .long 0xDEADBEEF /* Checksum of boot file */ | |
758 | -bi_reserved: .space (10*4) /* Reserved */ | |
759 | + -boot-info-table option If not, the values in this | |
760 | + table are default values that we can use to get us | |
761 | + what we need, at least under a certain set of assumptions. */ | |
762 | +bi_pvd: .long 16 /* LBA of primary volume descript */ | |
763 | +bi_file: .long 0 /* LBA of boot file */ | |
764 | +bi_length: .long 0xDEADBEEF /* Length of boot file */ | |
765 | +bi_csum: .long 0xDEADBEEF /* Checksum of boot file */ | |
766 | +bi_reserved: .space (10*4) /* Reserved */ | |
767 | ||
768 | real_start: | |
769 | xor %ax, %ax | |
770 | @@ -92,10 +94,28 @@ | |
771 | /* save drive reference first thing! */ | |
772 | mov %dl, ABS(BootDrive) | |
773 | ||
774 | - /* print a notification message on the screen */ | |
775 | - MSG(notification_string) | |
776 | + /* check if machine support IBM/MS int 13h extensions */ | |
777 | + mov $0x41, %ah | |
778 | + mov $0x55AA, %bx | |
779 | + int $0x13 | |
780 | + jnc load_image | |
781 | + | |
782 | + /* bios doesn't support int 13h extensions, print error messages */ | |
783 | + MSG(int13_error_string1) | |
784 | + MSG(notification_done) | |
785 | + MSG(int13_error_string2) | |
786 | + MSG(notification_done) | |
787 | + MSG(int13_error_string3) | |
788 | + MSG(notification_done) | |
789 | + /* even when bios says that it doesn't support int 13h | |
790 | + extensions, do not stop here and try to load image anyway, | |
791 | + because some bioses says that there isn't support for | |
792 | + extended functions but have the needed extended read function | |
793 | + (int 13h, function AH=42h) */ | |
794 | ||
795 | load_image: | |
796 | + /* print a notification message on the screen */ | |
797 | + MSG(notification_string) | |
798 | /* Set up boot file sector, size, load address */ | |
799 | mov ABS(bi_length), %eax | |
800 | add $(ISO_SECTOR_SIZE-1), %eax | |
801 | @@ -105,6 +125,8 @@ | |
802 | mov %bx, %es | |
803 | xor %bx, %bx | |
804 | mov ABS(bi_file), %eax | |
805 | + inc %eax /* do not reload the first sector (this code) */ | |
806 | + dec %bp /* this way we have more room for code in stage1 */ | |
807 | call getlinsec | |
808 | mov %ds, %ax | |
809 | mov %ax, %es | |
810 | @@ -115,7 +137,7 @@ | |
811 | mov $ABS(firstlist - BOOTSEC_LISTSIZE), %si | |
812 | mov (%si), %ebp | |
813 | mov ABS(BootDrive), %dl /* this makes sure %dl is our "boot" drive */ | |
814 | - ljmp $0, $(STAGE_ADDR+SECTOR_SIZE) /* jump to main() in asm.S */ | |
815 | + ljmp $0, $(STAGE_ADDR) /* jump to main() in asm.S */ | |
816 | ||
817 | /* go here when you need to stop the machine hard after an error condition */ | |
818 | stop: jmp stop | |
819 | @@ -171,11 +193,11 @@ | |
820 | */ | |
821 | xint13: | |
822 | movb $6, ABS(RetryCount) | |
823 | - pushal | |
824 | .try: | |
825 | + pushal | |
826 | int $0x13 | |
827 | jc 1f | |
828 | - add $(8*4), %sp /* Clean up stack */ | |
829 | + popal /* Clean up stack */ | |
830 | ret | |
831 | 1: | |
832 | mov %ah, %dl /* Save error code */ | |
833 | @@ -276,6 +298,10 @@ | |
834 | ||
835 | read_error_string: .string "Read error 0x" | |
836 | ||
837 | +int13_error_string1: .string "Support for IBM/MS INT 13h extensions not found" | |
838 | +int13_error_string2: .string "GRUB cannot be loaded if int 13h/function AH=42h isn't present" | |
839 | +int13_error_string3: .string "Trying to load stage 2 anyway..." | |
840 | + | |
841 | /* | |
842 | * EBIOS disk address packet | |
843 | */ | |
844 | @@ -306,7 +332,8 @@ | |
845 | .word 0 | |
846 | .word 0 | |
847 | ||
848 | - . = _start + SECTOR_SIZE - BOOTSEC_LISTSIZE | |
849 | + /* size of the code we can place between main body and fixed top location */ | |
850 | + . = _start + 1536 - BOOTSEC_LISTSIZE | |
851 | ||
852 | /* fill the first data listing with the default */ | |
853 | blocklist_default_start:/* this is the sector start parameter, in logical | |
854 | @@ -321,6 +348,12 @@ | |
855 | #endif | |
856 | blocklist_default_seg: /* this is the segment of the starting address | |
857 | to load the data into */ | |
858 | - .word (STAGE_ADDR + SECTOR_SIZE) >> 4 | |
859 | + .word (STAGE_ADDR) >> 4 | |
860 | ||
861 | firstlist: /* this label has to be after the list data!!! */ | |
862 | + | |
863 | + /* this is a workaround to allow more code to be added in stage1, | |
864 | + it allows more code to be added for this stage, but for this | |
865 | + we can't reload the first sector. So we have to align the code | |
866 | + to ISO_SECTOR_SIZE. */ | |
867 | + . = _start + ISO_SECTOR_SIZE | |
868 | diff -Naur grub-0.97.orig/util/grub-install.in grub-0.97/util/grub-install.in | |
869 | --- grub-0.97.orig/util/grub-install.in 2004-07-24 11:57:31.000000000 -0700 | |
870 | +++ grub-0.97/util/grub-install.in 2006-05-28 20:30:31.484088268 -0700 | |
871 | @@ -336,6 +336,10 @@ | |
872 | # Create a safe temporary file. | |
873 | test -n "$mklog" && log_file=`$mklog` | |
874 | ||
875 | + # Before all invocations of the grub shell, call sync to make sure | |
876 | + # the raw device is in sync with any bufferring in filesystems. | |
877 | + sync | |
878 | + | |
879 | $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file | |
880 | quit | |
881 | EOF | |
882 | @@ -450,6 +454,10 @@ | |
883 | # Create a safe temporary file. | |
884 | test -n "$mklog" && log_file=`$mklog` | |
885 | ||
886 | +# Before all invocations of the grub shell, call sync to make sure | |
887 | +# the raw device is in sync with any bufferring in filesystems. | |
888 | +sync | |
889 | + | |
890 | # Now perform the installation. | |
891 | $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file | |
892 | root $root_drive |