Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 144 - (hide annotations) (download)
Tue May 8 20:06:05 2007 UTC (17 years, 1 month ago) by niro
File size: 63567 byte(s)
-import

1 niro 144 diff -Naur grub-0.95-orig/configure.ac grub-0.95/configure.ac
2     --- grub-0.95-orig/configure.ac 2003-10-19 19:25:30.000000000 +0200
3     +++ grub-0.95/configure.ac 2004-02-15 11:20:57.681027504 +0100
4     @@ -595,6 +595,11 @@
5     [ --enable-diskless enable diskless support])
6     AM_CONDITIONAL(DISKLESS_SUPPORT, test "x$enable_diskless" = xyes)
7    
8     +dnl Graphical splashscreen support
9     +AC_ARG_ENABLE(graphics,
10     + [ --disable-graphics disable graphics terminal support])
11     +AM_CONDITIONAL(GRAPHICS_SUPPORT, test "x$enable_graphics" != xno)
12     +
13     dnl Hercules terminal
14     AC_ARG_ENABLE(hercules,
15     [ --disable-hercules disable hercules terminal support])
16     diff -Naur grub-0.95-orig/stage2/asm.S grub-0.95/stage2/asm.S
17     --- grub-0.95-orig/stage2/asm.S 2004-01-11 10:39:22.000000000 +0100
18     +++ grub-0.95/stage2/asm.S 2004-02-15 11:20:57.706023704 +0100
19     @@ -2216,6 +2216,156 @@
20     pop %ebx
21     pop %ebp
22     ret
23     +
24     +/* graphics mode functions */
25     +#ifdef SUPPORT_GRAPHICS
26     +VARIABLE(cursorX)
27     +.word 0
28     +VARIABLE(cursorY)
29     +.word 0
30     +VARIABLE(cursorCount)
31     +.word 0
32     +VARIABLE(cursorBuf)
33     +.byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
34     +
35     +
36     +/*
37     + * int set_videomode(mode)
38     + * BIOS call "INT 10H Function 0h" to set video mode
39     + * Call with %ah = 0x0
40     + * %al = video mode
41     + * Returns old videomode.
42     + */
43     +ENTRY(set_videomode)
44     + push %ebp
45     + push %ebx
46     + push %ecx
47     +
48     + movb 0x10(%esp), %cl
49     +
50     + call EXT_C(prot_to_real)
51     + .code16
52     +
53     + xorw %bx, %bx
54     + movb $0xf, %ah
55     + int $0x10 /* Get Current Video mode */
56     + movb %al, %ch
57     + xorb %ah, %ah
58     + movb %cl, %al
59     + int $0x10 /* Set Video mode */
60     +
61     + DATA32 call EXT_C(real_to_prot)
62     + .code32
63     +
64     + xorb %ah, %ah
65     + movb %ch, %al
66     +
67     + pop %ecx
68     + pop %ebx
69     + pop %ebp
70     + ret
71     +
72     +
73     +/*
74     + * unsigned char * graphics_get_font()
75     + * BIOS call "INT 10H Function 11h" to set font
76     + * Call with %ah = 0x11
77     + */
78     +ENTRY(graphics_get_font)
79     + push %ebp
80     + push %ebx
81     + push %ecx
82     + push %edx
83     +
84     + call EXT_C(prot_to_real)
85     + .code16
86     +
87     + movw $0x1130, %ax
88     + movb $6, %bh /* font 8x16 */
89     + int $0x10
90     + movw %bp, %dx
91     + movw %es, %cx
92     +
93     + DATA32 call EXT_C(real_to_prot)
94     + .code32
95     +
96     + xorl %eax, %eax
97     + movw %cx, %ax
98     + shll $4, %eax
99     + movw %dx, %ax
100     +
101     + pop %edx
102     + pop %ecx
103     + pop %ebx
104     + pop %ebp
105     + ret
106     +
107     +
108     +
109     +/*
110     + * graphics_set_palette(index, red, green, blue)
111     + * BIOS call "INT 10H Function 10h" to set individual dac register
112     + * Call with %ah = 0x10
113     + * %bx = register number
114     + * %ch = new value for green (0-63)
115     + * %cl = new value for blue (0-63)
116     + * %dh = new value for red (0-63)
117     + */
118     +
119     +ENTRY(graphics_set_palette)
120     + push %ebp
121     + push %eax
122     + push %ebx
123     + push %ecx
124     + push %edx
125     +
126     + movw $0x3c8, %bx /* address write mode register */
127     +
128     + /* wait vertical retrace */
129     +
130     + movw $0x3da, %dx
131     +l1b: inb %dx, %al /* wait vertical active display */
132     + test $8, %al
133     + jnz l1b
134     +
135     +l2b: inb %dx, %al /* wait vertical retrace */
136     + test $8, %al
137     + jnz l2b
138     +
139     + mov %bx, %dx
140     + movb 0x18(%esp), %al /* index */
141     + outb %al, %dx
142     + inc %dx
143     +
144     + movb 0x1c(%esp), %al /* red */
145     + outb %al, %dx
146     +
147     + movb 0x20(%esp), %al /* green */
148     + outb %al, %dx
149     +
150     + movb 0x24(%esp), %al /* blue */
151     + outb %al, %dx
152     +
153     + movw 0x18(%esp), %bx
154     +
155     + call EXT_C(prot_to_real)
156     + .code16
157     +
158     + movb %bl, %bh
159     + movw $0x1000, %ax
160     + int $0x10
161     +
162     + DATA32 call EXT_C(real_to_prot)
163     + .code32
164     +
165     + pop %edx
166     + pop %ecx
167     + pop %ebx
168     + pop %eax
169     + pop %ebp
170     + ret
171     +
172     +#endif /* SUPPORT_GRAPHICS */
173    
174     /*
175     * getrtsecs()
176     diff -Naur grub-0.95-orig/stage2/builtins.c grub-0.95/stage2/builtins.c
177     --- grub-0.95-orig/stage2/builtins.c 2004-01-11 10:39:22.000000000 +0100
178     +++ grub-0.95/stage2/builtins.c 2004-02-15 11:20:57.736019144 +0100
179     @@ -848,6 +848,138 @@
180     };
181     #endif /* SUPPORT_NETBOOT */
182    
183     +static int terminal_func (char *arg, int flags);
184     +
185     +#ifdef SUPPORT_GRAPHICS
186     +
187     +static int splashimage_func(char *arg, int flags) {
188     + char splashimage[64];
189     + int i;
190     +
191     + /* filename can only be 64 characters due to our buffer size */
192     + if (strlen(arg) > 63)
193     + return 1;
194     + if (flags == BUILTIN_CMDLINE) {
195     + if (!grub_open(arg))
196     + return 1;
197     + grub_close();
198     + }
199     +
200     + strcpy(splashimage, arg);
201     +
202     + /* get rid of TERM_NEED_INIT from the graphics terminal. */
203     + for (i = 0; term_table[i].name; i++) {
204     + if (grub_strcmp (term_table[i].name, "graphics") == 0) {
205     + term_table[i].flags &= ~TERM_NEED_INIT;
206     + break;
207     + }
208     + }
209     +
210     + graphics_set_splash(splashimage);
211     +
212     + if (flags == BUILTIN_CMDLINE && graphics_inited) {
213     + graphics_end();
214     + graphics_init();
215     + graphics_cls();
216     + }
217     +
218     + /* FIXME: should we be explicitly switching the terminal as a
219     + * side effect here? */
220     + terminal_func("graphics", flags);
221     +
222     + return 0;
223     +}
224     +
225     +static struct builtin builtin_splashimage =
226     +{
227     + "splashimage",
228     + splashimage_func,
229     + BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
230     + "splashimage FILE",
231     + "Load FILE as the background image when in graphics mode."
232     +};
233     +
234     +
235     +/* foreground */
236     +static int
237     +foreground_func(char *arg, int flags)
238     +{
239     + if (grub_strlen(arg) == 6) {
240     + int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
241     + int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
242     + int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
243     +
244     + foreground = (r << 16) | (g << 8) | b;
245     + if (graphics_inited)
246     + graphics_set_palette(15, r, g, b);
247     +
248     + return (0);
249     + }
250     +
251     + return (1);
252     +}
253     +
254     +static struct builtin builtin_foreground =
255     +{
256     + "foreground",
257     + foreground_func,
258     + BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
259     + "foreground RRGGBB",
260     + "Sets the foreground color when in graphics mode."
261     + "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
262     +};
263     +
264     +
265     +/* background */
266     +static int
267     +background_func(char *arg, int flags)
268     +{
269     + if (grub_strlen(arg) == 6) {
270     + int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
271     + int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
272     + int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
273     +
274     + background = (r << 16) | (g << 8) | b;
275     + if (graphics_inited)
276     + graphics_set_palette(0, r, g, b);
277     + return (0);
278     + }
279     +
280     + return (1);
281     +}
282     +
283     +static struct builtin builtin_background =
284     +{
285     + "background",
286     + background_func,
287     + BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
288     + "background RRGGBB",
289     + "Sets the background color when in graphics mode."
290     + "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
291     +};
292     +
293     +#endif /* SUPPORT_GRAPHICS */
294     +
295     +
296     +/* clear */
297     +static int
298     +clear_func()
299     +{
300     + if (current_term->cls)
301     + current_term->cls();
302     +
303     + return 0;
304     +}
305     +
306     +static struct builtin builtin_clear =
307     +{
308     + "clear",
309     + clear_func,
310     + BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
311     + "clear",
312     + "Clear the screen"
313     +};
314     +
315    
316     /* displayapm */
317     static int
318     @@ -4073,7 +4205,7 @@
319     };
320    
321    
322     -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES)
323     +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS)
324     /* terminal */
325     static int
326     terminal_func (char *arg, int flags)
327     @@ -4232,17 +4364,21 @@
328     end:
329     current_term = term_table + default_term;
330     current_term->flags = term_flags;
331     -
332     +
333     if (lines)
334     max_lines = lines;
335     else
336     - /* 24 would be a good default value. */
337     - max_lines = 24;
338     -
339     + max_lines = current_term->max_lines;
340     +
341     /* If the interface is currently the command-line,
342     restart it to repaint the screen. */
343     - if (current_term != prev_term && (flags & BUILTIN_CMDLINE))
344     + if ((current_term != prev_term) && (flags & BUILTIN_CMDLINE)){
345     + if (prev_term->shutdown)
346     + prev_term->shutdown();
347     + if (current_term->startup)
348     + current_term->startup();
349     grub_longjmp (restart_cmdline_env, 0);
350     + }
351    
352     return 0;
353     }
354     @@ -4252,7 +4388,7 @@
355     "terminal",
356     terminal_func,
357     BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
358     - "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules]",
359     + "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules] [graphics]",
360     "Select a terminal. When multiple terminals are specified, wait until"
361     " you push any key to continue. If both console and serial are specified,"
362     " the terminal to which you input a key first will be selected. If no"
363     @@ -4264,7 +4400,7 @@
364     " seconds. The option --lines specifies the maximum number of lines."
365     " The option --silent is used to suppress messages."
366     };
367     -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */
368     +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */
369    
370    
371     #ifdef SUPPORT_SERIAL
372     @@ -4783,6 +4919,9 @@
373     /* The table of builtin commands. Sorted in dictionary order. */
374     struct builtin *builtin_table[] =
375     {
376     +#ifdef SUPPORT_GRAPHICS
377     + &builtin_background,
378     +#endif
379     &builtin_blocklist,
380     &builtin_boot,
381     #ifdef SUPPORT_NETBOOT
382     @@ -4790,6 +4929,7 @@
383     #endif /* SUPPORT_NETBOOT */
384     &builtin_cat,
385     &builtin_chainloader,
386     + &builtin_clear,
387     &builtin_cmp,
388     &builtin_color,
389     &builtin_configfile,
390     @@ -4809,6 +4949,9 @@
391     &builtin_embed,
392     &builtin_fallback,
393     &builtin_find,
394     +#ifdef SUPPORT_GRAPHICS
395     + &builtin_foreground,
396     +#endif
397     &builtin_fstest,
398     &builtin_geometry,
399     &builtin_halt,
400     @@ -4852,9 +4995,12 @@
401     #endif /* SUPPORT_SERIAL */
402     &builtin_setkey,
403     &builtin_setup,
404     -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES)
405     +#ifdef SUPPORT_GRAPHICS
406     + &builtin_splashimage,
407     +#endif /* SUPPORT_GRAPHICS */
408     +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS)
409     &builtin_terminal,
410     -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */
411     +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */
412     #ifdef SUPPORT_SERIAL
413     &builtin_terminfo,
414     #endif /* SUPPORT_SERIAL */
415    
416     diff -Naur grub-0.95-orig/stage2/char_io.c grub-0.95/stage2/char_io.c
417     --- grub-0.95-orig/stage2/char_io.c 2003-07-09 13:45:52.000000000 +0200
418     +++ grub-0.95/stage2/char_io.c 2004-02-15 11:20:57.742018232 +0100
419     @@ -35,6 +35,7 @@
420     {
421     "console",
422     0,
423     + 24,
424     console_putchar,
425     console_checkkey,
426     console_getkey,
427     @@ -43,13 +44,16 @@
428     console_cls,
429     console_setcolorstate,
430     console_setcolor,
431     - console_setcursor
432     + console_setcursor,
433     + 0,
434     + 0
435     },
436     #ifdef SUPPORT_SERIAL
437     {
438     "serial",
439     /* A serial device must be initialized. */
440     TERM_NEED_INIT,
441     + 24,
442     serial_putchar,
443     serial_checkkey,
444     serial_getkey,
445     @@ -58,6 +62,8 @@
446     serial_cls,
447     serial_setcolorstate,
448     0,
449     + 0,
450     + 0,
451     0
452     },
453     #endif /* SUPPORT_SERIAL */
454     @@ -65,6 +71,7 @@
455     {
456     "hercules",
457     0,
458     + 24,
459     hercules_putchar,
460     console_checkkey,
461     console_getkey,
462     @@ -73,9 +80,28 @@
463     hercules_cls,
464     hercules_setcolorstate,
465     hercules_setcolor,
466     - hercules_setcursor
467     + hercules_setcursor,
468     + 0,
469     + 0
470     },
471     #endif /* SUPPORT_HERCULES */
472     +#ifdef SUPPORT_GRAPHICS
473     + { "graphics",
474     + TERM_NEED_INIT, /* flags */
475     + 30, /* number of lines */
476     + graphics_putchar, /* putchar */
477     + console_checkkey, /* checkkey */
478     + console_getkey, /* getkey */
479     + graphics_getxy, /* getxy */
480     + graphics_gotoxy, /* gotoxy */
481     + graphics_cls, /* cls */
482     + graphics_setcolorstate, /* setcolorstate */
483     + graphics_setcolor, /* setcolor */
484     + graphics_setcursor, /* nocursor */
485     + graphics_init, /* initialize */
486     + graphics_end /* shutdown */
487     + },
488     +#endif /* SUPPORT_GRAPHICS */
489     /* This must be the last entry. */
490     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
491     };
492     @@ -1046,13 +1072,15 @@
493     the following grub_printf call will print newlines. */
494     count_lines = -1;
495    
496     + grub_printf("\n");
497     if (current_term->setcolorstate)
498     current_term->setcolorstate (COLOR_STATE_HIGHLIGHT);
499    
500     - grub_printf ("\n[Hit return to continue]");
501     + grub_printf ("[Hit return to continue]");
502    
503     if (current_term->setcolorstate)
504     current_term->setcolorstate (COLOR_STATE_NORMAL);
505     +
506    
507     do
508     {
509     @@ -1090,7 +1118,7 @@
510     cls (void)
511     {
512     /* If the terminal is dumb, there is no way to clean the terminal. */
513     - if (current_term->flags & TERM_DUMB)
514     + if (current_term->flags & TERM_DUMB)
515     grub_putchar ('\n');
516     else
517     current_term->cls ();
518     @@ -1214,6 +1242,16 @@
519     return ! errnum;
520     }
521    
522     +void
523     +grub_memcpy(void *dest, const void *src, int len)
524     +{
525     + int i;
526     + register char *d = (char*)dest, *s = (char*)src;
527     +
528     + for (i = 0; i < len; i++)
529     + d[i] = s[i];
530     +}
531     +
532     void *
533     grub_memmove (void *to, const void *from, int len)
534     {
535     diff -Naur grub-0.95-orig/stage2/graphics.c grub-0.95/stage2/graphics.c
536     --- grub-0.95-orig/stage2/graphics.c 1970-01-01 01:00:00.000000000 +0100
537     +++ grub-0.95/stage2/graphics.c 2004-02-15 11:20:57.744017928 +0100
538     @@ -0,0 +1,552 @@
539     +/* graphics.c - graphics mode support for GRUB */
540     +/* Implemented as a terminal type by Jeremy Katz <katzj@redhat.com> based
541     + * on a patch by Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
542     + */
543     +/*
544     + * GRUB -- GRand Unified Bootloader
545     + * Copyright (C) 2001,2002 Red Hat, Inc.
546     + * Portions copyright (C) 2000 Conectiva, Inc.
547     + *
548     + * This program is free software; you can redistribute it and/or modify
549     + * it under the terms of the GNU General Public License as published by
550     + * the Free Software Foundation; either version 2 of the License, or
551     + * (at your option) any later version.
552     + *
553     + * This program is distributed in the hope that it will be useful,
554     + * but WITHOUT ANY WARRANTY; without even the implied warranty of
555     + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
556     + * GNU General Public License for more details.
557     + *
558     + * You should have received a copy of the GNU General Public License
559     + * along with this program; if not, write to the Free Software
560     + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
561     + */
562     +
563     +
564     +
565     +#ifdef SUPPORT_GRAPHICS
566     +
567     +#include <term.h>
568     +#include <shared.h>
569     +#include <graphics.h>
570     +
571     +int saved_videomode;
572     +unsigned char *font8x16;
573     +
574     +int graphics_inited = 0;
575     +static char splashimage[64];
576     +
577     +#define VSHADOW VSHADOW1
578     +unsigned char VSHADOW1[38400];
579     +unsigned char VSHADOW2[38400];
580     +unsigned char VSHADOW4[38400];
581     +unsigned char VSHADOW8[38400];
582     +
583     +/* constants to define the viewable area */
584     +const int x0 = 0;
585     +const int x1 = 80;
586     +const int y0 = 0;
587     +const int y1 = 30;
588     +
589     +/* text buffer has to be kept around so that we can write things as we
590     + * scroll and the like */
591     +unsigned short text[80 * 30];
592     +
593     +/* why do these have to be kept here? */
594     +int foreground = (63 << 16) | (63 << 8) | (63), background = 0, border = 0;
595     +
596     +/* current position */
597     +static int fontx = 0;
598     +static int fonty = 0;
599     +
600     +/* global state so that we don't try to recursively scroll or cursor */
601     +static int no_scroll = 0;
602     +
603     +/* color state */
604     +static int graphics_standard_color = A_NORMAL;
605     +static int graphics_normal_color = A_NORMAL;
606     +static int graphics_highlight_color = A_REVERSE;
607     +static int graphics_current_color = A_NORMAL;
608     +static color_state graphics_color_state = COLOR_STATE_STANDARD;
609     +
610     +
611     +/* graphics local functions */
612     +static void graphics_setxy(int col, int row);
613     +static void graphics_scroll();
614     +
615     +/* FIXME: where do these really belong? */
616     +static inline void outb(unsigned short port, unsigned char val)
617     +{
618     + __asm __volatile ("outb %0,%1"::"a" (val), "d" (port));
619     +}
620     +
621     +static void MapMask(int value) {
622     + outb(0x3c4, 2);
623     + outb(0x3c5, value);
624     +}
625     +
626     +/* bit mask register */
627     +static void BitMask(int value) {
628     + outb(0x3ce, 8);
629     + outb(0x3cf, value);
630     +}
631     +
632     +
633     +
634     +/* Set the splash image */
635     +void graphics_set_splash(char *splashfile) {
636     + grub_strcpy(splashimage, splashfile);
637     +}
638     +
639     +/* Get the current splash image */
640     +char *graphics_get_splash(void) {
641     + return splashimage;
642     +}
643     +
644     +/* Initialize a vga16 graphics display with the palette based off of
645     + * the image in splashimage. If the image doesn't exist, leave graphics
646     + * mode. */
647     +int graphics_init()
648     +{
649     + if (!graphics_inited) {
650     + saved_videomode = set_videomode(0x12);
651     + }
652     +
653     + if (!read_image(splashimage)) {
654     + set_videomode(saved_videomode);
655     + grub_printf("failed to read image\n");
656     + return 0;
657     + }
658     +
659     + font8x16 = (unsigned char*)graphics_get_font();
660     +
661     + graphics_inited = 1;
662     +
663     + /* make sure that the highlight color is set correctly */
664     + graphics_highlight_color = ((graphics_normal_color >> 4) |
665     + ((graphics_normal_color & 0xf) << 4));
666     +
667     + return 1;
668     +}
669     +
670     +/* Leave graphics mode */
671     +void graphics_end(void)
672     +{
673     + if (graphics_inited) {
674     + set_videomode(saved_videomode);
675     + graphics_inited = 0;
676     + }
677     +}
678     +
679     +/* Print ch on the screen. Handle any needed scrolling or the like */
680     +void graphics_putchar(int ch) {
681     + ch &= 0xff;
682     +
683     + graphics_cursor(0);
684     +
685     + if (ch == '\n') {
686     + if (fonty + 1 < y1)
687     + graphics_setxy(fontx, fonty + 1);
688     + else
689     + graphics_scroll();
690     + graphics_cursor(1);
691     + return;
692     + } else if (ch == '\r') {
693     + graphics_setxy(x0, fonty);
694     + graphics_cursor(1);
695     + return;
696     + }
697     +
698     + graphics_cursor(0);
699     +
700     + text[fonty * 80 + fontx] = ch;
701     + text[fonty * 80 + fontx] &= 0x00ff;
702     + if (graphics_current_color & 0xf0)
703     + text[fonty * 80 + fontx] |= 0x100;
704     +
705     + graphics_cursor(0);
706     +
707     + if ((fontx + 1) >= x1) {
708     + graphics_setxy(x0, fonty);
709     + if (fonty + 1 < y1)
710     + graphics_setxy(x0, fonty + 1);
711     + else
712     + graphics_scroll();
713     + } else {
714     + graphics_setxy(fontx + 1, fonty);
715     + }
716     +
717     + graphics_cursor(1);
718     +}
719     +
720     +/* get the current location of the cursor */
721     +int graphics_getxy(void) {
722     + return (fontx << 8) | fonty;
723     +}
724     +
725     +void graphics_gotoxy(int x, int y) {
726     + graphics_cursor(0);
727     +
728     + graphics_setxy(x, y);
729     +
730     + graphics_cursor(1);
731     +}
732     +
733     +void graphics_cls(void) {
734     + int i;
735     + unsigned char *mem, *s1, *s2, *s4, *s8;
736     +
737     + graphics_cursor(0);
738     + graphics_gotoxy(x0, y0);
739     +
740     + mem = (unsigned char*)VIDEOMEM;
741     + s1 = (unsigned char*)VSHADOW1;
742     + s2 = (unsigned char*)VSHADOW2;
743     + s4 = (unsigned char*)VSHADOW4;
744     + s8 = (unsigned char*)VSHADOW8;
745     +
746     + for (i = 0; i < 80 * 30; i++)
747     + text[i] = ' ';
748     + graphics_cursor(1);
749     +
750     + BitMask(0xff);
751     +
752     + /* plano 1 */
753     + MapMask(1);
754     + grub_memcpy(mem, s1, 38400);
755     +
756     + /* plano 2 */
757     + MapMask(2);
758     + grub_memcpy(mem, s2, 38400);
759     +
760     + /* plano 3 */
761     + MapMask(4);
762     + grub_memcpy(mem, s4, 38400);
763     +
764     + /* plano 4 */
765     + MapMask(8);
766     + grub_memcpy(mem, s8, 38400);
767     +
768     + MapMask(15);
769     +
770     +}
771     +
772     +void graphics_setcolorstate (color_state state) {
773     + switch (state) {
774     + case COLOR_STATE_STANDARD:
775     + graphics_current_color = graphics_standard_color;
776     + break;
777     + case COLOR_STATE_NORMAL:
778     + graphics_current_color = graphics_normal_color;
779     + break;
780     + case COLOR_STATE_HIGHLIGHT:
781     + graphics_current_color = graphics_highlight_color;
782     + break;
783     + default:
784     + graphics_current_color = graphics_standard_color;
785     + break;
786     + }
787     +
788     + graphics_color_state = state;
789     +}
790     +
791     +void graphics_setcolor (int normal_color, int highlight_color) {
792     + graphics_normal_color = normal_color;
793     + graphics_highlight_color = highlight_color;
794     +
795     + graphics_setcolorstate (graphics_color_state);
796     +}
797     +
798     +void graphics_setcursor (int on) {
799     + /* FIXME: we don't have a cursor in graphics */
800     + return;
801     +}
802     +
803     +/* Read in the splashscreen image and set the palette up appropriately.
804     + * Format of splashscreen is an xpm (can be gzipped) with 16 colors and
805     + * 640x480. */
806     +int read_image(char *s)
807     +{
808     + char buf[32], pal[16];
809     + unsigned char c, base, mask, *s1, *s2, *s4, *s8;
810     + unsigned i, len, idx, colors, x, y, width, height;
811     +
812     + if (!grub_open(s))
813     + return 0;
814     +
815     + /* read header */
816     + if (!grub_read((char*)&buf, 10) || grub_memcmp(buf, "/* XPM */\n", 10)) {
817     + grub_close();
818     + return 0;
819     + }
820     +
821     + /* parse info */
822     + while (grub_read(&c, 1)) {
823     + if (c == '"')
824     + break;
825     + }
826     +
827     + while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
828     + ;
829     +
830     + i = 0;
831     + width = c - '0';
832     + while (grub_read(&c, 1)) {
833     + if (c >= '0' && c <= '9')
834     + width = width * 10 + c - '0';
835     + else
836     + break;
837     + }
838     + while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
839     + ;
840     +
841     + height = c - '0';
842     + while (grub_read(&c, 1)) {
843     + if (c >= '0' && c <= '9')
844     + height = height * 10 + c - '0';
845     + else
846     + break;
847     + }
848     + while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
849     + ;
850     +
851     + colors = c - '0';
852     + while (grub_read(&c, 1)) {
853     + if (c >= '0' && c <= '9')
854     + colors = colors * 10 + c - '0';
855     + else
856     + break;
857     + }
858     +
859     + base = 0;
860     + while (grub_read(&c, 1) && c != '"')
861     + ;
862     +
863     + /* palette */
864     + for (i = 0, idx = 1; i < colors; i++) {
865     + len = 0;
866     +
867     + while (grub_read(&c, 1) && c != '"')
868     + ;
869     + grub_read(&c, 1); /* char */
870     + base = c;
871     + grub_read(buf, 4); /* \t c # */
872     +
873     + while (grub_read(&c, 1) && c != '"') {
874     + if (len < sizeof(buf))
875     + buf[len++] = c;
876     + }
877     +
878     + if (len == 6 && idx < 15) {
879     + int r = ((hex(buf[0]) << 4) | hex(buf[1])) >> 2;
880     + int g = ((hex(buf[2]) << 4) | hex(buf[3])) >> 2;
881     + int b = ((hex(buf[4]) << 4) | hex(buf[5])) >> 2;
882     +
883     + pal[idx] = base;
884     + graphics_set_palette(idx, r, g, b);
885     + ++idx;
886     + }
887     + }
888     +
889     + x = y = len = 0;
890     +
891     + s1 = (unsigned char*)VSHADOW1;
892     + s2 = (unsigned char*)VSHADOW2;
893     + s4 = (unsigned char*)VSHADOW4;
894     + s8 = (unsigned char*)VSHADOW8;
895     +
896     + for (i = 0; i < 38400; i++)
897     + s1[i] = s2[i] = s4[i] = s8[i] = 0;
898     +
899     + /* parse xpm data */
900     + while (y < height) {
901     + while (1) {
902     + if (!grub_read(&c, 1)) {
903     + grub_close();
904     + return 0;
905     + }
906     + if (c == '"')
907     + break;
908     + }
909     +
910     + while (grub_read(&c, 1) && c != '"') {
911     + for (i = 1; i < 15; i++)
912     + if (pal[i] == c) {
913     + c = i;
914     + break;
915     + }
916     +
917     + mask = 0x80 >> (x & 7);
918     + if (c & 1)
919     + s1[len + (x >> 3)] |= mask;
920     + if (c & 2)
921     + s2[len + (x >> 3)] |= mask;
922     + if (c & 4)
923     + s4[len + (x >> 3)] |= mask;
924     + if (c & 8)
925     + s8[len + (x >> 3)] |= mask;
926     +
927     + if (++x >= 640) {
928     + x = 0;
929     +
930     + if (y < 480)
931     + len += 80;
932     + ++y;
933     + }
934     + }
935     + }
936     +
937     + grub_close();
938     +
939     + graphics_set_palette(0, (background >> 16), (background >> 8) & 63,
940     + background & 63);
941     + graphics_set_palette(15, (foreground >> 16), (foreground >> 8) & 63,
942     + foreground & 63);
943     + graphics_set_palette(0x11, (border >> 16), (border >> 8) & 63,
944     + border & 63);
945     +
946     + return 1;
947     +}
948     +
949     +
950     +/* Convert a character which is a hex digit to the appropriate integer */
951     +int hex(int v)
952     +{
953     + if (v >= 'A' && v <= 'F')
954     + return (v - 'A' + 10);
955     + if (v >= 'a' && v <= 'f')
956     + return (v - 'a' + 10);
957     + return (v - '0');
958     +}
959     +
960     +
961     +/* move the graphics cursor location to col, row */
962     +static void graphics_setxy(int col, int row) {
963     + if (col >= x0 && col < x1) {
964     + fontx = col;
965     + cursorX = col << 3;
966     + }
967     + if (row >= y0 && row < y1) {
968     + fonty = row;
969     + cursorY = row << 4;
970     + }
971     +}
972     +
973     +/* scroll the screen */
974     +static void graphics_scroll() {
975     + int i, j;
976     +
977     + /* we don't want to scroll recursively... that would be bad */
978     + if (no_scroll)
979     + return;
980     + no_scroll = 1;
981     +
982     + /* move everything up a line */
983     + for (j = y0 + 1; j < y1; j++) {
984     + graphics_gotoxy(x0, j - 1);
985     + for (i = x0; i < x1; i++) {
986     + graphics_putchar(text[j * 80 + i]);
987     + }
988     + }
989     +
990     + /* last line should be blank */
991     + graphics_gotoxy(x0, y1 - 1);
992     + for (i = x0; i < x1; i++)
993     + graphics_putchar(' ');
994     + graphics_setxy(x0, y1 - 1);
995     +
996     + no_scroll = 0;
997     +}
998     +
999     +
1000     +void graphics_cursor(int set) {
1001     + unsigned char *pat, *mem, *ptr, chr[16 << 2];
1002     + int i, ch, invert, offset;
1003     +
1004     + if (set && no_scroll)
1005     + return;
1006     +
1007     + offset = cursorY * 80 + fontx;
1008     + ch = text[fonty * 80 + fontx] & 0xff;
1009     + invert = (text[fonty * 80 + fontx] & 0xff00) != 0;
1010     + pat = font8x16 + (ch << 4);
1011     +
1012     + mem = (unsigned char*)VIDEOMEM + offset;
1013     +
1014     + if (!set) {
1015     + for (i = 0; i < 16; i++) {
1016     + unsigned char mask = pat[i];
1017     +
1018     + if (!invert) {
1019     + chr[i ] = ((unsigned char*)VSHADOW1)[offset];
1020     + chr[16 + i] = ((unsigned char*)VSHADOW2)[offset];
1021     + chr[32 + i] = ((unsigned char*)VSHADOW4)[offset];
1022     + chr[48 + i] = ((unsigned char*)VSHADOW8)[offset];
1023     +
1024     + /* FIXME: if (shade) */
1025     + if (1) {
1026     + if (ch == DISP_VERT || ch == DISP_LL ||
1027     + ch == DISP_UR || ch == DISP_LR) {
1028     + unsigned char pmask = ~(pat[i] >> 1);
1029     +
1030     + chr[i ] &= pmask;
1031     + chr[16 + i] &= pmask;
1032     + chr[32 + i] &= pmask;
1033     + chr[48 + i] &= pmask;
1034     + }
1035     + if (i > 0 && ch != DISP_VERT) {
1036     + unsigned char pmask = ~(pat[i - 1] >> 1);
1037     +
1038     + chr[i ] &= pmask;
1039     + chr[16 + i] &= pmask;
1040     + chr[32 + i] &= pmask;
1041     + chr[48 + i] &= pmask;
1042     + if (ch == DISP_HORIZ || ch == DISP_UR || ch == DISP_LR) {
1043     + pmask = ~pat[i - 1];
1044     +
1045     + chr[i ] &= pmask;
1046     + chr[16 + i] &= pmask;
1047     + chr[32 + i] &= pmask;
1048     + chr[48 + i] &= pmask;
1049     + }
1050     + }
1051     + }
1052     + chr[i ] |= mask;
1053     + chr[16 + i] |= mask;
1054     + chr[32 + i] |= mask;
1055     + chr[48 + i] |= mask;
1056     +
1057     + offset += 80;
1058     + }
1059     + else {
1060     + chr[i ] = mask;
1061     + chr[16 + i] = mask;
1062     + chr[32 + i] = mask;
1063     + chr[48 + i] = mask;
1064     + }
1065     + }
1066     + }
1067     + else {
1068     + MapMask(15);
1069     + ptr = mem;
1070     + for (i = 0; i < 16; i++, ptr += 80) {
1071     + cursorBuf[i] = pat[i];
1072     + *ptr = ~pat[i];
1073     + }
1074     + return;
1075     + }
1076     +
1077     + offset = 0;
1078     + for (i = 1; i < 16; i <<= 1, offset += 16) {
1079     + int j;
1080     +
1081     + MapMask(i);
1082     + ptr = mem;
1083     + for (j = 0; j < 16; j++, ptr += 80)
1084     + *ptr = chr[j + offset];
1085     + }
1086     +
1087     + MapMask(15);
1088     +}
1089     +
1090     +#endif /* SUPPORT_GRAPHICS */
1091     diff -Naur grub-0.95-orig/stage2/graphics.h grub-0.95/stage2/graphics.h
1092     --- grub-0.95-orig/stage2/graphics.h 1970-01-01 01:00:00.000000000 +0100
1093     +++ grub-0.95/stage2/graphics.h 2004-02-15 11:20:57.746017624 +0100
1094     @@ -0,0 +1,42 @@
1095     +/* graphics.h - graphics console interface */
1096     +/*
1097     + * GRUB -- GRand Unified Bootloader
1098     + * Copyright (C) 2002 Free Software Foundation, Inc.
1099     + *
1100     + * This program is free software; you can redistribute it and/or modify
1101     + * it under the terms of the GNU General Public License as published by
1102     + * the Free Software Foundation; either version 2 of the License, or
1103     + * (at your option) any later version.
1104     + *
1105     + * This program is distributed in the hope that it will be useful,
1106     + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1107     + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1108     + * GNU General Public License for more details.
1109     + *
1110     + * You should have received a copy of the GNU General Public License
1111     + * along with this program; if not, write to the Free Software
1112     + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1113     + */
1114     +
1115     +#ifndef GRAPHICS_H
1116     +#define GRAPHICS_H
1117     +
1118     +/* magic constant */
1119     +#define VIDEOMEM 0xA0000
1120     +
1121     +/* function prototypes */
1122     +char *graphics_get_splash(void);
1123     +
1124     +int read_image(char *s);
1125     +void graphics_cursor(int set);
1126     +
1127     +/* function prototypes for asm functions */
1128     +void * graphics_get_font();
1129     +void graphics_set_palette(int idx, int red, int green, int blue);
1130     +void set_int1c_handler();
1131     +void unset_int1c_handler();
1132     +
1133     +extern short cursorX, cursorY;
1134     +extern char cursorBuf[16];
1135     +
1136     +#endif /* GRAPHICS_H */
1137     diff -Naur grub-0.95-orig/stage2/Makefile.am grub-0.95/stage2/Makefile.am
1138     --- grub-0.95-orig/stage2/Makefile.am 2003-10-19 18:45:18.000000000 +0200
1139     +++ grub-0.95/stage2/Makefile.am 2004-02-15 11:20:57.748017320 +0100
1140     @@ -7,7 +7,7 @@
1141     fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
1142     imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
1143     nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
1144     - terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h
1145     + terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h graphics.h
1146     EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
1147    
1148     # For <stage1.h>.
1149     @@ -19,7 +19,7 @@
1150     disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
1151     fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
1152     fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
1153     - terminfo.c tparm.c
1154     + terminfo.c tparm.c graphics.c
1155     libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
1156     -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
1157     -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
1158     @@ -80,8 +80,14 @@
1159     HERCULES_FLAGS =
1160     endif
1161    
1162     +if GRAPHICS_SUPPORT
1163     +GRAPHICS_FLAGS = -DSUPPORT_GRAPHICS=1
1164     +else
1165     +GRAPHICS_FLAGS =
1166     +endif
1167     +
1168     STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
1169     - $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS)
1170     + $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS)
1171    
1172     STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
1173     STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
1174     @@ -91,7 +97,8 @@
1175     cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
1176     fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
1177     fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \
1178     - hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c
1179     + hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c \
1180     + graphics.c
1181     pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
1182     pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
1183     pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)
1184     diff -Naur grub-0.95-orig/stage2/shared.h grub-0.95/stage2/shared.h
1185     --- grub-0.95-orig/stage2/shared.h 2004-01-11 10:39:22.000000000 +0100
1186     +++ grub-0.95/stage2/shared.h 2004-02-15 11:20:57.760015496 +0100
1187     @@ -871,6 +871,7 @@
1188     int grub_tolower (int c);
1189     int grub_isspace (int c);
1190     int grub_strncat (char *s1, const char *s2, int n);
1191     +void grub_memcpy(void *dest, const void *src, int len);
1192     void *grub_memmove (void *to, const void *from, int len);
1193     void *grub_memset (void *start, int c, int len);
1194     int grub_strncat (char *s1, const char *s2, int n);
1195     diff -Naur grub-0.95-orig/stage2/shared.h.orig grub-0.95/stage2/shared.h.orig
1196     --- grub-0.95-orig/stage2/shared.h.orig 1970-01-01 01:00:00.000000000 +0100
1197     +++ grub-0.95/stage2/shared.h.orig 2004-01-11 10:39:22.000000000 +0100
1198     @@ -0,0 +1,980 @@
1199     +/* shared.h - definitions used in all GRUB-specific code */
1200     +/*
1201     + * GRUB -- GRand Unified Bootloader
1202     + * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
1203     + *
1204     + * This program is free software; you can redistribute it and/or modify
1205     + * it under the terms of the GNU General Public License as published by
1206     + * the Free Software Foundation; either version 2 of the License, or
1207     + * (at your option) any later version.
1208     + *
1209     + * This program is distributed in the hope that it will be useful,
1210     + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1211     + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1212     + * GNU General Public License for more details.
1213     + *
1214     + * You should have received a copy of the GNU General Public License
1215     + * along with this program; if not, write to the Free Software
1216     + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1217     + */
1218     +
1219     +/*
1220     + * Generic defines to use anywhere
1221     + */
1222     +
1223     +#ifndef GRUB_SHARED_HEADER
1224     +#define GRUB_SHARED_HEADER 1
1225     +
1226     +#include <config.h>
1227     +
1228     +/* Add an underscore to a C symbol in assembler code if needed. */
1229     +#ifdef HAVE_ASM_USCORE
1230     +# define EXT_C(sym) _ ## sym
1231     +#else
1232     +# define EXT_C(sym) sym
1233     +#endif
1234     +
1235     +/* Maybe redirect memory requests through grub_scratch_mem. */
1236     +#ifdef GRUB_UTIL
1237     +extern char *grub_scratch_mem;
1238     +# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem)
1239     +# define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4)
1240     +#else
1241     +# define RAW_ADDR(x) (x)
1242     +# define RAW_SEG(x) (x)
1243     +#endif
1244     +
1245     +/*
1246     + * Integer sizes
1247     + */
1248     +
1249     +#define MAXINT 0x7FFFFFFF
1250     +
1251     +/* Maximum command line size. Before you blindly increase this value,
1252     + see the comment in char_io.c (get_cmdline). */
1253     +#define MAX_CMDLINE 1600
1254     +#define NEW_HEAPSIZE 1500
1255     +
1256     +/* 512-byte scratch area */
1257     +#define SCRATCHADDR RAW_ADDR (0x77e00)
1258     +#define SCRATCHSEG RAW_SEG (0x77e0)
1259     +
1260     +/*
1261     + * This is the location of the raw device buffer. It is 31.5K
1262     + * in size.
1263     + */
1264     +
1265     +#define BUFFERLEN 0x7e00
1266     +#define BUFFERADDR RAW_ADDR (0x70000)
1267     +#define BUFFERSEG RAW_SEG (0x7000)
1268     +
1269     +#define BOOT_PART_TABLE RAW_ADDR (0x07be)
1270     +
1271     +/*
1272     + * BIOS disk defines
1273     + */
1274     +#define BIOSDISK_READ 0x0
1275     +#define BIOSDISK_WRITE 0x1
1276     +#define BIOSDISK_ERROR_GEOMETRY 0x100
1277     +#define BIOSDISK_FLAG_LBA_EXTENSION 0x1
1278     +
1279     +/*
1280     + * This is the filesystem (not raw device) buffer.
1281     + * It is 32K in size, do not overrun!
1282     + */
1283     +
1284     +#define FSYS_BUFLEN 0x8000
1285     +#define FSYS_BUF RAW_ADDR (0x68000)
1286     +
1287     +/* Command-line buffer for Multiboot kernels and modules. This area
1288     + includes the area into which Stage 1.5 and Stage 1 are loaded, but
1289     + that's no problem. */
1290     +#define MB_CMDLINE_BUF RAW_ADDR (0x2000)
1291     +#define MB_CMDLINE_BUFLEN 0x6000
1292     +
1293     +/* The buffer for the password. */
1294     +#define PASSWORD_BUF RAW_ADDR (0x78000)
1295     +#define PASSWORD_BUFLEN 0x200
1296     +
1297     +/* The buffer for the command-line. */
1298     +#define CMDLINE_BUF (PASSWORD_BUF + PASSWORD_BUFLEN)
1299     +#define CMDLINE_BUFLEN MAX_CMDLINE
1300     +
1301     +/* The kill buffer for the command-line. */
1302     +#define KILL_BUF (CMDLINE_BUF + CMDLINE_BUFLEN)
1303     +#define KILL_BUFLEN MAX_CMDLINE
1304     +
1305     +/* The history buffer for the command-line. */
1306     +#define HISTORY_BUF (KILL_BUF + KILL_BUFLEN)
1307     +#define HISTORY_SIZE 5
1308     +#define HISTORY_BUFLEN (MAX_CMDLINE * HISTORY_SIZE)
1309     +
1310     +/* The buffer for the completion. */
1311     +#define COMPLETION_BUF (HISTORY_BUF + HISTORY_BUFLEN)
1312     +#define COMPLETION_BUFLEN MAX_CMDLINE
1313     +
1314     +/* The buffer for the unique string. */
1315     +#define UNIQUE_BUF (COMPLETION_BUF + COMPLETION_BUFLEN)
1316     +#define UNIQUE_BUFLEN MAX_CMDLINE
1317     +
1318     +/* The buffer for the menu entries. */
1319     +#define MENU_BUF (UNIQUE_BUF + UNIQUE_BUFLEN)
1320     +#define MENU_BUFLEN (0x8000 + PASSWORD_BUF - UNIQUE_BUF)
1321     +
1322     +/* The size of the drive map. */
1323     +#define DRIVE_MAP_SIZE 8
1324     +
1325     +/* The size of the key map. */
1326     +#define KEY_MAP_SIZE 128
1327     +
1328     +/* The size of the io map. */
1329     +#define IO_MAP_SIZE 128
1330     +
1331     +/*
1332     + * Linux setup parameters
1333     + */
1334     +
1335     +#define LINUX_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */
1336     +#define LINUX_DEFAULT_SETUP_SECTS 4
1337     +#define LINUX_FLAG_CAN_USE_HEAP 0x80
1338     +#define LINUX_INITRD_MAX_ADDRESS 0x38000000
1339     +#define LINUX_MAX_SETUP_SECTS 64
1340     +#define LINUX_BOOT_LOADER_TYPE 0x71
1341     +#define LINUX_HEAP_END_OFFSET (0x9000 - 0x200)
1342     +
1343     +#define LINUX_BZIMAGE_ADDR RAW_ADDR (0x100000)
1344     +#define LINUX_ZIMAGE_ADDR RAW_ADDR (0x10000)
1345     +#define LINUX_OLD_REAL_MODE_ADDR RAW_ADDR (0x90000)
1346     +#define LINUX_SETUP_STACK 0x9000
1347     +
1348     +#define LINUX_FLAG_BIG_KERNEL 0x1
1349     +
1350     +/* Linux's video mode selection support. Actually I hate it! */
1351     +#define LINUX_VID_MODE_NORMAL 0xFFFF
1352     +#define LINUX_VID_MODE_EXTENDED 0xFFFE
1353     +#define LINUX_VID_MODE_ASK 0xFFFD
1354     +
1355     +#define LINUX_CL_OFFSET 0x9000
1356     +#define LINUX_CL_END_OFFSET 0x90FF
1357     +#define LINUX_SETUP_MOVE_SIZE 0x9100
1358     +#define LINUX_CL_MAGIC 0xA33F
1359     +
1360     +/*
1361     + * General disk stuff
1362     + */
1363     +
1364     +#define SECTOR_SIZE 0x200
1365     +#define SECTOR_BITS 9
1366     +#define BIOS_FLAG_FIXED_DISK 0x80
1367     +
1368     +#define BOOTSEC_LOCATION RAW_ADDR (0x7C00)
1369     +#define BOOTSEC_SIGNATURE 0xAA55
1370     +#define BOOTSEC_BPB_OFFSET 0x3
1371     +#define BOOTSEC_BPB_LENGTH 0x3B
1372     +#define BOOTSEC_BPB_SYSTEM_ID 0x3
1373     +#define BOOTSEC_BPB_HIDDEN_SECTORS 0x1C
1374     +#define BOOTSEC_PART_OFFSET 0x1BE
1375     +#define BOOTSEC_PART_LENGTH 0x40
1376     +#define BOOTSEC_SIG_OFFSET 0x1FE
1377     +#define BOOTSEC_LISTSIZE 8
1378     +
1379     +/* Not bad, perhaps. */
1380     +#define NETWORK_DRIVE 0x20
1381     +
1382     +/*
1383     + * GRUB specific information
1384     + * (in LSB order)
1385     + */
1386     +
1387     +#include <stage1.h>
1388     +
1389     +#define STAGE2_VER_MAJ_OFFS 0x6
1390     +#define STAGE2_INSTALLPART 0x8
1391     +#define STAGE2_SAVED_ENTRYNO 0xc
1392     +#define STAGE2_STAGE2_ID 0x10
1393     +#define STAGE2_FORCE_LBA 0x11
1394     +#define STAGE2_VER_STR_OFFS 0x12
1395     +
1396     +/* Stage 2 identifiers */
1397     +#define STAGE2_ID_STAGE2 0
1398     +#define STAGE2_ID_FFS_STAGE1_5 1
1399     +#define STAGE2_ID_E2FS_STAGE1_5 2
1400     +#define STAGE2_ID_FAT_STAGE1_5 3
1401     +#define STAGE2_ID_MINIX_STAGE1_5 4
1402     +#define STAGE2_ID_REISERFS_STAGE1_5 5
1403     +#define STAGE2_ID_VSTAFS_STAGE1_5 6
1404     +#define STAGE2_ID_JFS_STAGE1_5 7
1405     +#define STAGE2_ID_XFS_STAGE1_5 8
1406     +
1407     +#ifndef STAGE1_5
1408     +# define STAGE2_ID STAGE2_ID_STAGE2
1409     +#else
1410     +# if defined(FSYS_FFS)
1411     +# define STAGE2_ID STAGE2_ID_FFS_STAGE1_5
1412     +# elif defined(FSYS_EXT2FS)
1413     +# define STAGE2_ID STAGE2_ID_E2FS_STAGE1_5
1414     +# elif defined(FSYS_FAT)
1415     +# define STAGE2_ID STAGE2_ID_FAT_STAGE1_5
1416     +# elif defined(FSYS_MINIX)
1417     +# define STAGE2_ID STAGE2_ID_MINIX_STAGE1_5
1418     +# elif defined(FSYS_REISERFS)
1419     +# define STAGE2_ID STAGE2_ID_REISERFS_STAGE1_5
1420     +# elif defined(FSYS_VSTAFS)
1421     +# define STAGE2_ID STAGE2_ID_VSTAFS_STAGE1_5
1422     +# elif defined(FSYS_JFS)
1423     +# define STAGE2_ID STAGE2_ID_JFS_STAGE1_5
1424     +# elif defined(FSYS_XFS)
1425     +# define STAGE2_ID STAGE2_ID_XFS_STAGE1_5
1426     +# else
1427     +# error "unknown Stage 2"
1428     +# endif
1429     +#endif
1430     +
1431     +/*
1432     + * defines for use when switching between real and protected mode
1433     + */
1434     +
1435     +#define CR0_PE_ON 0x1
1436     +#define CR0_PE_OFF 0xfffffffe
1437     +#define PROT_MODE_CSEG 0x8
1438     +#define PROT_MODE_DSEG 0x10
1439     +#define PSEUDO_RM_CSEG 0x18
1440     +#define PSEUDO_RM_DSEG 0x20
1441     +#define STACKOFF (0x2000 - 0x10)
1442     +#define PROTSTACKINIT (FSYS_BUF - 0x10)
1443     +
1444     +
1445     +/*
1446     + * Assembly code defines
1447     + *
1448     + * "EXT_C" is assumed to be defined in the Makefile by the configure
1449     + * command.
1450     + */
1451     +
1452     +#define ENTRY(x) .globl EXT_C(x) ; EXT_C(x):
1453     +#define VARIABLE(x) ENTRY(x)
1454     +
1455     +
1456     +#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */
1457     +#define K_STATUS 0x64 /* keyboard status */
1458     +#define K_CMD 0x64 /* keybd ctlr command (write-only) */
1459     +
1460     +#define K_OBUF_FUL 0x01 /* output buffer full */
1461     +#define K_IBUF_FUL 0x02 /* input buffer full */
1462     +
1463     +#define KC_CMD_WIN 0xd0 /* read output port */
1464     +#define KC_CMD_WOUT 0xd1 /* write output port */
1465     +#define KB_OUTPUT_MASK 0xdd /* enable output buffer full interrupt
1466     + enable data line
1467     + enable clock line */
1468     +#define KB_A20_ENABLE 0x02
1469     +
1470     +/* Codes for getchar. */
1471     +#define ASCII_CHAR(x) ((x) & 0xFF)
1472     +#if !defined(GRUB_UTIL) || !defined(HAVE_LIBCURSES)
1473     +# define KEY_LEFT 0x4B00
1474     +# define KEY_RIGHT 0x4D00
1475     +# define KEY_UP 0x4800
1476     +# define KEY_DOWN 0x5000
1477     +# define KEY_IC 0x5200 /* insert char */
1478     +# define KEY_DC 0x5300 /* delete char */
1479     +# define KEY_BACKSPACE 0x0008
1480     +# define KEY_HOME 0x4700
1481     +# define KEY_END 0x4F00
1482     +# define KEY_NPAGE 0x5100
1483     +# define KEY_PPAGE 0x4900
1484     +# define A_NORMAL 0x7
1485     +# define A_REVERSE 0x70
1486     +#elif defined(HAVE_NCURSES_CURSES_H)
1487     +# include <ncurses/curses.h>
1488     +#elif defined(HAVE_NCURSES_H)
1489     +# include <ncurses.h>
1490     +#elif defined(HAVE_CURSES_H)
1491     +# include <curses.h>
1492     +#endif
1493     +
1494     +/* In old BSD curses, A_NORMAL and A_REVERSE are not defined, so we
1495     + define them here if they are undefined. */
1496     +#ifndef A_NORMAL
1497     +# define A_NORMAL 0
1498     +#endif /* ! A_NORMAL */
1499     +#ifndef A_REVERSE
1500     +# ifdef A_STANDOUT
1501     +# define A_REVERSE A_STANDOUT
1502     +# else /* ! A_STANDOUT */
1503     +# define A_REVERSE 0
1504     +# endif /* ! A_STANDOUT */
1505     +#endif /* ! A_REVERSE */
1506     +
1507     +/* Define ACS_* ourselves, since the definitions are not consistent among
1508     + various curses implementations. */
1509     +#undef ACS_ULCORNER
1510     +#undef ACS_URCORNER
1511     +#undef ACS_LLCORNER
1512     +#undef ACS_LRCORNER
1513     +#undef ACS_HLINE
1514     +#undef ACS_VLINE
1515     +#undef ACS_LARROW
1516     +#undef ACS_RARROW
1517     +#undef ACS_UARROW
1518     +#undef ACS_DARROW
1519     +
1520     +#define ACS_ULCORNER '+'
1521     +#define ACS_URCORNER '+'
1522     +#define ACS_LLCORNER '+'
1523     +#define ACS_LRCORNER '+'
1524     +#define ACS_HLINE '-'
1525     +#define ACS_VLINE '|'
1526     +#define ACS_LARROW '<'
1527     +#define ACS_RARROW '>'
1528     +#define ACS_UARROW '^'
1529     +#define ACS_DARROW 'v'
1530     +
1531     +/* Special graphics characters for IBM displays. */
1532     +#define DISP_UL 218
1533     +#define DISP_UR 191
1534     +#define DISP_LL 192
1535     +#define DISP_LR 217
1536     +#define DISP_HORIZ 196
1537     +#define DISP_VERT 179
1538     +#define DISP_LEFT 0x1b
1539     +#define DISP_RIGHT 0x1a
1540     +#define DISP_UP 0x18
1541     +#define DISP_DOWN 0x19
1542     +
1543     +/* Remap some libc-API-compatible function names so that we prevent
1544     + circularararity. */
1545     +#ifndef WITHOUT_LIBC_STUBS
1546     +#define memmove grub_memmove
1547     +#define memcpy grub_memmove /* we don't need a separate memcpy */
1548     +#define memset grub_memset
1549     +#define isspace grub_isspace
1550     +#define printf grub_printf
1551     +#define sprintf grub_sprintf
1552     +#undef putchar
1553     +#define putchar grub_putchar
1554     +#define strncat grub_strncat
1555     +#define strstr grub_strstr
1556     +#define memcmp grub_memcmp
1557     +#define strcmp grub_strcmp
1558     +#define tolower grub_tolower
1559     +#define strlen grub_strlen
1560     +#define strcpy grub_strcpy
1561     +#endif /* WITHOUT_LIBC_STUBS */
1562     +
1563     +
1564     +#ifndef ASM_FILE
1565     +/*
1566     + * Below this should be ONLY defines and other constructs for C code.
1567     + */
1568     +
1569     +/* multiboot stuff */
1570     +
1571     +#include "mb_header.h"
1572     +#include "mb_info.h"
1573     +
1574     +/* For the Linux/i386 boot protocol version 2.03. */
1575     +struct linux_kernel_header
1576     +{
1577     + char code1[0x0020];
1578     + unsigned short cl_magic; /* Magic number 0xA33F */
1579     + unsigned short cl_offset; /* The offset of command line */
1580     + char code2[0x01F1 - 0x0020 - 2 - 2];
1581     + unsigned char setup_sects; /* The size of the setup in sectors */
1582     + unsigned short root_flags; /* If the root is mounted readonly */
1583     + unsigned short syssize; /* obsolete */
1584     + unsigned short swap_dev; /* obsolete */
1585     + unsigned short ram_size; /* obsolete */
1586     + unsigned short vid_mode; /* Video mode control */
1587     + unsigned short root_dev; /* Default root device number */
1588     + unsigned short boot_flag; /* 0xAA55 magic number */
1589     + unsigned short jump; /* Jump instruction */
1590     + unsigned long header; /* Magic signature "HdrS" */
1591     + unsigned short version; /* Boot protocol version supported */
1592     + unsigned long realmode_swtch; /* Boot loader hook */
1593     + unsigned long start_sys; /* Points to kernel version string */
1594     + unsigned char type_of_loader; /* Boot loader identifier */
1595     + unsigned char loadflags; /* Boot protocol option flags */
1596     + unsigned short setup_move_size; /* Move to high memory size */
1597     + unsigned long code32_start; /* Boot loader hook */
1598     + unsigned long ramdisk_image; /* initrd load address */
1599     + unsigned long ramdisk_size; /* initrd size */
1600     + unsigned long bootsect_kludge; /* obsolete */
1601     + unsigned short heap_end_ptr; /* Free memory after setup end */
1602     + unsigned short pad1; /* Unused */
1603     + char *cmd_line_ptr; /* Points to the kernel command line */
1604     + unsigned long initrd_addr_max; /* The highest address of initrd */
1605     +} __attribute__ ((packed));
1606     +
1607     +/* Memory map address range descriptor used by GET_MMAP_ENTRY. */
1608     +struct mmar_desc
1609     +{
1610     + unsigned long desc_len; /* Size of this descriptor. */
1611     + unsigned long long addr; /* Base address. */
1612     + unsigned long long length; /* Length in bytes. */
1613     + unsigned long type; /* Type of address range. */
1614     +} __attribute__ ((packed));
1615     +
1616     +/* VBE controller information. */
1617     +struct vbe_controller
1618     +{
1619     + unsigned char signature[4];
1620     + unsigned short version;
1621     + unsigned long oem_string;
1622     + unsigned long capabilities;
1623     + unsigned long video_mode;
1624     + unsigned short total_memory;
1625     + unsigned short oem_software_rev;
1626     + unsigned long oem_vendor_name;
1627     + unsigned long oem_product_name;
1628     + unsigned long oem_product_rev;
1629     + unsigned char reserved[222];
1630     + unsigned char oem_data[256];
1631     +} __attribute__ ((packed));
1632     +
1633     +/* VBE mode information. */
1634     +struct vbe_mode
1635     +{
1636     + unsigned short mode_attributes;
1637     + unsigned char win_a_attributes;
1638     + unsigned char win_b_attributes;
1639     + unsigned short win_granularity;
1640     + unsigned short win_size;
1641     + unsigned short win_a_segment;
1642     + unsigned short win_b_segment;
1643     + unsigned long win_func;
1644     + unsigned short bytes_per_scanline;
1645     +
1646     + /* >=1.2 */
1647     + unsigned short x_resolution;
1648     + unsigned short y_resolution;
1649     + unsigned char x_char_size;
1650     + unsigned char y_char_size;
1651     + unsigned char number_of_planes;
1652     + unsigned char bits_per_pixel;
1653     + unsigned char number_of_banks;
1654     + unsigned char memory_model;
1655     + unsigned char bank_size;
1656     + unsigned char number_of_image_pages;
1657     + unsigned char reserved0;
1658     +
1659     + /* direct color */
1660     + unsigned char red_mask_size;
1661     + unsigned char red_field_position;
1662     + unsigned char green_mask_size;
1663     + unsigned char green_field_position;
1664     + unsigned char blue_mask_size;
1665     + unsigned char blue_field_position;
1666     + unsigned char reserved_mask_size;
1667     + unsigned char reserved_field_position;
1668     + unsigned char direct_color_mode_info;
1669     +
1670     + /* >=2.0 */
1671     + unsigned long phys_base;
1672     + unsigned long reserved1;
1673     + unsigned short reversed2;
1674     +
1675     + /* >=3.0 */
1676     + unsigned short linear_bytes_per_scanline;
1677     + unsigned char banked_number_of_image_pages;
1678     + unsigned char linear_number_of_image_pages;
1679     + unsigned char linear_red_mask_size;
1680     + unsigned char linear_red_field_position;
1681     + unsigned char linear_green_mask_size;
1682     + unsigned char linear_green_field_position;
1683     + unsigned char linear_blue_mask_size;
1684     + unsigned char linear_blue_field_position;
1685     + unsigned char linear_reserved_mask_size;
1686     + unsigned char linear_reserved_field_position;
1687     + unsigned long max_pixel_clock;
1688     +
1689     + unsigned char reserved3[189];
1690     +} __attribute__ ((packed));
1691     +
1692     +
1693     +#undef NULL
1694     +#define NULL ((void *) 0)
1695     +
1696     +/* Error codes (descriptions are in common.c) */
1697     +typedef enum
1698     +{
1699     + ERR_NONE = 0,
1700     + ERR_BAD_FILENAME,
1701     + ERR_BAD_FILETYPE,
1702     + ERR_BAD_GZIP_DATA,
1703     + ERR_BAD_GZIP_HEADER,
1704     + ERR_BAD_PART_TABLE,
1705     + ERR_BAD_VERSION,
1706     + ERR_BELOW_1MB,
1707     + ERR_BOOT_COMMAND,
1708     + ERR_BOOT_FAILURE,
1709     + ERR_BOOT_FEATURES,
1710     + ERR_DEV_FORMAT,
1711     + ERR_DEV_VALUES,
1712     + ERR_EXEC_FORMAT,
1713     + ERR_FILELENGTH,
1714     + ERR_FILE_NOT_FOUND,
1715     + ERR_FSYS_CORRUPT,
1716     + ERR_FSYS_MOUNT,
1717     + ERR_GEOM,
1718     + ERR_NEED_LX_KERNEL,
1719     + ERR_NEED_MB_KERNEL,
1720     + ERR_NO_DISK,
1721     + ERR_NO_PART,
1722     + ERR_NUMBER_PARSING,
1723     + ERR_OUTSIDE_PART,
1724     + ERR_READ,
1725     + ERR_SYMLINK_LOOP,
1726     + ERR_UNRECOGNIZED,
1727     + ERR_WONT_FIT,
1728     + ERR_WRITE,
1729     + ERR_BAD_ARGUMENT,
1730     + ERR_UNALIGNED,
1731     + ERR_PRIVILEGED,
1732     + ERR_DEV_NEED_INIT,
1733     + ERR_NO_DISK_SPACE,
1734     + ERR_NUMBER_OVERFLOW,
1735     +
1736     + MAX_ERR_NUM
1737     +} grub_error_t;
1738     +
1739     +extern unsigned long install_partition;
1740     +extern unsigned long boot_drive;
1741     +extern unsigned long install_second_sector;
1742     +extern struct apm_info apm_bios_info;
1743     +extern unsigned long boot_part_addr;
1744     +extern int saved_entryno;
1745     +extern unsigned char force_lba;
1746     +extern char version_string[];
1747     +extern char config_file[];
1748     +extern unsigned long linux_text_len;
1749     +extern char *linux_data_tmp_addr;
1750     +extern char *linux_data_real_addr;
1751     +
1752     +#ifdef GRUB_UTIL
1753     +/* If not using config file, this variable is set to zero,
1754     + otherwise non-zero. */
1755     +extern int use_config_file;
1756     +/* If using the preset menu, this variable is set to non-zero,
1757     + otherwise zero. */
1758     +extern int use_preset_menu;
1759     +/* If not using curses, this variable is set to zero, otherwise non-zero. */
1760     +extern int use_curses;
1761     +/* The flag for verbose messages. */
1762     +extern int verbose;
1763     +/* The flag for read-only. */
1764     +extern int read_only;
1765     +/* The number of floppies to be probed. */
1766     +extern int floppy_disks;
1767     +/* The map between BIOS drives and UNIX device file names. */
1768     +extern char **device_map;
1769     +/* The filename which stores the information about a device map. */
1770     +extern char *device_map_file;
1771     +/* The array of geometries. */
1772     +extern struct geometry *disks;
1773     +/* Assign DRIVE to a device name DEVICE. */
1774     +extern void assign_device_name (int drive, const char *device);
1775     +#endif
1776     +
1777     +#ifndef STAGE1_5
1778     +/* GUI interface variables. */
1779     +extern int fallback_entry;
1780     +extern int default_entry;
1781     +extern int current_entryno;
1782     +
1783     +/* The constants for password types. */
1784     +typedef enum
1785     +{
1786     + PASSWORD_PLAIN,
1787     + PASSWORD_MD5,
1788     + PASSWORD_UNSUPPORTED
1789     +}
1790     +password_t;
1791     +
1792     +extern char *password;
1793     +extern password_t password_type;
1794     +extern int auth;
1795     +extern char commands[];
1796     +
1797     +/* For `more'-like feature. */
1798     +extern int max_lines;
1799     +extern int count_lines;
1800     +extern int use_pager;
1801     +#endif
1802     +
1803     +#ifndef NO_DECOMPRESSION
1804     +extern int no_decompression;
1805     +extern int compressed_file;
1806     +#endif
1807     +
1808     +/* instrumentation variables */
1809     +extern void (*disk_read_hook) (int, int, int);
1810     +extern void (*disk_read_func) (int, int, int);
1811     +
1812     +#ifndef STAGE1_5
1813     +/* The flag for debug mode. */
1814     +extern int debug;
1815     +#endif /* STAGE1_5 */
1816     +
1817     +extern unsigned long current_drive;
1818     +extern unsigned long current_partition;
1819     +
1820     +extern int fsys_type;
1821     +
1822     +/* The information for a disk geometry. The CHS information is only for
1823     + DOS/Partition table compatibility, and the real number of sectors is
1824     + stored in TOTAL_SECTORS. */
1825     +struct geometry
1826     +{
1827     + /* The number of cylinders */
1828     + unsigned long cylinders;
1829     + /* The number of heads */
1830     + unsigned long heads;
1831     + /* The number of sectors */
1832     + unsigned long sectors;
1833     + /* The total number of sectors */
1834     + unsigned long total_sectors;
1835     + /* Flags */
1836     + unsigned long flags;
1837     +};
1838     +
1839     +extern unsigned long part_start;
1840     +extern unsigned long part_length;
1841     +
1842     +extern int current_slice;
1843     +
1844     +extern int buf_drive;
1845     +extern int buf_track;
1846     +extern struct geometry buf_geom;
1847     +
1848     +/* these are the current file position and maximum file position */
1849     +extern int filepos;
1850     +extern int filemax;
1851     +
1852     +/*
1853     + * Common BIOS/boot data.
1854     + */
1855     +
1856     +extern struct multiboot_info mbi;
1857     +extern unsigned long saved_drive;
1858     +extern unsigned long saved_partition;
1859     +#ifndef STAGE1_5
1860     +extern unsigned long saved_mem_upper;
1861     +extern unsigned long extended_memory;
1862     +#endif
1863     +
1864     +/*
1865     + * Error variables.
1866     + */
1867     +
1868     +extern grub_error_t errnum;
1869     +extern char *err_list[];
1870     +
1871     +/* Simplify declaration of entry_addr. */
1872     +typedef void (*entry_func) (int, int, int, int, int, int)
1873     + __attribute__ ((noreturn));
1874     +
1875     +extern entry_func entry_addr;
1876     +
1877     +/* Enter the stage1.5/stage2 C code after the stack is set up. */
1878     +void cmain (void);
1879     +
1880     +/* Halt the processor (called after an unrecoverable error). */
1881     +void stop (void) __attribute__ ((noreturn));
1882     +
1883     +/* Reboot the system. */
1884     +void grub_reboot (void) __attribute__ ((noreturn));
1885     +
1886     +/* Halt the system, using APM if possible. If NO_APM is true, don't use
1887     + APM even if it is available. */
1888     +void grub_halt (int no_apm) __attribute__ ((noreturn));
1889     +
1890     +/* Copy MAP to the drive map and set up int13_handler. */
1891     +void set_int13_handler (unsigned short *map);
1892     +
1893     +/* Set up int15_handler. */
1894     +void set_int15_handler (void);
1895     +
1896     +/* Restore the original int15 handler. */
1897     +void unset_int15_handler (void);
1898     +
1899     +/* Track the int13 handler to probe I/O address space. */
1900     +void track_int13 (int drive);
1901     +
1902     +/* The key map. */
1903     +extern unsigned short bios_key_map[];
1904     +extern unsigned short ascii_key_map[];
1905     +extern unsigned short io_map[];
1906     +
1907     +/* calls for direct boot-loader chaining */
1908     +void chain_stage1 (unsigned long segment, unsigned long offset,
1909     + unsigned long part_table_addr)
1910     + __attribute__ ((noreturn));
1911     +void chain_stage2 (unsigned long segment, unsigned long offset,
1912     + int second_sector)
1913     + __attribute__ ((noreturn));
1914     +
1915     +/* do some funky stuff, then boot linux */
1916     +void linux_boot (void) __attribute__ ((noreturn));
1917     +
1918     +/* do some funky stuff, then boot bzImage linux */
1919     +void big_linux_boot (void) __attribute__ ((noreturn));
1920     +
1921     +/* booting a multiboot executable */
1922     +void multi_boot (int start, int mb_info) __attribute__ ((noreturn));
1923     +
1924     +/* If LINEAR is nonzero, then set the Intel processor to linear mode.
1925     + Otherwise, bit 20 of all memory accesses is always forced to zero,
1926     + causing a wraparound effect for bugwards compatibility with the
1927     + 8086 CPU. */
1928     +void gateA20 (int linear);
1929     +
1930     +/* memory probe routines */
1931     +int get_memsize (int type);
1932     +int get_eisamemsize (void);
1933     +
1934     +/* Fetch the next entry in the memory map and return the continuation
1935     + value. DESC is a pointer to the descriptor buffer, and CONT is the
1936     + previous continuation value (0 to get the first entry in the
1937     + map). */
1938     +int get_mmap_entry (struct mmar_desc *desc, int cont);
1939     +
1940     +/* Get the linear address of a ROM configuration table. Return zero,
1941     + if fails. */
1942     +unsigned long get_rom_config_table (void);
1943     +
1944     +/* Get APM BIOS information. */
1945     +void get_apm_info (void);
1946     +
1947     +/* Get VBE controller information. */
1948     +int get_vbe_controller_info (struct vbe_controller *controller);
1949     +
1950     +/* Get VBE mode information. */
1951     +int get_vbe_mode_info (int mode_number, struct vbe_mode *mode);
1952     +
1953     +/* Set VBE mode. */
1954     +int set_vbe_mode (int mode_number);
1955     +
1956     +/* Return the data area immediately following our code. */
1957     +int get_code_end (void);
1958     +
1959     +/* low-level timing info */
1960     +int getrtsecs (void);
1961     +int currticks (void);
1962     +
1963     +/* Clear the screen. */
1964     +void cls (void);
1965     +
1966     +/* Turn on/off cursor. */
1967     +int setcursor (int on);
1968     +
1969     +/* Get the current cursor position (where 0,0 is the top left hand
1970     + corner of the screen). Returns packed values, (RET >> 8) is x,
1971     + (RET & 0xff) is y. */
1972     +int getxy (void);
1973     +
1974     +/* Set the cursor position. */
1975     +void gotoxy (int x, int y);
1976     +
1977     +/* Displays an ASCII character. IBM displays will translate some
1978     + characters to special graphical ones (see the DISP_* constants). */
1979     +void grub_putchar (int c);
1980     +
1981     +/* Wait for a keypress, and return its packed BIOS/ASCII key code.
1982     + Use ASCII_CHAR(ret) to extract the ASCII code. */
1983     +int getkey (void);
1984     +
1985     +/* Like GETKEY, but doesn't block, and returns -1 if no keystroke is
1986     + available. */
1987     +int checkkey (void);
1988     +
1989     +/* Low-level disk I/O */
1990     +int get_diskinfo (int drive, struct geometry *geometry);
1991     +int biosdisk (int subfunc, int drive, struct geometry *geometry,
1992     + int sector, int nsec, int segment);
1993     +void stop_floppy (void);
1994     +
1995     +/* Command-line interface functions. */
1996     +#ifndef STAGE1_5
1997     +
1998     +/* The flags for the builtins. */
1999     +#define BUILTIN_CMDLINE 0x1 /* Run in the command-line. */
2000     +#define BUILTIN_MENU 0x2 /* Run in the menu. */
2001     +#define BUILTIN_TITLE 0x4 /* Only for the command title. */
2002     +#define BUILTIN_SCRIPT 0x8 /* Run in the script. */
2003     +#define BUILTIN_NO_ECHO 0x10 /* Don't print command on booting. */
2004     +#define BUILTIN_HELP_LIST 0x20 /* Show help in listing. */
2005     +
2006     +/* The table for a builtin. */
2007     +struct builtin
2008     +{
2009     + /* The command name. */
2010     + char *name;
2011     + /* The callback function. */
2012     + int (*func) (char *, int);
2013     + /* The combination of the flags defined above. */
2014     + int flags;
2015     + /* The short version of the documentation. */
2016     + char *short_doc;
2017     + /* The long version of the documentation. */
2018     + char *long_doc;
2019     +};
2020     +
2021     +/* All the builtins are registered in this. */
2022     +extern struct builtin *builtin_table[];
2023     +
2024     +/* The constants for kernel types. */
2025     +typedef enum
2026     +{
2027     + KERNEL_TYPE_NONE, /* None is loaded. */
2028     + KERNEL_TYPE_MULTIBOOT, /* Multiboot. */
2029     + KERNEL_TYPE_LINUX, /* Linux. */
2030     + KERNEL_TYPE_BIG_LINUX, /* Big Linux. */
2031     + KERNEL_TYPE_FREEBSD, /* FreeBSD. */
2032     + KERNEL_TYPE_NETBSD, /* NetBSD. */
2033     + KERNEL_TYPE_CHAINLOADER /* Chainloader. */
2034     +}
2035     +kernel_t;
2036     +
2037     +extern kernel_t kernel_type;
2038     +extern int show_menu;
2039     +extern int grub_timeout;
2040     +
2041     +void init_builtins (void);
2042     +void init_config (void);
2043     +char *skip_to (int after_equal, char *cmdline);
2044     +struct builtin *find_command (char *command);
2045     +void print_cmdline_message (int forever);
2046     +void enter_cmdline (char *heap, int forever);
2047     +int run_script (char *script, char *heap);
2048     +#endif
2049     +
2050     +/* C library replacement functions with identical semantics. */
2051     +void grub_printf (const char *format,...);
2052     +int grub_sprintf (char *buffer, const char *format, ...);
2053     +int grub_tolower (int c);
2054     +int grub_isspace (int c);
2055     +int grub_strncat (char *s1, const char *s2, int n);
2056     +void *grub_memmove (void *to, const void *from, int len);
2057     +void *grub_memset (void *start, int c, int len);
2058     +int grub_strncat (char *s1, const char *s2, int n);
2059     +char *grub_strstr (const char *s1, const char *s2);
2060     +int grub_memcmp (const char *s1, const char *s2, int n);
2061     +int grub_strcmp (const char *s1, const char *s2);
2062     +int grub_strlen (const char *str);
2063     +char *grub_strcpy (char *dest, const char *src);
2064     +
2065     +#ifndef GRUB_UTIL
2066     +typedef unsigned long grub_jmp_buf[6];
2067     +#else
2068     +/* In the grub shell, use the libc jmp_buf instead. */
2069     +# include <setjmp.h>
2070     +# define grub_jmp_buf jmp_buf
2071     +#endif
2072     +
2073     +#ifdef GRUB_UTIL
2074     +# define grub_setjmp setjmp
2075     +# define grub_longjmp longjmp
2076     +#else /* ! GRUB_UTIL */
2077     +int grub_setjmp (grub_jmp_buf env);
2078     +void grub_longjmp (grub_jmp_buf env, int val);
2079     +#endif /* ! GRUB_UTIL */
2080     +
2081     +/* The environment for restarting Stage 2. */
2082     +extern grub_jmp_buf restart_env;
2083     +/* The environment for restarting the command-line interface. */
2084     +extern grub_jmp_buf restart_cmdline_env;
2085     +
2086     +/* misc */
2087     +void init_page (void);
2088     +void print_error (void);
2089     +char *convert_to_ascii (char *buf, int c, ...);
2090     +int get_cmdline (char *prompt, char *cmdline, int maxlen,
2091     + int echo_char, int history);
2092     +int substring (const char *s1, const char *s2);
2093     +int nul_terminate (char *str);
2094     +int get_based_digit (int c, int base);
2095     +int safe_parse_maxint (char **str_ptr, int *myint_ptr);
2096     +int memcheck (int start, int len);
2097     +void grub_putstr (const char *str);
2098     +
2099     +#ifndef NO_DECOMPRESSION
2100     +/* Compression support. */
2101     +int gunzip_test_header (void);
2102     +int gunzip_read (char *buf, int len);
2103     +#endif /* NO_DECOMPRESSION */
2104     +
2105     +int rawread (int drive, int sector, int byte_offset, int byte_len, char *buf);
2106     +int devread (int sector, int byte_offset, int byte_len, char *buf);
2107     +int rawwrite (int drive, int sector, char *buf);
2108     +int devwrite (int sector, int sector_len, char *buf);
2109     +
2110     +/* Parse a device string and initialize the global parameters. */
2111     +char *set_device (char *device);
2112     +int open_device (void);
2113     +int real_open_partition (int flags);
2114     +int open_partition (void);
2115     +int next_partition (unsigned long drive, unsigned long dest,
2116     + unsigned long *partition, int *type,
2117     + unsigned long *start, unsigned long *len,
2118     + unsigned long *offset, int *entry,
2119     + unsigned long *ext_offset, char *buf);
2120     +
2121     +/* Sets device to the one represented by the SAVED_* parameters. */
2122     +int make_saved_active (void);
2123     +
2124     +/* Set or clear the current root partition's hidden flag. */
2125     +int set_partition_hidden_flag (int hidden);
2126     +
2127     +/* Open a file or directory on the active device, using GRUB's
2128     + internal filesystem support. */
2129     +int grub_open (char *filename);
2130     +
2131     +/* Read LEN bytes into BUF from the file that was opened with
2132     + GRUB_OPEN. If LEN is -1, read all the remaining data in the file. */
2133     +int grub_read (char *buf, int len);
2134     +
2135     +/* Reposition a file offset. */
2136     +int grub_seek (int offset);
2137     +
2138     +/* Close a file. */
2139     +void grub_close (void);
2140     +
2141     +/* List the contents of the directory that was opened with GRUB_OPEN,
2142     + printing all completions. */
2143     +int dir (char *dirname);
2144     +
2145     +int set_bootdev (int hdbias);
2146     +
2147     +/* Display statistics on the current active device. */
2148     +void print_fsys_type (void);
2149     +
2150     +/* Display device and filename completions. */
2151     +void print_a_completion (char *filename);
2152     +int print_completions (int is_filename, int is_completion);
2153     +
2154     +/* Copies the current partition data to the desired address. */
2155     +void copy_current_part_entry (char *buf);
2156     +
2157     +#ifndef STAGE1_5
2158     +void bsd_boot (kernel_t type, int bootdev, char *arg)
2159     + __attribute__ ((noreturn));
2160     +
2161     +/* Define flags for load_image here. */
2162     +/* Don't pass a Linux's mem option automatically. */
2163     +#define KERNEL_LOAD_NO_MEM_OPTION (1 << 0)
2164     +
2165     +kernel_t load_image (char *kernel, char *arg, kernel_t suggested_type,
2166     + unsigned long load_flags);
2167     +
2168     +int load_module (char *module, char *arg);
2169     +int load_initrd (char *initrd);
2170     +
2171     +int check_password(char *entered, char* expected, password_t type);
2172     +#endif
2173     +
2174     +void init_bios_info (void);
2175     +
2176     +#endif /* ASM_FILE */
2177     +
2178     +#endif /* ! GRUB_SHARED_HEADER */
2179     diff -Naur grub-0.95-orig/stage2/stage2.c grub-0.95/stage2/stage2.c
2180     --- grub-0.95-orig/stage2/stage2.c 2003-07-09 13:45:53.000000000 +0200
2181     +++ grub-0.95/stage2/stage2.c 2004-02-15 11:20:57.763015040 +0100
2182     @@ -233,6 +233,7 @@
2183     {
2184     int c, time1, time2 = -1, first_entry = 0;
2185     char *cur_entry = 0;
2186     + struct term_entry *prev_term = NULL;
2187    
2188     /*
2189     * Main loop for menu UI.
2190     @@ -714,6 +715,15 @@
2191    
2192     cls ();
2193     setcursor (1);
2194     + /* if our terminal needed initialization, we should shut it down
2195     + * before booting the kernel, but we want to save what it was so
2196     + * we can come back if needed */
2197     + prev_term = current_term;
2198     + if (current_term->shutdown)
2199     + {
2200     + (*current_term->shutdown)();
2201     + current_term = term_table; /* assumption: console is first */
2202     + }
2203    
2204     while (1)
2205     {
2206     @@ -748,6 +758,13 @@
2207     break;
2208     }
2209    
2210     + /* if we get back here, we should go back to what our term was before */
2211     + current_term = prev_term;
2212     + if (current_term->startup)
2213     + /* if our terminal fails to initialize, fall back to console since
2214     + * it should always work */
2215     + if ((*current_term->startup)() == 0)
2216     + current_term = term_table; /* we know that console is first */
2217     show_menu = 1;
2218     goto restart;
2219     }
2220     @@ -1049,6 +1066,10 @@
2221     while (is_preset);
2222     }
2223    
2224     + /* go ahead and make sure the terminal is setup */
2225     + if (current_term->startup)
2226     + (*current_term->startup)();
2227     +
2228     if (! num_entries)
2229     {
2230     /* If no acceptable config file, goto command-line, starting
2231     diff -Naur grub-0.95-orig/stage2/term.h grub-0.95/stage2/term.h
2232     --- grub-0.95-orig/stage2/term.h 2003-07-09 13:45:53.000000000 +0200
2233     +++ grub-0.95/stage2/term.h 2004-02-15 11:20:57.765014736 +0100
2234     @@ -60,6 +60,8 @@
2235     const char *name;
2236     /* The feature flags defined above. */
2237     unsigned long flags;
2238     + /* Default for maximum number of lines if not specified */
2239     + unsigned short max_lines;
2240     /* Put a character. */
2241     void (*putchar) (int c);
2242     /* Check if any input character is available. */
2243     @@ -79,6 +81,11 @@
2244     void (*setcolor) (int normal_color, int highlight_color);
2245     /* Turn on/off the cursor. */
2246     int (*setcursor) (int on);
2247     +
2248     + /* function to start a terminal */
2249     + int (*startup) (void);
2250     + /* function to use to shutdown a terminal */
2251     + void (*shutdown) (void);
2252     };
2253    
2254     /* This lists up available terminals. */
2255     @@ -124,4 +131,23 @@
2256     int hercules_setcursor (int on);
2257     #endif
2258    
2259     +#ifdef SUPPORT_GRAPHICS
2260     +extern int foreground, background, border, graphics_inited;
2261     +
2262     +void graphics_set_splash(char *splashfile);
2263     +int set_videomode (int mode);
2264     +void graphics_putchar (int c);
2265     +int graphics_getxy(void);
2266     +void graphics_gotoxy(int x, int y);
2267     +void graphics_cls(void);
2268     +void graphics_setcolorstate (color_state state);
2269     +void graphics_setcolor (int normal_color, int highlight_color);
2270     +void graphics_setcursor (int on);
2271     +int graphics_init(void);
2272     +void graphics_end(void);
2273     +
2274     +int hex(int v);
2275     +void graphics_set_palette(int idx, int red, int green, int blue);
2276     +#endif /* SUPPORT_GRAPHICS */
2277     +
2278     #endif /* ! GRUB_TERM_HEADER */