add a patch for grub-0.97 from LFS to fix segfaults on x86_64
[openwrt/svn-archive/archive.git] / target / linux / x86-2.6 / 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;