Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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