strip the kernel version suffix from target directories, except for brcm-2.4 (the...
[openwrt.git] / target / linux / x86 / image / grub / patches / 010-fixes-1.patch
1 Submitted By: Jim Gifford (jim at linuxfromscratch dot org)
2 Date: 2006-07-04
3 Initial Package Version: 0.97
4 Origin: Debian
5 Upstream Status: Unknown
6 Description: Contains various fixes and enhancements
7         Graphics mode support
8         Fixes for Raid Support
9         XFS Filesystem Boot Freeze Fixes
10         Removed 2GB Memory Limitation
11         Freebsd support
12         Fixes for initrd support
13         Grub installation Fixes
14         Linux 2.6 geometry Fixes
15         Intel Mac Support
16         Autoconf and aclocal updates
17
18 http://trac.cross-lfs.org/browser/trunk/patches/grub-0.97-fixes-1.patch
19
20 diff -Naur grub-0.97.orig/aclocal.m4 grub-0.97/aclocal.m4
21 --- grub-0.97.orig/aclocal.m4   2005-05-07 19:41:18.000000000 -0700
22 +++ grub-0.97/aclocal.m4        2006-07-04 00:08:22.000000000 -0700
23 @@ -1,7 +1,7 @@
24 -# generated automatically by aclocal 1.9.4 -*- Autoconf -*-
25 +# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
26  
27 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
28 -# Free Software Foundation, Inc.
29 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
30 +# 2005  Free Software Foundation, Inc.
31  # This file is free software; the Free Software Foundation
32  # gives unlimited permission to copy and/or distribute it,
33  # with or without modifications, as long as this notice is preserved.
34 @@ -11,23 +11,11 @@
35  # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
36  # PARTICULAR PURPOSE.
37  
38 -#                                                        -*- Autoconf -*-
39 -# Copyright (C) 2002, 2003  Free Software Foundation, Inc.
40 -# Generated from amversion.in; do not edit by hand.
41 -
42 -# This program is free software; you can redistribute it and/or modify
43 -# it under the terms of the GNU General Public License as published by
44 -# the Free Software Foundation; either version 2, or (at your option)
45 -# any later version.
46 -
47 -# This program is distributed in the hope that it will be useful,
48 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
49 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
50 -# GNU General Public License for more details.
51 -
52 -# You should have received a copy of the GNU General Public License
53 -# along with this program; if not, write to the Free Software
54 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
55 +# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
56 +#
57 +# This file is free software; the Free Software Foundation
58 +# gives unlimited permission to copy and/or distribute it,
59 +# with or without modifications, as long as this notice is preserved.
60  
61  # AM_AUTOMAKE_VERSION(VERSION)
62  # ----------------------------
63 @@ -40,26 +28,15 @@
64  # Call AM_AUTOMAKE_VERSION so it can be traced.
65  # This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
66  AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
67 -        [AM_AUTOMAKE_VERSION([1.9.4])])
68 -
69 -# AM_AUX_DIR_EXPAND
70 -
71 -# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
72 +        [AM_AUTOMAKE_VERSION([1.9.6])])
73  
74 -# This program is free software; you can redistribute it and/or modify
75 -# it under the terms of the GNU General Public License as published by
76 -# the Free Software Foundation; either version 2, or (at your option)
77 -# any later version.
78 +# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
79  
80 -# This program is distributed in the hope that it will be useful,
81 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
82 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
83 -# GNU General Public License for more details.
84 -
85 -# You should have received a copy of the GNU General Public License
86 -# along with this program; if not, write to the Free Software
87 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
88 -# 02111-1307, USA.
89 +# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
90 +#
91 +# This file is free software; the Free Software Foundation
92 +# gives unlimited permission to copy and/or distribute it,
93 +# with or without modifications, as long as this notice is preserved.
94  
95  # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
96  # $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
97 @@ -106,26 +83,16 @@
98  am_aux_dir=`cd $ac_aux_dir && pwd`
99  ])
100  
101 -# AM_CONDITIONAL                                              -*- Autoconf -*-
102 +# AM_CONDITIONAL                                            -*- Autoconf -*-
103  
104 -# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
105 -
106 -# This program is free software; you can redistribute it and/or modify
107 -# it under the terms of the GNU General Public License as published by
108 -# the Free Software Foundation; either version 2, or (at your option)
109 -# any later version.
110 -
111 -# This program is distributed in the hope that it will be useful,
112 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
113 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
114 -# GNU General Public License for more details.
115 -
116 -# You should have received a copy of the GNU General Public License
117 -# along with this program; if not, write to the Free Software
118 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
119 -# 02111-1307, USA.
120 +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
121 +# Free Software Foundation, Inc.
122 +#
123 +# This file is free software; the Free Software Foundation
124 +# gives unlimited permission to copy and/or distribute it,
125 +# with or without modifications, as long as this notice is preserved.
126  
127 -# serial 6
128 +# serial 7
129  
130  # AM_CONDITIONAL(NAME, SHELL-CONDITION)
131  # -------------------------------------
132 @@ -149,26 +116,15 @@
133  Usually this means the macro was only invoked conditionally.]])
134  fi])])
135  
136 -# serial 7                                             -*- Autoconf -*-
137  
138 -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
139 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
140  # Free Software Foundation, Inc.
141 +#
142 +# This file is free software; the Free Software Foundation
143 +# gives unlimited permission to copy and/or distribute it,
144 +# with or without modifications, as long as this notice is preserved.
145  
146 -# This program is free software; you can redistribute it and/or modify
147 -# it under the terms of the GNU General Public License as published by
148 -# the Free Software Foundation; either version 2, or (at your option)
149 -# any later version.
150 -
151 -# This program is distributed in the hope that it will be useful,
152 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
153 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
154 -# GNU General Public License for more details.
155 -
156 -# You should have received a copy of the GNU General Public License
157 -# along with this program; if not, write to the Free Software
158 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
159 -# 02111-1307, USA.
160 -
161 +# serial 8
162  
163  # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
164  # written in clear, in which case automake, when reading aclocal.m4,
165 @@ -177,7 +133,6 @@
166  # CC etc. in the Makefile, will ask for an AC_PROG_CC use...
167  
168  
169 -
170  # _AM_DEPENDENCIES(NAME)
171  # ----------------------
172  # See how the compiler implements dependency checking.
173 @@ -317,27 +272,16 @@
174  AC_SUBST([AMDEPBACKSLASH])
175  ])
176  
177 -# Generate code to set up dependency tracking.   -*- Autoconf -*-
178 -
179 -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
180 -#   Free Software Foundation, Inc.
181 -
182 -# This program is free software; you can redistribute it and/or modify
183 -# it under the terms of the GNU General Public License as published by
184 -# the Free Software Foundation; either version 2, or (at your option)
185 -# any later version.
186 +# Generate code to set up dependency tracking.              -*- Autoconf -*-
187  
188 -# This program is distributed in the hope that it will be useful,
189 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
190 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
191 -# GNU General Public License for more details.
192 -
193 -# You should have received a copy of the GNU General Public License
194 -# along with this program; if not, write to the Free Software
195 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
196 -# 02111-1307, USA.
197 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
198 +# Free Software Foundation, Inc.
199 +#
200 +# This file is free software; the Free Software Foundation
201 +# gives unlimited permission to copy and/or distribute it,
202 +# with or without modifications, as long as this notice is preserved.
203  
204 -#serial 2
205 +#serial 3
206  
207  # _AM_OUTPUT_DEPENDENCY_COMMANDS
208  # ------------------------------
209 @@ -396,30 +340,19 @@
210       [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
211  ])
212  
213 -# Do all the work for Automake.                            -*- Autoconf -*-
214 +# Do all the work for Automake.                             -*- Autoconf -*-
215  
216 -# This macro actually does too much some checks are only needed if
217 -# your package does certain things.  But this isn't really a big deal.
218 -
219 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
220 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
221  # Free Software Foundation, Inc.
222 +#
223 +# This file is free software; the Free Software Foundation
224 +# gives unlimited permission to copy and/or distribute it,
225 +# with or without modifications, as long as this notice is preserved.
226  
227 -# This program is free software; you can redistribute it and/or modify
228 -# it under the terms of the GNU General Public License as published by
229 -# the Free Software Foundation; either version 2, or (at your option)
230 -# any later version.
231 -
232 -# This program is distributed in the hope that it will be useful,
233 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
234 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
235 -# GNU General Public License for more details.
236 -
237 -# You should have received a copy of the GNU General Public License
238 -# along with this program; if not, write to the Free Software
239 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
240 -# 02111-1307, USA.
241 +# serial 12
242  
243 -# serial 11
244 +# This macro actually does too much.  Some checks are only needed if
245 +# your package does certain things.  But this isn't really a big deal.
246  
247  # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
248  # AM_INIT_AUTOMAKE([OPTIONS])
249 @@ -521,51 +454,27 @@
250  done
251  echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
252  
253 +# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
254 +#
255 +# This file is free software; the Free Software Foundation
256 +# gives unlimited permission to copy and/or distribute it,
257 +# with or without modifications, as long as this notice is preserved.
258 +
259  # AM_PROG_INSTALL_SH
260  # ------------------
261  # Define $install_sh.
262 -
263 -# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
264 -
265 -# This program is free software; you can redistribute it and/or modify
266 -# it under the terms of the GNU General Public License as published by
267 -# the Free Software Foundation; either version 2, or (at your option)
268 -# any later version.
269 -
270 -# This program is distributed in the hope that it will be useful,
271 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
272 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
273 -# GNU General Public License for more details.
274 -
275 -# You should have received a copy of the GNU General Public License
276 -# along with this program; if not, write to the Free Software
277 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
278 -# 02111-1307, USA.
279 -
280  AC_DEFUN([AM_PROG_INSTALL_SH],
281  [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
282  install_sh=${install_sh-"$am_aux_dir/install-sh"}
283  AC_SUBST(install_sh)])
284  
285 -#                                                          -*- Autoconf -*-
286 -# Copyright (C) 2003  Free Software Foundation, Inc.
287 -
288 -# This program is free software; you can redistribute it and/or modify
289 -# it under the terms of the GNU General Public License as published by
290 -# the Free Software Foundation; either version 2, or (at your option)
291 -# any later version.
292 -
293 -# This program is distributed in the hope that it will be useful,
294 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
295 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
296 -# GNU General Public License for more details.
297 -
298 -# You should have received a copy of the GNU General Public License
299 -# along with this program; if not, write to the Free Software
300 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
301 -# 02111-1307, USA.
302 +# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
303 +#
304 +# This file is free software; the Free Software Foundation
305 +# gives unlimited permission to copy and/or distribute it,
306 +# with or without modifications, as long as this notice is preserved.
307  
308 -# serial 1
309 +# serial 2
310  
311  # Check whether the underlying file-system supports filenames
312  # with a leading dot.  For instance MS-DOS doesn't.
313 @@ -580,28 +489,17 @@
314  rmdir .tst 2>/dev/null
315  AC_SUBST([am__leading_dot])])
316  
317 -# Add --enable-maintainer-mode option to configure.
318 +# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
319  # From Jim Meyering
320  
321 -# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004
322 +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
323  # Free Software Foundation, Inc.
324 +#
325 +# This file is free software; the Free Software Foundation
326 +# gives unlimited permission to copy and/or distribute it,
327 +# with or without modifications, as long as this notice is preserved.
328  
329 -# This program is free software; you can redistribute it and/or modify
330 -# it under the terms of the GNU General Public License as published by
331 -# the Free Software Foundation; either version 2, or (at your option)
332 -# any later version.
333 -
334 -# This program is distributed in the hope that it will be useful,
335 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
336 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
337 -# GNU General Public License for more details.
338 -
339 -# You should have received a copy of the GNU General Public License
340 -# along with this program; if not, write to the Free Software
341 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
342 -# 02111-1307, USA.
343 -
344 -# serial 3
345 +# serial 4
346  
347  AC_DEFUN([AM_MAINTAINER_MODE],
348  [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
349 @@ -620,26 +518,15 @@
350  
351  AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
352  
353 -# Check to see how 'make' treats includes.     -*- Autoconf -*-
354 -
355 -# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
356 +# Check to see how 'make' treats includes.                 -*- Autoconf -*-
357  
358 -# This program is free software; you can redistribute it and/or modify
359 -# it under the terms of the GNU General Public License as published by
360 -# the Free Software Foundation; either version 2, or (at your option)
361 -# any later version.
362 -
363 -# This program is distributed in the hope that it will be useful,
364 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
365 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
366 -# GNU General Public License for more details.
367 -
368 -# You should have received a copy of the GNU General Public License
369 -# along with this program; if not, write to the Free Software
370 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
371 -# 02111-1307, USA.
372 +# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
373 +#
374 +# This file is free software; the Free Software Foundation
375 +# gives unlimited permission to copy and/or distribute it,
376 +# with or without modifications, as long as this notice is preserved.
377  
378 -# serial 2
379 +# serial 3
380  
381  # AM_MAKE_INCLUDE()
382  # -----------------
383 @@ -683,27 +570,16 @@
384  rm -f confinc confmf
385  ])
386  
387 -#  -*- Autoconf -*-
388 -
389 -
390 -# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
391 -
392 -# This program is free software; you can redistribute it and/or modify
393 -# it under the terms of the GNU General Public License as published by
394 -# the Free Software Foundation; either version 2, or (at your option)
395 -# any later version.
396 +# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
397  
398 -# This program is distributed in the hope that it will be useful,
399 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
400 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
401 -# GNU General Public License for more details.
402 -
403 -# You should have received a copy of the GNU General Public License
404 -# along with this program; if not, write to the Free Software
405 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
406 -# 02111-1307, USA.
407 +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
408 +# Free Software Foundation, Inc.
409 +#
410 +# This file is free software; the Free Software Foundation
411 +# gives unlimited permission to copy and/or distribute it,
412 +# with or without modifications, as long as this notice is preserved.
413  
414 -# serial 3
415 +# serial 4
416  
417  # AM_MISSING_PROG(NAME, PROGRAM)
418  # ------------------------------
419 @@ -729,27 +605,16 @@
420  fi
421  ])
422  
423 +# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
424 +#
425 +# This file is free software; the Free Software Foundation
426 +# gives unlimited permission to copy and/or distribute it,
427 +# with or without modifications, as long as this notice is preserved.
428 +
429  # AM_PROG_MKDIR_P
430  # ---------------
431  # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
432 -
433 -# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
434 -
435 -# This program is free software; you can redistribute it and/or modify
436 -# it under the terms of the GNU General Public License as published by
437 -# the Free Software Foundation; either version 2, or (at your option)
438 -# any later version.
439 -
440 -# This program is distributed in the hope that it will be useful,
441 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
442 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
443 -# GNU General Public License for more details.
444 -
445 -# You should have received a copy of the GNU General Public License
446 -# along with this program; if not, write to the Free Software
447 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
448 -# 02111-1307, USA.
449 -
450 +#
451  # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
452  # created by `make install' are always world readable, even if the
453  # installer happens to have an overly restrictive umask (e.g. 077).
454 @@ -803,26 +668,15 @@
455  fi
456  AC_SUBST([mkdir_p])])
457  
458 -# Helper functions for option handling.                    -*- Autoconf -*-
459 +# Helper functions for option handling.                     -*- Autoconf -*-
460  
461 -# Copyright (C) 2001, 2002, 2003  Free Software Foundation, Inc.
462 -
463 -# This program is free software; you can redistribute it and/or modify
464 -# it under the terms of the GNU General Public License as published by
465 -# the Free Software Foundation; either version 2, or (at your option)
466 -# any later version.
467 -
468 -# This program is distributed in the hope that it will be useful,
469 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
470 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
471 -# GNU General Public License for more details.
472 -
473 -# You should have received a copy of the GNU General Public License
474 -# along with this program; if not, write to the Free Software
475 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
476 -# 02111-1307, USA.
477 +# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
478 +#
479 +# This file is free software; the Free Software Foundation
480 +# gives unlimited permission to copy and/or distribute it,
481 +# with or without modifications, as long as this notice is preserved.
482  
483 -# serial 2
484 +# serial 3
485  
486  # _AM_MANGLE_OPTION(NAME)
487  # -----------------------
488 @@ -847,28 +701,16 @@
489  AC_DEFUN([_AM_IF_OPTION],
490  [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
491  
492 -#
493 -# Check to make sure that the build environment is sane.
494 -#
495 -
496 -# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
497 -
498 -# This program is free software; you can redistribute it and/or modify
499 -# it under the terms of the GNU General Public License as published by
500 -# the Free Software Foundation; either version 2, or (at your option)
501 -# any later version.
502 +# Check to make sure that the build environment is sane.    -*- Autoconf -*-
503  
504 -# This program is distributed in the hope that it will be useful,
505 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
506 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
507 -# GNU General Public License for more details.
508 -
509 -# You should have received a copy of the GNU General Public License
510 -# along with this program; if not, write to the Free Software
511 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
512 -# 02111-1307, USA.
513 +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
514 +# Free Software Foundation, Inc.
515 +#
516 +# This file is free software; the Free Software Foundation
517 +# gives unlimited permission to copy and/or distribute it,
518 +# with or without modifications, as long as this notice is preserved.
519  
520 -# serial 3
521 +# serial 4
522  
523  # AM_SANITY_CHECK
524  # ---------------
525 @@ -911,25 +753,14 @@
526  fi
527  AC_MSG_RESULT(yes)])
528  
529 -# AM_PROG_INSTALL_STRIP
530 -
531 -# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
532 -
533 -# This program is free software; you can redistribute it and/or modify
534 -# it under the terms of the GNU General Public License as published by
535 -# the Free Software Foundation; either version 2, or (at your option)
536 -# any later version.
537 -
538 -# This program is distributed in the hope that it will be useful,
539 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
540 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
541 -# GNU General Public License for more details.
542 -
543 -# You should have received a copy of the GNU General Public License
544 -# along with this program; if not, write to the Free Software
545 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
546 -# 02111-1307, USA.
547 +# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
548 +#
549 +# This file is free software; the Free Software Foundation
550 +# gives unlimited permission to copy and/or distribute it,
551 +# with or without modifications, as long as this notice is preserved.
552  
553 +# AM_PROG_INSTALL_STRIP
554 +# ---------------------
555  # One issue with vendor `install' (even GNU) is that you can't
556  # specify the program used to strip binaries.  This is especially
557  # annoying in cross-compiling environments, where the build's strip
558 @@ -952,25 +783,13 @@
559  
560  # Check how to create a tarball.                            -*- Autoconf -*-
561  
562 -# Copyright (C) 2004  Free Software Foundation, Inc.
563 -
564 -# This program is free software; you can redistribute it and/or modify
565 -# it under the terms of the GNU General Public License as published by
566 -# the Free Software Foundation; either version 2, or (at your option)
567 -# any later version.
568 -
569 -# This program is distributed in the hope that it will be useful,
570 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
571 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
572 -# GNU General Public License for more details.
573 -
574 -# You should have received a copy of the GNU General Public License
575 -# along with this program; if not, write to the Free Software
576 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
577 -# 02111-1307, USA.
578 -
579 -# serial 1
580 +# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
581 +#
582 +# This file is free software; the Free Software Foundation
583 +# gives unlimited permission to copy and/or distribute it,
584 +# with or without modifications, as long as this notice is preserved.
585  
586 +# serial 2
587  
588  # _AM_PROG_TAR(FORMAT)
589  # --------------------
590 diff -Naur grub-0.97.orig/ChangeLog grub-0.97/ChangeLog
591 --- grub-0.97.orig/ChangeLog    2005-05-07 19:47:02.000000000 -0700
592 +++ grub-0.97/ChangeLog 2006-07-04 00:01:50.000000000 -0700
593 @@ -1,3 +1,51 @@
594 +2006-05-02  Pavel Roskin  <proski@gnu.org>
595 +
596 +       * stage2/stage2.c (run_menu): Fix "savedefault" to save only top
597 +       level menu positions.  Remember current position when calling a
598 +       submenu.  Don't recalculate it when booting from a submenu.
599 +
600 +       * grub/main.c (main): Make sure the boot drive number doesn't
601 +       exceed 255.
602 +
603 +2006-05-02  Vesa Jaaskelainen  <chaac@nic.fi>
604 +
605 +       * stage2/shared.h (vbe_mode): Back ported aligment fix from GRUB 2
606 +       to GRUB Legacy.  Problem reported by Gerardo Richarte.
607 +
608 +2006-04-23  Robert Millan  <robertmh@gnu.org>
609 +
610 +       * grub/asmstub.c (get_diskinfo): Optimize sysctl routine.
611 +
612 +2006-04-20  Robert Millan  <robertmh@gnu.org>
613 +
614 +       Fixes for kernel of FreeBSD:
615 +       * grub/asmstub.c (get_diskinfo): Toggle "kern.geom.debugflags" sysctl
616 +       before opening a device for writing.
617 +       * util/grub-install.in: Devices don't have this "r" prefix anymore.
618 +
619 +2006-04-16  Yoshinori K. Okuji  <okuji@enbug.org>
620 +
621 +       * docs/multiboot.texi: Correct the offset of address
622 +       fields. Reported by Jeroen Dekkers.
623 +
624 +2006-03-21  Yoshinori K. Okuji  <okuji@enbug.org>
625 +
626 +       * stage2/builtins.c (setup_func): Specify the size of DEVICE to
627 +       grub_strncat instead of a strange number 256. Reported by Vitaly
628 +       Fertman <vitaly@namesys.com>.
629 +
630 +2005-09-29  Yoshinori K. Okuji  <okuji@enbug.org>
631 +
632 +       * docs/multiboot.texi: Fix a bug in the byte order of
633 +       boot_device. I hope this won't affect any OS image.
634 +       Increased the version number to 0.6.94.
635 +
636 +2005-09-28  Yoshinori K. Okuji  <okuji@enbug.org>
637 +
638 +       * stage2/boot.c (load_image): Even if an OS image is an ELF
639 +       object, use the a.out kludge if MULTIBOOT_AOUT_KLUDGE is
640 +       specified.
641 +
642  2005-05-08  Yoshinori K. Okuji  <okuji@enbug.org>
643  
644         * configure.ac (AC_INIT): Upgraded to 0.97.
645 diff -Naur grub-0.97.orig/configure grub-0.97/configure
646 --- grub-0.97.orig/configure    2005-05-07 19:48:12.000000000 -0700
647 +++ grub-0.97/configure 2006-07-04 00:08:05.000000000 -0700
648 @@ -311,7 +311,7 @@
649  # include <unistd.h>
650  #endif"
651  
652 -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT PERL CC ac_ct_CC CFLAGS LDFLAGS CPPFLAGS EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CCAS RANLIB ac_ct_RANLIB STAGE1_CFLAGS STAGE2_CFLAGS GRUB_CFLAGS OBJCOPY ac_ct_OBJCOPY GRUB_LIBS CPP EGREP NETBOOT_SUPPORT_TRUE NETBOOT_SUPPORT_FALSE DISKLESS_SUPPORT_TRUE DISKLESS_SUPPORT_FALSE HERCULES_SUPPORT_TRUE HERCULES_SUPPORT_FALSE SERIAL_SUPPORT_TRUE SERIAL_SUPPORT_FALSE SERIAL_SPEED_SIMULATION_TRUE SERIAL_SPEED_SIMULATION_FALSE BUILD_EXAMPLE_KERNEL_TRUE BUILD_EXAMPLE_KERNEL_FALSE FSYS_CFLAGS NET_CFLAGS NET_EXTRAFLAGS NETBOOT_DRIVERS CCASFLAGS LIBOBJS LTLIBOBJS'
653 +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT PERL CC ac_ct_CC CFLAGS LDFLAGS CPPFLAGS EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CCAS RANLIB ac_ct_RANLIB STAGE1_CFLAGS STAGE2_CFLAGS GRUB_CFLAGS OBJCOPY ac_ct_OBJCOPY GRUB_LIBS CPP EGREP NETBOOT_SUPPORT_TRUE NETBOOT_SUPPORT_FALSE DISKLESS_SUPPORT_TRUE DISKLESS_SUPPORT_FALSE GRAPHICS_SUPPORT_TRUE GRAPHICS_SUPPORT_FALSE HERCULES_SUPPORT_TRUE HERCULES_SUPPORT_FALSE SERIAL_SUPPORT_TRUE SERIAL_SUPPORT_FALSE SERIAL_SPEED_SIMULATION_TRUE SERIAL_SPEED_SIMULATION_FALSE BUILD_EXAMPLE_KERNEL_TRUE BUILD_EXAMPLE_KERNEL_FALSE FSYS_CFLAGS NET_CFLAGS NET_EXTRAFLAGS NETBOOT_DRIVERS CCASFLAGS LIBOBJS LTLIBOBJS'
654  ac_subst_files=''
655  
656  # Initialize some variables set by options.
657 @@ -914,6 +914,7 @@
658                            set the default memory location for WD/SMC
659    --enable-cs-scan=LIST   probe for CS89x0 base address using LIST
660    --enable-diskless       enable diskless support
661 +  --disable-graphics      disable graphics terminal support
662    --disable-hercules      disable hercules terminal support
663    --disable-serial        disable serial terminal support
664    --enable-serial-speed-simulation
665 @@ -5966,6 +5967,22 @@
666  fi
667  
668  
669 +# Check whether --enable-graphics or --disable-graphics was given.
670 +if test "${enable_graphics+set}" = set; then
671 +  enableval="$enable_graphics"
672 +
673 +fi;
674 +
675 +
676 +if test "x$enable_graphics" != xno; then
677 +  GRAPHICS_SUPPORT_TRUE=
678 +  GRAPHICS_SUPPORT_FALSE='#'
679 +else
680 +  GRAPHICS_SUPPORT_TRUE='#'
681 +  GRAPHICS_SUPPORT_FALSE=
682 +fi
683 +
684 +
685  # Check whether --enable-hercules or --disable-hercules was given.
686  if test "${enable_hercules+set}" = set; then
687    enableval="$enable_hercules"
688 @@ -6270,6 +6287,13 @@
689  Usually this means the macro was only invoked conditionally." >&2;}
690     { (exit 1); exit 1; }; }
691  fi
692 +if test -z "${GRAPHICS_SUPPORT_TRUE}" && test -z "${GRAPHICS_SUPPORT_FALSE}"; then
693 +  { { echo "$as_me:$LINENO: error: conditional \"GRAPHICS_SUPPORT\" was never defined.
694 +Usually this means the macro was only invoked conditionally." >&5
695 +echo "$as_me: error: conditional \"GRAPHICS_SUPPORT\" was never defined.
696 +Usually this means the macro was only invoked conditionally." >&2;}
697 +   { (exit 1); exit 1; }; }
698 +fi
699  if test -z "${HERCULES_SUPPORT_TRUE}" && test -z "${HERCULES_SUPPORT_FALSE}"; then
700    { { echo "$as_me:$LINENO: error: conditional \"HERCULES_SUPPORT\" was never defined.
701  Usually this means the macro was only invoked conditionally." >&5
702 @@ -6907,6 +6931,8 @@
703  s,@NETBOOT_SUPPORT_FALSE@,$NETBOOT_SUPPORT_FALSE,;t t
704  s,@DISKLESS_SUPPORT_TRUE@,$DISKLESS_SUPPORT_TRUE,;t t
705  s,@DISKLESS_SUPPORT_FALSE@,$DISKLESS_SUPPORT_FALSE,;t t
706 +s,@GRAPHICS_SUPPORT_TRUE@,$GRAPHICS_SUPPORT_TRUE,;t t
707 +s,@GRAPHICS_SUPPORT_FALSE@,$GRAPHICS_SUPPORT_FALSE,;t t
708  s,@HERCULES_SUPPORT_TRUE@,$HERCULES_SUPPORT_TRUE,;t t
709  s,@HERCULES_SUPPORT_FALSE@,$HERCULES_SUPPORT_FALSE,;t t
710  s,@SERIAL_SUPPORT_TRUE@,$SERIAL_SUPPORT_TRUE,;t t
711 diff -Naur grub-0.97.orig/configure.ac grub-0.97/configure.ac
712 --- grub-0.97.orig/configure.ac 2005-05-07 19:36:03.000000000 -0700
713 +++ grub-0.97/configure.ac      2006-07-03 23:58:41.000000000 -0700
714 @@ -595,6 +595,11 @@
715    [  --enable-diskless       enable diskless support])
716  AM_CONDITIONAL(DISKLESS_SUPPORT, test "x$enable_diskless" = xyes)
717  
718 +dnl Graphical splashscreen support
719 +AC_ARG_ENABLE(graphics,
720 +  [  --disable-graphics      disable graphics terminal support])
721 +AM_CONDITIONAL(GRAPHICS_SUPPORT, test "x$enable_graphics" != xno)
722 +
723  dnl Hercules terminal
724  AC_ARG_ENABLE(hercules,
725    [  --disable-hercules      disable hercules terminal support])
726 diff -Naur grub-0.97.orig/docs/grub.8 grub-0.97/docs/grub.8
727 --- grub-0.97.orig/docs/grub.8  2005-05-07 19:48:56.000000000 -0700
728 +++ grub-0.97/docs/grub.8       2006-07-04 00:01:50.000000000 -0700
729 @@ -1,5 +1,5 @@
730  .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.23.
731 -.TH GRUB "8" "May 2005" "grub (GNU GRUB 0.97)" FSF
732 +.TH GRUB "8" "September 2005" "grub (GNU GRUB 0.97)" FSF
733  .SH NAME
734  grub \- the grub shell
735  .SH SYNOPSIS
736 diff -Naur grub-0.97.orig/docs/grub.texi grub-0.97/docs/grub.texi
737 --- grub-0.97.orig/docs/grub.texi       2005-05-07 19:59:59.000000000 -0700
738 +++ grub-0.97/docs/grub.texi    2006-07-04 00:00:54.000000000 -0700
739 @@ -2199,6 +2199,7 @@
740  * rarp::                        Initialize a network device via RARP
741  * serial::                      Set up a serial device
742  * setkey::                      Configure the key map
743 +* splashimage::                 Use a splash image
744  * terminal::                    Choose a terminal
745  * terminfo::                    Define escape sequences for a terminal
746  * tftpserver::                  Specify a TFTP server
747 @@ -2578,6 +2579,16 @@
748  @end deffn
749  
750  
751 +@node splashimage
752 +@subsection splashimage
753 +
754 +@deffn Command splashimage file
755 +Select an image to use as the background image.  This should be
756 +specified using normal GRUB device naming syntax.  The format of the
757 +file is a gzipped xpm which is 640x480 with a 14 color palette.
758 +@end deffn
759 +
760 +
761  @node terminal
762  @subsection terminal
763  
764 @@ -2685,6 +2696,7 @@
765  * module::                      Load a module
766  * modulenounzip::               Load a module without decompression
767  * pause::                       Wait for a key press
768 +* print::                       Print a message
769  * quit::                        Exit from the grub shell
770  * reboot::                      Reboot your computer
771  * read::                        Read data from memory
772 @@ -3091,6 +3103,16 @@
773  @end deffn
774  
775  
776 +@node print
777 +@subsection print
778 +
779 +@deffn Command print message @dots{}
780 +Print the @var{message}. Note that placing @key{^G} (ASCII code 7) in the
781 +message will cause the speaker to emit the standard beep sound, which is
782 +useful for visually impaired people.
783 +@end deffn
784 +
785 +
786  @node quit
787  @subsection quit
788  
789 diff -Naur grub-0.97.orig/docs/multiboot.texi grub-0.97/docs/multiboot.texi
790 --- grub-0.97.orig/docs/multiboot.texi  2003-07-09 04:45:36.000000000 -0700
791 +++ grub-0.97/docs/multiboot.texi       2006-07-04 00:01:50.000000000 -0700
792 @@ -25,7 +25,7 @@
793  @ifinfo
794  Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu>
795  Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org>
796 -Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
797 +Copyright @copyright{} 1999, 2000, 2001, 2002, 2005, 2006 Free Software Foundation, Inc.
798  
799  Permission is granted to make and distribute verbatim copies of
800  this manual provided the copyright notice and this permission notice
801 @@ -57,7 +57,7 @@
802  @vskip 0pt plus 1filll
803  Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu>
804  Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org>
805 -Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
806 +Copyright @copyright{} 1999, 2000, 2001, 2002, 2005, 2006 Free Software Foundation, Inc.
807  
808  Permission is granted to make and distribute verbatim copies of
809  this manual provided the copyright notice and this permission notice
810 @@ -80,7 +80,7 @@
811  @top Multiboot Specification
812  
813  This file documents Multiboot Specification, the proposal for the boot
814 -sequence standard. This edition documents version 0.6.93.
815 +sequence standard. This edition documents version 0.6.94.
816  @end ifnottex
817  
818  @menu
819 @@ -426,7 +426,7 @@
820  kernel.
821  
822  If bit 16 in the @samp{flags} word is set, then the fields at offsets
823 -8-24 in the Multiboot header are valid, and the boot loader should use
824 +12-28 in the Multiboot header are valid, and the boot loader should use
825  them instead of the fields in the actual executable header to calculate
826  where to load the OS image. This information does not need to be
827  provided if the kernel image is in @sc{elf} format, but it @emph{must}
828 @@ -677,7 +677,7 @@
829  @example
830  @group
831  +-------+-------+-------+-------+
832 -| drive | part1 | part2 | part3 |
833 +| part3 | part2 | part1 | drive |
834  +-------+-------+-------+-------+
835  @end group
836  @end example
837 @@ -1199,6 +1199,13 @@
838  @email{bug-grub@@gnu.org}, from Bryan Ford and Erich Stefan Boleyn.
839  @end itemize
840  
841 +@item
842 +The byte order of the @samp{boot_device} in Multiboot information is
843 +reversed. This was a mistake.
844 +
845 +@item
846 +The offset of the address fields were wrong.
847 +
848  @item 0.6
849  @itemize @bullet
850  @item
851 diff -Naur grub-0.97.orig/grub/asmstub.c grub-0.97/grub/asmstub.c
852 --- grub-0.97.orig/grub/asmstub.c       2005-02-16 12:45:14.000000000 -0800
853 +++ grub-0.97/grub/asmstub.c    2006-07-04 00:01:50.000000000 -0700
854 @@ -42,6 +42,12 @@
855  #include <sys/time.h>
856  #include <termios.h>
857  #include <signal.h>
858 +#include <sys/mman.h>
859 +
860 +#include <limits.h>
861 +#ifndef PAGESIZE
862 +#define PAGESIZE 4096
863 +#endif
864  
865  #ifdef __linux__
866  # include <sys/ioctl.h>                /* ioctl */
867 @@ -55,6 +61,10 @@
868  # endif /* ! BLKFLSBUF */
869  #endif /* __linux__ */
870  
871 +#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
872 +# include <sys/sysctl.h>
873 +#endif
874 +
875  /* We want to prevent any circularararity in our stubs, as well as
876     libc name clashes. */
877  #define WITHOUT_LIBC_STUBS 1
878 @@ -144,6 +154,22 @@
879    assert (grub_scratch_mem == 0);
880    scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15);
881    assert (scratch);
882 +
883 +  {
884 +    char *p;
885 +    int ret;
886 +
887 +    /* Align to a multiple of PAGESIZE, assumed to be a power of two. */
888 +    p = (char *) (((long) scratch) & ~(PAGESIZE - 1));
889 +
890 +    /* The simulated stack needs to be executable, since GCC uses stack
891 +     * trampolines to implement nested functions.
892 +     */
893 +    ret = mprotect (p, 0x100000 + EXTENDED_MEMSIZE + 15,
894 +                   PROT_READ | PROT_WRITE | PROT_EXEC);
895 +    assert (ret == 0);
896 +  }
897 +
898    grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4);
899  
900    /* FIXME: simulate the memory holes using mprot, if available. */
901 @@ -777,7 +803,39 @@
902  
903        /* Open read/write, or read-only if that failed. */
904        if (! read_only)
905 -       disks[drive].flags = open (devname, O_RDWR);
906 +       {
907 +/* By default, kernel of FreeBSD does not allow overwriting MBR */
908 +#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
909 +#define GEOM_SYSCTL    "kern.geom.debugflags"
910 +         int old_flags, flags;
911 +         size_t sizeof_int = sizeof (int);
912 +
913 +         if (sysctlbyname (GEOM_SYSCTL, &old_flags, &sizeof_int, NULL, 0) != 0)
914 +           grub_printf ("failed to get " GEOM_SYSCTL "sysctl: %s\n", strerror (errno));
915 +
916 +         if ((old_flags & 0x10) == 0)
917 +           {
918 +             /* "allow foot shooting", see geom(4) */
919 +             flags = old_flags | 0x10;
920 +
921 +             if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &flags, sizeof (int)) != 0)
922 +               {
923 +                 flags = old_flags;
924 +                 grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n", strerror (errno));
925 +               }
926 +           }
927 +         else
928 +           flags = old_flags;
929 +#endif
930 +         disks[drive].flags = open (devname, O_RDWR);
931 +#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
932 +         if (flags != old_flags)
933 +           {
934 +             if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &old_flags, sizeof (int)) != 0)
935 +               grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n", strerror (errno));
936 +           }
937 +#endif
938 +       }
939  
940        if (disks[drive].flags == -1)
941         {
942 diff -Naur grub-0.97.orig/grub/main.c grub-0.97/grub/main.c
943 --- grub-0.97.orig/grub/main.c  2003-07-09 04:45:36.000000000 -0700
944 +++ grub-0.97/grub/main.c       2006-07-04 00:01:50.000000000 -0700
945 @@ -32,6 +32,7 @@
946  #define WITHOUT_LIBC_STUBS 1
947  #include <shared.h>
948  #include <term.h>
949 +#include <device.h>
950  
951  char *program_name = 0;
952  int use_config_file = 1;
953 @@ -192,6 +193,12 @@
954               perror ("strtoul");
955               exit (1);
956             }
957 +         if (boot_drive >= NUM_DISKS)
958 +           {
959 +             fprintf (stderr, "boot_drive should be from 0 to %d\n",
960 +                      NUM_DISKS - 1);
961 +             exit (1);
962 +           }
963           break;
964  
965         case OPT_NO_CONFIG_FILE:
966 diff -Naur grub-0.97.orig/lib/device.c grub-0.97/lib/device.c
967 --- grub-0.97.orig/lib/device.c 2005-03-27 15:14:25.000000000 -0800
968 +++ grub-0.97/lib/device.c      2006-07-04 00:00:44.000000000 -0700
969 @@ -131,6 +131,152 @@
970  #include <shared.h>
971  #include <device.h>
972  
973 +#if defined(__linux__)
974 +/* The 2.6 kernel has removed all of the geometry handling for IDE drives
975 + * that did fixups for LBA, etc.  This means that the geometry we get
976 + * with the ioctl has a good chance of being wrong.  So, we get to 
977 + * also know about partition tables and try to read what the geometry
978 + * is there. *grumble*   Very closely based on code from cfdisk
979 + */
980 +static void get_kernel_geometry(int fd, long long *cyl, int *heads, int *sectors) {
981 +    struct hd_geometry hdg;
982 +    
983 +    if (ioctl (fd, HDIO_GETGEO, &hdg))
984 +        return;
985 +
986 +    *cyl = hdg.cylinders;
987 +    *heads = hdg.heads;
988 +    *sectors = hdg.sectors;
989 +}
990 +
991 +struct partition {
992 +        unsigned char boot_ind;         /* 0x80 - active */
993 +        unsigned char head;             /* starting head */
994 +        unsigned char sector;           /* starting sector */
995 +        unsigned char cyl;              /* starting cylinder */
996 +        unsigned char sys_ind;          /* What partition type */
997 +        unsigned char end_head;         /* end head */
998 +        unsigned char end_sector;       /* end sector */
999 +        unsigned char end_cyl;          /* end cylinder */
1000 +        unsigned char start4[4];        /* starting sector counting from 0 */
1001 +        unsigned char size4[4];         /* nr of sectors in partition */
1002 +};
1003 +
1004 +#define ALIGNMENT 2
1005 +typedef union {
1006 +    struct {
1007 +       unsigned char align[ALIGNMENT];
1008 +       unsigned char b[SECTOR_SIZE];
1009 +    } c;
1010 +    struct {
1011 +       unsigned char align[ALIGNMENT];
1012 +       unsigned char buffer[0x1BE];
1013 +       struct partition part[4];
1014 +       unsigned char magicflag[2];
1015 +    } p;
1016 +} partition_table;
1017 +
1018 +#define PART_TABLE_FLAG0 0x55
1019 +#define PART_TABLE_FLAG1 0xAA
1020 +
1021 +static void
1022 +get_partition_table_geometry(partition_table *bufp, long long *cyl, int *heads, 
1023 +                             int *sectors) {
1024 +    struct partition *p;
1025 +    int i,h,s,hh,ss;
1026 +    int first = 1;
1027 +    int bad = 0;
1028 +
1029 +    if (bufp->p.magicflag[0] != PART_TABLE_FLAG0 ||
1030 +       bufp->p.magicflag[1] != PART_TABLE_FLAG1) {
1031 +           /* Matthew Wilcox: slightly friendlier version of
1032 +              fatal(_("Bad signature on partition table"), 3);
1033 +           */
1034 +            fprintf(stderr, "Unknown partition table signature\n");
1035 +           return;
1036 +    }
1037 +
1038 +    hh = ss = 0;
1039 +    for (i=0; i<4; i++) {
1040 +       p = &(bufp->p.part[i]);
1041 +       if (p->sys_ind != 0) {
1042 +           h = p->end_head + 1;
1043 +           s = (p->end_sector & 077);
1044 +           if (first) {
1045 +               hh = h;
1046 +               ss = s;
1047 +               first = 0;
1048 +           } else if (hh != h || ss != s)
1049 +               bad = 1;
1050 +       }
1051 +    }
1052 +
1053 +    if (!first && !bad) {
1054 +       *heads = hh;
1055 +       *sectors = ss;
1056 +    }
1057 +}
1058 +
1059 +static long long my_lseek (unsigned int fd, long long offset, 
1060 +                           unsigned int origin)
1061 +{
1062 +#if defined(__linux__) && (!defined(__GLIBC__) || \
1063 +        ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1))))
1064 +  /* Maybe libc doesn't have large file support.  */
1065 +  loff_t offset, result;
1066 +  static int _llseek (uint filedes, ulong hi, ulong lo,
1067 +                      loff_t *res, uint wh);
1068 +  _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo,
1069 +             loff_t *, res, uint, wh);
1070 +  
1071 +  if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET) < 0)
1072 +    return (long long) -1;
1073 +  return result;
1074 +#else
1075 +  return lseek(fd, offset, SEEK_SET);
1076 +#endif
1077 +}
1078 +
1079 +static void get_linux_geometry (int fd, struct geometry *geom) {
1080 +    long long kern_cyl = 0; int kern_head = 0, kern_sectors = 0;
1081 +    long long pt_cyl = 0; int pt_head = 0, pt_sectors = 0;
1082 +    partition_table bufp;
1083 +    char *buff, *buf_unaligned;
1084 +
1085 +    buf_unaligned = malloc(sizeof(partition_table) + 4095);
1086 +    buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) &
1087 +                     (~(4096-1)));
1088 +
1089 +    get_kernel_geometry(fd, &kern_cyl, &kern_head, &kern_sectors);
1090 +
1091 +    if (my_lseek (fd, 0*SECTOR_SIZE, SEEK_SET) < 0) {
1092 +        fprintf(stderr, "Unable to seek");
1093 +    }
1094 +
1095 +    if (read(fd, buff, SECTOR_SIZE) == SECTOR_SIZE) {
1096 +        memcpy(bufp.c.b, buff, SECTOR_SIZE);
1097 +        get_partition_table_geometry(&bufp, &pt_cyl, &pt_head, &pt_sectors);
1098 +    } else {
1099 +        fprintf(stderr, "Unable to read partition table: %s\n", strerror(errno));
1100 +    }
1101 +
1102 +    if (pt_head && pt_sectors) {
1103 +        int cyl_size;
1104 +
1105 +        geom->heads = pt_head;
1106 +        geom->sectors = pt_sectors;
1107 +        cyl_size = pt_head * pt_sectors;
1108 +        geom->cylinders = geom->total_sectors/cyl_size;
1109 +    } else {
1110 +        geom->heads = kern_head;
1111 +        geom->sectors = kern_sectors;
1112 +        geom->cylinders = kern_cyl;
1113 +    }
1114 +
1115 +    return;
1116 +}
1117 +#endif
1118 +
1119  /* Get the geometry of a drive DRIVE.  */
1120  void
1121  get_drive_geometry (struct geometry *geom, char **map, int drive)
1122 @@ -151,21 +297,16 @@
1123  #if defined(__linux__)
1124    /* Linux */
1125    {
1126 -    struct hd_geometry hdg;
1127      unsigned long nr;
1128 -    
1129 -    if (ioctl (fd, HDIO_GETGEO, &hdg))
1130 -      goto fail;
1131  
1132      if (ioctl (fd, BLKGETSIZE, &nr))
1133        goto fail;
1134      
1135      /* Got the geometry, so save it. */
1136 -    geom->cylinders = hdg.cylinders;
1137 -    geom->heads = hdg.heads;
1138 -    geom->sectors = hdg.sectors;
1139      geom->total_sectors = nr;
1140 -    
1141 +    get_linux_geometry(fd, geom);
1142 +    if (!geom->heads && !geom->cylinders && !geom->sectors)
1143 +        goto fail;
1144      goto success;
1145    }
1146  
1147 @@ -403,6 +544,18 @@
1148  }
1149  
1150  static void
1151 +get_cciss_disk_name (char *name, int controller, int drive)
1152 +{
1153 +  sprintf (name, "/dev/cciss/c%dd%d", controller, drive);
1154 +}
1155 +
1156 +static void
1157 +get_ida_disk_name (char *name, int controller, int drive)
1158 +{
1159 +  sprintf (name, "/dev/ida/c%dd%d", controller, drive);
1160 +}
1161 +
1162 +static void
1163  get_ataraid_disk_name (char *name, int unit)
1164  {
1165    sprintf (name, "/dev/ataraid/d%c", unit + '0');
1166 @@ -801,6 +954,74 @@
1167           }
1168        }
1169    }
1170 +
1171 +  /* This is for CCISS, its like the DAC960  - we have
1172 +     /dev/cciss/<controller>d<logical drive>p<partition> 
1173 +
1174 +     It currently supports up to 3 controllers, 10 logical volumes
1175 +     and 10 partitions
1176 +
1177 +     Code gratuitously copied from DAC960 above.
1178 +     Horms <horms@verge.net.au> 23rd July 2004
1179 +  */
1180 +  {
1181 +    int controller, drive;
1182 +    
1183 +    for (controller = 0; controller < 2; controller++)
1184 +      {
1185 +       for (drive = 0; drive < 9; drive++)
1186 +         {
1187 +           char name[24];
1188 +           
1189 +           get_cciss_disk_name (name, controller, drive);
1190 +           if (check_device (name))
1191 +             {
1192 +               (*map)[num_hd + 0x80] = strdup (name);
1193 +               assert ((*map)[num_hd + 0x80]);
1194 +               
1195 +               /* If the device map file is opened, write the map.  */
1196 +               if (fp)
1197 +                 fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
1198 +               
1199 +               num_hd++;
1200 +             }
1201 +         }
1202 +      }
1203 +  }
1204 +
1205 +  /* This is for Compaq Smart Array, its like the DAC960  - we have
1206 +     /dev/ida/<controller>d<logical drive>p<partition> 
1207 +
1208 +     It currently supports up to 3 controllers, 10 logical volumes
1209 +     and 15 partitions
1210 +
1211 +     Code gratuitously copied from DAC960 above.
1212 +     Piotr Roszatycki <dexter@debian.org>
1213 +  */
1214 +  {
1215 +    int controller, drive;
1216 +    
1217 +    for (controller = 0; controller < 2; controller++)
1218 +      {
1219 +       for (drive = 0; drive < 9; drive++)
1220 +         {
1221 +           char name[24];
1222 +           
1223 +           get_ida_disk_name (name, controller, drive);
1224 +           if (check_device (name))
1225 +             {
1226 +               (*map)[num_hd + 0x80] = strdup (name);
1227 +               assert ((*map)[num_hd + 0x80]);
1228 +               
1229 +               /* If the device map file is opened, write the map.  */
1230 +               if (fp)
1231 +                 fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
1232 +               
1233 +               num_hd++;
1234 +             }
1235 +         }
1236 +      }
1237 +  }
1238  #endif /* __linux__ */
1239    
1240    /* OK, close the device map file if opened.  */
1241 @@ -844,6 +1065,7 @@
1242  {
1243    char dev[PATH_MAX];  /* XXX */
1244    int fd;
1245 +  off_t offset = (off_t) sector * (off_t) SECTOR_SIZE;
1246    
1247    if ((partition & 0x00FF00) != 0x00FF00)
1248      {
1249 @@ -861,8 +1083,14 @@
1250        if (strcmp (dev + strlen(dev) - 5, "/disc") == 0)
1251         strcpy (dev + strlen(dev) - 5, "/part");
1252      }
1253 -  sprintf (dev + strlen(dev), "%d", ((partition >> 16) & 0xFF) + 1);
1254 -  
1255 +  sprintf (dev + strlen(dev), "%s%d", 
1256 +   /* Compaq smart and others */
1257 +   (strncmp(dev, "/dev/ida/", 9) == 0 ||
1258 +   strncmp(dev, "/dev/ataraid/", 13) == 0 ||
1259 +   strncmp(dev, "/dev/cciss/", 11) == 0 ||
1260 +   strncmp(dev, "/dev/rd/", 8) == 0) ? "p" : "",
1261 +   ((partition >> 16) & 0xFF) + 1);
1262 +
1263    /* Open the partition.  */
1264    fd = open (dev, O_RDWR);
1265    if (fd < 0)
1266 @@ -870,35 +1098,13 @@
1267        errnum = ERR_NO_PART;
1268        return 0;
1269      }
1270 -  
1271 -#if defined(__linux__) && (!defined(__GLIBC__) || \
1272 -        ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1))))
1273 -  /* Maybe libc doesn't have large file support.  */
1274 -  {
1275 -    loff_t offset, result;
1276 -    static int _llseek (uint filedes, ulong hi, ulong lo,
1277 -                        loff_t *res, uint wh);
1278 -    _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo,
1279 -               loff_t *, res, uint, wh);
1280  
1281 -    offset = (loff_t) sector * (loff_t) SECTOR_SIZE;
1282 -    if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET))
1283 -      {
1284 -       errnum = ERR_DEV_VALUES;
1285 -       return 0;
1286 -      }
1287 -  }
1288 -#else
1289 -  {
1290 -    off_t offset = (off_t) sector * (off_t) SECTOR_SIZE;
1291  
1292 -    if (lseek (fd, offset, SEEK_SET) != offset)
1293 -      {
1294 -       errnum = ERR_DEV_VALUES;
1295 -       return 0;
1296 -      }
1297 -  }
1298 -#endif
1299 +  if (my_lseek(fd, offset, SEEK_SET) != offset)
1300 +    {
1301 +      errnum = ERR_DEV_VALUES;
1302 +      return 0;
1303 +    }
1304    
1305    if (write (fd, buf, size * SECTOR_SIZE) != (size * SECTOR_SIZE))
1306      {
1307 diff -Naur grub-0.97.orig/stage2/asm.S grub-0.97/stage2/asm.S
1308 --- grub-0.97.orig/stage2/asm.S 2004-06-19 09:55:22.000000000 -0700
1309 +++ grub-0.97/stage2/asm.S      2006-07-04 00:01:19.000000000 -0700
1310 @@ -1651,7 +1651,29 @@
1311         jnz     3f
1312         ret
1313  
1314 -3:     /* use keyboard controller */
1315 +3:     /*
1316 +        * try to switch gateA20 using PORT92, the "Fast A20 and Init"
1317 +        * register
1318 +       */
1319 +       mov $0x92, %dx
1320 +       inb %dx, %al
1321 +       /* skip the port92 code if it's unimplemented (read returns 0xff) */
1322 +       cmpb $0xff, %al
1323 +       jz 6f
1324 +       
1325 +       /* set or clear bit1, the ALT_A20_GATE bit */
1326 +       movb 4(%esp), %ah
1327 +       testb %ah, %ah
1328 +       jz 4f
1329 +       orb $2, %al
1330 +       jmp 5f
1331 +4:     and $0xfd, %al
1332 +       
1333 +       /* clear the INIT_NOW bit don't accidently reset the machine */
1334 +5:     and $0xfe, %al
1335 +       outb %al, %dx
1336 +       
1337 +6:     /* use keyboard controller */
1338         pushl   %eax
1339  
1340         call    gloop1
1341 @@ -1661,9 +1683,12 @@
1342  
1343  gloopint1:
1344         inb     $K_STATUS
1345 +       cmpb    $0xff, %al
1346 +       jz      gloopint1_done
1347         andb    $K_IBUF_FUL, %al
1348         jnz     gloopint1
1349  
1350 +gloopint1_done:        
1351         movb    $KB_OUTPUT_MASK, %al
1352         cmpb    $0, 0x8(%esp)
1353         jz      gdoit
1354 @@ -1684,6 +1709,8 @@
1355  
1356  gloop1:
1357         inb     $K_STATUS
1358 +       cmpb    $0xff, %al
1359 +       jz      gloop2ret
1360         andb    $K_IBUF_FUL, %al
1361         jnz     gloop1
1362  
1363 @@ -1991,6 +2018,11 @@
1364  ENTRY(console_getkey)
1365         push    %ebp
1366  
1367 +wait_for_key:
1368 +       call    EXT_C(console_checkkey)
1369 +       incl    %eax
1370 +       jz      wait_for_key
1371 +       
1372         call    EXT_C(prot_to_real)
1373         .code16
1374  
1375 @@ -2216,7 +2248,304 @@
1376         pop     %ebx
1377         pop     %ebp
1378         ret
1379 -               
1380 +
1381 +
1382 +/* graphics mode functions */
1383 +#ifdef SUPPORT_GRAPHICS
1384 +VARIABLE(cursorX)
1385 +.word  0
1386 +VARIABLE(cursorY)
1387 +.word  0
1388 +VARIABLE(cursorCount)
1389 +.word 0
1390 +VARIABLE(cursorBuf)
1391 +.byte  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1392 +
1393 +
1394 +/*
1395 + * set_int1c_handler(void)
1396 + */
1397 +ENTRY(set_int1c_handler)
1398 +       pushl   %edi
1399 +
1400 +       /* save the original int1c handler */
1401 +       movl    $0x70, %edi
1402 +       movw    (%edi), %ax
1403 +       movw    %ax, ABS(int1c_offset)
1404 +       movw    2(%edi), %ax
1405 +       movw    %ax, ABS(int1c_segment)
1406 +
1407 +       /* save the new int1c handler */
1408 +       movw    $ABS(int1c_handler), %ax
1409 +       movw    %ax, (%edi)
1410 +       xorw    %ax, %ax
1411 +       movw    %ax, 2(%edi)
1412 +
1413 +       popl    %edi
1414 +       ret
1415 +
1416 +
1417 +/*
1418 + * unset_int1c_handler(void)
1419 + */
1420 +ENTRY(unset_int1c_handler)
1421 +       pushl   %edi
1422 +
1423 +       /* check if int1c_handler is set */
1424 +       movl    $0x70, %edi
1425 +       movw    $ABS(int1c_handler), %ax
1426 +       cmpw    %ax, (%edi)
1427 +       jne     int1c_1
1428 +       xorw    %ax, %ax
1429 +       cmpw    %ax, 2(%edi)
1430 +       jne     int1c_1
1431 +
1432 +       /* restore the original */
1433 +       movw    ABS(int1c_offset), %ax
1434 +       movw    %ax, (%edi)
1435 +       movw    ABS(int1c_segment), %ax
1436 +       movw    %ax, 2(%edi)
1437 +
1438 +int1c_1:
1439 +       popl    %edi
1440 +       ret
1441 +
1442 +
1443 +/*
1444 + * blinks graphics cursor
1445 + */
1446 +       .code16
1447 +write_data:
1448 +       movw    $0, %ax
1449 +       movw    %ax, %ds
1450 +
1451 +       mov     $0xA000, %ax            /* video in es:di */
1452 +       mov     %ax, %es
1453 +       mov     $80, %ax
1454 +       movw    $ABS(cursorY), %si
1455 +       mov     %ds:(%si), %bx
1456 +       mul     %bx
1457 +       movw    $ABS(cursorX), %si
1458 +       mov     %ds:(%si), %bx
1459 +       shr     $3, %bx                 /* %bx /= 8 */
1460 +       add     %bx, %ax
1461 +       mov     %ax, %di
1462 +
1463 +       movw    $ABS(cursorBuf), %si    /* fontBuf in ds:si */
1464 +
1465 +       /* prepare for data moving */
1466 +       mov     $16, %dx                /* altura da fonte */
1467 +       mov     $80, %bx                /* bytes por linha */
1468 +
1469 +write_loop:
1470 +       movb    %ds:(%si), %al
1471 +       xorb    $0xff, %al
1472 +       movb    %al, %ds:(%si)          /* invert cursorBuf */
1473 +       movb    %al, %es:(%di)          /* write to video */
1474 +       add     %bx, %di
1475 +       inc     %si
1476 +       dec     %dx
1477 +       jg      write_loop
1478 +       ret
1479 +
1480 +int1c_handler:
1481 +       pusha
1482 +       mov     $0, %ax
1483 +       mov     %ax, %ds
1484 +       mov     $ABS(cursorCount), %si
1485 +       mov     %ds:(%si), %ax
1486 +       inc     %ax
1487 +       mov     %ax, %ds:(%si)
1488 +       cmp     $9, %ax
1489 +       jne     int1c_done
1490 +
1491 +       mov     $0, %ax
1492 +       mov     %ax, %ds:(%si)
1493 +       call    write_data
1494 +
1495 +int1c_done:
1496 +       popa
1497 +       iret
1498 +       /* call previous int1c handler */
1499 +       /* ljmp */
1500 +       .byte   0xea
1501 +int1c_offset:  .word   0
1502 +int1c_segment: .word   0
1503 +       .code32
1504 +
1505 +
1506 +/*
1507 + * unsigned char set_videomode(unsigned char mode)
1508 + * BIOS call "INT 10H Function 0h" to set video mode
1509 + *     Call with       %ah = 0x0
1510 + *                     %al = video mode
1511 + *  Returns old videomode.
1512 + */
1513 +ENTRY(set_videomode)
1514 +       pushl   %ebp
1515 +       movl    %esp,%ebp
1516 +       pushl   %ebx
1517 +       pushl   %ecx
1518 +
1519 +       movb    8(%ebp), %cl
1520 +
1521 +       call    EXT_C(prot_to_real)
1522 +       .code16
1523 +
1524 +       xorb    %al, %al
1525 +       movb    $0xf, %ah
1526 +       int     $0x10                   /* Get Current Video mode */
1527 +       movb    %al, %ch
1528 +       xorb    %ah, %ah
1529 +       movb    %cl, %al
1530 +       int     $0x10                   /* Set Video mode */
1531 +
1532 +       DATA32  call    EXT_C(real_to_prot)
1533 +       .code32
1534 +
1535 +       xorl    %eax, %eax
1536 +       movb    %ch, %al
1537 +
1538 +       popl    %ecx
1539 +       popl    %ebx
1540 +       popl    %ebp
1541 +       ret
1542 +
1543 +
1544 +/*
1545 + * int get_videomode()
1546 + * BIOS call "INT 10H Function 0Fh" to get current video mode
1547 + *     Call with       %al = 0x0
1548 + *                     %ah = 0xF
1549 + *     Returns current videomode.
1550 + */
1551 +ENTRY(get_videomode)
1552 +       pushl   %ebp
1553 +       movl    %esp,%ebp
1554 +       pushl   %ebx
1555 +       pushl   %ecx
1556 +
1557 +       call    EXT_C(prot_to_real)
1558 +       .code16
1559 +
1560 +       xorb    %al, %al
1561 +       movb    $0xF, %ah
1562 +       int     $0x10                   /* Get Current Video mode */
1563 +       movb    %al, %cl        /* For now we only want display mode */
1564 +
1565 +       DATA32  call    EXT_C(real_to_prot)
1566 +       .code32
1567 +
1568 +       xorl    %eax, %eax
1569 +       movb    %cl, %al
1570 +
1571 +       popl    %ecx
1572 +       popl    %ebx
1573 +       popl    %ebp
1574 +       ret
1575 +
1576 +
1577 +/*
1578 + * unsigned char * graphics_get_font()
1579 + * BIOS call "INT 10H Function 11h" to set font
1580 + *      Call with       %ah = 0x11
1581 + */
1582 +ENTRY(graphics_get_font)
1583 +       push    %ebp
1584 +       push    %ebx
1585 +       push    %ecx
1586 +       push    %edx
1587 +
1588 +       call    EXT_C(prot_to_real)
1589 +       .code16
1590 +
1591 +       movw    $0x1130, %ax
1592 +       movb    $6, %bh         /* font 8x16 */
1593 +       int     $0x10
1594 +       movw    %bp, %dx
1595 +       movw    %es, %cx
1596 +
1597 +       DATA32  call    EXT_C(real_to_prot)
1598 +       .code32
1599 +
1600 +       xorl    %eax, %eax
1601 +       movw    %cx, %ax
1602 +       shll    $4, %eax
1603 +       movw    %dx, %ax
1604 +
1605 +       pop     %edx
1606 +       pop     %ecx
1607 +       pop     %ebx
1608 +       pop     %ebp
1609 +       ret
1610 +
1611 +
1612 +/*
1613 + * graphics_set_palette(index, red, green, blue)
1614 + * BIOS call "INT 10H Function 10h" to set individual dac register
1615 + *     Call with       %ah = 0x10
1616 + *                     %bx = register number
1617 + *                     %ch = new value for green (0-63)
1618 + *                     %cl = new value for blue (0-63)
1619 + *                     %dh = new value for red (0-63)
1620 + */
1621 +
1622 +ENTRY(graphics_set_palette)
1623 +       push    %ebp
1624 +       push    %eax
1625 +       push    %ebx
1626 +       push    %ecx
1627 +       push    %edx
1628 +
1629 +       movw    $0x3c8, %bx             /* address write mode register */
1630 +
1631 +       /* wait vertical retrace */
1632 +       movw    $0x3da, %dx
1633 +l1b:
1634 +       inb     %dx, %al        /* wait vertical active display */
1635 +       test    $8, %al
1636 +       jnz     l1b
1637 +
1638 +l2b:
1639 +       inb     %dx, %al        /* wait vertical retrace */
1640 +       test    $8, %al
1641 +       jnz     l2b
1642 +
1643 +       mov     %bx, %dx
1644 +       movb    0x18(%esp), %al         /* index */
1645 +       outb    %al, %dx
1646 +       inc     %dx
1647 +
1648 +       movb    0x1c(%esp), %al         /* red */
1649 +       outb    %al, %dx
1650 +
1651 +       movb    0x20(%esp), %al         /* green */
1652 +       outb    %al, %dx
1653 +
1654 +       movb    0x24(%esp), %al         /* blue */
1655 +       outb    %al, %dx
1656 +
1657 +       movw    0x18(%esp), %bx
1658 +
1659 +       call    EXT_C(prot_to_real)
1660 +       .code16
1661 +
1662 +       movb    %bl, %bh
1663 +       movw    $0x1000, %ax
1664 +       int     $0x10
1665 +
1666 +       DATA32  call    EXT_C(real_to_prot)
1667 +       .code32
1668 +
1669 +       pop     %edx
1670 +       pop     %ecx
1671 +       pop     %ebx
1672 +       pop     %eax
1673 +       pop     %ebp
1674 +       ret
1675 +#endif /* SUPPORT_GRAPHICS */
1676 +
1677 +
1678  /*
1679   * getrtsecs()
1680   *     if a seconds value can be read, read it and return it (BCD),
1681 diff -Naur grub-0.97.orig/stage2/boot.c grub-0.97/stage2/boot.c
1682 --- grub-0.97.orig/stage2/boot.c        2004-03-30 03:44:08.000000000 -0800
1683 +++ grub-0.97/stage2/boot.c     2006-07-04 00:01:50.000000000 -0700
1684 @@ -1,7 +1,7 @@
1685  /* boot.c - load and bootstrap a kernel */
1686  /*
1687   *  GRUB  --  GRand Unified Bootloader
1688 - *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
1689 + *  Copyright (C) 1999,2000,2001,2002,2003,2004,2005  Free Software Foundation, Inc.
1690   *
1691   *  This program is free software; you can redistribute it and/or modify
1692   *  it under the terms of the GNU General Public License as published by
1693 @@ -29,6 +29,8 @@
1694  entry_func entry_addr;
1695  static struct mod_list mll[99];
1696  static int linux_mem_size;
1697 +static int elf_kernel_addr;
1698 +static int elf_kernel_size;
1699  
1700  /*
1701   *  The next two functions, 'load_image' and 'load_module', are the building
1702 @@ -96,7 +98,7 @@
1703    lh = (struct linux_kernel_header *) buffer;
1704    
1705    /* ELF loading supported if multiboot, FreeBSD and NetBSD.  */
1706 -  if ((type == KERNEL_TYPE_MULTIBOOT
1707 +  if (((type == KERNEL_TYPE_MULTIBOOT && ! (flags & MULTIBOOT_AOUT_KLUDGE))
1708         || pu.elf->e_ident[EI_OSABI] == ELFOSABI_FREEBSD
1709         || grub_strcmp (pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0
1710         || suggested_type == KERNEL_TYPE_NETBSD)
1711 @@ -594,6 +596,7 @@
1712  
1713        /* reset this to zero for now */
1714        cur_addr = 0;
1715 +      elf_kernel_addr = ~0;
1716  
1717        /* scan for program segments */
1718        for (i = 0; i < pu.elf->e_phnum; i++)
1719 @@ -630,6 +633,8 @@
1720               /* mark memory as used */
1721               if (cur_addr < memaddr + memsiz)
1722                 cur_addr = memaddr + memsiz;
1723 +             if (elf_kernel_addr > cur_addr)
1724 +               elf_kernel_addr = cur_addr;
1725               printf (", <0x%x:0x%x:0x%x>", memaddr, filesiz,
1726                       memsiz - filesiz);
1727               /* increment number of segments */
1728 @@ -647,6 +652,8 @@
1729             }
1730         }
1731  
1732 +      elf_kernel_size = cur_addr - elf_kernel_addr;
1733 +
1734        if (! errnum)
1735         {
1736           if (! loaded)
1737 @@ -824,8 +831,11 @@
1738      moveto = (mbi.mem_upper + 0x400) << 10;
1739    
1740    moveto = (moveto - len) & 0xfffff000;
1741 -  max_addr = (lh->header == LINUX_MAGIC_SIGNATURE && lh->version >= 0x0203
1742 -             ? lh->initrd_addr_max : LINUX_INITRD_MAX_ADDRESS);
1743 +  max_addr = LINUX_INITRD_MAX_ADDRESS;
1744 +  if (lh->header == LINUX_MAGIC_SIGNATURE &&
1745 +      lh->version >= 0x0203 &&
1746 +      lh->initrd_addr_max < max_addr)
1747 +    max_addr = lh->initrd_addr_max;
1748    if (moveto + len >= max_addr)
1749      moveto = (max_addr - len) & 0xfffff000;
1750    
1751 @@ -864,6 +874,129 @@
1752  }
1753  #endif
1754  
1755 +#define mem_align4k(p) ((p) + 0xFFF) & 0xFFFFF000
1756 +
1757 +static void
1758 +kfreebsd_setenv (char *env, const char *var, const char *value)
1759 +{
1760 +  while (1)
1761 +    {
1762 +      if (env[0] == '\0' && env[1] == '\0')
1763 +       {
1764 +         env++;
1765 +         break;
1766 +       }
1767 +      else
1768 +        env++;
1769 +    }
1770 +
1771 +  grub_sprintf (env, "%s=%s", var, value);
1772 +  env[grub_strlen (env) + 1] = '\0';
1773 +}
1774 +
1775 +static char *
1776 +kfreebsd_read_hints (char *buf)
1777 +{
1778 +  char *buf_end = buf;
1779 +
1780 +  if (grub_open ("/boot/device.hints"))
1781 +    {
1782 +      char *line_start;
1783 +      int line_len = 0;
1784 +      char *envp;
1785 +      int env_len;
1786 +
1787 +      env_len = grub_read (buf, -1);
1788 +      if (env_len)
1789 +       {
1790 +         buf_end += env_len;
1791 +         *(buf_end++) = '\0';
1792 +       }
1793 +      else
1794 +       return buf_end;
1795 +
1796 +      grub_close ();
1797 +
1798 +      envp = line_start = buf;
1799 +      while (*envp)
1800 +       {
1801 +         char *envp_current = envp;
1802 +       
1803 +         switch (*envp)
1804 +           {
1805 +             case ' ':
1806 +               while (*envp == ' ')
1807 +                 {
1808 +                   envp++;
1809 +                   env_len--;
1810 +                 }
1811 +               grub_memmove (envp_current, envp, env_len + 1);
1812 +               envp = envp_current;
1813 +               break;
1814 +             case '#':
1815 +               while (*envp != '\n')
1816 +                 {
1817 +                   envp++;
1818 +                   env_len--;
1819 +                 }
1820 +               if (!line_len)
1821 +                 envp++;
1822 +               grub_memmove (envp_current, envp, env_len + 1);
1823 +               envp = envp_current;
1824 +               break;
1825 +             case '\n':
1826 +               if (!line_len)
1827 +                 {
1828 +                   env_len--;
1829 +                   grub_memmove (line_start, envp, env_len + 1);
1830 +                 }
1831 +               *(envp++) = '\0';
1832 +               line_len = 0;
1833 +               line_start = envp;
1834 +             default:
1835 +               envp++;
1836 +               line_len++;
1837 +               break;
1838 +           }
1839 +       }
1840 +
1841 +      buf_end = buf + env_len;
1842 +      *(buf_end++) = '\0';
1843 +    }
1844 +
1845 +  return buf_end;
1846 +}
1847 +
1848 +static u32_t *
1849 +kfreebsd_set_module_string (u32_t type, u32_t *dst, char *src)
1850 +{
1851 +  int size;
1852 +
1853 +  *(dst++) = type;
1854 +  *(dst++) = size = grub_strlen (src) + 1;
1855 +  grub_strcpy ((void *) dst, src);
1856 +
1857 +  return dst + (size + sizeof(u32_t) - 1) / sizeof(u32_t);
1858 +}
1859 +
1860 +static u32_t *
1861 +kfreebsd_set_module_var (u32_t type, u32_t *dst, u32_t src)
1862 +{
1863 +  *(dst++) = type;
1864 +  *(dst++) = sizeof(u32_t);
1865 +  *(dst++) = src;
1866 +
1867 +  return dst;
1868 +}
1869 +
1870 +static u32_t *
1871 +kfreebsd_set_modules (u32_t *modulep)
1872 +{
1873 +  /* XXX: Need to copy the whole module structure.  */
1874 +  /* XXX: How to pass the module name ?  */
1875 +
1876 +  return modulep;
1877 +}
1878  
1879  /*
1880   *  All "*_boot" commands depend on the images being loaded into memory
1881 @@ -877,7 +1010,10 @@
1882  bsd_boot (kernel_t type, int bootdev, char *arg)
1883  {
1884    char *str;
1885 -  int clval = 0, i;
1886 +  char *kernelname;
1887 +  char *bsd_root;
1888 +  int clval = 0;
1889 +  int i;
1890    struct bootinfo bi;
1891  
1892  #ifdef GRUB_UTIL
1893 @@ -886,8 +1022,21 @@
1894    stop_floppy ();
1895  #endif
1896  
1897 +  while (*arg != '/')
1898 +    arg++;
1899 +  kernelname = arg;
1900 +
1901    while (*(++arg) && *arg != ' ');
1902 +  *(arg++) = 0;
1903    str = arg;
1904 +
1905 +  bsd_root = grub_strstr (str, "root=");
1906 +  if (bsd_root)
1907 +    {
1908 +      bsd_root += 5;
1909 +      /* XXX: should copy the str or terminate it.  */
1910 +    }
1911 +
1912    while (*str)
1913      {
1914        if (*str == '-')
1915 @@ -910,6 +1059,8 @@
1916                 clval |= RB_GDB;
1917               if (*str == 'h')
1918                 clval |= RB_SERIAL;
1919 +             if (*str == 'p')
1920 +               clval |= RB_PAUSE;
1921               if (*str == 'm')
1922                 clval |= RB_MUTE;
1923               if (*str == 'r')
1924 @@ -927,14 +1078,17 @@
1925  
1926    if (type == KERNEL_TYPE_FREEBSD)
1927      {
1928 +      char *envp;
1929 +      u32_t *modp;
1930 +
1931        clval |= RB_BOOTINFO;
1932  
1933        bi.bi_version = BOOTINFO_VERSION;
1934  
1935 -      *arg = 0;
1936 -      while ((--arg) > (char *) MB_CMDLINE_BUF && *arg != '/');
1937 -      if (*arg == '/')
1938 -       bi.bi_kernelname = arg + 1;
1939 +      bi.bi_pad[0] = bi.bi_pad[1] = 0;
1940 +
1941 +      if (*kernelname == '/')
1942 +       bi.bi_kernelname = kernelname;
1943        else
1944         bi.bi_kernelname = 0;
1945  
1946 @@ -961,6 +1115,30 @@
1947        bi.bi_basemem = mbi.mem_lower;
1948        bi.bi_extmem = extended_memory;
1949  
1950 +      /* Setup the environment.  */
1951 +      bi.bi_envp = cur_addr = mem_align4k (cur_addr);
1952 +      grub_memset ((void *) cur_addr, 0, 2);
1953 +      cur_addr = (int) kfreebsd_read_hints ((void *) cur_addr);
1954 +
1955 +      envp = (char *) bi.bi_envp;
1956 +      kfreebsd_setenv (envp, "kernelname", kernelname);
1957 +      kfreebsd_setenv (envp, "vfs.root.mountfrom", bsd_root);
1958 +
1959 +      /* Setup the modules list.  */
1960 +      bi.bi_modulep = cur_addr = mem_align4k (cur_addr);
1961 +      modp = (u32_t *) bi.bi_modulep;
1962 +      /* The first module is the kernel.  */
1963 +      modp = kfreebsd_set_module_string (MODINFO_NAME, modp, kernelname);
1964 +      modp = kfreebsd_set_module_string (MODINFO_TYPE, modp, "elf kernel");
1965 +      modp = kfreebsd_set_module_string (MODINFO_ARGS, modp, arg);
1966 +      modp = kfreebsd_set_module_var (MODINFO_ADDR, modp, elf_kernel_addr);
1967 +      modp = kfreebsd_set_module_var (MODINFO_SIZE, modp, elf_kernel_size);
1968 +      /* Now the real modules.  */
1969 +      modp = kfreebsd_set_modules(modp);
1970 +
1971 +      /* Set the kernel end.  */
1972 +      bi.bi_kernend = cur_addr = mem_align4k (((int) modp) + 1);
1973 +
1974        if (mbi.flags & MB_INFO_AOUT_SYMS)
1975         {
1976           bi.bi_symtab = mbi.syms.a.addr;
1977 @@ -970,8 +1148,9 @@
1978  #if 0
1979        else if (mbi.flags & MB_INFO_ELF_SHDR)
1980         {
1981 -         /* FIXME: Should check if a symbol table exists and, if exists,
1982 -            pass the table to BI.  */
1983 +         bi.bi_symtab = mbi.syms.e.addr;
1984 +         bi.bi_esymtab = mbi.syms.e.addr
1985 +           + mbi.syms.e.size * mbi.syms.e.num * mbi.syms.e.shndx;
1986         }
1987  #endif
1988        else
1989 diff -Naur grub-0.97.orig/stage2/builtins.c grub-0.97/stage2/builtins.c
1990 --- grub-0.97.orig/stage2/builtins.c    2005-02-15 13:58:23.000000000 -0800
1991 +++ grub-0.97/stage2/builtins.c 2006-07-04 00:01:50.000000000 -0700
1992 @@ -28,6 +28,10 @@
1993  #include <filesys.h>
1994  #include <term.h>
1995  
1996 +#ifdef SUPPORT_GRAPHICS
1997 +# include <graphics.h>
1998 +#endif
1999 +
2000  #ifdef SUPPORT_NETBOOT
2001  # define GRUB  1
2002  # include <etherboot.h>
2003 @@ -82,6 +86,10 @@
2004     inside other functions.  */
2005  static int configfile_func (char *arg, int flags);
2006  
2007 +static int savedefault_helper (char *arg, int flags);
2008 +
2009 +static int savedefault_shell (char *arg, int flags);
2010 +
2011  /* Initialize the data for builtins.  */
2012  void
2013  init_builtins (void)
2014 @@ -237,12 +245,22 @@
2015  static int
2016  boot_func (char *arg, int flags)
2017  {
2018 +  struct term_entry *prev_term = current_term;
2019    /* Clear the int15 handler if we can boot the kernel successfully.
2020       This assumes that the boot code never fails only if KERNEL_TYPE is
2021       not KERNEL_TYPE_NONE. Is this assumption is bad?  */
2022    if (kernel_type != KERNEL_TYPE_NONE)
2023      unset_int15_handler ();
2024  
2025 +  /* if our terminal needed initialization, we should shut it down
2026 +   * before booting the kernel, but we want to save what it was so
2027 +   * we can come back if needed */
2028 +  if (current_term->shutdown) 
2029 +    {
2030 +      current_term->shutdown();
2031 +      current_term = term_table; /* assumption: console is first */
2032 +    }
2033 +
2034  #ifdef SUPPORT_NETBOOT
2035    /* Shut down the networking.  */
2036    cleanup_net ();
2037 @@ -306,6 +324,13 @@
2038        return 1;
2039      }
2040  
2041 +  /* if we get back here, we should go back to what our term was before */
2042 +  current_term = prev_term;
2043 +  if (current_term->startup)
2044 +      /* if our terminal fails to initialize, fall back to console since
2045 +       * it should always work */
2046 +      if (current_term->startup() == 0)
2047 +          current_term = term_table; /* we know that console is first */
2048    return 0;
2049  }
2050  
2051 @@ -852,6 +877,251 @@
2052  };
2053  #endif /* SUPPORT_NETBOOT */
2054  
2055 +#ifdef SUPPORT_GRAPHICS
2056 +\f
2057 +static int splashimage_func(char *arg, int flags) {
2058 +  int i;
2059 +    
2060 +  /* filename can only be 256 characters due to our buffer size */
2061 +  if (grub_strlen(arg) > 256) {
2062 +    grub_printf("Splash image filename too large\n");
2063 +    grub_printf("Press any key to continue...");
2064 +    getkey();
2065 +    return 1;
2066 +  }
2067 +
2068 +  /* get rid of TERM_NEED_INIT from the graphics terminal. */
2069 +  for (i = 0; term_table[i].name; i++) {
2070 +    if (grub_strcmp (term_table[i].name, "graphics") == 0) {
2071 +      term_table[i].flags &= ~TERM_NEED_INIT;
2072 +      break;
2073 +    }
2074 +  }
2075 +
2076 +  graphics_set_splash(arg);
2077 +
2078 +  if (flags == BUILTIN_CMDLINE && graphics_inited) {
2079 +    graphics_end();
2080 +    if (graphics_init() == 0) {
2081 +      /* Fallback to default term */
2082 +      current_term = term_table;
2083 +      max_lines = current_term->max_lines;
2084 +      if (current_term->cls)
2085 +        current_term->cls();
2086 +      grub_printf("Failed to set splash image and/or graphics mode\n");
2087 +      return 1;
2088 +    }
2089 +    graphics_cls();
2090 +  }
2091 +
2092 +  if (flags == BUILTIN_MENU)
2093 +    current_term = term_table + i;
2094 +
2095 +  return 0;
2096 +}
2097 +
2098 +static struct builtin builtin_splashimage =
2099 +{
2100 +  "splashimage",
2101 +  splashimage_func,
2102 +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
2103 +  "splashimage FILE",
2104 +  "Load FILE as the background image when in graphics mode."
2105 +};
2106 +
2107 +\f
2108 +/* shade */
2109 +static int
2110 +shade_func(char *arg, int flags)
2111 +{
2112 +    int new_shade;
2113 +
2114 +    if (!arg || safe_parse_maxint(&arg, &new_shade) == 0)
2115 +       return (1);
2116 +
2117 +    if (shade != new_shade) {
2118 +       shade = new_shade;
2119 +       if (flags == BUILTIN_CMDLINE && graphics_inited) {
2120 +           graphics_end();
2121 +           graphics_init();
2122 +           graphics_cls();
2123 +       }
2124 +    }
2125 +
2126 +    return 0;
2127 +}
2128 +
2129 +static struct builtin builtin_shade =
2130 +{
2131 +  "shade",
2132 +  shade_func,
2133 +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
2134 +  "shade INTEGER",
2135 +  "If set to 0, disables the use of shaded text, else enables it."
2136 +};
2137 +
2138 +\f
2139 +/* foreground */
2140 +static int
2141 +foreground_func(char *arg, int flags)
2142 +{
2143 +    if (grub_strlen(arg) == 6) {
2144 +       int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
2145 +       int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
2146 +       int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
2147 +
2148 +       foreground = (r << 16) | (g << 8) | b;
2149 +       if (graphics_inited)
2150 +           graphics_set_palette(15, r, g, b);
2151 +
2152 +       return 0;
2153 +    }
2154 +
2155 +    return 1;
2156 +}
2157 +
2158 +static struct builtin builtin_foreground =
2159 +{
2160 +  "foreground",
2161 +  foreground_func,
2162 +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
2163 +  "foreground RRGGBB",
2164 +  "Sets the foreground color when in graphics mode."
2165 +  "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
2166 +};
2167 +
2168 +\f
2169 +/* background */
2170 +static int
2171 +background_func(char *arg, int flags)
2172 +{
2173 +    if (grub_strlen(arg) == 6) {
2174 +       int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
2175 +       int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
2176 +       int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
2177 +
2178 +       background = (r << 16) | (g << 8) | b;
2179 +       if (graphics_inited)
2180 +           graphics_set_palette(0, r, g, b);
2181 +       return 0;
2182 +    }
2183 +
2184 +    return 1;
2185 +}
2186 +
2187 +static struct builtin builtin_background =
2188 +{
2189 +  "background",
2190 +  background_func,
2191 +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
2192 +  "background RRGGBB",
2193 +  "Sets the background color when in graphics mode."
2194 +  "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
2195 +};
2196 +
2197 +\f
2198 +/* border */
2199 +static int
2200 +border_func(char *arg, int flags)
2201 +{
2202 +    if (grub_strlen(arg) == 6) {
2203 +       int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
2204 +       int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
2205 +       int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
2206 +
2207 +       window_border = (r << 16) | (g << 8) | b;
2208 +       if (graphics_inited)
2209 +           graphics_set_palette(0x11, r, g, b);
2210 +
2211 +       return 0;
2212 +    }
2213 +
2214 +    return 1;
2215 +}
2216 +
2217 +static struct builtin builtin_border =
2218 +{
2219 +  "border",
2220 +  border_func,
2221 +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
2222 +  "border RRGGBB",
2223 +  "Sets the border video color when in graphics mode."
2224 +  "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
2225 +};
2226 +
2227 +\f
2228 +/* viewport */
2229 +static int
2230 +viewport_func (char *arg, int flags)
2231 +{
2232 +    int i;
2233 +    int x0 = 0, y0 = 0, x1 = 80, y1 = 30;
2234 +    int *pos[4] = { &x0, &y0, &x1, &y1 };
2235 +
2236 +    if (!arg)
2237 +       return (1);
2238 +    for (i = 0; i < 4; i++) {
2239 +       if (!*arg)
2240 +           return (1);
2241 +    while (*arg && (*arg == ' ' || *arg == '\t'))
2242 +           ++arg;
2243 +       if (!safe_parse_maxint(&arg, pos[i]))
2244 +           return (1);
2245 +       while (*arg && (*arg != ' ' && *arg != '\t'))
2246 +           ++arg;
2247 +    }
2248 +
2249 +    /* minimum size is 65 colums and 16 rows */
2250 +    if (x0 > x1 - 66 || y0 > y1 - 16 || x0 < 0 || y0 < 0 || x1 > 80 || y1 > 30)
2251 +       return 1;
2252 +
2253 +    view_x0 = x0;
2254 +    view_y0 = y0;
2255 +    view_x1 = x1;
2256 +    view_y1 = y1;
2257 +
2258 +    if (flags == BUILTIN_CMDLINE && graphics_inited) {
2259 +       graphics_end();
2260 +       graphics_init();
2261 +       graphics_cls();
2262 +    }
2263 +
2264 +    return 0;
2265 +}
2266 +
2267 +static struct builtin builtin_viewport =
2268 +{
2269 +  "viewport",
2270 +  viewport_func,
2271 +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
2272 +  "viewport x0 y0 x1 y1",
2273 +  "Changes grub internals to output text in the window defined by"
2274 +  " four parameters. The x and y parameters are 0 based. This option"
2275 +  " only works with the graphics interface."
2276 +};
2277 +
2278 +#endif /* SUPPORT_GRAPHICS */
2279 +
2280 +\f
2281 +/* clear */
2282 +static int 
2283 +clear_func() 
2284 +{
2285 +  if (current_term->cls)
2286 +    current_term->cls();
2287 +
2288 +  return 0;
2289 +}
2290 +
2291 +static struct builtin builtin_clear =
2292 +{
2293 +  "clear",
2294 +  clear_func,
2295 +  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
2296 +  "clear",
2297 +  "Clear the screen"
2298 +};
2299 +
2300  \f
2301  /* displayapm */
2302  static int
2303 @@ -1454,14 +1724,20 @@
2304  
2305  \f
2306  /* help */
2307 -#define MAX_SHORT_DOC_LEN      39
2308 -#define MAX_LONG_DOC_LEN       66
2309 -
2310  static int
2311  help_func (char *arg, int flags)
2312  {
2313 -  int all = 0;
2314 -  
2315 +  int all = 0, max_short_doc_len, max_long_doc_len;
2316 +  max_short_doc_len = 39;
2317 +  max_long_doc_len = 66;
2318 +#ifdef SUPPORT_GRAPHICS
2319 +  if (grub_memcmp (current_term->name, "graphics", sizeof ("graphics") - 1) == 0)
2320 +    {
2321 +      max_short_doc_len = (view_x1 - view_x0 + 1) / 2 - 1;
2322 +      max_long_doc_len = (view_x1 - view_x0) - 14;
2323 +    }
2324 +#endif
2325 +
2326    if (grub_memcmp (arg, "--all", sizeof ("--all") - 1) == 0)
2327      {
2328        all = 1;
2329 @@ -1491,13 +1767,13 @@
2330  
2331           len = grub_strlen ((*builtin)->short_doc);
2332           /* If the length of SHORT_DOC is too long, truncate it.  */
2333 -         if (len > MAX_SHORT_DOC_LEN - 1)
2334 -           len = MAX_SHORT_DOC_LEN - 1;
2335 +         if (len > max_short_doc_len - 1)
2336 +           len = max_short_doc_len - 1;
2337  
2338           for (i = 0; i < len; i++)
2339             grub_putchar ((*builtin)->short_doc[i]);
2340  
2341 -         for (; i < MAX_SHORT_DOC_LEN; i++)
2342 +         for (; i < max_short_doc_len; i++)
2343             grub_putchar (' ');
2344  
2345           if (! left)
2346 @@ -1546,10 +1822,10 @@
2347                       int i;
2348  
2349                       /* If LEN is too long, fold DOC.  */
2350 -                     if (len > MAX_LONG_DOC_LEN)
2351 +                     if (len > max_long_doc_len)
2352                         {
2353                           /* Fold this line at the position of a space.  */
2354 -                         for (len = MAX_LONG_DOC_LEN; len > 0; len--)
2355 +                         for (len = max_long_doc_len; len > 0; len--)
2356                             if (doc[len - 1] == ' ')
2357                               break;
2358                         }
2359 @@ -2323,6 +2599,25 @@
2360    "Probe I/O ports used for the drive DRIVE."
2361  };
2362  
2363 +/* print */
2364 +static int
2365 +print_func (char *arg, int flags)
2366 +{
2367 +  printf("%s\n", arg);
2368 +
2369 +  return 0;
2370 +}
2371 +
2372 +static struct builtin builtin_print =
2373 +{
2374 +  "print",
2375 +  print_func,
2376 +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_NO_ECHO,
2377 +  "print [MESSAGE ...]",
2378 +  "Print MESSAGE."
2379 +};
2380 +
2381 +
2382  \f
2383  /* kernel */
2384  static int
2385 @@ -3221,7 +3516,102 @@
2386  static int
2387  savedefault_func (char *arg, int flags)
2388  {
2389 -#if !defined(SUPPORT_DISKLESS) && !defined(GRUB_UTIL)
2390 +#if !defined(SUPPORT_DISKLESS)
2391 +  #if !defined(GRUB_UTIL)
2392 +       savedefault_helper(arg, flags);
2393 +  #else
2394 +       savedefault_shell(arg, flags);
2395 +  #endif
2396 +#else /* !SUPPORT_DISKLESS */ 
2397 +  errnum = ERR_UNRECOGNIZED;
2398 +  return 1;
2399 +#endif /* !SUPPORT_DISKLESS */
2400 +}
2401 +
2402 +#if !defined(SUPPORT_DISKLESS) && defined(GRUB_UTIL)
2403 +/* savedefault_shell */
2404 +static int
2405 +savedefault_shell(char *arg, int flags)
2406 + {
2407 +  int once_only = 0;
2408 +  int new_default;
2409 +  int curr_default = -1;
2410 +  int curr_prev_default = -1;
2411 +  int new_prev_default = -1;
2412 +  FILE *fp;
2413 +  size_t bytes = 10;
2414 +  char line[bytes];
2415 +  char *default_file = (char *) DEFAULT_FILE_BUF;
2416 +  char buf[bytes];
2417 +  int i;
2418 +  
2419 +  while (1)
2420 +    {
2421 +      if (grub_memcmp ("--default=", arg, sizeof ("--default=") - 1) == 0)
2422 +        {
2423 +          char *p = arg + sizeof ("--default=") - 1;
2424 +          if (! safe_parse_maxint (&p, &new_default))
2425 +            return 1;
2426 +          arg = skip_to (0, arg);
2427 +        }
2428 +      else if (grub_memcmp ("--once", arg, sizeof ("--once") - 1) == 0)
2429 +        {
2430 +         once_only = 1;
2431 +         arg = skip_to (0, arg);
2432 +       }
2433 +      else
2434 +        break;
2435 +    }
2436 +
2437 +  *default_file = 0;
2438 +  grub_strncat (default_file, config_file, DEFAULT_FILE_BUFLEN);
2439 +  for (i = grub_strlen(default_file); i >= 0; i--)
2440 +    if (default_file[i] == '/')
2441 +    {
2442 +      i++;
2443 +      break;
2444 +    }
2445 +  default_file[i] = 0;
2446 +  grub_strncat (default_file + i, "default", DEFAULT_FILE_BUFLEN - i);
2447 +
2448 +  if(!(fp = fopen(default_file,"w")))
2449 +    {
2450 +      errnum = ERR_READ;
2451 +      goto fail;
2452 +    }
2453 +  
2454 +  read(&line, -1);
2455 +    
2456 +  sscanf(line, "%d:%d", &curr_prev_default, &curr_default);
2457 +     
2458 +  if(curr_default != -1)
2459 +    new_prev_default = curr_default;
2460 +  else
2461 +    {
2462 +      if(curr_prev_default != -1)
2463 +        new_prev_default = curr_prev_default;
2464 +      else
2465 +        new_prev_default = 0;
2466 +    }
2467 +     
2468 +  if(once_only)
2469 +    sprintf(buf, "%d:%d\n", new_prev_default, new_default);
2470 +  else
2471 +    sprintf(buf, "%d\n", new_default);
2472 +     
2473 +  fprintf(fp, buf);   
2474 +     
2475 +fail:
2476 +  fclose(fp);
2477 +  return errnum;
2478 +}
2479 +#endif
2480 +
2481 +/* savedefault_helper */
2482 +static int
2483 +savedefault_helper (char *arg, int flags)
2484 +{
2485 +#if !defined(SUPPORT_DISKLESS)
2486    unsigned long tmp_drive = saved_drive;
2487    unsigned long tmp_partition = saved_partition;
2488    char *default_file = (char *) DEFAULT_FILE_BUF;
2489 @@ -3300,19 +3690,23 @@
2490        disk_read_hook = 0;
2491        grub_close ();
2492        
2493 -      if (len != sizeof (buf))
2494 -       {
2495 -         /* This is too small. Do not modify the file manually, please!  */
2496 -         errnum = ERR_READ;
2497 -         goto fail;
2498 -       }
2499 -
2500        if (sector_count > 2)
2501         {
2502           /* Is this possible?! Too fragmented!  */
2503           errnum = ERR_FSYS_CORRUPT;
2504           goto fail;
2505         }
2506 +
2507 +      char *tmp;
2508 +      if((tmp = grub_strstr(buf, ":")) != NULL)
2509 +      {
2510 +       int f_len = grub_strlen(buf) - grub_strlen(tmp);
2511 +       char *def;
2512 +       int a;
2513 +       for(a = 0; a < f_len; a++)
2514 +         grub_memcpy(&def[a], &buf[a], sizeof(char));
2515 +       safe_parse_maxint (&def, &entryno);
2516 +      }
2517        
2518        /* Set up a string to be written.  */
2519        grub_memset (buf, '\n', sizeof (buf));
2520 @@ -3830,15 +4224,15 @@
2521         {
2522           char tmp[16];
2523           grub_sprintf (tmp, ",%d", (partition >> 16) & 0xFF);
2524 -         grub_strncat (device, tmp, 256);
2525 +         grub_strncat (device, tmp, sizeof (device));
2526         }
2527        if ((partition & 0x00FF00) != 0x00FF00)
2528         {
2529           char tmp[16];
2530           grub_sprintf (tmp, ",%c", 'a' + ((partition >> 8) & 0xFF));
2531 -         grub_strncat (device, tmp, 256);
2532 +         grub_strncat (device, tmp, sizeof (device));
2533         }
2534 -      grub_strncat (device, ")", 256);
2535 +      grub_strncat (device, ")", sizeof (device));
2536      }
2537    
2538    int embed_stage1_5 (char *stage1_5, int drive, int partition)
2539 @@ -4085,7 +4479,7 @@
2540  };
2541  
2542  \f
2543 -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES)
2544 +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS)
2545  /* terminal */
2546  static int
2547  terminal_func (char *arg, int flags)
2548 @@ -4244,17 +4638,29 @@
2549   end:
2550    current_term = term_table + default_term;
2551    current_term->flags = term_flags;
2552 -  
2553 +
2554    if (lines)
2555      max_lines = lines;
2556    else
2557 -    /* 24 would be a good default value.  */
2558 -    max_lines = 24;
2559 -  
2560 +    max_lines = current_term->max_lines;
2561 +
2562    /* If the interface is currently the command-line,
2563       restart it to repaint the screen.  */
2564 -  if (current_term != prev_term && (flags & BUILTIN_CMDLINE))
2565 +  if ((current_term != prev_term) && (flags & BUILTIN_CMDLINE)){
2566 +    if (prev_term->shutdown)
2567 +      prev_term->shutdown();
2568 +    if (current_term->startup) {
2569 +      /* If startup fails, return to previous term */
2570 +      if (current_term->startup() == 0) {
2571 +        current_term = prev_term;
2572 +        max_lines = current_term->max_lines;
2573 +        if (current_term->cls) {
2574 +          current_term->cls();
2575 +        }
2576 +      }
2577 +    }
2578      grub_longjmp (restart_cmdline_env, 0);
2579 +  }
2580    
2581    return 0;
2582  }
2583 @@ -4264,7 +4670,7 @@
2584    "terminal",
2585    terminal_func,
2586    BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
2587 -  "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules]",
2588 +  "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules] [graphics]",
2589    "Select a terminal. When multiple terminals are specified, wait until"
2590    " you push any key to continue. If both console and serial are specified,"
2591    " the terminal to which you input a key first will be selected. If no"
2592 @@ -4276,7 +4682,7 @@
2593    " seconds. The option --lines specifies the maximum number of lines."
2594    " The option --silent is used to suppress messages."
2595  };
2596 -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */
2597 +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */
2598  
2599  \f
2600  #ifdef SUPPORT_SERIAL
2601 @@ -4795,13 +5201,20 @@
2602  /* The table of builtin commands. Sorted in dictionary order.  */
2603  struct builtin *builtin_table[] =
2604  {
2605 +#ifdef SUPPORT_GRAPHICS
2606 +  &builtin_background,
2607 +#endif
2608    &builtin_blocklist,
2609    &builtin_boot,
2610  #ifdef SUPPORT_NETBOOT
2611    &builtin_bootp,
2612  #endif /* SUPPORT_NETBOOT */
2613 +#ifdef SUPPORT_GRAPHICS
2614 +  &builtin_border,
2615 +#endif
2616    &builtin_cat,
2617    &builtin_chainloader,
2618 +  &builtin_clear,
2619    &builtin_cmp,
2620    &builtin_color,
2621    &builtin_configfile,
2622 @@ -4821,6 +5234,9 @@
2623    &builtin_embed,
2624    &builtin_fallback,
2625    &builtin_find,
2626 +#ifdef SUPPORT_GRAPHICS
2627 +  &builtin_foreground,
2628 +#endif
2629    &builtin_fstest,
2630    &builtin_geometry,
2631    &builtin_halt,
2632 @@ -4848,6 +5264,7 @@
2633    &builtin_parttype,
2634    &builtin_password,
2635    &builtin_pause,
2636 +  &builtin_print,
2637  #ifdef GRUB_UTIL
2638    &builtin_quit,
2639  #endif /* GRUB_UTIL */
2640 @@ -4864,9 +5281,13 @@
2641  #endif /* SUPPORT_SERIAL */
2642    &builtin_setkey,
2643    &builtin_setup,
2644 -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES)
2645 +#ifdef SUPPORT_GRAPHICS
2646 +  &builtin_shade,
2647 +  &builtin_splashimage,
2648 +#endif /* SUPPORT_GRAPHICS */
2649 +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS)
2650    &builtin_terminal,
2651 -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */
2652 +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */
2653  #ifdef SUPPORT_SERIAL
2654    &builtin_terminfo,
2655  #endif /* SUPPORT_SERIAL */
2656 @@ -4880,5 +5301,8 @@
2657    &builtin_unhide,
2658    &builtin_uppermem,
2659    &builtin_vbeprobe,
2660 +#ifdef SUPPORT_GRAPHICS
2661 +  &builtin_viewport,
2662 +#endif
2663    0
2664  };
2665 diff -Naur grub-0.97.orig/stage2/char_io.c grub-0.97/stage2/char_io.c
2666 --- grub-0.97.orig/stage2/char_io.c     2005-02-01 12:51:23.000000000 -0800
2667 +++ grub-0.97/stage2/char_io.c  2006-07-03 23:59:27.000000000 -0700
2668 @@ -29,12 +29,17 @@
2669  # include <serial.h>
2670  #endif
2671  
2672 +#ifdef SUPPORT_GRAPHICS
2673 +# include <graphics.h>
2674 +#endif
2675 +
2676  #ifndef STAGE1_5
2677  struct term_entry term_table[] =
2678    {
2679      {
2680        "console",
2681        0,
2682 +      24,
2683        console_putchar,
2684        console_checkkey,
2685        console_getkey,
2686 @@ -43,13 +48,16 @@
2687        console_cls,
2688        console_setcolorstate,
2689        console_setcolor,
2690 -      console_setcursor
2691 +      console_setcursor,
2692 +      0, 
2693 +      0
2694      },
2695  #ifdef SUPPORT_SERIAL
2696      {
2697        "serial",
2698        /* A serial device must be initialized.  */
2699        TERM_NEED_INIT,
2700 +      24,
2701        serial_putchar,
2702        serial_checkkey,
2703        serial_getkey,
2704 @@ -58,6 +66,8 @@
2705        serial_cls,
2706        serial_setcolorstate,
2707        0,
2708 +      0,
2709 +      0, 
2710        0
2711      },
2712  #endif /* SUPPORT_SERIAL */
2713 @@ -65,6 +75,7 @@
2714      {
2715        "hercules",
2716        0,
2717 +      24,
2718        hercules_putchar,
2719        console_checkkey,
2720        console_getkey,
2721 @@ -73,11 +84,30 @@
2722        hercules_cls,
2723        hercules_setcolorstate,
2724        hercules_setcolor,
2725 -      hercules_setcursor
2726 +      hercules_setcursor,
2727 +      0,
2728 +      0
2729      },      
2730  #endif /* SUPPORT_HERCULES */
2731 +#ifdef SUPPORT_GRAPHICS
2732 +    { "graphics",
2733 +      TERM_NEED_INIT, /* flags */
2734 +      30, /* number of lines */
2735 +      graphics_putchar, /* putchar */
2736 +      console_checkkey, /* checkkey */
2737 +      console_getkey, /* getkey */
2738 +      graphics_getxy, /* getxy */
2739 +      graphics_gotoxy, /* gotoxy */
2740 +      graphics_cls, /* cls */
2741 +      graphics_setcolorstate, /* setcolorstate */
2742 +      graphics_setcolor, /* setcolor */
2743 +      graphics_setcursor, /* nocursor */
2744 +      graphics_init, /* initialize */
2745 +      graphics_end /* shutdown */
2746 +    },
2747 +#endif /* SUPPORT_GRAPHICS */
2748      /* This must be the last entry.  */
2749 -    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
2750 +    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
2751    };
2752  
2753  /* This must be console.  */
2754 @@ -305,9 +335,10 @@
2755  
2756    /* XXX: These should be defined in shared.h, but I leave these here,
2757       until this code is freezed.  */
2758 -#define CMDLINE_WIDTH  78
2759  #define CMDLINE_MARGIN 10
2760 -  
2761 +
2762 +  /* command-line limits */
2763 +  int cmdline_width = 78, col_start = 0;
2764    int xpos, lpos, c, section;
2765    /* The length of PROMPT.  */
2766    int plen;
2767 @@ -338,7 +369,7 @@
2768        
2769        /* If the cursor is in the first section, display the first section
2770          instead of the second.  */
2771 -      if (section == 1 && plen + lpos < CMDLINE_WIDTH)
2772 +      if (section == 1 && plen + lpos < cmdline_width)
2773         cl_refresh (1, 0);
2774        else if (xpos - count < 1)
2775         cl_refresh (1, 0);
2776 @@ -354,7 +385,7 @@
2777                 grub_putchar ('\b');
2778             }
2779           else
2780 -           gotoxy (xpos, getxy () & 0xFF);
2781 +           gotoxy (xpos + col_start, getxy () & 0xFF);
2782         }
2783      }
2784  
2785 @@ -364,7 +395,7 @@
2786        lpos += count;
2787  
2788        /* If the cursor goes outside, scroll the screen to the right.  */
2789 -      if (xpos + count >= CMDLINE_WIDTH)
2790 +      if (xpos + count >= cmdline_width)
2791         cl_refresh (1, 0);
2792        else
2793         {
2794 @@ -383,7 +414,7 @@
2795                 }
2796             }
2797           else
2798 -           gotoxy (xpos, getxy () & 0xFF);
2799 +           gotoxy (xpos + col_start, getxy () & 0xFF);
2800         }
2801      }
2802  
2803 @@ -398,14 +429,14 @@
2804        if (full)
2805         {
2806           /* Recompute the section number.  */
2807 -         if (lpos + plen < CMDLINE_WIDTH)
2808 +         if (lpos + plen < cmdline_width)
2809             section = 0;
2810           else
2811 -           section = ((lpos + plen - CMDLINE_WIDTH)
2812 -                      / (CMDLINE_WIDTH - 1 - CMDLINE_MARGIN) + 1);
2813 +           section = ((lpos + plen - cmdline_width)
2814 +                      / (cmdline_width - 1 - CMDLINE_MARGIN) + 1);
2815  
2816           /* From the start to the end.  */
2817 -         len = CMDLINE_WIDTH;
2818 +         len = cmdline_width;
2819           pos = 0;
2820           grub_putchar ('\r');
2821  
2822 @@ -445,8 +476,8 @@
2823           if (! full)
2824             offset = xpos - 1;
2825           
2826 -         start = ((section - 1) * (CMDLINE_WIDTH - 1 - CMDLINE_MARGIN)
2827 -                  + CMDLINE_WIDTH - plen - CMDLINE_MARGIN);
2828 +         start = ((section - 1) * (cmdline_width - 1 - CMDLINE_MARGIN)
2829 +                  + cmdline_width - plen - CMDLINE_MARGIN);
2830           xpos = lpos + 1 - start;
2831           start += offset;
2832         }
2833 @@ -471,7 +502,7 @@
2834        
2835        /* If the cursor is at the last position, put `>' or a space,
2836          depending on if there are more characters in BUF.  */
2837 -      if (pos == CMDLINE_WIDTH)
2838 +      if (pos == cmdline_width)
2839         {
2840           if (start + len < llen)
2841             grub_putchar ('>');
2842 @@ -488,7 +519,7 @@
2843             grub_putchar ('\b');
2844         }
2845        else
2846 -       gotoxy (xpos, getxy () & 0xFF);
2847 +       gotoxy (xpos + col_start, getxy () & 0xFF);
2848      }
2849  
2850    /* Initialize the command-line.  */
2851 @@ -518,10 +549,10 @@
2852           
2853           llen += l;
2854           lpos += l;
2855 -         if (xpos + l >= CMDLINE_WIDTH)
2856 +         if (xpos + l >= cmdline_width)
2857             cl_refresh (1, 0);
2858 -         else if (xpos + l + llen - lpos > CMDLINE_WIDTH)
2859 -           cl_refresh (0, CMDLINE_WIDTH - xpos);
2860 +         else if (xpos + l + llen - lpos > cmdline_width)
2861 +           cl_refresh (0, cmdline_width - xpos);
2862           else
2863             cl_refresh (0, l + llen - lpos);
2864         }
2865 @@ -533,12 +564,22 @@
2866        grub_memmove (buf + lpos, buf + lpos + count, llen - count + 1);
2867        llen -= count;
2868        
2869 -      if (xpos + llen + count - lpos > CMDLINE_WIDTH)
2870 -       cl_refresh (0, CMDLINE_WIDTH - xpos);
2871 +      if (xpos + llen + count - lpos > cmdline_width)
2872 +       cl_refresh (0, cmdline_width - xpos);
2873        else
2874         cl_refresh (0, llen + count - lpos);
2875      }
2876  
2877 +  max_lines = current_term->max_lines;
2878 +#ifdef SUPPORT_GRAPHICS
2879 +  if (grub_memcmp (current_term->name, "graphics", sizeof ("graphics") - 1) == 0)
2880 +    {
2881 +      cmdline_width = (view_x1 - view_x0) - 2;
2882 +      col_start = view_x0;
2883 +      max_lines = view_y1 - view_y0;
2884 +    }
2885 +#endif
2886 +
2887    plen = grub_strlen (prompt);
2888    llen = grub_strlen (cmdline);
2889  
2890 @@ -1006,6 +1047,48 @@
2891  }
2892  #endif /* ! STAGE1_5 */
2893  
2894 +#ifndef STAGE1_5
2895 +/* Internal pager.  */
2896 +int
2897 +do_more (void)
2898 +{
2899 +  if (count_lines >= 0)
2900 +    {
2901 +      count_lines++;
2902 +      if (count_lines >= max_lines - 2)
2903 +        {
2904 +          int tmp;
2905 +
2906 +          /* It's important to disable the feature temporarily, because
2907 +             the following grub_printf call will print newlines.  */
2908 +          count_lines = -1;
2909 +
2910 +          grub_printf("\n");
2911 +          if (current_term->setcolorstate)
2912 +            current_term->setcolorstate (COLOR_STATE_HIGHLIGHT);
2913 +
2914 +          grub_printf ("[Hit return to continue]");
2915 +
2916 +          if (current_term->setcolorstate)
2917 +            current_term->setcolorstate (COLOR_STATE_NORMAL);
2918 +
2919 +
2920 +          do
2921 +            {
2922 +              tmp = ASCII_CHAR (getkey ());
2923 +            }
2924 +          while (tmp != '\n' && tmp != '\r');
2925 +          grub_printf ("\r                        \r");
2926 +
2927 +          /* Restart to count lines.  */
2928 +          count_lines = 0;
2929 +          return 1;
2930 +        }
2931 +    }
2932 +  return 0;
2933 +}
2934 +#endif
2935 +
2936  /* Display an ASCII character.  */
2937  void
2938  grub_putchar (int c)
2939 @@ -1034,38 +1117,11 @@
2940  
2941    if (c == '\n')
2942      {
2943 +      int flag;
2944        /* Internal `more'-like feature.  */
2945 -      if (count_lines >= 0)
2946 -       {
2947 -         count_lines++;
2948 -         if (count_lines >= max_lines - 2)
2949 -           {
2950 -             int tmp;
2951 -             
2952 -             /* It's important to disable the feature temporarily, because
2953 -                the following grub_printf call will print newlines.  */
2954 -             count_lines = -1;
2955 -
2956 -             if (current_term->setcolorstate)
2957 -               current_term->setcolorstate (COLOR_STATE_HIGHLIGHT);
2958 -             
2959 -             grub_printf ("\n[Hit return to continue]");
2960 -
2961 -             if (current_term->setcolorstate)
2962 -               current_term->setcolorstate (COLOR_STATE_NORMAL);
2963 -             
2964 -             do
2965 -               {
2966 -                 tmp = ASCII_CHAR (getkey ());
2967 -               }
2968 -             while (tmp != '\n' && tmp != '\r');
2969 -             grub_printf ("\r                        \r");
2970 -             
2971 -             /* Restart to count lines.  */
2972 -             count_lines = 0;
2973 -             return;
2974 -           }
2975 -       }
2976 +      flag = do_more ();
2977 +      if (flag)
2978 +        return;
2979      }
2980  
2981    current_term->putchar (c);
2982 @@ -1090,7 +1146,7 @@
2983  cls (void)
2984  {
2985    /* If the terminal is dumb, there is no way to clean the terminal.  */
2986 -  if (current_term->flags & TERM_DUMB)
2987 +  if (current_term->flags & TERM_DUMB) 
2988      grub_putchar ('\n');
2989    else
2990      current_term->cls ();
2991 @@ -1175,13 +1231,13 @@
2992  #endif /* ! STAGE1_5 */
2993  
2994  int
2995 -memcheck (int addr, int len)
2996 +memcheck (unsigned long int addr, unsigned long int len)
2997  {
2998  #ifdef GRUB_UTIL
2999 -  auto int start_addr (void);
3000 -  auto int end_addr (void);
3001 +  auto unsigned long int start_addr (void);
3002 +  auto int unsigned long end_addr (void);
3003    
3004 -  auto int start_addr (void)
3005 +  auto unsigned long int start_addr (void)
3006      {
3007        int ret;
3008  # if defined(HAVE_START_SYMBOL)
3009 @@ -1192,7 +1248,7 @@
3010        return ret;
3011      }
3012  
3013 -  auto int end_addr (void)
3014 +  auto unsigned long int end_addr (void)
3015      {
3016        int ret;
3017  # if defined(HAVE_END_SYMBOL)
3018 @@ -1217,6 +1273,16 @@
3019    return ! errnum;
3020  }
3021  
3022 +void
3023 +grub_memcpy(void *dest, const void *src, int len)
3024 +{
3025 +  int i;
3026 +  register char *d = (char*)dest, *s = (char*)src;
3027 +
3028 +  for (i = 0; i < len; i++)
3029 +    d[i] = s[i];
3030 +}
3031 +
3032  void *
3033  grub_memmove (void *to, const void *from, int len)
3034  {
3035 diff -Naur grub-0.97.orig/stage2/cmdline.c grub-0.97/stage2/cmdline.c
3036 --- grub-0.97.orig/stage2/cmdline.c     2004-08-16 16:23:01.000000000 -0700
3037 +++ grub-0.97/stage2/cmdline.c  2006-07-03 23:58:41.000000000 -0700
3038 @@ -50,10 +50,11 @@
3039  void
3040  print_cmdline_message (int forever)
3041  {
3042 -  printf (" [ Minimal BASH-like line editing is supported.  For the first word, TAB\n"
3043 -         "   lists possible command completions.  Anywhere else TAB lists the possible\n"
3044 -         "   completions of a device/filename.%s ]\n",
3045 -         (forever ? "" : "  ESC at any time exits."));
3046 +  grub_printf("       [ Minimal BASH-like line editing is supported.   For\n"
3047 +              "         the   first   word,  TAB  lists  possible  command\n"
3048 +              "         completions.  Anywhere else TAB lists the possible\n"
3049 +              "         completions of a device/filename.%s ]\n",
3050 +              (forever ? "" : "  ESC at any time\n         exits."));
3051  }
3052  
3053  /* Find the builtin whose command name is COMMAND and return the
3054 diff -Naur grub-0.97.orig/stage2/freebsd.h grub-0.97/stage2/freebsd.h
3055 --- grub-0.97.orig/stage2/freebsd.h     2003-07-09 04:45:52.000000000 -0700
3056 +++ grub-0.97/stage2/freebsd.h  2006-07-03 23:59:36.000000000 -0700
3057 @@ -1,7 +1,7 @@
3058  
3059  /*
3060   *  GRUB  --  GRand Unified Bootloader
3061 - *  Copyright (C) 2001  Free Software Foundation, Inc.
3062 + *  Copyright (C) 2001, 2004  Free Software Foundation, Inc.
3063   *
3064   *  This program is free software; you can redistribute it and/or modify
3065   *  it under the terms of the GNU General Public License as published by
3066 @@ -35,6 +35,10 @@
3067  #define RB_CDROM        0x2000 /* use cdrom as root */
3068  #define RB_GDB         0x8000  /* use GDB remote debugger instead of DDB */
3069  #define RB_MUTE                0x10000 /* Come up with the console muted */
3070 +#define RB_SELFTEST    0x20000 /* don't complete the boot; do selftest */
3071 +#define RB_RESERVED1   0x40000 /* reserved for internal use of boot blocks */
3072 +#define RB_RESERVED2   0x80000 /* reserved for internal use of boot blocks */
3073 +#define RB_PAUSE       0x100000 /* pause after each output line during probe */
3074  #define RB_MULTIPLE    0x20000000      /* Use multiple consoles */
3075  
3076  #define RB_BOOTINFO     0x80000000     /* have `struct bootinfo *' arg */
3077 @@ -70,6 +74,9 @@
3078  
3079  #define N_BIOS_GEOM             8
3080  
3081 +typedef unsigned char u8_t;
3082 +typedef unsigned int u32_t;
3083 +
3084  /*
3085   * A zero bootinfo field often means that there is no info available.
3086   * Flags are used to indicate the validity of fields where zero is a
3087 @@ -77,19 +84,33 @@
3088   */
3089  struct bootinfo
3090    {
3091 -    unsigned int bi_version;
3092 -    unsigned char *bi_kernelname;
3093 -    struct nfs_diskless *bi_nfs_diskless;
3094 +    u32_t bi_version;
3095 +    u8_t *bi_kernelname;
3096 +    u32_t bi_nfs_diskless;
3097      /* End of fields that are always present. */
3098  #define bi_endcommon            bi_n_bios_used
3099 -    unsigned int bi_n_bios_used;
3100 -    unsigned long bi_bios_geom[N_BIOS_GEOM];
3101 -    unsigned int bi_size;
3102 -    unsigned char bi_memsizes_valid;
3103 -    unsigned char bi_bios_dev;
3104 -    unsigned char bi_pad[2];
3105 -    unsigned long bi_basemem;
3106 -    unsigned long bi_extmem;
3107 -    unsigned long bi_symtab;
3108 -    unsigned long bi_esymtab;
3109 +    u32_t bi_n_bios_used;
3110 +    u32_t bi_bios_geom[N_BIOS_GEOM];
3111 +    u32_t bi_size;
3112 +    u8_t bi_memsizes_valid;
3113 +    u8_t bi_bios_dev;
3114 +    u8_t bi_pad[2];
3115 +    u32_t bi_basemem;
3116 +    u32_t bi_extmem;
3117 +    u32_t bi_symtab;
3118 +    u32_t bi_esymtab;
3119 +    /* Items below only from advanced bootloader */
3120 +    u32_t bi_kernend;
3121 +    u32_t bi_envp;
3122 +    u32_t bi_modulep;
3123    };
3124 +
3125 +#define MODINFO_END            0x0000          /* End of list */
3126 +#define MODINFO_NAME           0x0001          /* Name of module (string) */
3127 +#define MODINFO_TYPE           0x0002          /* Type of module (string) */
3128 +#define MODINFO_ADDR           0x0003          /* Loaded address */
3129 +#define MODINFO_SIZE           0x0004          /* Size of module */
3130 +#define MODINFO_EMPTY          0x0005          /* Has been deleted */
3131 +#define MODINFO_ARGS           0x0006          /* Parameters string */
3132 +#define MODINFO_METADATA       0x8000          /* Module-specfic */
3133 +
3134 diff -Naur grub-0.97.orig/stage2/graphics.c grub-0.97/stage2/graphics.c
3135 --- grub-0.97.orig/stage2/graphics.c    1969-12-31 16:00:00.000000000 -0800
3136 +++ grub-0.97/stage2/graphics.c 2006-07-03 23:58:41.000000000 -0700
3137 @@ -0,0 +1,585 @@
3138 +/*
3139 + * graphics.c - graphics mode support for GRUB
3140 + * Implemented as a terminal type by Jeremy Katz <katzj@redhat.com> based
3141 + * on a patch by Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
3142 + * Options and enhancements made by Herton Ronaldo Krzesinski
3143 + * <herton@mandriva.com>
3144 + *
3145 + *  GRUB  --  GRand Unified Bootloader
3146 + *  Copyright (C) 2001,2002  Red Hat, Inc.
3147 + *  Portions copyright (C) 2000  Conectiva, Inc.
3148 + *
3149 + *  This program is free software; you can redistribute it and/or modify
3150 + *  it under the terms of the GNU General Public License as published by
3151 + *  the Free Software Foundation; either version 2 of the License, or
3152 + *  (at your option) any later version.
3153 + *
3154 + *  This program is distributed in the hope that it will be useful,
3155 + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
3156 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3157 + *  GNU General Public License for more details.
3158 + *
3159 + *  You should have received a copy of the GNU General Public License
3160 + *  along with this program; if not, write to the Free Software
3161 + *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
3162 + */
3163 +
3164 +#ifdef SUPPORT_GRAPHICS
3165 +
3166 +#include <term.h>
3167 +#include <shared.h>
3168 +#include <graphics.h>
3169 +
3170 +int saved_videomode;
3171 +unsigned char *font8x16;
3172 +
3173 +int graphics_inited = 0;
3174 +static char splashimage[256];
3175 +
3176 +int shade = 1, no_cursor = 0;
3177 +
3178 +#define VSHADOW VSHADOW1
3179 +unsigned char VSHADOW1[38400];
3180 +unsigned char VSHADOW2[38400];
3181 +unsigned char VSHADOW4[38400];
3182 +unsigned char VSHADOW8[38400];
3183 +
3184 +/* define the default viewable area */
3185 +int view_x0 = 0;
3186 +int view_y0 = 0;
3187 +int view_x1 = 80;
3188 +int view_y1 = 30;
3189 +
3190 +/* text buffer has to be kept around so that we can write things as we
3191 + * scroll and the like */
3192 +unsigned short text[80 * 30];
3193 +
3194 +/* graphics options */
3195 +int foreground = (63 << 16) | (63 << 8) | (63), background = 0, window_border = 0;
3196 +
3197 +/* current position */
3198 +static int fontx = 0;
3199 +static int fonty = 0;
3200 +
3201 +/* global state so that we don't try to recursively scroll or cursor */
3202 +static int no_scroll = 0;
3203 +
3204 +/* color state */
3205 +static int graphics_standard_color = A_NORMAL;
3206 +static int graphics_normal_color = A_NORMAL;
3207 +static int graphics_highlight_color = A_REVERSE;
3208 +static int graphics_current_color = A_NORMAL;
3209 +static color_state graphics_color_state = COLOR_STATE_STANDARD;
3210 +
3211 +static inline void outb(unsigned short port, unsigned char val)
3212 +{
3213 +    __asm __volatile ("outb %0,%1"::"a" (val), "d" (port));
3214 +}
3215 +
3216 +static void MapMask(int value) {
3217 +    outb(0x3c4, 2);
3218 +    outb(0x3c5, value);
3219 +}
3220 +
3221 +/* bit mask register */
3222 +static void BitMask(int value) {
3223 +    outb(0x3ce, 8);
3224 +    outb(0x3cf, value);
3225 +}
3226 +
3227 +/* move the graphics cursor location to col, row */
3228 +static void graphics_setxy(int col, int row) {
3229 +    if (col >= view_x0 && col < view_x1) {
3230 +        fontx = col;
3231 +        cursorX = col << 3;
3232 +    }
3233 +    if (row >= view_y0 && row < view_y1) {
3234 +        fonty = row;
3235 +        cursorY = row << 4;
3236 +    }
3237 +}
3238 +
3239 +/* scroll the screen */
3240 +static void graphics_scroll() {
3241 +    int i, j, k;
3242 +
3243 +    /* we don't want to scroll recursively... that would be bad */
3244 +    if (no_scroll)
3245 +        return;
3246 +    no_scroll = 1;
3247 +
3248 +    /* disable pager temporarily */
3249 +    k = count_lines;
3250 +    count_lines = -1;
3251 +    
3252 +    /* move everything up a line */
3253 +    for (j = view_y0 + 1; j < view_y1; j++) {
3254 +        graphics_gotoxy(view_x0, j - 1);
3255 +        for (i = view_x0; i < view_x1; i++) {
3256 +            graphics_putchar(text[j * 80 + i]);
3257 +        }
3258 +    }
3259 +
3260 +    /* last line should be blank */
3261 +    graphics_gotoxy(view_x0, view_y1 - 1);
3262 +    for (i = view_x0; i < view_x1; i++)
3263 +        graphics_putchar(' ');
3264 +    graphics_setxy(view_x0, view_y1 - 1);
3265 +
3266 +    count_lines = k;
3267 +
3268 +    no_scroll = 0;
3269 +}
3270 +
3271 +/* Set the splash image */
3272 +void graphics_set_splash(char *splashfile) {
3273 +    grub_strcpy(splashimage, splashfile);
3274 +}
3275 +
3276 +/* Get the current splash image */
3277 +char *graphics_get_splash(void) {
3278 +    return splashimage;
3279 +}
3280 +
3281 +/* 
3282 + * Initialize a vga16 graphics display with the palette based off of
3283 + * the image in splashimage.  If the image doesn't exist, leave graphics
3284 + * mode. The mode initiated is 12h. From "Ralf Brown's Interrupt List":
3285 + *      text/ text pixel   pixel   colors disply scrn  system
3286 + *      grph resol  box  resolution       pages  addr
3287 + * 12h   G   80x30  8x16  640x480  16/256K  .    A000  VGA,ATI VIP
3288 + *       G   80x30  8x16  640x480  16/64    .    A000  ATI EGA Wonder
3289 + *       G     .     .    640x480  16       .      .   UltraVision+256K EGA
3290 + */
3291 +int graphics_init()
3292 +{
3293 +    if (!graphics_inited) {
3294 +        saved_videomode = set_videomode(0x12);
3295 +        if (get_videomode() != 0x12) {
3296 +            set_videomode(saved_videomode);
3297 +            return 0;
3298 +        }
3299 +        graphics_inited = 1;
3300 +    }
3301 +    else
3302 +        return 1;
3303 +
3304 +    font8x16 = (unsigned char*)graphics_get_font();
3305 +
3306 +    /* make sure that the highlight color is set correctly */
3307 +    graphics_highlight_color = ((graphics_normal_color >> 4) | 
3308 +                                ((graphics_normal_color & 0xf) << 4));
3309 +
3310 +    graphics_cls();
3311 +
3312 +    if (!read_image(splashimage)) {
3313 +        grub_printf("Failed to read splash image (%s)\n", splashimage);
3314 +        grub_printf("Press any key to continue...");
3315 +        getkey();
3316 +        set_videomode(saved_videomode);
3317 +        graphics_inited = 0;
3318 +        return 0;
3319 +    }
3320 +
3321 +    set_int1c_handler();
3322 +
3323 +    return 1;
3324 +}
3325 +
3326 +/* Leave graphics mode */
3327 +void graphics_end(void)
3328 +{
3329 +    if (graphics_inited) {
3330 +        unset_int1c_handler();
3331 +        set_videomode(saved_videomode);
3332 +        graphics_inited = 0;
3333 +        no_cursor = 0;
3334 +    }
3335 +}
3336 +
3337 +/* Print ch on the screen.  Handle any needed scrolling or the like */
3338 +void graphics_putchar(int ch) {
3339 +    ch &= 0xff;
3340 +
3341 +    graphics_cursor(0);
3342 +
3343 +    if (ch == '\n') {
3344 +        if (fonty + 1 < view_y1)
3345 +            graphics_setxy(fontx, fonty + 1);
3346 +        else
3347 +            graphics_scroll();
3348 +        graphics_cursor(1);
3349 +        return;
3350 +    } else if (ch == '\r') {
3351 +        graphics_setxy(view_x0, fonty);
3352 +        graphics_cursor(1);
3353 +        return;
3354 +    }
3355 +
3356 +    graphics_cursor(0);
3357 +
3358 +    text[fonty * 80 + fontx] = ch;
3359 +    text[fonty * 80 + fontx] &= 0x00ff;
3360 +    if (graphics_current_color & 0xf0)
3361 +        text[fonty * 80 + fontx] |= 0x100;
3362 +
3363 +    graphics_cursor(0);
3364 +
3365 +    if ((fontx + 1) >= view_x1) {
3366 +        graphics_setxy(view_x0, fonty);
3367 +        if (fonty + 1 < view_y1)
3368 +            graphics_setxy(view_x0, fonty + 1);
3369 +        else
3370 +            graphics_scroll();
3371 +        graphics_cursor(1);
3372 +        do_more ();
3373 +        graphics_cursor(0);
3374 +    } else {
3375 +        graphics_setxy(fontx + 1, fonty);
3376 +    }
3377 +
3378 +    graphics_cursor(1);
3379 +}
3380 +
3381 +/* get the current location of the cursor */
3382 +int graphics_getxy(void) {
3383 +    return (fontx << 8) | fonty;
3384 +}
3385 +
3386 +void graphics_gotoxy(int x, int y) {
3387 +    graphics_cursor(0);
3388 +
3389 +    graphics_setxy(x, y);
3390 +
3391 +    graphics_cursor(1);
3392 +}
3393 +
3394 +void graphics_cls(void) {
3395 +    int i;
3396 +    unsigned char *mem, *s1, *s2, *s4, *s8;
3397 +
3398 +    graphics_cursor(0);
3399 +    graphics_gotoxy(view_x0, view_y0);
3400 +
3401 +    mem = (unsigned char*)VIDEOMEM;
3402 +    s1 = (unsigned char*)VSHADOW1;
3403 +    s2 = (unsigned char*)VSHADOW2;
3404 +    s4 = (unsigned char*)VSHADOW4;
3405 +    s8 = (unsigned char*)VSHADOW8;
3406 +
3407 +    for (i = 0; i < 80 * 30; i++)
3408 +        text[i] = ' ';
3409 +    graphics_cursor(1);
3410 +
3411 +    BitMask(0xff);
3412 +
3413 +    /* plane 1 */
3414 +    MapMask(1);
3415 +    grub_memcpy(mem, s1, 38400);
3416 +
3417 +    /* plane 2 */
3418 +    MapMask(2);
3419 +    grub_memcpy(mem, s2, 38400);
3420 +
3421 +    /* plane 3 */
3422 +    MapMask(4);
3423 +    grub_memcpy(mem, s4, 38400);
3424 +
3425 +    /* plane 4 */
3426 +    MapMask(8);
3427 +    grub_memcpy(mem, s8, 38400);
3428 +
3429 +    MapMask(15);
3430 +
3431 +    if (no_cursor) {
3432 +        no_cursor = 0;
3433 +        set_int1c_handler();
3434 +    }
3435 +}
3436 +
3437 +void graphics_setcolorstate (color_state state) {
3438 +    switch (state) {
3439 +    case COLOR_STATE_STANDARD:
3440 +        graphics_current_color = graphics_standard_color;
3441 +        break;
3442 +    case COLOR_STATE_NORMAL:
3443 +        graphics_current_color = graphics_normal_color;
3444 +        break;
3445 +    case COLOR_STATE_HIGHLIGHT:
3446 +        graphics_current_color = graphics_highlight_color;
3447 +        break;
3448 +    default:
3449 +        graphics_current_color = graphics_standard_color;
3450 +        break;
3451 +    }
3452 +
3453 +    graphics_color_state = state;
3454 +}
3455 +
3456 +void graphics_setcolor (int normal_color, int highlight_color) {
3457 +    graphics_normal_color = normal_color;
3458 +    graphics_highlight_color = highlight_color;
3459 +
3460 +    graphics_setcolorstate (graphics_color_state);
3461 +}
3462 +
3463 +int graphics_setcursor (int on) {
3464 +    if (!no_cursor && !on) {
3465 +        no_cursor = 1;
3466 +        unset_int1c_handler();
3467 +        graphics_cursor(0);
3468 +    }
3469 +    else if(no_cursor && on) {
3470 +        no_cursor = 0;
3471 +        set_int1c_handler();
3472 +        graphics_cursor(1);
3473 +    }
3474 +    return 0;
3475 +}
3476 +
3477 +/* Read in the splashscreen image and set the palette up appropriately.
3478 + * Format of splashscreen is an xpm (can be gzipped) with 16 colors and
3479 + * 640x480. */
3480 +int read_image(char *s)
3481 +{
3482 +    char buf[32], pal[16], c;
3483 +    unsigned char base, mask, *s1, *s2, *s4, *s8;
3484 +    unsigned i, len, idx, colors, x, y, width, height;
3485 +
3486 +    if (!grub_open(s))
3487 +        return 0;
3488 +
3489 +    /* read header */
3490 +    if (!grub_read((char*)&buf, 10) || grub_memcmp(buf, "/* XPM */\n", 10)) {
3491 +        grub_close();
3492 +        return 0;
3493 +    }
3494 +    
3495 +    /* parse info */
3496 +    while (grub_read(&c, 1)) {
3497 +        if (c == '"')
3498 +            break;
3499 +    }
3500 +
3501 +    while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
3502 +        ;
3503 +
3504 +    i = 0;
3505 +    width = c - '0';
3506 +    while (grub_read(&c, 1)) {
3507 +        if (c >= '0' && c <= '9')
3508 +            width = width * 10 + c - '0';
3509 +        else
3510 +            break;
3511 +    }
3512 +    while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
3513 +        ;
3514 +
3515 +    height = c - '0';
3516 +    while (grub_read(&c, 1)) {
3517 +        if (c >= '0' && c <= '9')
3518 +            height = height * 10 + c - '0';
3519 +        else
3520 +            break;
3521 +    }
3522 +    while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
3523 +        ;
3524 +
3525 +    colors = c - '0';
3526 +    while (grub_read(&c, 1)) {
3527 +        if (c >= '0' && c <= '9')
3528 +            colors = colors * 10 + c - '0';
3529 +        else
3530 +            break;
3531 +    }
3532 +
3533 +    base = 0;
3534 +    while (grub_read(&c, 1) && c != '"')
3535 +        ;
3536 +
3537 +    /* palette */
3538 +    for (i = 0, idx = 1; i < colors; i++) {
3539 +        len = 0;
3540 +
3541 +        while (grub_read(&c, 1) && c != '"')
3542 +            ;
3543 +        grub_read(&c, 1);       /* char */
3544 +        base = c;
3545 +        grub_read(buf, 4);      /* \t c # */
3546 +
3547 +        while (grub_read(&c, 1) && c != '"') {
3548 +            if (len < sizeof(buf))
3549 +                buf[len++] = c;
3550 +        }
3551 +
3552 +        if (len == 6 && idx < 15) {
3553 +            int r = ((hex(buf[0]) << 4) | hex(buf[1])) >> 2;
3554 +            int g = ((hex(buf[2]) << 4) | hex(buf[3])) >> 2;
3555 +            int b = ((hex(buf[4]) << 4) | hex(buf[5])) >> 2;
3556 +
3557 +            pal[idx] = base;
3558 +            graphics_set_palette(idx, r, g, b);
3559 +            ++idx;
3560 +        }
3561 +    }
3562 +
3563 +    x = y = len = 0;
3564 +
3565 +    s1 = (unsigned char*)VSHADOW1;
3566 +    s2 = (unsigned char*)VSHADOW2;
3567 +    s4 = (unsigned char*)VSHADOW4;
3568 +    s8 = (unsigned char*)VSHADOW8;
3569 +
3570 +    for (i = 0; i < 38400; i++)
3571 +        s1[i] = s2[i] = s4[i] = s8[i] = 0;
3572 +
3573 +    /* parse xpm data */
3574 +    while (y < height) {
3575 +        while (1) {
3576 +            if (!grub_read(&c, 1)) {
3577 +                grub_close();
3578 +                return 0;
3579 +            }
3580 +            if (c == '"')
3581 +                break;
3582 +        }
3583 +
3584 +        while (grub_read(&c, 1) && c != '"') {
3585 +            for (i = 1; i < 15; i++)
3586 +                if (pal[i] == c) {
3587 +                    c = i;
3588 +                    break;
3589 +                }
3590 +
3591 +            mask = 0x80 >> (x & 7);
3592 +            if (c & 1)
3593 +                s1[len + (x >> 3)] |= mask;
3594 +            if (c & 2)
3595 +                s2[len + (x >> 3)] |= mask;
3596 +            if (c & 4)
3597 +                s4[len + (x >> 3)] |= mask;
3598 +            if (c & 8)
3599 +                s8[len + (x >> 3)] |= mask;
3600 +
3601 +            if (++x >= 640) {
3602 +                x = 0;
3603 +
3604 +                if (y < 480)
3605 +                    len += 80;
3606 +                ++y;
3607 +            }
3608 +        }
3609 +    }
3610 +
3611 +    grub_close();
3612 +
3613 +    graphics_set_palette(0, (background >> 16), (background >> 8) & 63, 
3614 +                background & 63);
3615 +    graphics_set_palette(15, (foreground >> 16), (foreground >> 8) & 63, 
3616 +                foreground & 63);
3617 +    graphics_set_palette(0x11, (window_border >> 16), (window_border >> 8) & 63, 
3618 +                         window_border & 63);
3619 +
3620 +    return 1;
3621 +}
3622 +
3623 +/* Convert a character which is a hex digit to the appropriate integer */
3624 +int hex(int v)
3625 +{
3626 +    if (v >= 'A' && v <= 'F')
3627 +        return (v - 'A' + 10);
3628 +    if (v >= 'a' && v <= 'f')
3629 +        return (v - 'a' + 10);
3630 +    return (v - '0');
3631 +}
3632 +
3633 +void graphics_cursor(int set) {
3634 +    unsigned char *pat, *mem, *ptr, chr[16 << 2];
3635 +    int i, ch, invert, offset;
3636 +
3637 +    if (set && (no_cursor || no_scroll))
3638 +        return;
3639 +
3640 +    offset = cursorY * 80 + fontx;
3641 +    ch = text[fonty * 80 + fontx] & 0xff;
3642 +    invert = (text[fonty * 80 + fontx] & 0xff00) != 0;
3643 +    pat = font8x16 + (ch << 4);
3644 +
3645 +    mem = (unsigned char*)VIDEOMEM + offset;
3646 +
3647 +    if (!set) {
3648 +        for (i = 0; i < 16; i++) {
3649 +            unsigned char mask = pat[i];
3650 +
3651 +            if (!invert) {
3652 +                chr[i     ] = ((unsigned char*)VSHADOW1)[offset];
3653 +                chr[16 + i] = ((unsigned char*)VSHADOW2)[offset];
3654 +                chr[32 + i] = ((unsigned char*)VSHADOW4)[offset];
3655 +                chr[48 + i] = ((unsigned char*)VSHADOW8)[offset];
3656 +
3657 +                if (shade) {
3658 +                    if (ch == DISP_VERT || ch == DISP_LL ||
3659 +                        ch == DISP_UR || ch == DISP_LR) {
3660 +                        unsigned char pmask = ~(pat[i] >> 1);
3661 +
3662 +                        chr[i     ] &= pmask;
3663 +                        chr[16 + i] &= pmask;
3664 +                        chr[32 + i] &= pmask;
3665 +                        chr[48 + i] &= pmask;
3666 +                    }
3667 +                    if (i > 0 && ch != DISP_VERT) {
3668 +                        unsigned char pmask = ~(pat[i - 1] >> 1);
3669 +
3670 +                        chr[i     ] &= pmask;
3671 +                        chr[16 + i] &= pmask;
3672 +                        chr[32 + i] &= pmask;
3673 +                        chr[48 + i] &= pmask;
3674 +                        if (ch == DISP_HORIZ || ch == DISP_UR || ch == DISP_LR) {
3675 +                            pmask = ~pat[i - 1];
3676 +
3677 +                            chr[i     ] &= pmask;
3678 +                            chr[16 + i] &= pmask;
3679 +                            chr[32 + i] &= pmask;
3680 +                            chr[48 + i] &= pmask;
3681 +                        }
3682 +                    }
3683 +                }
3684 +                chr[i     ] |= mask;
3685 +                chr[16 + i] |= mask;
3686 +                chr[32 + i] |= mask;
3687 +                chr[48 + i] |= mask;
3688 +
3689 +                offset += 80;
3690 +            }
3691 +            else {
3692 +                chr[i     ] = mask;
3693 +                chr[16 + i] = mask;
3694 +                chr[32 + i] = mask;
3695 +                chr[48 + i] = mask;
3696 +            }
3697 +        }
3698 +    }
3699 +    else {
3700 +        MapMask(15);
3701 +        ptr = mem;
3702 +        for (i = 0; i < 16; i++, ptr += 80) {
3703 +            cursorBuf[i] = pat[i];
3704 +            *ptr = ~pat[i];
3705 +        }
3706 +        return;
3707 +    }
3708 +
3709 +    offset = 0;
3710 +    for (i = 1; i < 16; i <<= 1, offset += 16) {
3711 +        int j;
3712 +
3713 +        MapMask(i);
3714 +        ptr = mem;
3715 +        for (j = 0; j < 16; j++, ptr += 80)
3716 +            *ptr = chr[j + offset];
3717 +    }
3718 +
3719 +    MapMask(15);
3720 +}
3721 +
3722 +#endif /* SUPPORT_GRAPHICS */
3723 diff -Naur grub-0.97.orig/stage2/graphics.h grub-0.97/stage2/graphics.h
3724 --- grub-0.97.orig/stage2/graphics.h    1969-12-31 16:00:00.000000000 -0800
3725 +++ grub-0.97/stage2/graphics.h 2006-07-03 23:58:41.000000000 -0700
3726 @@ -0,0 +1,44 @@
3727 +/* graphics.h - graphics console interface */
3728 +/*
3729 + *  GRUB  --  GRand Unified Bootloader
3730 + *  Copyright (C) 2002  Free Software Foundation, Inc.
3731 + *
3732 + *  This program is free software; you can redistribute it and/or modify
3733 + *  it under the terms of the GNU General Public License as published by
3734 + *  the Free Software Foundation; either version 2 of the License, or
3735 + *  (at your option) any later version.
3736 + *
3737 + *  This program is distributed in the hope that it will be useful,
3738 + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
3739 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3740 + *  GNU General Public License for more details.
3741 + *
3742 + *  You should have received a copy of the GNU General Public License
3743 + *  along with this program; if not, write to the Free Software
3744 + *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
3745 + */
3746 +
3747 +#ifndef GRAPHICS_H
3748 +#define GRAPHICS_H
3749 +
3750 +/* magic constant */
3751 +#define VIDEOMEM 0xA0000
3752 +
3753 +/* function prototypes */
3754 +char *graphics_get_splash(void);
3755 +
3756 +int read_image(char *s);
3757 +void graphics_cursor(int set);
3758 +
3759 +/* function prototypes for asm functions */
3760 +void * graphics_get_font();
3761 +void graphics_set_palette(int idx, int red, int green, int blue);
3762 +void set_int1c_handler();
3763 +void unset_int1c_handler();
3764 +
3765 +extern short cursorX, cursorY;
3766 +extern char cursorBuf[16];
3767 +extern int shade;
3768 +extern int view_x0, view_y0, view_x1, view_y1;
3769 +
3770 +#endif /* GRAPHICS_H */
3771 diff -Naur grub-0.97.orig/stage2/Makefile.am grub-0.97/stage2/Makefile.am
3772 --- grub-0.97.orig/stage2/Makefile.am   2005-02-02 12:37:35.000000000 -0800
3773 +++ grub-0.97/stage2/Makefile.am        2006-07-03 23:58:41.000000000 -0700
3774 @@ -7,7 +7,7 @@
3775          fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
3776         imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
3777         nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
3778 -       terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h
3779 +       terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h graphics.h
3780  EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
3781  
3782  # For <stage1.h>.
3783 @@ -19,7 +19,7 @@
3784         disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
3785         fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
3786         fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
3787 -       terminfo.c tparm.c
3788 +       terminfo.c tparm.c graphics.c
3789  libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
3790         -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
3791         -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
3792 @@ -79,8 +79,14 @@
3793  HERCULES_FLAGS =
3794  endif
3795  
3796 +if GRAPHICS_SUPPORT
3797 +GRAPHICS_FLAGS = -DSUPPORT_GRAPHICS=1
3798 +else
3799 +GRAPHICS_FLAGS =
3800 +endif
3801 +
3802  STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
3803 -       $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS)
3804 +       $(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS)
3805  
3806  STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
3807  STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
3808 @@ -90,7 +96,8 @@
3809         cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
3810         fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
3811         fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \
3812 -       hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c
3813 +       hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c \
3814 +       graphics.c
3815  pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
3816  pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
3817  pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)
3818 diff -Naur grub-0.97.orig/stage2/shared.h grub-0.97/stage2/shared.h
3819 --- grub-0.97.orig/stage2/shared.h      2004-06-19 09:40:09.000000000 -0700
3820 +++ grub-0.97/stage2/shared.h   2006-07-04 00:01:50.000000000 -0700
3821 @@ -499,7 +499,11 @@
3822    unsigned char linear_reserved_field_position;
3823    unsigned long max_pixel_clock;
3824  
3825 -  unsigned char reserved3[189];
3826 +  /* Reserved field to make structure to be 256 bytes long, VESA BIOS 
3827 +     Extension 3.0 Specification says to reserve 189 bytes here but 
3828 +     that doesn't make structure to be 256 bytes.  So additional one is 
3829 +     added here.  */
3830 +  unsigned char reserved3[189 + 1];
3831  } __attribute__ ((packed));
3832  
3833  
3834 @@ -792,6 +796,11 @@
3835  /* Set the cursor position. */
3836  void gotoxy (int x, int y);
3837  
3838 +/* Internal pager
3839 +   Returns 1 = if pager was used
3840 +           0 = if pager wasn't used  */
3841 +int do_more (void);
3842 +
3843  /* Displays an ASCII character.  IBM displays will translate some
3844     characters to special graphical ones (see the DISP_* constants). */
3845  void grub_putchar (int c);
3846 @@ -871,6 +880,7 @@
3847  int grub_tolower (int c);
3848  int grub_isspace (int c);
3849  int grub_strncat (char *s1, const char *s2, int n);
3850 +void grub_memcpy(void *dest, const void *src, int len);
3851  void *grub_memmove (void *to, const void *from, int len);
3852  void *grub_memset (void *start, int c, int len);
3853  int grub_strncat (char *s1, const char *s2, int n);
3854 @@ -911,7 +921,7 @@
3855  int nul_terminate (char *str);
3856  int get_based_digit (int c, int base);
3857  int safe_parse_maxint (char **str_ptr, int *myint_ptr);
3858 -int memcheck (int start, int len);
3859 +int memcheck (unsigned long int start, unsigned long int len);
3860  void grub_putstr (const char *str);
3861  
3862  #ifndef NO_DECOMPRESSION
3863 diff -Naur grub-0.97.orig/stage2/stage2.c grub-0.97/stage2/stage2.c
3864 --- grub-0.97.orig/stage2/stage2.c      2005-03-19 09:51:57.000000000 -0800
3865 +++ grub-0.97/stage2/stage2.c   2006-07-04 00:01:50.000000000 -0700
3866 @@ -20,6 +20,12 @@
3867  #include <shared.h>
3868  #include <term.h>
3869  
3870 +#ifdef SUPPORT_GRAPHICS
3871 +# include <graphics.h>
3872 +#endif
3873 +
3874 +int col_start, col_end, row_start, box_size;
3875 +
3876  grub_jmp_buf restart_env;
3877  
3878  #if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS)
3879 @@ -105,13 +111,13 @@
3880    if (highlight && current_term->setcolorstate)
3881      current_term->setcolorstate (COLOR_STATE_HIGHLIGHT);
3882  
3883 -  gotoxy (2, y);
3884 +  gotoxy (2 + col_start, y);
3885    grub_putchar (' ');
3886 -  for (x = 3; x < 75; x++)
3887 +  for (x = 3 + col_start; x < (col_end - 5); x++)
3888      {
3889 -      if (*entry && x <= 72)
3890 +      if (*entry && x <= (col_end - 8))
3891         {
3892 -         if (x == 72)
3893 +         if (x == (col_end - 8))
3894             grub_putchar (DISP_RIGHT);
3895           else
3896             grub_putchar (*entry++);
3897 @@ -119,7 +125,7 @@
3898        else
3899         grub_putchar (' ');
3900      }
3901 -  gotoxy (74, y);
3902 +  gotoxy ((col_end - 6), y);
3903  
3904    if (current_term->setcolorstate)
3905      current_term->setcolorstate (COLOR_STATE_STANDARD);
3906 @@ -131,7 +137,7 @@
3907  {
3908    int i;
3909    
3910 -  gotoxy (77, y + 1);
3911 +  gotoxy ((col_end - 3), y + 1);
3912  
3913    if (first)
3914      grub_putchar (DISP_UP);
3915 @@ -151,14 +157,14 @@
3916         menu_entries++;
3917      }
3918  
3919 -  gotoxy (77, y + size);
3920 +  gotoxy ((col_end - 3), y + size);
3921  
3922    if (*menu_entries)
3923      grub_putchar (DISP_DOWN);
3924    else
3925      grub_putchar (' ');
3926  
3927 -  gotoxy (74, y + entryno + 1);
3928 +  gotoxy ((col_end - 6), y + entryno + 1);
3929  }
3930  
3931  static void
3932 @@ -196,30 +202,30 @@
3933    if (current_term->setcolorstate)
3934      current_term->setcolorstate (COLOR_STATE_NORMAL);
3935    
3936 -  gotoxy (1, y);
3937 +  gotoxy (1 + col_start, y);
3938  
3939    grub_putchar (DISP_UL);
3940 -  for (i = 0; i < 73; i++)
3941 +  for (i = col_start; i < (col_end - 7); i++)
3942      grub_putchar (DISP_HORIZ);
3943    grub_putchar (DISP_UR);
3944  
3945    i = 1;
3946    while (1)
3947      {
3948 -      gotoxy (1, y + i);
3949 +      gotoxy (1 + col_start, y + i);
3950  
3951        if (i > size)
3952         break;
3953        
3954        grub_putchar (DISP_VERT);
3955 -      gotoxy (75, y + i);
3956 +      gotoxy ((col_end - 5), y + i);
3957        grub_putchar (DISP_VERT);
3958  
3959        i++;
3960      }
3961  
3962    grub_putchar (DISP_LL);
3963 -  for (i = 0; i < 73; i++)
3964 +  for (i = col_start; i < (col_end - 7); i++)
3965      grub_putchar (DISP_HORIZ);
3966    grub_putchar (DISP_LR);
3967  
3968 @@ -233,6 +239,7 @@
3969  {
3970    int c, time1, time2 = -1, first_entry = 0;
3971    char *cur_entry = 0;
3972 +  struct term_entry *prev_term = NULL;
3973  
3974    /*
3975     *  Main loop for menu UI.
3976 @@ -250,6 +257,22 @@
3977         }
3978      }
3979  
3980 +  col_start = 0;
3981 +  col_end = 80;
3982 +  row_start = 0;
3983 +  box_size = 12;
3984 +  /* if we're using viewport we need to make sure to setup
3985 +     coordinates correctly.  */
3986 +#ifdef SUPPORT_GRAPHICS
3987 +  if (grub_memcmp (current_term->name, "graphics", sizeof ("graphics") - 1) == 0)
3988 +    {
3989 +      col_start = view_x0;
3990 +      col_end = view_x1;
3991 +      row_start = view_y0;
3992 +      box_size = (view_y1 - view_y0) - 13;
3993 +    }
3994 +#endif
3995 +
3996    /* If the timeout was expired or wasn't set, force to show the menu
3997       interface. */
3998    if (grub_timeout < 0)
3999 @@ -302,36 +325,36 @@
4000        if (current_term->flags & TERM_DUMB)
4001         print_entries_raw (num_entries, first_entry, menu_entries);
4002        else
4003 -       print_border (3, 12);
4004 +       print_border (3 + row_start, box_size);
4005  
4006        grub_printf ("\n\
4007 -      Use the %c and %c keys to select which entry is highlighted.\n",
4008 +    Use the %c and %c keys to select which entry is highlighted.\n",
4009                    DISP_UP, DISP_DOWN);
4010        
4011        if (! auth && password)
4012         {
4013           printf ("\
4014 -      Press enter to boot the selected OS or \'p\' to enter a\n\
4015 -      password to unlock the next set of features.");
4016 +    Press enter to boot the selected OS or \'p\' to enter a\n\
4017 +    password to unlock the next set of features.");
4018         }
4019        else
4020         {
4021           if (config_entries)
4022             printf ("\
4023 -      Press enter to boot the selected OS, \'e\' to edit the\n\
4024 -      commands before booting, or \'c\' for a command-line.");
4025 +    Press enter to boot the selected OS, \'e\' to edit the\n\
4026 +    commands before booting, or \'c\' for a command-line.");
4027           else
4028             printf ("\
4029 -      Press \'b\' to boot, \'e\' to edit the selected command in the\n\
4030 -      boot sequence, \'c\' for a command-line, \'o\' to open a new line\n\
4031 -      after (\'O\' for before) the selected line, \'d\' to remove the\n\
4032 -      selected line, or escape to go back to the main menu.");
4033 +    Press \'b\' to boot, \'e\' to edit the selected command in the\n\
4034 +    boot sequence, \'c\' for a command-line, \'o\' to open a new line\n\
4035 +    after (\'O\' for before) the selected line, \'d\' to remove the\n\
4036 +    selected line, or escape to go back to the main menu.");
4037         }
4038  
4039        if (current_term->flags & TERM_DUMB)
4040         grub_printf ("\n\nThe selected entry is %d ", entryno);
4041        else
4042 -       print_entries (3, 12, first_entry, entryno, menu_entries);
4043 +       print_entries (3 + row_start, box_size, first_entry, entryno, menu_entries);
4044      }
4045  
4046    /* XX using RT clock now, need to initialize value */
4047 @@ -358,10 +381,10 @@
4048                            entryno, grub_timeout);
4049           else
4050             {
4051 -             gotoxy (3, 22);
4052 -             grub_printf ("The highlighted entry will be booted automatically in %d seconds.    ",
4053 +             gotoxy (3 + col_start, 10 + box_size + row_start);
4054 +             grub_printf (" The highlighted entry will be booted automatically in %d seconds.   ",
4055                            grub_timeout);
4056 -             gotoxy (74, 4 + entryno);
4057 +             gotoxy ((col_end - 6), 4 + entryno + row_start);
4058           }
4059           
4060           grub_timeout--;
4061 @@ -387,12 +410,12 @@
4062               if (current_term->flags & TERM_DUMB)
4063                 grub_putchar ('\r');
4064               else
4065 -               gotoxy (3, 22);
4066 +               gotoxy (3 + col_start, 10 + box_size + row_start);
4067               printf ("                                                                    ");
4068               grub_timeout = -1;
4069               fallback_entryno = -1;
4070               if (! (current_term->flags & TERM_DUMB))
4071 -               gotoxy (74, 4 + entryno);
4072 +               gotoxy ((col_end - 6), 4 + entryno + row_start);
4073             }
4074  
4075           /* We told them above (at least in SUPPORT_SERIAL) to use
4076 @@ -408,12 +431,12 @@
4077                 {
4078                   if (entryno > 0)
4079                     {
4080 -                     print_entry (4 + entryno, 0,
4081 +                     print_entry (4 + entryno + row_start, 0,
4082                                    get_entry (menu_entries,
4083                                               first_entry + entryno,
4084                                               0));
4085                       entryno--;
4086 -                     print_entry (4 + entryno, 1,
4087 +                     print_entry (4 + entryno + row_start, 1,
4088                                    get_entry (menu_entries,
4089                                               first_entry + entryno,
4090                                               0));
4091 @@ -421,7 +444,7 @@
4092                   else if (first_entry > 0)
4093                     {
4094                       first_entry--;
4095 -                     print_entries (3, 12, first_entry, entryno,
4096 +                     print_entries (3 + row_start, box_size, first_entry, entryno,
4097                                      menu_entries);
4098                     }
4099                 }
4100 @@ -433,29 +456,29 @@
4101                 entryno++;
4102               else
4103                 {
4104 -                 if (entryno < 11)
4105 +                 if (entryno < (box_size - 1))
4106                     {
4107 -                     print_entry (4 + entryno, 0,
4108 +                     print_entry (4 + entryno + row_start, 0,
4109                                    get_entry (menu_entries,
4110                                               first_entry + entryno,
4111                                               0));
4112                       entryno++;
4113 -                     print_entry (4 + entryno, 1,
4114 +                     print_entry (4 + entryno + row_start, 1,
4115                                    get_entry (menu_entries,
4116                                               first_entry + entryno,
4117                                               0));
4118                   }
4119 -               else if (num_entries > 12 + first_entry)
4120 +               else if (num_entries > box_size + first_entry)
4121                   {
4122                     first_entry++;
4123 -                   print_entries (3, 12, first_entry, entryno, menu_entries);
4124 +                   print_entries (3 + row_start, box_size, first_entry, entryno, menu_entries);
4125                   }
4126                 }
4127             }
4128           else if (c == 7)
4129             {
4130               /* Page Up */
4131 -             first_entry -= 12;
4132 +             first_entry -= box_size;
4133               if (first_entry < 0)
4134                 {
4135                   entryno += first_entry;
4136 @@ -463,20 +486,20 @@
4137                   if (entryno < 0)
4138                     entryno = 0;
4139                 }
4140 -             print_entries (3, 12, first_entry, entryno, menu_entries);
4141 +             print_entries (3 + row_start, box_size, first_entry, entryno, menu_entries);
4142             }
4143           else if (c == 3)
4144             {
4145               /* Page Down */
4146 -             first_entry += 12;
4147 +             first_entry += box_size;
4148               if (first_entry + entryno + 1 >= num_entries)
4149                 {
4150 -                 first_entry = num_entries - 12;
4151 +                 first_entry = num_entries - box_size;
4152                   if (first_entry < 0)
4153                     first_entry = 0;
4154                   entryno = num_entries - first_entry - 1;
4155                 }
4156 -             print_entries (3, 12, first_entry, entryno, menu_entries);
4157 +             print_entries (3 + row_start, box_size, first_entry, entryno, menu_entries);
4158             }
4159  
4160           if (config_entries)
4161 @@ -489,7 +512,7 @@
4162               if ((c == 'd') || (c == 'o') || (c == 'O'))
4163                 {
4164                   if (! (current_term->flags & TERM_DUMB))
4165 -                   print_entry (4 + entryno, 0,
4166 +                   print_entry (4 + entryno + row_start, 0,
4167                                  get_entry (menu_entries,
4168                                             first_entry + entryno,
4169                                             0));
4170 @@ -537,7 +560,7 @@
4171  
4172                       if (entryno >= num_entries)
4173                         entryno--;
4174 -                     if (first_entry && num_entries < 12 + first_entry)
4175 +                     if (first_entry && num_entries < box_size + first_entry)
4176                         first_entry--;
4177                     }
4178  
4179 @@ -549,7 +572,7 @@
4180                       grub_printf ("\n");
4181                     }
4182                   else
4183 -                   print_entries (3, 12, first_entry, entryno, menu_entries);
4184 +                   print_entries (3 + row_start, box_size, first_entry, entryno, menu_entries);
4185                 }
4186  
4187               cur_entry = menu_entries;
4188 @@ -570,7 +593,7 @@
4189                   if (current_term->flags & TERM_DUMB)
4190                     grub_printf ("\r                                    ");
4191                   else
4192 -                   gotoxy (1, 21);
4193 +                   gotoxy (1 + col_start, 9 + box_size + row_start);
4194  
4195                   /* Wipe out the previously entered password */
4196                   grub_memset (entered, 0, sizeof (entered));
4197 @@ -651,7 +674,10 @@
4198                   *(new_heap++) = 0;
4199  
4200                   if (config_entries)
4201 -                   run_menu (heap, NULL, new_num_entries, new_heap, 0);
4202 +                   {
4203 +                     current_entryno = first_entry + entryno;
4204 +                     run_menu (heap, NULL, new_num_entries, new_heap, 0);
4205 +                   }
4206                   else
4207                     {
4208                       cls ();
4209 @@ -714,6 +740,15 @@
4210    
4211    cls ();
4212    setcursor (1);
4213 +  /* if our terminal needed initialization, we should shut it down
4214 +   * before booting the kernel, but we want to save what it was so
4215 +   * we can come back if needed */
4216 +  prev_term = current_term;
4217 +  if (current_term->shutdown) 
4218 +    {
4219 +      current_term->shutdown();
4220 +      current_term = term_table; /* assumption: console is first */
4221 +    }
4222    
4223    while (1)
4224      {
4225 @@ -727,7 +762,8 @@
4226         cur_entry = get_entry (config_entries, first_entry + entryno, 1);
4227  
4228        /* Set CURRENT_ENTRYNO for the command "savedefault".  */
4229 -      current_entryno = first_entry + entryno;
4230 +      if (config_entries)
4231 +       current_entryno = first_entry + entryno;
4232        
4233        if (run_script (cur_entry, heap))
4234         {
4235 @@ -748,6 +784,13 @@
4236         break;
4237      }
4238  
4239 +  /* if we get back here, we should go back to what our term was before */
4240 +  current_term = prev_term;
4241 +  if (current_term->startup)
4242 +      /* if our terminal fails to initialize, fall back to console since
4243 +       * it should always work */
4244 +      if (current_term->startup() == 0)
4245 +          current_term = term_table; /* we know that console is first */
4246    show_menu = 1;
4247    goto restart;
4248  }
4249 @@ -891,8 +934,18 @@
4250               len = grub_read (buf, sizeof (buf));
4251               if (len > 0)
4252                 {
4253 +                 char *tmp;
4254 +                 char *def;
4255                   buf[sizeof (buf) - 1] = 0;
4256 -                 safe_parse_maxint (&p, &saved_entryno);
4257 +
4258 +                 if((tmp = grub_strstr(p, ":")) != NULL)
4259 +                 {
4260 +                   *tmp++;
4261 +                   grub_memcpy(&def, &tmp, sizeof(p));
4262 +                 }else
4263 +                   grub_memcpy(&def, &p, sizeof(p));
4264 +                 
4265 +                 safe_parse_maxint (&def, &saved_entryno);
4266                 }
4267  
4268               grub_close ();
4269 @@ -1050,6 +1103,16 @@
4270           while (is_preset);
4271         }
4272  
4273 +      /* go ahead and make sure the terminal is setup */
4274 +      if (current_term->startup)
4275 +       {
4276 +         /* If initialization fails, go back to default terminal */
4277 +         if (current_term->startup() == 0)
4278 +                 {
4279 +                     current_term = term_table;
4280 +                 }
4281 +       }
4282 +
4283        if (! num_entries)
4284         {
4285           /* If no acceptable config file, goto command-line, starting
4286 diff -Naur grub-0.97.orig/stage2/term.h grub-0.97/stage2/term.h
4287 --- grub-0.97.orig/stage2/term.h        2003-07-09 04:45:53.000000000 -0700
4288 +++ grub-0.97/stage2/term.h     2006-07-03 23:58:41.000000000 -0700
4289 @@ -60,6 +60,8 @@
4290    const char *name;
4291    /* The feature flags defined above.  */
4292    unsigned long flags;
4293 +  /* Default for maximum number of lines if not specified */
4294 +  unsigned short max_lines;
4295    /* Put a character.  */
4296    void (*putchar) (int c);
4297    /* Check if any input character is available.  */
4298 @@ -79,6 +81,10 @@
4299    void (*setcolor) (int normal_color, int highlight_color);
4300    /* Turn on/off the cursor.  */
4301    int (*setcursor) (int on);
4302 +  /* function to start a terminal */
4303 +  int (*startup) (void);
4304 +  /* function to use to shutdown a terminal */
4305 +  void (*shutdown) (void);
4306  };
4307  
4308  /* This lists up available terminals.  */
4309 @@ -124,4 +130,24 @@
4310  int hercules_setcursor (int on);
4311  #endif
4312  
4313 +#ifdef SUPPORT_GRAPHICS
4314 +extern int foreground, background, window_border, graphics_inited, saved_videomode;
4315 +
4316 +void graphics_set_splash(char *splashfile);
4317 +int set_videomode(int mode);
4318 +int get_videomode(void);
4319 +void graphics_putchar (int c);
4320 +int graphics_getxy(void);
4321 +void graphics_gotoxy(int x, int y);
4322 +void graphics_cls(void);
4323 +void graphics_setcolorstate (color_state state);
4324 +void graphics_setcolor (int normal_color, int highlight_color);
4325 +int graphics_setcursor (int on);
4326 +int graphics_init(void);
4327 +void graphics_end(void);
4328 +
4329 +int hex(int v);
4330 +void graphics_set_palette(int idx, int red, int green, int blue);
4331 +#endif /* SUPPORT_GRAPHICS */
4332 +
4333  #endif /* ! GRUB_TERM_HEADER */
4334 diff -Naur grub-0.97.orig/THANKS grub-0.97/THANKS
4335 --- grub-0.97.orig/THANKS       2005-05-07 19:17:43.000000000 -0700
4336 +++ grub-0.97/THANKS    2006-07-04 00:01:50.000000000 -0700
4337 @@ -121,3 +121,4 @@
4338  Yedidyah Bar-David <didi@post.tau.ac.il>
4339  Yury V. Umanets <umka@namesys.com>
4340  Yuri Zaporogets <yuriz@ukr.net>
4341 +Vitaly Fertman <vitaly@namesys.com>
4342 diff -Naur grub-0.97.orig/util/grub-install.in grub-0.97/util/grub-install.in
4343 --- grub-0.97.orig/util/grub-install.in 2004-07-24 11:57:31.000000000 -0700
4344 +++ grub-0.97/util/grub-install.in      2006-07-04 00:01:50.000000000 -0700
4345 @@ -81,6 +81,50 @@
4346  EOF
4347  }
4348  
4349 +# Usage: getraid_mdadm mddevice
4350 +# Routine to find a physical device from an md device
4351 +# If found, the first grub BIOS device (from device.map) is returned 
4352 +# If no BIOS drives match the RAID devices, the first device returned
4353 +# from mdadm -D is returned
4354 +getraid_mdadm() {
4355 +       device=$1
4356 +       mdadm=$(mdadm -D "$device") || {
4357 +               echo "$PROG: mdadm -D $device failed" >&2
4358 +               exit 1
4359 +       }
4360 +       eval "$(
4361 +               echo "$mdadm" | awk '
4362 +                       $1 == "Number" && $2 == "Major" { start = 1; next }
4363 +                       $1 == "UUID" { print "uuid=" $3; start = 0; next }
4364 +                       !start { next }
4365 +                       $2 == 0 && $3 == 0 { next }
4366 +                       { devices = devices "\n" $NF }
4367 +                       END { print "devices='\''" devices "'\''" }
4368 +               '
4369 +       )"
4370 +
4371 +       # Convert RAID devices list into a list of disks
4372 +       tmp_disks=`echo "$devices" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
4373 +                                        -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
4374 +                                        -e 's%\(fd[0-9]*\)$%\1%' \
4375 +                                        -e 's%/part[0-9]*$%/disc%' \
4376 +                                        -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \
4377 +                                        -e '/^$/d' |
4378 +                                    sed -n '1h;2,$H;${g;s/\n/|/g;p}'`
4379 +
4380 +       # Find first BIOS disk that's a member of the RAID array
4381 +       # Default to first RAID member if no tmp_disks are BIOS devices
4382 +       set -- `egrep $tmp_disks $device_map | \
4383 +               sort | \
4384 +               sed -n 1p `
4385 +       device=${2:-${tmp_disks%%|*}}
4386 +
4387 +       # Return first partition on BIOS disk that's part of the RAID
4388 +       echo "$devices" | \
4389 +               sed -n "\:${device}:p" | \
4390 +               sed -n 1p
4391 +}
4392 +
4393  # Usage: convert os_device
4394  # Convert an OS device to the corresponding GRUB drive.
4395  # This part is OS-specific.
4396 @@ -96,6 +140,10 @@
4397      # Break the device name into the disk part and the partition part.
4398      case "$host_os" in
4399      linux*)
4400 +       # Find an actual physical device if we're passed a RAID device
4401 +       case $1 in
4402 +               /dev/md*)  set -- `getraid_mdadm $1`
4403 +       esac
4404         tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
4405                                   -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
4406                                   -e 's%\(fd[0-9]*\)$%\1%' \
4407 @@ -112,8 +160,8 @@
4408         tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
4409         tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;;
4410      freebsd* | kfreebsd*-gnu)
4411 -       tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%r\1%' \
4412 -                           | sed 's%r\{0,1\}\(da[0-9]*\).*$%r\1%'`
4413 +       tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%\1%' \
4414 +                           | sed 's%r\{0,1\}\(da[0-9]*\).*$%\1%'`
4415         tmp_part=`echo "$1" \
4416             | sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \
4417                     | sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"`
4418 @@ -131,7 +179,7 @@
4419  
4420      # Get the drive name.
4421      tmp_drive=`grep -v '^#' $device_map | grep "$tmp_disk *$" \
4422 -       | sed 's%.*\(([hf]d[0-9][a-g0-9,]*)\).*%\1%'`
4423 +       | sed 's%.*\(([hf]d[0-9][a-z0-9,]*)\).*%\1%'`
4424  
4425      # If not found, print an error message and exit.
4426      if test "x$tmp_drive" = x; then
4427 @@ -148,13 +196,13 @@
4428         gnu*)
4429             if echo $tmp_part | grep "^s" >/dev/null; then
4430                 tmp_pc_slice=`echo $tmp_part \
4431 -                   | sed "s%s\([0-9]*\)[a-g]*$%\1%"`
4432 +                   | sed "s%s\([0-9]*\)[a-z]*$%\1%"`
4433                 tmp_drive=`echo "$tmp_drive" \
4434                     | sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"`
4435             fi
4436 -           if echo $tmp_part | grep "[a-g]$" >/dev/null; then
4437 +           if echo $tmp_part | grep "[a-z]$" >/dev/null; then
4438                 tmp_bsd_partition=`echo "$tmp_part" \
4439 -                   | sed "s%[^a-g]*\([a-g]\)$%\1%"`
4440 +                   | sed "s%[^a-z]*\([a-z]\)$%\1%"`
4441                 tmp_drive=`echo "$tmp_drive" \
4442                     | sed "s%)%,$tmp_bsd_partition)%"`
4443             fi
4444 @@ -336,6 +384,10 @@
4445      # Create a safe temporary file.
4446      test -n "$mklog" && log_file=`$mklog`
4447  
4448 +    # Before all invocations of the grub shell, call sync to make sure
4449 +    # the raw device is in sync with any bufferring in filesystems.
4450 +    sync
4451
4452      $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
4453  quit
4454  EOF
4455 @@ -450,6 +502,24 @@
4456  # Create a safe temporary file.
4457  test -n "$mklog" && log_file=`$mklog`
4458  
4459 +# Sync to prevent GRUB from not finding stage files (notably, on XFS)
4460 +sync
4461 +
4462 +# XFS needs special magic
4463 +xfs_frozen=false
4464 +if which xfs_freeze > /dev/null ; then
4465 +  cat << EOF
4466 +Due to a bug in xfs_freeze, the following command might produce a segmentation
4467 +fault when ${grubdir} is not in an XFS filesystem. This error is harmless and
4468 +can be ignored.
4469 +EOF
4470 +  if xfs_freeze -f ${grubdir} ; then xfs_frozen=true ; fi
4471 +fi
4472 +
4473 +# Before all invocations of the grub shell, call sync to make sure
4474 +# the raw device is in sync with any bufferring in filesystems.
4475 +sync
4476 +
4477  # Now perform the installation.
4478  $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
4479  root $root_drive
4480 @@ -457,6 +527,10 @@
4481  quit
4482  EOF
4483  
4484 +if ${xfs_frozen} ; then
4485 +  xfs_freeze -u ${grubdir}
4486 +fi
4487 +
4488  if grep "Error [0-9]*: " $log_file >/dev/null || test $debug = yes; then
4489      cat $log_file 1>&2
4490      exit 1