Magellan Linux

Annotation of /trunk/grub/patches/grub-0.97-reiser4.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 329 - (hide annotations) (download)
Sun Sep 2 22:53:40 2007 UTC (16 years, 9 months ago) by niro
File size: 44241 byte(s)
-added reiser4 patch

1 niro 329 diff -Naur grub-0.97/config.h.in grub-0.97-magellan/config.h.in
2     --- grub-0.97/config.h.in 2005-05-08 04:48:19.000000000 +0200
3     +++ grub-0.97-magellan/config.h.in 2007-09-03 00:37:37.000000000 +0200
4     @@ -27,9 +27,16 @@
5     /* Define to 1 if you have the <inttypes.h> header file. */
6     #undef HAVE_INTTYPES_H
7    
8     +/* Define to 1 if you have the `aal-minimal' library (-laal-minimal). */
9     +#undef HAVE_LIBAAL_MINIMAL
10     +
11     /* Define if you have a curses library */
12     #undef HAVE_LIBCURSES
13    
14     +/* Define to 1 if you have the `reiser4-minimal' library (-lreiser4-minimal).
15     + */
16     +#undef HAVE_LIBREISER4_MINIMAL
17     +
18     /* Define to 1 if you have the <memory.h> header file. */
19     #undef HAVE_MEMORY_H
20    
21     diff -Naur grub-0.97/configure.ac grub-0.97-magellan/configure.ac
22     --- grub-0.97/configure.ac 2007-09-03 00:48:33.000000000 +0200
23     +++ grub-0.97-magellan/configure.ac 2007-09-03 00:37:37.000000000 +0200
24     @@ -263,6 +263,77 @@
25     FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_REISERFS=1"
26     fi
27    
28     +dnl Checking for reiser4
29     +REISER4_LIBS=""
30     +REISER4_CFLAGS=""
31     +
32     +OLD_LIBS=$LIBS
33     +OLD_CFLAGS=$CFLAGS
34     +LIBS=""
35     +CFLAGS=""
36     +
37     +AC_ARG_ENABLE(reiser4,
38     + [ --disable-reiser4 disable Reiser4 support in Stage 2])
39     +
40     +if test x"$enable_reiser4" != xno; then
41     + AC_CHECK_LIB(aal-minimal, aal_mem_init, ,
42     + AC_MSG_WARN(
43     +Reiser4 support is disabled due to inability find libaal-minimal with
44     +memory manager support turned on.)
45     + enable_reiser4=no
46     + )
47     +fi
48     +
49     +if test x"$enable_reiser4" != xno; then
50     + AC_CHECK_HEADER(aal/libaal.h, ,
51     + AC_MSG_WARN(
52     +Libaal header files are not found. Reiser4 support is disabled
53     + )
54     + enable_reiser4=no)
55     +fi
56     +
57     +if test x"$enable_reiser4" != xno; then
58     + AC_CHECK_LIB(reiser4-minimal, reiser4_fs_open, ,
59     + AC_MSG_WARN(
60     +Reiser4 support is disabled due to inability find valid libreiser4-minimal.)
61     + enable_reiser4=no,
62     + -laal-minimal
63     + )
64     +fi
65     +
66     +if test x"$enable_reiser4" != xno; then
67     + AC_CHECK_HEADER(reiser4/libreiser4.h, ,
68     + AC_MSG_WARN(
69     +Reiser4 header files are not found. Reiser4 support is disabled.
70     + )
71     + enable_reiser4=no)
72     +fi
73     +
74     +if test x"$enable_reiser4" != xno; then
75     + REISER4_CFLAGS="$REISER4_CFLAGS -DFSYS_REISER4=1"
76     + REISER4_LIBS=$LIBS
77     +fi
78     +
79     +if test x"$enable_reiser4" != xno; then
80     + AC_CHECK_LIB(reiser4-minimal, __sym40_plug_init,
81     + REISER4_CFLAGS="$REISER4_CFLAGS -DENABLE_SYMLINKS=1",
82     +AC_MSG_WARN(Reiser4 symlinks support is disabled.),
83     + -laal-minimal
84     + )
85     +fi
86     +
87     +LIBS=$OLD_LIBS
88     +CFLAGS=$OLD_CFLAGS
89     +
90     +if test x"$enable_reiser4" != xno; then
91     + enable_reiser4_support=yes
92     + FSYS_CFLAGS="$FSYS_CFLAGS $REISER4_CFLAGS"
93     +fi
94     +
95     +AC_SUBST(REISER4_LIBS)
96     +AC_SUBST(REISER4_CFLAGS)
97     +AM_CONDITIONAL(ENABLE_REISER4_SUPPORT, test x"$enable_reiser4" != xno)
98     +
99     AC_ARG_ENABLE(vstafs,
100     [ --disable-vstafs disable VSTa FS support in Stage 2])
101    
102     diff -Naur grub-0.97/docs/grub.texi grub-0.97-magellan/docs/grub.texi
103     --- grub-0.97/docs/grub.texi 2005-05-08 04:59:59.000000000 +0200
104     +++ grub-0.97-magellan/docs/grub.texi 2007-09-03 00:37:37.000000000 +0200
105     @@ -283,7 +283,7 @@
106     Support multiple filesystem types transparently, plus a useful explicit
107     blocklist notation. The currently supported filesystem types are
108     @dfn{BSD FFS}, @dfn{DOS FAT16 and FAT32}, @dfn{Minix fs}, @dfn{Linux
109     -ext2fs}, @dfn{ReiserFS}, @dfn{JFS}, @dfn{XFS}, and @dfn{VSTa
110     +ext2fs}, @dfn{ReiserFS}, @dfn{ReiserFS}, @dfn{JFS}, @dfn{XFS}, and @dfn{VSTa
111     fs}. @xref{Filesystem}, for more information.
112    
113     @item Support automatic decompression
114     @@ -1776,6 +1776,7 @@
115     @itemx jfs_stage1_5
116     @itemx minix_stage1_5
117     @itemx reiserfs_stage1_5
118     +@itemx reiser4_stage1_5
119     @itemx vstafs_stage1_5
120     @itemx xfs_stage1_5
121    
122     diff -Naur grub-0.97/grub/Makefile.am grub-0.97-magellan/grub/Makefile.am
123     --- grub-0.97/grub/Makefile.am 2005-02-02 21:38:19.000000000 +0100
124     +++ grub-0.97-magellan/grub/Makefile.am 2007-09-03 00:37:37.000000000 +0200
125     @@ -16,4 +16,4 @@
126     AM_CFLAGS = $(GRUB_CFLAGS)
127    
128     grub_SOURCES = main.c asmstub.c
129     -grub_LDADD = ../stage2/libgrub.a ../lib/libcommon.a $(GRUB_LIBS)
130     +grub_LDADD = ../stage2/libgrub.a ../lib/libcommon.a $(GRUB_LIBS) $(REISER4_LIBS)
131     diff -Naur grub-0.97/INSTALL grub-0.97-magellan/INSTALL
132     --- grub-0.97/INSTALL 2005-05-08 04:43:15.000000000 +0200
133     +++ grub-0.97-magellan/INSTALL 2007-09-03 00:37:37.000000000 +0200
134     @@ -207,6 +207,9 @@
135     `--disable-reiserfs'
136     Omit the ReiserFS support in Stage 2.
137    
138     +`--disable-reiser4'
139     + Omit the Reiser4 support in Stage 2.
140     +
141     `--disable-vstafs'
142     Omit the VSTa filesystem support in Stage 2.
143    
144     diff -Naur grub-0.97/stage2/builtins.c grub-0.97-magellan/stage2/builtins.c
145     --- grub-0.97/stage2/builtins.c 2007-09-03 00:48:45.000000000 +0200
146     +++ grub-0.97-magellan/stage2/builtins.c 2007-09-03 00:37:37.000000000 +0200
147     @@ -4069,6 +4069,7 @@
148     {"jfs", "/jfs_stage1_5"},
149     {"minix", "/minix_stage1_5"},
150     {"reiserfs", "/reiserfs_stage1_5"},
151     + {"reiser4", "/reiser4_stage1_5"},
152     {"vstafs", "/vstafs_stage1_5"},
153     {"xfs", "/xfs_stage1_5"}
154     };
155     diff -Naur grub-0.97/stage2/builtins.c.orig grub-0.97-magellan/stage2/builtins.c.orig
156     --- grub-0.97/stage2/builtins.c.orig 2007-09-03 00:48:33.000000000 +0200
157     +++ grub-0.97-magellan/stage2/builtins.c.orig 2007-09-03 00:36:55.000000000 +0200
158     @@ -131,63 +131,98 @@
159     }
160    
161    
162     +/* blocklist_read_helper nee disk_read_blocklist_func was a nested
163     + * function, to which pointers were taken and exposed globally. Even
164     + * in the GNU-C nested functions extension, they have local linkage,
165     + * and aren't guaranteed to be accessable *at all* outside of their
166     + * containing scope.
167     + *
168     + * Above and beyond all of that, the variables within blocklist_func_context
169     + * are originally local variables, with local (not even static) linkage,
170     + * from within blocklist_func. These were each referenced by
171     + * disk_read_blocklist_func, which is only called from other functions
172     + * through a globally scoped pointer.
173     + *
174     + * The documentation in GCC actually uses the words "all hell will break
175     + * loose" to describe this scenario.
176     + *
177     + * Also, "start_sector" was also used uninitialized, but gcc doesn't warn
178     + * about it (possibly because of the scoping madness?)
179     + */
180     +
181     +static struct {
182     + int start_sector;
183     + int num_sectors;
184     + int num_entries;
185     + int last_length;
186     +} blocklist_func_context = {
187     + .start_sector = 0,
188     + .num_sectors = 0,
189     + .num_entries = 0,
190     + .last_length = 0
191     +};
192     +
193     +/* Collect contiguous blocks into one entry as many as possible,
194     + and print the blocklist notation on the screen. */
195     +static void
196     +blocklist_read_helper (int sector, int offset, int length)
197     +{
198     + int *start_sector = &blocklist_func_context.start_sector;
199     + int *num_sectors = &blocklist_func_context.num_sectors;
200     + int *num_entries = &blocklist_func_context.num_entries;
201     + int *last_length = &blocklist_func_context.last_length;
202     +
203     + if (*num_sectors > 0)
204     + {
205     + if (*start_sector + *num_sectors == sector
206     + && offset == 0 && *last_length == SECTOR_SIZE)
207     + {
208     + *num_sectors++;
209     + *last_length = length;
210     + return;
211     + }
212     + else
213     + {
214     + if (*last_length == SECTOR_SIZE)
215     + grub_printf ("%s%d+%d", *num_entries ? "," : "",
216     + *start_sector - part_start, *num_sectors);
217     + else if (*num_sectors > 1)
218     + grub_printf ("%s%d+%d,%d[0-%d]", *num_entries ? "," : "",
219     + *start_sector - part_start, *num_sectors-1,
220     + *start_sector + *num_sectors-1 - part_start,
221     + *last_length);
222     + else
223     + grub_printf ("%s%d[0-%d]", *num_entries ? "," : "",
224     + *start_sector - part_start, *last_length);
225     + *num_entries++;
226     + *num_sectors = 0;
227     + }
228     + }
229     +
230     + if (offset > 0)
231     + {
232     + grub_printf("%s%d[%d-%d]", *num_entries ? "," : "",
233     + sector-part_start, offset, offset+length);
234     + *num_entries++;
235     + }
236     + else
237     + {
238     + *start_sector = sector;
239     + *num_sectors = 1;
240     + *last_length = length;
241     + }
242     +}
243     +
244     /* blocklist */
245     static int
246     blocklist_func (char *arg, int flags)
247     {
248     char *dummy = (char *) RAW_ADDR (0x100000);
249     - int start_sector;
250     - int num_sectors = 0;
251     - int num_entries = 0;
252     - int last_length = 0;
253    
254     - auto void disk_read_blocklist_func (int sector, int offset, int length);
255     + int *start_sector = &blocklist_func_context.start_sector;
256     + int *num_sectors = &blocklist_func_context.num_sectors;
257     + int *num_entries = &blocklist_func_context.num_entries;
258    
259     - /* Collect contiguous blocks into one entry as many as possible,
260     - and print the blocklist notation on the screen. */
261     - auto void disk_read_blocklist_func (int sector, int offset, int length)
262     - {
263     - if (num_sectors > 0)
264     - {
265     - if (start_sector + num_sectors == sector
266     - && offset == 0 && last_length == SECTOR_SIZE)
267     - {
268     - num_sectors++;
269     - last_length = length;
270     - return;
271     - }
272     - else
273     - {
274     - if (last_length == SECTOR_SIZE)
275     - grub_printf ("%s%d+%d", num_entries ? "," : "",
276     - start_sector - part_start, num_sectors);
277     - else if (num_sectors > 1)
278     - grub_printf ("%s%d+%d,%d[0-%d]", num_entries ? "," : "",
279     - start_sector - part_start, num_sectors-1,
280     - start_sector + num_sectors-1 - part_start,
281     - last_length);
282     - else
283     - grub_printf ("%s%d[0-%d]", num_entries ? "," : "",
284     - start_sector - part_start, last_length);
285     - num_entries++;
286     - num_sectors = 0;
287     - }
288     - }
289     -
290     - if (offset > 0)
291     - {
292     - grub_printf("%s%d[%d-%d]", num_entries ? "," : "",
293     - sector-part_start, offset, offset+length);
294     - num_entries++;
295     - }
296     - else
297     - {
298     - start_sector = sector;
299     - num_sectors = 1;
300     - last_length = length;
301     - }
302     - }
303     -
304     /* Open the file. */
305     if (! grub_open (arg))
306     return 1;
307     @@ -206,15 +241,15 @@
308     grub_printf (")");
309    
310     /* Read in the whole file to DUMMY. */
311     - disk_read_hook = disk_read_blocklist_func;
312     + disk_read_hook = blocklist_read_helper;
313     if (! grub_read (dummy, -1))
314     goto fail;
315    
316     /* The last entry may not be printed yet. Don't check if it is a
317     * full sector, since it doesn't matter if we read too much. */
318     - if (num_sectors > 0)
319     - grub_printf ("%s%d+%d", num_entries ? "," : "",
320     - start_sector - part_start, num_sectors);
321     + if (*num_sectors > 0)
322     + grub_printf ("%s%d+%d", *num_entries ? "," : "",
323     + *start_sector - part_start, *num_sectors);
324    
325     grub_printf ("\n");
326    
327     @@ -1872,6 +1907,77 @@
328    
329    
330     /* install */
331     +static struct {
332     + int saved_sector;
333     + int installaddr;
334     + int installlist;
335     + char *stage2_first_buffer;
336     +} install_func_context = {
337     + .saved_sector = 0,
338     + .installaddr = 0,
339     + .installlist = 0,
340     + .stage2_first_buffer = NULL,
341     +};
342     +
343     +/* Save the first sector of Stage2 in STAGE2_SECT. */
344     +/* Formerly disk_read_savesect_func with local scope inside install_func */
345     +static void
346     +install_savesect_helper(int sector, int offset, int length)
347     +{
348     + if (debug)
349     + printf ("[%d]", sector);
350     +
351     + /* ReiserFS has files which sometimes contain data not aligned
352     + on sector boundaries. Returning an error is better than
353     + silently failing. */
354     + if (offset != 0 || length != SECTOR_SIZE)
355     + errnum = ERR_UNALIGNED;
356     +
357     + install_func_context.saved_sector = sector;
358     +}
359     +
360     +/* Write SECTOR to INSTALLLIST, and update INSTALLADDR and INSTALLSECT. */
361     +/* Formerly disk_read_blocklist_func with local scope inside install_func */
362     +static void
363     +install_blocklist_helper (int sector, int offset, int length)
364     +{
365     + int *installaddr = &install_func_context.installaddr;
366     + int *installlist = &install_func_context.installlist;
367     + char **stage2_first_buffer = &install_func_context.stage2_first_buffer;
368     + /* Was the last sector full? */
369     + static int last_length = SECTOR_SIZE;
370     +
371     + if (debug)
372     + printf("[%d]", sector);
373     +
374     + if (offset != 0 || last_length != SECTOR_SIZE)
375     + {
376     + /* We found a non-sector-aligned data block. */
377     + errnum = ERR_UNALIGNED;
378     + return;
379     + }
380     +
381     + last_length = length;
382     +
383     + if (*((unsigned long *) (*installlist - 4))
384     + + *((unsigned short *) *installlist) != sector
385     + || *installlist == (int) *stage2_first_buffer + SECTOR_SIZE + 4)
386     + {
387     + *installlist -= 8;
388     +
389     + if (*((unsigned long *) (*installlist - 8)))
390     + errnum = ERR_WONT_FIT;
391     + else
392     + {
393     + *((unsigned short *) (*installlist + 2)) = (*installaddr >> 4);
394     + *((unsigned long *) (*installlist - 4)) = sector;
395     + }
396     + }
397     +
398     + *((unsigned short *) *installlist) += 1;
399     + *installaddr += 512;
400     +}
401     +
402     static int
403     install_func (char *arg, int flags)
404     {
405     @@ -1879,8 +1985,12 @@
406     char *stage1_buffer = (char *) RAW_ADDR (0x100000);
407     char *stage2_buffer = stage1_buffer + SECTOR_SIZE;
408     char *old_sect = stage2_buffer + SECTOR_SIZE;
409     - char *stage2_first_buffer = old_sect + SECTOR_SIZE;
410     - char *stage2_second_buffer = stage2_first_buffer + SECTOR_SIZE;
411     + /* stage2_first_buffer used to be defined as:
412     + * char *stage2_first_buffer = old_sect + SECTOR_SIZE; */
413     + char **stage2_first_buffer = &install_func_context.stage2_first_buffer;
414     + /* and stage2_second_buffer was:
415     + * char *stage2_second_buffer = stage2_first_buffer + SECTOR_SIZE; */
416     + char *stage2_second_buffer = old_sect + SECTOR_SIZE + SECTOR_SIZE;
417     /* XXX: Probably SECTOR_SIZE is reasonable. */
418     char *config_filename = stage2_second_buffer + SECTOR_SIZE;
419     char *dummy = config_filename + SECTOR_SIZE;
420     @@ -1889,10 +1999,11 @@
421     int src_drive, src_partition, src_part_start;
422     int i;
423     struct geometry dest_geom, src_geom;
424     - int saved_sector;
425     + int *saved_sector = &install_func_context.saved_sector;
426     int stage2_first_sector, stage2_second_sector;
427     char *ptr;
428     - int installaddr, installlist;
429     + int *installaddr = &install_func_context.installaddr;
430     + int *installlist = &install_func_context.installlist;
431     /* Point to the location of the name of a configuration file in Stage 2. */
432     char *config_file_location;
433     /* If FILE is a Stage 1.5? */
434     @@ -1901,67 +2012,13 @@
435     int is_open = 0;
436     /* If LBA is forced? */
437     int is_force_lba = 0;
438     - /* Was the last sector full? */
439     - int last_length = SECTOR_SIZE;
440     -
441     +
442     + *stage2_first_buffer = old_sect + SECTOR_SIZE;
443     #ifdef GRUB_UTIL
444     /* If the Stage 2 is in a partition mounted by an OS, this will store
445     the filename under the OS. */
446     char *stage2_os_file = 0;
447     #endif /* GRUB_UTIL */
448     -
449     - auto void disk_read_savesect_func (int sector, int offset, int length);
450     - auto void disk_read_blocklist_func (int sector, int offset, int length);
451     -
452     - /* Save the first sector of Stage2 in STAGE2_SECT. */
453     - auto void disk_read_savesect_func (int sector, int offset, int length)
454     - {
455     - if (debug)
456     - printf ("[%d]", sector);
457     -
458     - /* ReiserFS has files which sometimes contain data not aligned
459     - on sector boundaries. Returning an error is better than
460     - silently failing. */
461     - if (offset != 0 || length != SECTOR_SIZE)
462     - errnum = ERR_UNALIGNED;
463     -
464     - saved_sector = sector;
465     - }
466     -
467     - /* Write SECTOR to INSTALLLIST, and update INSTALLADDR and
468     - INSTALLSECT. */
469     - auto void disk_read_blocklist_func (int sector, int offset, int length)
470     - {
471     - if (debug)
472     - printf("[%d]", sector);
473     -
474     - if (offset != 0 || last_length != SECTOR_SIZE)
475     - {
476     - /* We found a non-sector-aligned data block. */
477     - errnum = ERR_UNALIGNED;
478     - return;
479     - }
480     -
481     - last_length = length;
482     -
483     - if (*((unsigned long *) (installlist - 4))
484     - + *((unsigned short *) installlist) != sector
485     - || installlist == (int) stage2_first_buffer + SECTOR_SIZE + 4)
486     - {
487     - installlist -= 8;
488     -
489     - if (*((unsigned long *) (installlist - 8)))
490     - errnum = ERR_WONT_FIT;
491     - else
492     - {
493     - *((unsigned short *) (installlist + 2)) = (installaddr >> 4);
494     - *((unsigned long *) (installlist - 4)) = sector;
495     - }
496     - }
497     -
498     - *((unsigned short *) installlist) += 1;
499     - installaddr += 512;
500     - }
501    
502     /* First, check the GNU-style long option. */
503     while (1)
504     @@ -1994,10 +2051,10 @@
505     addr = skip_to (0, file);
506    
507     /* Get the installation address. */
508     - if (! safe_parse_maxint (&addr, &installaddr))
509     + if (! safe_parse_maxint (&addr, installaddr))
510     {
511     /* ADDR is not specified. */
512     - installaddr = 0;
513     + *installaddr = 0;
514     ptr = addr;
515     errnum = 0;
516     }
517     @@ -2093,17 +2150,17 @@
518     = 0x9090;
519    
520     /* Read the first sector of Stage 2. */
521     - disk_read_hook = disk_read_savesect_func;
522     - if (grub_read (stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE)
523     + disk_read_hook = install_savesect_helper;
524     + if (grub_read (*stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE)
525     goto fail;
526    
527     - stage2_first_sector = saved_sector;
528     + stage2_first_sector = *saved_sector;
529    
530     /* Read the second sector of Stage 2. */
531     if (grub_read (stage2_second_buffer, SECTOR_SIZE) != SECTOR_SIZE)
532     goto fail;
533    
534     - stage2_second_sector = saved_sector;
535     + stage2_second_sector = *saved_sector;
536    
537     /* Check for the version of Stage 2. */
538     if (*((short *) (stage2_second_buffer + STAGE2_VER_MAJ_OFFS))
539     @@ -2119,27 +2176,27 @@
540    
541     /* If INSTALLADDR is not specified explicitly in the command-line,
542     determine it by the Stage 2 id. */
543     - if (! installaddr)
544     + if (! *installaddr)
545     {
546     if (! is_stage1_5)
547     /* Stage 2. */
548     - installaddr = 0x8000;
549     + *installaddr = 0x8000;
550     else
551     /* Stage 1.5. */
552     - installaddr = 0x2000;
553     + *installaddr = 0x2000;
554     }
555    
556     *((unsigned long *) (stage1_buffer + STAGE1_STAGE2_SECTOR))
557     = stage2_first_sector;
558     *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_ADDRESS))
559     - = installaddr;
560     + = *installaddr;
561     *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_SEGMENT))
562     - = installaddr >> 4;
563     + = *installaddr >> 4;
564    
565     - i = (int) stage2_first_buffer + SECTOR_SIZE - 4;
566     + i = (int) *stage2_first_buffer + SECTOR_SIZE - 4;
567     while (*((unsigned long *) i))
568     {
569     - if (i < (int) stage2_first_buffer
570     + if (i < (int) *stage2_first_buffer
571     || (*((int *) (i - 4)) & 0x80000000)
572     || *((unsigned short *) i) >= 0xA00
573     || *((short *) (i + 2)) == 0)
574     @@ -2153,13 +2210,13 @@
575     i -= 8;
576     }
577    
578     - installlist = (int) stage2_first_buffer + SECTOR_SIZE + 4;
579     - installaddr += SECTOR_SIZE;
580     + *installlist = (int) *stage2_first_buffer + SECTOR_SIZE + 4;
581     + *installaddr += SECTOR_SIZE;
582    
583     /* Read the whole of Stage2 except for the first sector. */
584     grub_seek (SECTOR_SIZE);
585    
586     - disk_read_hook = disk_read_blocklist_func;
587     + disk_read_hook = install_blocklist_helper;
588     if (! grub_read (dummy, -1))
589     goto fail;
590    
591     @@ -2242,7 +2299,7 @@
592     /* Skip the first sector. */
593     grub_seek (SECTOR_SIZE);
594    
595     - disk_read_hook = disk_read_savesect_func;
596     + disk_read_hook = install_savesect_helper;
597     if (grub_read (stage2_buffer, SECTOR_SIZE) != SECTOR_SIZE)
598     goto fail;
599    
600     @@ -2312,7 +2369,7 @@
601     else
602     #endif /* GRUB_UTIL */
603     {
604     - if (! devwrite (saved_sector - part_start, 1, stage2_buffer))
605     + if (! devwrite (*saved_sector - part_start, 1, stage2_buffer))
606     goto fail;
607     }
608     }
609     @@ -2334,7 +2391,7 @@
610     goto fail;
611     }
612    
613     - if (fwrite (stage2_first_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
614     + if (fwrite (*stage2_first_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
615     {
616     fclose (fp);
617     errnum = ERR_WRITE;
618     @@ -2361,7 +2418,7 @@
619     goto fail;
620    
621     if (! devwrite (stage2_first_sector - src_part_start, 1,
622     - stage2_first_buffer))
623     + *stage2_first_buffer))
624     goto fail;
625    
626     if (! devwrite (stage2_second_sector - src_part_start, 1,
627     diff -Naur grub-0.97/stage2/disk_io.c grub-0.97-magellan/stage2/disk_io.c
628     --- grub-0.97/stage2/disk_io.c 2004-05-23 18:35:24.000000000 +0200
629     +++ grub-0.97-magellan/stage2/disk_io.c 2007-09-03 00:37:37.000000000 +0200
630     @@ -63,6 +63,9 @@
631     # ifdef FSYS_REISERFS
632     {"reiserfs", reiserfs_mount, reiserfs_read, reiserfs_dir, 0, reiserfs_embed},
633     # endif
634     +# ifdef FSYS_REISER4
635     + {"reiser4", reiser4_mount, reiser4_read, reiser4_dir, 0, reiser4_embed},
636     +# endif
637     # ifdef FSYS_VSTAFS
638     {"vstafs", vstafs_mount, vstafs_read, vstafs_dir, 0, 0},
639     # endif
640     diff -Naur grub-0.97/stage2/filesys.h grub-0.97-magellan/stage2/filesys.h
641     --- grub-0.97/stage2/filesys.h 2004-05-14 21:36:43.000000000 +0200
642     +++ grub-0.97-magellan/stage2/filesys.h 2007-09-03 00:37:37.000000000 +0200
643     @@ -77,6 +77,16 @@
644     #define FSYS_REISERFS_NUM 0
645     #endif
646    
647     +#ifdef FSYS_REISER4
648     +#define FSYS_REISER4_NUM 1
649     +int reiser4_mount (void);
650     +int reiser4_read (char *buf, int len);
651     +int reiser4_dir (char *dirname);
652     +int reiser4_embed (int *start_sector, int needed_sectors);
653     +#else
654     +#define FSYS_REISER4_NUM 0
655     +#endif
656     +
657     #ifdef FSYS_VSTAFS
658     #define FSYS_VSTAFS_NUM 1
659     int vstafs_mount (void);
660     @@ -127,8 +137,8 @@
661     #ifndef NUM_FSYS
662     #define NUM_FSYS \
663     (FSYS_FFS_NUM + FSYS_FAT_NUM + FSYS_EXT2FS_NUM + FSYS_MINIX_NUM \
664     - + FSYS_REISERFS_NUM + FSYS_VSTAFS_NUM + FSYS_JFS_NUM + FSYS_XFS_NUM \
665     - + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS2_NUM)
666     + + FSYS_REISERFS_NUM + FSYS_REISER4_NUM + FSYS_VSTAFS_NUM + FSYS_JFS_NUM \
667     + + FSYS_XFS_NUM + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS2_NUM)
668     #endif
669    
670     /* defines for the block filesystem info area */
671     diff -Naur grub-0.97/stage2/fsys_reiser4.c grub-0.97-magellan/stage2/fsys_reiser4.c
672     --- grub-0.97/stage2/fsys_reiser4.c 1970-01-01 01:00:00.000000000 +0100
673     +++ grub-0.97-magellan/stage2/fsys_reiser4.c 2007-09-03 00:37:37.000000000 +0200
674     @@ -0,0 +1,260 @@
675     +/*
676     + * fsys_reiser4.c -- reiser4 filesystem support.
677     + * Copyright (C) 2000, 2001 Free Software Foundation, Inc.
678     + *
679     + * GRUB -- GRand Unified Bootloader
680     + *
681     + * This program is free software; you can redistribute it and/or modify
682     + * it under the terms of the GNU General Public License as published by
683     + * the Free Software Foundation; either version 2 of the License, or
684     + * (at your option) any later version.
685     + *
686     + * This program is distributed in the hope that it will be useful,
687     + * but WITHOUT ANY WARRANTY; without even the implied warranty of
688     + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
689     + * GNU General Public License for more details.
690     + *
691     + * You should have received a copy of the GNU General Public License
692     + * along with this program; if not, write to the Free Software
693     + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
694     +*/
695     +
696     +#ifdef FSYS_REISER4
697     +#include "shared.h"
698     +#include "filesys.h"
699     +
700     +#define ENABLE_MINIMAL
701     +#include <reiser4/libreiser4.h>
702     +
703     +static reiser4_fs_t *fs = NULL;
704     +static aal_device_t *dev = NULL;
705     +static reiser4_object_t *object = NULL;
706     +
707     +/* Read callback of grub specific device. It uses devread() for reading passed
708     + @count of device blocks starting from @blk to passed @buff. */
709     +static errno_t grub_dev_read(aal_device_t *device,
710     + void *buff, blk_t blk,
711     + count_t count)
712     +{
713     + unsigned int size;
714     + unsigned int factor;
715     + unsigned int sector;
716     +
717     + /* Calculating actual sector and size in bytes to be read from
718     + device. */
719     + factor = device->blksize / SECTOR_SIZE;
720     + sector = (unsigned int)blk << aal_log2(factor);
721     + size = (unsigned int)count * (SECTOR_SIZE * factor);
722     +
723     + /* Reading from the current device */
724     + if (!devread(sector, 0, size, buff))
725     + return -EIO;
726     +
727     + return 0;
728     +}
729     +
730     +/* Length callback of grub device */
731     +static count_t grub_dev_len(aal_device_t *device) {
732     + unsigned int factor;
733     +
734     + /* Getting partition length in device blocks */
735     + factor = device->blksize / SECTOR_SIZE;
736     + return (part_length >> aal_log2(factor));
737     +}
738     +
739     +/*
740     + Initializing grub device abstraction instance. It will use devread and friends
741     + for providing needed functionality.
742     +*/
743     +struct aal_device_ops grub_dev_ops = {
744     + .read = grub_dev_read,
745     + .len = grub_dev_len
746     +};
747     +
748     +/* Initializes reiser4 */
749     +static int reiser4_init(void) {
750     + extern aal_hash_table_t *plugins;
751     +
752     + plugins = NULL;
753     +
754     + /* Initializing memory manager */
755     + aal_mem_init((void *)FSYS_BUF, FSYS_BUFLEN);
756     +
757     + /* Initializing device abstraction on current device GRUB uses. */
758     + if (!(dev = aal_device_open(&grub_dev_ops, NULL,
759     + SECTOR_SIZE, 0)))
760     + {
761     + return 0;
762     + }
763     +
764     + /* Initializing libreiser4 (plugins, etc) */
765     + return !libreiser4_init();
766     +}
767     +
768     +#define MEMORY_WATERMARK 8192
769     +
770     +/* Memory pressure detect function. */
771     +static int mpressure_detect(reiser4_tree_t *tree) {
772     + return (aal_mem_free() <= MEMORY_WATERMARK);
773     +}
774     +
775     +/* Reiser4 mount() routine */
776     +int reiser4_mount(void) {
777     +
778     + /* Initialize all reiser4 related stuff first */
779     + if (!reiser4_init())
780     + return 0;
781     +
782     + /* Open filesystem on @dev. */
783     + if (!(fs = reiser4_fs_open(dev)))
784     + return 0;
785     +
786     + fs->tree->mpc_func = mpressure_detect;
787     +
788     + object = NULL;
789     + return 1;
790     +}
791     +
792     +/* Reiser4 read() handler */
793     +int reiser4_read(char *buf, int len) {
794     + int64_t read;
795     +
796     + if (object == NULL)
797     + return 0;
798     +
799     + /* Seet at current position denoted by @filepos */
800     + if (objplug(object)->o.object_ops->seek) {
801     + plug_call(objplug(object)->o.object_ops,
802     + seek, object->ent, filepos);
803     + }
804     +
805     + /* Reading current file data starting from @filepos */
806     + disk_read_func = disk_read_hook;
807     + read = objplug(object)->o.object_ops->read ?
808     + plug_call(objplug(object)->o.object_ops, read,
809     + object->ent, buf, len) : -EINVAL;
810     + disk_read_func = NULL;
811     +
812     + if (read < 0) {
813     + errnum = ERR_FSYS_CORRUPT;
814     + return 0;
815     + }
816     +
817     + filepos += read;
818     + return read;
819     +}
820     +
821     +/* Reiser4 file open() routine */
822     +int reiser4_dir(char *dirname) {
823     + char *ch;
824     +
825     + if (fs == NULL)
826     + return 0;
827     +
828     + if (object != NULL) {
829     + plug_call(objplug(object)->o.object_ops,
830     + close, object->ent);
831     + aal_free(object);
832     + object = NULL;
833     + }
834     +
835     + /* Cutting out string after first space character */
836     + if ((ch = aal_strchr(dirname, ' ')))
837     + *ch = '\0';
838     +
839     + /* This function is also called for getting directory list for
840     + maintaining the bash-like completion. */
841     +#ifndef STAGE1_5
842     + if (print_possibilities) {
843     + char entry[256];
844     + entry_hint_t entry_hint;
845     +
846     + /* Getting last part of name (jsut after last '/') */
847     + if (*(dirname + aal_strlen(dirname) - 1) != '/') {
848     +
849     + if (!(ch = aal_strrchr(dirname, '/'))) {
850     + errnum = ERR_BAD_FILETYPE;
851     + return 0;
852     + }
853     +
854     + aal_strncpy(entry, ch + 1, sizeof(entry));
855     + *(ch + 1) = '\0';
856     + } else {
857     + aal_memset(entry, 0, sizeof(entry));
858     + }
859     +
860     + /* Open obejct by @dirname */
861     + if (!(object = reiser4_semantic_open(fs->tree, dirname,
862     + NULL, 1)))
863     + {
864     + errnum = ERR_FILE_NOT_FOUND;
865     + return 0;
866     + }
867     +
868     + /* Checking if it is a directory object */
869     + if (object->ent->opset.plug[OPSET_OBJ]->id.group != DIR_OBJECT)
870     + {
871     + /* If not, cutting out last '/' character */
872     + if ((ch = aal_strrchr(dirname, '/')))
873     + *ch = '\0';
874     +
875     + /* Close current object */
876     + plug_call(objplug(object)->o.object_ops,
877     + close, object->ent);
878     + aal_free(object);
879     + return 0;
880     + }
881     +
882     + /* Reading the opened directory to build the completion list. */
883     + if (objplug(object)->o.object_ops->readdir) {
884     + while (plug_call(objplug(object)->o.object_ops, readdir,
885     + object->ent, &entry_hint) > 0)
886     + {
887     + if (substring(entry, entry_hint.name) <= 0) {
888     + if (print_possibilities > 0)
889     + print_possibilities =
890     + -print_possibilities;
891     +
892     + print_a_completion(entry_hint.name);
893     + }
894     + }
895     + }
896     + } else {
897     +#endif
898     + /* This is the case when resier4_dir() is called for open the
899     + file @dirname, not for building completion list. */
900     + if (!(object = reiser4_semantic_open(fs->tree, dirname,
901     + NULL, 1)))
902     + {
903     + errnum = ERR_FILE_NOT_FOUND;
904     + return 0;
905     + }
906     +
907     + if (object->ent->opset.plug[OPSET_OBJ]->id.group != REG_OBJECT)
908     + {
909     + errnum = ERR_BAD_FILETYPE;
910     + return 0;
911     + }
912     +
913     + /* Initializing GRUB global variables @filepos and @filemax. */
914     + filepos = 0;
915     + filemax = reiser4_object_size(object);
916     +
917     + return 1;
918     +#ifndef STAGE1_5
919     + }
920     +
921     + return 1;
922     +#endif
923     +
924     + errnum = ERR_FILE_NOT_FOUND;
925     + return 0;
926     +}
927     +
928     +/* Returns how many sectors may be used for embeding reiser4_stage1_5 in teh
929     + case of installing GRUB to partition instead of MBR. */
930     +int reiser4_embed (int *start_sector, int needed_sectors) {
931     + *start_sector = 1;
932     + return needed_sectors <= ((REISER4_MASTER_OFFSET >> SECTOR_BITS) - 1);
933     +}
934     +#endif /* FSYS_REISER4 */
935     diff -Naur grub-0.97/stage2/Makefile.am grub-0.97-magellan/stage2/Makefile.am
936     --- grub-0.97/stage2/Makefile.am 2007-09-03 00:48:33.000000000 +0200
937     +++ grub-0.97-magellan/stage2/Makefile.am 2007-09-03 00:47:50.000000000 +0200
938     @@ -13,17 +13,25 @@
939     # For <stage1.h>.
940     INCLUDES = -I$(top_srcdir)/stage1
941    
942     +if ENABLE_REISER4_SUPPORT
943     +REISER4_STAGE1_5 = reiser4_stage1_5
944     +REISER4_STAGE1_5_EXEC = reiser4_stage1_5.exec
945     +else
946     +REISER4_STAGE1_5 =
947     +REISER4_STAGE1_5_EXEC =
948     +endif
949     +
950     # The library for /sbin/grub.
951     noinst_LIBRARIES = libgrub.a
952     libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
953     disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
954     - fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
955     + fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_reiser4.c fsys_ufs2.c \
956     fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
957     terminfo.c tparm.c graphics.c
958     libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
959     -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
960     -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
961     - -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
962     + $(REISER4_CFLAGS) -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
963     -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1
964    
965     # Stage 2 and Stage 1.5's.
966     @@ -34,24 +42,26 @@
967     if DISKLESS_SUPPORT
968     pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
969     ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
970     - reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5 \
971     - nbgrub pxegrub
972     + reiserfs_stage1_5 $(REISER4_STAGE1_5) ufs2_stage1_5 \
973     + vstafs_stage1_5 xfs_stage1_5 nbgrub pxegrub
974     noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless
975     noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
976     e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
977     iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
978     - reiserfs_stage1_5.exec ufs2_stage1_5.exec vstafs_stage1_5.exec \
979     - xfs_stage1_5.exec nbloader.exec pxeloader.exec diskless.exec
980     + reiserfs_stage1_5.exec $(REISER4_STAGE1_5_EXEC) ufs2_stage1_5.exec \
981     + vstafs_stage1_5.exec xfs_stage1_5.exec nbloader.exec pxeloader.exec \
982     + diskless.exec
983     else
984     pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
985     ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
986     - reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5
987     + reiserfs_stage1_5 $(REISER4_STAGE1_5) ufs2_stage1_5 \
988     + vstafs_stage1_5 xfs_stage1_5
989     noinst_DATA = pre_stage2 start start_eltorito
990     noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
991     e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
992     iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
993     - reiserfs_stage1_5.exec ufs2_stage1_5.exec vstafs_stage1_5.exec \
994     - xfs_stage1_5.exec
995     + reiserfs_stage1_5.exec $(REISER4_STAGE1_5_EXEC) ufs2_stage1_5.exec \
996     + vstafs_stage1_5.exec xfs_stage1_5.exec
997     endif
998     MOSTLYCLEANFILES = $(noinst_PROGRAMS)
999    
1000     @@ -85,7 +95,7 @@
1001     GRAPHICS_FLAGS =
1002     endif
1003    
1004     -STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
1005     +STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin \
1006     $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS)
1007    
1008     STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
1009     @@ -95,15 +105,17 @@
1010     pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
1011     cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
1012     fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
1013     - fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \
1014     - hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c \
1015     - graphics.c
1016     + fsys_reiserfs.c fsys_reiser4.c fsys_ufs2.c fsys_vstafs.c \
1017     + fsys_xfs.c gunzip.c hercules.c md5.c serial.c smp-imps.c \
1018     + stage2.c terminfo.c tparm.c graphics.c
1019     pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
1020     pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
1021     pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)
1022    
1023     if NETBOOT_SUPPORT
1024     -pre_stage2_exec_LDADD = ../netboot/libdrivers.a
1025     +pre_stage2_exec_LDADD = ../netboot/libdrivers.a $(REISER4_LIBS)
1026     +else
1027     +pre_stage2_exec_LDADD = $(REISER4_LIBS)
1028     endif
1029    
1030     if DISKLESS_SUPPORT
1031     @@ -197,6 +209,16 @@
1032     -DNO_BLOCK_FILES=1
1033     reiserfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1034    
1035     +# For reiser4_stage1_5 target.
1036     +reiser4_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
1037     + disk_io.c stage1_5.c fsys_reiser4.c bios.c
1038     +reiser4_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) $(REISER4_CFLAGS) \
1039     + -DNO_BLOCK_FILES=1
1040     +reiser4_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) $(REISER4_CFLAGS) \
1041     + -DNO_BLOCK_FILES=1
1042     +reiser4_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1043     +reiser4_stage1_5_exec_LDADD = $(REISER4_LIBS)
1044     +
1045     # For vstafs_stage1_5 target.
1046     vstafs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
1047     disk_io.c stage1_5.c fsys_vstafs.c bios.c
1048     diff -Naur grub-0.97/stage2/Makefile.am.orig grub-0.97-magellan/stage2/Makefile.am.orig
1049     --- grub-0.97/stage2/Makefile.am.orig 2005-02-02 21:37:35.000000000 +0100
1050     +++ grub-0.97-magellan/stage2/Makefile.am.orig 1970-01-01 01:00:00.000000000 +0100
1051     @@ -1,272 +0,0 @@
1052     -# For test target.
1053     -TESTS = size_test
1054     -noinst_SCRIPTS = $(TESTS)
1055     -
1056     -# For dist target.
1057     -noinst_HEADERS = apic.h defs.h dir.h disk_inode.h disk_inode_ffs.h \
1058     - fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
1059     - imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
1060     - nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
1061     - terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h
1062     -EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
1063     -
1064     -# For <stage1.h>.
1065     -INCLUDES = -I$(top_srcdir)/stage1
1066     -
1067     -# The library for /sbin/grub.
1068     -noinst_LIBRARIES = libgrub.a
1069     -libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
1070     - disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
1071     - fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
1072     - fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
1073     - terminfo.c tparm.c
1074     -libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
1075     - -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
1076     - -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
1077     - -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
1078     - -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1
1079     -
1080     -# Stage 2 and Stage 1.5's.
1081     -pkglibdir = $(libdir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
1082     -
1083     -EXTRA_PROGRAMS = nbloader.exec pxeloader.exec diskless.exec
1084     -
1085     -if DISKLESS_SUPPORT
1086     -pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
1087     - ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
1088     - reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5 \
1089     - nbgrub pxegrub
1090     -noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless
1091     -noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
1092     - e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
1093     - iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
1094     - reiserfs_stage1_5.exec ufs2_stage1_5.exec vstafs_stage1_5.exec \
1095     - xfs_stage1_5.exec nbloader.exec pxeloader.exec diskless.exec
1096     -else
1097     -pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
1098     - ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
1099     - reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5
1100     -noinst_DATA = pre_stage2 start start_eltorito
1101     -noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
1102     - e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
1103     - iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
1104     - reiserfs_stage1_5.exec ufs2_stage1_5.exec vstafs_stage1_5.exec \
1105     - xfs_stage1_5.exec
1106     -endif
1107     -MOSTLYCLEANFILES = $(noinst_PROGRAMS)
1108     -
1109     -PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
1110     -START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
1111     -NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0
1112     -PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
1113     -START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
1114     -
1115     -if NETBOOT_SUPPORT
1116     -NETBOOT_FLAGS = -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1
1117     -else
1118     -NETBOOT_FLAGS =
1119     -endif
1120     -
1121     -if SERIAL_SUPPORT
1122     -SERIAL_FLAGS = -DSUPPORT_SERIAL=1
1123     -else
1124     -SERIAL_FLAGS =
1125     -endif
1126     -
1127     -if HERCULES_SUPPORT
1128     -HERCULES_FLAGS = -DSUPPORT_HERCULES=1
1129     -else
1130     -HERCULES_FLAGS =
1131     -endif
1132     -
1133     -STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
1134     - $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS)
1135     -
1136     -STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
1137     -STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
1138     -
1139     -# For stage2 target.
1140     -pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
1141     - cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
1142     - fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
1143     - fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \
1144     - hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c
1145     -pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
1146     -pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
1147     -pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)
1148     -
1149     -if NETBOOT_SUPPORT
1150     -pre_stage2_exec_LDADD = ../netboot/libdrivers.a
1151     -endif
1152     -
1153     -if DISKLESS_SUPPORT
1154     -BUILT_SOURCES = stage2_size.h diskless_size.h
1155     -else
1156     -BUILT_SOURCES = stage2_size.h
1157     -endif
1158     -
1159     -CLEANFILES = $(pkglib_DATA) $(noinst_DATA) $(BUILT_SOURCES)
1160     -
1161     -stage2_size.h: pre_stage2
1162     - -rm -f stage2_size.h
1163     - set dummy `ls -l pre_stage2`; \
1164     - echo "#define STAGE2_SIZE $$6" > stage2_size.h
1165     -
1166     -start_exec_SOURCES = start.S
1167     -start_exec_CCASFLAGS = $(STAGE2_COMPILE)
1168     -start_exec_LDFLAGS = $(START_LINK)
1169     -
1170     -# XXX: automake doesn't provide a way to specify dependencies for object
1171     -# files explicitly, so we must write this by a general Makefile scheme.
1172     -# If automake change the naming scheme for per-executable objects, this
1173     -# will be broken.
1174     -start_exec-start.$(OBJEXT): stage2_size.h
1175     -
1176     -stage2: pre_stage2 start
1177     - -rm -f stage2
1178     - cat start pre_stage2 > stage2
1179     -
1180     -start_eltorito_exec_SOURCES = start_eltorito.S
1181     -start_eltorito_exec_CCASFLAGS = $(STAGE2_COMPILE)
1182     -start_eltorito_exec_LDFLAGS = $(START_ELTORITO_LINK)
1183     -
1184     -start_eltorito_exec-start.$(OBJEXT): stage2_size.h
1185     -
1186     -stage2_eltorito: pre_stage2 start_eltorito
1187     - -rm -f stage2_eltorito
1188     - cat start_eltorito pre_stage2 > stage2_eltorito
1189     -
1190     -# For e2fs_stage1_5 target.
1191     -e2fs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
1192     - stage1_5.c fsys_ext2fs.c bios.c
1193     -e2fs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_EXT2FS=1 \
1194     - -DNO_BLOCK_FILES=1
1195     -e2fs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_EXT2FS=1 \
1196     - -DNO_BLOCK_FILES=1
1197     -e2fs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1198     -
1199     -# For fat_stage1_5 target.
1200     -fat_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
1201     - stage1_5.c fsys_fat.c bios.c
1202     -fat_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_FAT=1 \
1203     - -DNO_BLOCK_FILES=1
1204     -fat_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_FAT=1 \
1205     - -DNO_BLOCK_FILES=1
1206     -fat_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1207     -
1208     -# For ffs_stage1_5 target.
1209     -ffs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
1210     - stage1_5.c fsys_ffs.c bios.c
1211     -ffs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_FFS=1 \
1212     - -DNO_BLOCK_FILES=1
1213     -ffs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_FFS=1 \
1214     - -DNO_BLOCK_FILES=1
1215     -ffs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1216     -
1217     -# For ufs2_stage1_5 target.
1218     -ufs2_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
1219     - stage1_5.c fsys_ufs2.c bios.c
1220     -ufs2_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_UFS2=1 \
1221     - -DNO_BLOCK_FILES=1
1222     -ufs2_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_UFS2=1 \
1223     - -DNO_BLOCK_FILES=1
1224     -ufs2_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1225     -
1226     -# For minix_stage1_5 target.
1227     -minix_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
1228     - stage1_5.c fsys_minix.c bios.c
1229     -minix_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_MINIX=1 \
1230     - -DNO_BLOCK_FILES=1
1231     -minix_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_MINIX=1 \
1232     - -DNO_BLOCK_FILES=1
1233     -minix_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1234     -
1235     -# For reiserfs_stage1_5 target.
1236     -reiserfs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
1237     - disk_io.c stage1_5.c fsys_reiserfs.c bios.c
1238     -reiserfs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_REISERFS=1 \
1239     - -DNO_BLOCK_FILES=1
1240     -reiserfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_REISERFS=1 \
1241     - -DNO_BLOCK_FILES=1
1242     -reiserfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1243     -
1244     -# For vstafs_stage1_5 target.
1245     -vstafs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
1246     - disk_io.c stage1_5.c fsys_vstafs.c bios.c
1247     -vstafs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_VSTAFS=1 \
1248     - -DNO_BLOCK_FILES=1
1249     -vstafs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_VSTAFS=1 \
1250     - -DNO_BLOCK_FILES=1
1251     -vstafs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1252     -
1253     -# For jfs_stage1_5 target.
1254     -jfs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
1255     - disk_io.c stage1_5.c fsys_jfs.c bios.c
1256     -jfs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_JFS=1 \
1257     - -DNO_BLOCK_FILES=1
1258     -jfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_JFS=1 \
1259     - -DNO_BLOCK_FILES=1
1260     -jfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1261     -
1262     -# For xfs_stage1_5 target.
1263     -xfs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
1264     - disk_io.c stage1_5.c fsys_xfs.c bios.c
1265     -xfs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_XFS=1 \
1266     - -DNO_BLOCK_FILES=1
1267     -xfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_XFS=1 \
1268     - -DNO_BLOCK_FILES=1
1269     -xfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1270     -
1271     -# For iso9660_stage1_5 target.
1272     -iso9660_stage1_5_exec_SOURCES = start_eltorito.S asm.S common.c char_io.c \
1273     - disk_io.c stage1_5.c fsys_iso9660.c bios.c
1274     -iso9660_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ISO9660=1 \
1275     - -DNO_BLOCK_FILES=1
1276     -iso9660_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ISO9660=1 \
1277     - -DNO_BLOCK_FILES=1
1278     -iso9660_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
1279     -
1280     -# For diskless target.
1281     -diskless_exec_SOURCES = $(pre_stage2_exec_SOURCES)
1282     -diskless_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) \
1283     - -DSUPPORT_DISKLESS=1
1284     -diskless_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) \
1285     - -DSUPPORT_DISKLESS=1
1286     -diskless_exec_LDFLAGS = $(PRE_STAGE2_LINK)
1287     -diskless_exec_LDADD = ../netboot/libdrivers.a
1288     -
1289     -diskless_size.h: diskless
1290     - -rm -f $@
1291     - set dummy `ls -l $^`; \
1292     - echo "#define DISKLESS_SIZE $$6" > $@
1293     -
1294     -# For nbloader target.
1295     -nbloader_exec_SOURCES = nbloader.S
1296     -nbloader_exec_CCASFLAGS = $(STAGE2_COMPILE)
1297     -nbloader_exec_LDFLAGS = $(NBLOADER_LINK)
1298     -
1299     -# XXX: See the comment for start_exec-start.o.
1300     -nbloader_exec-nbloader.$(OBJEXT): diskless_size.h
1301     -
1302     -# For nbgrub target.
1303     -nbgrub: nbloader diskless
1304     - -rm -f $@
1305     - cat $^ > $@
1306     -
1307     -# For pxeloader target.
1308     -pxeloader_exec_SOURCES = pxeloader.S
1309     -pxeloader_exec_CCASFLAGS = $(STAGE2_COMPILE)
1310     -pxeloader_exec_LDFLAGS = $(PXELOADER_LINK)
1311     -
1312     -# XXX: See the comment for start_exec-start.o.
1313     -pxeloader_exec-pxeloader.$(OBJEXT): diskless_size.h
1314     -
1315     -# For pxegrub target.
1316     -pxegrub: pxeloader diskless
1317     - -rm -f $@
1318     - cat $^ > $@
1319     -
1320     -# General rule for making a raw binary.
1321     -SUFFIXES = .exec
1322     -.exec:
1323     - $(OBJCOPY) -O binary $< $@
1324     diff -Naur grub-0.97/stage2/shared.h grub-0.97-magellan/stage2/shared.h
1325     --- grub-0.97/stage2/shared.h 2007-09-03 00:48:49.000000000 +0200
1326     +++ grub-0.97-magellan/stage2/shared.h 2007-09-03 00:37:37.000000000 +0200
1327     @@ -207,11 +207,12 @@
1328     #define STAGE2_ID_FAT_STAGE1_5 3
1329     #define STAGE2_ID_MINIX_STAGE1_5 4
1330     #define STAGE2_ID_REISERFS_STAGE1_5 5
1331     -#define STAGE2_ID_VSTAFS_STAGE1_5 6
1332     -#define STAGE2_ID_JFS_STAGE1_5 7
1333     -#define STAGE2_ID_XFS_STAGE1_5 8
1334     -#define STAGE2_ID_ISO9660_STAGE1_5 9
1335     -#define STAGE2_ID_UFS2_STAGE1_5 10
1336     +#define STAGE2_ID_REISER4_STAGE1_5 6
1337     +#define STAGE2_ID_VSTAFS_STAGE1_5 7
1338     +#define STAGE2_ID_JFS_STAGE1_5 8
1339     +#define STAGE2_ID_XFS_STAGE1_5 9
1340     +#define STAGE2_ID_ISO9660_STAGE1_5 10
1341     +#define STAGE2_ID_UFS2_STAGE1_5 11
1342    
1343     #ifndef STAGE1_5
1344     # define STAGE2_ID STAGE2_ID_STAGE2
1345     @@ -226,6 +227,8 @@
1346     # define STAGE2_ID STAGE2_ID_MINIX_STAGE1_5
1347     # elif defined(FSYS_REISERFS)
1348     # define STAGE2_ID STAGE2_ID_REISERFS_STAGE1_5
1349     +# elif defined(FSYS_REISER4)
1350     +# define STAGE2_ID STAGE2_ID_REISER4_STAGE1_5
1351     # elif defined(FSYS_VSTAFS)
1352     # define STAGE2_ID STAGE2_ID_VSTAFS_STAGE1_5
1353     # elif defined(FSYS_JFS)