NEWS - list of user-visible changes between releases of GRUB

New in 0.97 - 2005-05-08:
* Fix the prototypes and the definitions of nested functions. This was
  required for gcc-4.
* Implement a more robust workaround for buggy BIOSes which don't pass
  boot drive correctly (notably for HP Vectra).

New in 0.96 - 2005-01-30:
* The command "fallback" supports mutiple fallback entries.
* The command "savedefault" supports an optional argument which
  is the number of next boot entry or the special keyword `fallback'.
* New utility "grub-set-default".
* New section "Making your system robust" in the manual.

New in 0.95 - 2004-06-13:
* Add support for ReiserFS 3.
* Fix support for FreeBSD 5.
* Support ATARAID for Linux in the grub shell and grub-install.
* Add CDROM support for El Torito with no emulation mode. You can use
  (cd) as a CDROM drive in the config file.
* Option --no-mem-option is implied for Linux 2.4.18 and newer.
* Add support for UFS2.

New in 0.94 - 2004-01-25:
* Support building on x86-64 with gcc -m32.
* Use a BIOS call to turn on/off Gate A20. This should solve various
  problems related to Gate A20 in modern BIOSes.
* Add a workaround for buggy BIOSes (notably HP Vectra series) which
  don't pass the boot drive correctly.
* Display "GNU GRUB" instead of "GRUB" in the menu.
* Add support for QNX RTP into the grub shell.
* Add support for the initrd max address of a kernel header in Linux.
* Support 32 bit and 64 bit dev_t.
* Add support for an install device in GRUB's notation with no
  parenthesis (e.g. grub-install hd0).
* Improve the manual a lot.

New in 0.93 - 2002-12-08:
* Define the behavior of the boot loader when the load end address is
  zero and the bss end address is zero in the Multiboot Specification.
  Also, add the support into GRUB.
* Finally, we have a Bug Tracking System! Now the preferable way to
  report bugs is to use the BTS rather than sending e-mail to bug-grub.
  See <http://bugcomm.enbug.org/?project=grub&mode=project>, for more
  details.
* The appendix "FAQ" in the manual is removed. See the GNU GRUB FAQ on
  the web <http://www.gnu.org/software/grub/grub-faq.html> instead.
* The terminal handling code is rewritten radically, and many bugfixes
  are made at the same time.
* The command "color" is effective even in the command-line.
* The command "terminal" takes two new options, ``--no-echo'' and
  ``--no-edit''. If you specify ``--no-echo'', GRUB won't echo back
  input characters. If you specify ``--no-edit'', GRUB will disable the
  BASH-like editing feature. These options are useful when using an
  intelligent terminal (such as the comint mode in GNU Emacs).
* The utility ``grub-md5-crypt'' prompts to retype a password and checks
  if the passwords match.
* Support for booting Linux is rewritten, so GRUB now supports
  large-EBDA systems.
* The menu interfaces supports Page Up, Page Down, and Right Key.
* New command "terminfo", for vt100-incompatible terminals.
* New options, ``-D'', ``-g'' and ``-m'' are supported for FreeBSD.

New in 0.92 - 2002-04-30:
* The command "displaymem" uses only hex digits for consistency.
* The netboot code goes back to the progress bars instead of dots, for
  the notation of data transfers. And, that is displayed only in debug
  mode, that is to say, nothing is displayed by default. Remember that
  you can turn on debug mode via the command "debug".
* The command "help" doesn't show all the available commands by default,
  when no argument is specified. Rarely used commands (such as
  "testload") and useless commands in interactive use (such as
  "savedefault") are hidden. If you want to see help messages for those
  commands, specify the new option "--all".
* A built-in, `more'-like pager is added. When a command prints too many
  lines to fit the screen, GRUB waits until you hit return key. This
  feature can be turned off by the new command "pager".
* The command "terminal" accepts a new option, "--lines=LINES". You can
  set the maximum number of lines arbitrarily with this option. If you
  don't specify it, the maximum number will be 24.
* The command "terminal" accepts another new option, "--silent". You can
  suppress the "Press any key to continue" message with this option.
* The mem= option for Linux is recognized and used to limit the maximum
  address of initrd.
* A fallback entry is executed immediately after a default entry,
  without prompting a user's intervention, as the manual has ever been
  saying.
* The utility ``grub-install'' makes sure that GRUB images have been
  written to a physical disk completely. To assist this feature, a new
  command "dump" is added.

New in 0.91 - 2002-01-21:
* Support for Linux DAC960 is added.
* JFS and XFS support is added.
* The commands "hide" and "unhide" support logical partitions.
* The utility ``grub-install'' supports NetBSD.
* The network support is updated to Etherboot-5.0.5.
* The manner of handling the preset menu changes. In the previous
  implementation, the preset menu is used only when opening the
  configuration file failed. Now try to use the preset menu first. And,
  if the configuration file is available, it is read after readoing the
  preset menu. In this case, menu entries in the preset menu (if any)
  are overrided by the configuration file.
* Diskless support is a bit changed. In the previous, GRUB set up a
  network automatically via a special function. In the current, the
  function is gone and the preset menu feature is used (i.e. just
  execute the command "bootp" as if you specified it in the preset
  menu). This has no impact against most users, but you should take care
  if using the preset menu for your own purpose, because GRUB doesn't
  call "bootp" implicitly when the preset menu is used explicitly. In
  this case, you would probably need to insert commands to initialize a
  network into your preset menu.
* Important bugfixes are made for ReiserFS, APM, TFTP, LBA, etc.

New in 0.90 - 2001-07-11:
* The command "setkey" resets key mappings, when no argument is
  specified.
* Linux devfs support is added.
* The utility ``grub-install'' accepts a new option, `--recheck'. If
  this option is specified, probe a device map, even if it already
  exists. You should use this option whenever you add/remove a disk.
* The command "password" supports a md5 password if the option `--md5'
  is given.  This command can now also be used to protect specific menu
  items with their own passwords.
* New command, "displayapm".
* New command, "md5crypt".
* The new utility ``grub-md5-crypt'' is a frontend of the grub shell. It
  encrypts a password in MD5 format.
* New commands, "testvbe" and "vbeprobe".
* The configure script accepts a new option, `--enable-preset-menu'. You
  can embed an arbitrary configuration which will be used when Stage 2
  cannot open a real configuration file, with this option. The argument
  must be an existing file.
* EZ-BIOS support is added.
* Booting Windows from a logical partition is supported.
* The example Multiboot kernel in the directory "docs" is built, if you
  specify the option `--enable-example-kernel' to the configure script.
* New command, "ifconfig".
* Linux software RAID support is added (only for RAID-1).
* Hercules support is added.
* The configure script now accepts `--disable-auto-linux-mem-opt', which
  has the same meaning as you specify the option `--no-mem-option' to the
  command "kernel".
* Jump to the physical entry address of a Multiboot kernel when booting
  it up. The old behavior was to use the virtual one, regardless of the
  setting of the physical address.
* The commands "bootp" and "dhcp" accepts a new option
  `--with-configfile', so that you can load a remotely specified
  configuration file automatically, like the network boot images.
* VSTa filesystem support is added.
* ELF symbol loading support is added.

New in 0.5.96 - 2000-10-04:
* New commands, "reboot" and "halt".
* New command, "hiddenmenu". You can hide the menu interface by default
  with this command.
* You can specify `--no-mem-option' to the command "kernel", if you want
  GRUB not to pass a Linux's mem option automatically.
* Now GRUB is compliant with the Linux/i386 boot protocol version 2.02.
* The network support is updated to Etherboot-4.6.4.
* Symlinks in ReiserFS are supported.
* Add a workaround into the grub shell, so that it works fine even under
  Linux 2.4.
* Add a new option `--stage2' into the commands "install" and "setup",
  to let the grub shell know what the file name of Stage 2 is under your
  operating system. You must specify the option correctly, if you cannot
  unmount the partition where GRUB images reside. We'd recommend _not_
  using those commands directly, but using the utility "grub-install"
  instead, because this is safer.
* One violation against the Network Boot Image Proposal was found and
  fixed. So now the image `nbgrub' can work fine even with a card such
  as rtl8139.
* Serial terminal support is added. The configure script accepts
  a new option `--disable-serial'. Unless it is specified, you can use
  two new commands, "serial" and "terminal" in the command-line and the
  menu. See the manual, for more details.
* Preserve the possible magic number used by Windows NT in a MBR.
* The command-line interface is switched to single-line editing mode.
* Only for developers: the configure script accepts
  `--enable-serial-speed-simulation', which is useful when you want to
  simulate the speed of a serial device on a psuedo terminal.
* Also only for developers: you can specify an optional argument to the
  option `--hold' for the grub shell. The argument means how many
  seconds the grub shell should wait until diving into the main routine.
* New command, "savedefault". Now you can save current entry number to
  your disk with this command and then you can set the default boot
  entry to it by the command "default saved".
* Add a new option `--prefix' into the command "setup", so that you can
  specify the name of a directory which contains GRUB images. And, the
  behavior of this command changed slightly, that is, this command now
  searchs stage1 automatically under "/boot/grub" and "/grub", unless
  you specify the option `--prefix'.
* The utility `grub-install' recognizes a separate boot partition
  automatically.
* New commands, "partnew" and "parttype". You can modify partition
  tables with these commands.

New in 0.5.95 - 2000-06-27:
* NetBSD ELF kernel support is added. You have to specify the new option
  to the command "kernel". See below.
* Added a new option `--type=TYPE' into the command "kernel". This
  option suggests what type of kernel you want to load. TYPE must be
  either of "netbsd", "freebsd", "openbsd", "linux", "biglinux" and
  "multiboot". Actually, this option will be necessary only if you want
  to load a NetBSD ELF kernel, because GRUB can automatically determine
  a kernel type in the other cases.
* ReiserFS support is added.
* Added a new option `--force-lba' into the command "install". This
  option disables some sanity checks for LBA mode (but not all). If you
  are sure that your machine supports LBA mode but GRUB doesn't work in
  LBA mode, you should specify it. It is necessary if your BIOS is too
  buggy. In the previous version, it was a compile-time option, but you
  don't have to recompile GRUB any longer.
* Likewise, now the command "setup" and the script "grub-install" also
  accept `--force-lba' option. Specifying this option to "setup" or
  "grub-install" has the same effect as to the command "install".
* The configure script doesn't accept the option
  `--disable-lba-support-bitmap-check' any longer. Use the option above.
* The network support is updated to Etherboot-4.6.1. So now we have
  3Com59x and DEPCA drivers.
* Now you can omit the configuration file argument to the command
  "password". If you omit it, then GRUB will just unlock privileged
  instructions (such as `c') when you enter a correct password.
* The new command "lock" can be used to prevent end-users from executing
  arbitrary menu entries. This command will emit an error until the user
  enters a correct password.
* Recognize the Linux extended partition type.
* Pass a correct memory size to Linux and *BSD.
* Diskless support is added. Now configure accepts --enable-diskless,
  and "make" will produce two additional images, ``nbgrub'' for Net Boot
  Image Proposal and ``pxegrub'' for Preboot Execution Environment. See
  the documentation, for more details.
* The command "tftpserver" overrides a TFTP server address returned by a
  BOOTP server, a DHCP server or a RARP server.
* Fix a serious bug about LBA support. It is possible that you don't
  disable the LBA support bitmap check any longer. Please send a report,
  if you must still disable it. We need to know if we should get rid of
  the option.

New in 0.5.94 - 2000-03-06:
* Stage 1 supports both the LBA mode and the CHS mode.
* The NetBSD and OpenBSD boot bug is fixed.
* The more automatic installation command "setup" is added.
* The command "embed" embeds a Stage 1.5 in the sectors after a MBR.
* Support symbolic color name syntax in the command "color".
* The grub shell loads the BIOS drive mapping information from a device
  map file if it is specified and can be opened. If not found, try to
  create it based on the guessed information.
* NetBSD support in the grub shell is improved.
* A simple checker for the format of a Multiboot kernel, ``mbchk'', is
  added.
* The command "find" searches for a filename in all devices and print
  the list of the devices which contain the file.
* The command "map" maps a drive to another drive so that we can
  chain-load some foolish operating systems (such as DOS) even if such
  an operating system resides at a non-first drive.
* The command "setkey" maps a key to another.
* The GRUB manual is rewritten, and now consists of three parts and
  appendices.
* The command "ioprobe" detects what I/O ports are used for a BIOS
  drive.
* OpenBSD support in the grub shell is improved.
* The command "install" can now patch a Stage 2 with a different
  filename from "/boot/grub/menu.lst" even if a Stage 1.5 is used.
* New program, ``grub-install''.
* The command "blocklist" prints the blocklist notation of a file.
* The command "chainloader" now accepts an option "--force", which is
  required if you want to chain-load a boot loader defective in the
  signature, such as SCO Unixware 7.1.
* The netboot support is heavily rewritten, based on Etherboot-4.4.3.
  Most of the device drivers are stolen from it, so we now have many
  network drivers. See netboot/README.netboot for more details.
* Now configure accepts the option `--disable-lba-support-bitmap-check'
  to ignore an incorrect LBA support bitmap returned by a buggy BIOS. If
  you are sure that your BIOS does support LBA mode but GRUB doesn't
  work in LBA mode, recompile GRUB with this option specified. You can
  check if GRUB accesses a drive in LBA mode by the command "geometry".
* New commands "bootp", "dhcp" and "rarp" can be used to initialize a
  network device and get IP addresses from a network.
* Long filename support in the FAT filesystem is added.
* The command "cmp" compares each bytes in two files.

New in 0.5.93 - 1999-10-30:
* ELF format of FreeBSD kernel is supported.
* Support the partition ids for NetBSD and OpenBSD.
* Exit from the grub shell just by pushing the key `q' in the menu.
* New options for configure can disable some functions in Stage 2. See
  the output from `configure --help' for more information.
* FAT32 support is added.
* Minix fs support is added.
* New commands "hide" and "unhide".
* The character `=' after a command is not necessary any longer, but it
  is supported for backward compatibility.
* The command "help" displays helpful information about builtin
  commands.
* The command "geometry" displays the information of a drive specified
  and set the geometry to arbitrary C/H/S values if the optional
  arguments are used.
* The command "configfile" loads a configuration file interactively.
* The command "device" assigns a BIOS drive to an arbitrary filename in
  the grub shell.
* The option `--no-floppy' force the grub shell to assume that there is
  no floppy, and the option `--probe-second-floppy' enables the probe of
  the second floppy drive.
* Integrated the netboot support in the Dresden version of GRUB.
* FreeBSD support in the grub shell is improved.
* Killing (C-u and C-k), yanking (C-y) and manipulating the history
  (C-p and C-n) are supported.
* The address argument for the command "install" is now optional.
* Better completion support.
* The command "cat" displays the contents of a file.

New in 0.5.92 - 1999-07-26:
* Bug fixes (i.e. Stage 1.5 can work fine again).
* The /sbin/grub stage2 simulator now works at least on GNU/Linux, and
  uses the Linux HDIO_GETGEO ioctl to determine hard disk geometry.
* TAB not only lists filenames, but also completes a filename when the
  filename is unique.
* Password is not echoed back, put an asterisk for each of input
  characters.
* stage2_debug is removed, and the debugging features are added into
  stage2.
* Color menu support.
* New command "quit".
* The man page for /sbin/grub.
* All documents become Texinfo.
* Linux video mode selection is supported.
* The new Stage 1 `stage1_lba' supports LBA addressing mode.

New in 0.5.91 - 1999-03-14, Gordon Matzigkeit:
* LBA and preliminary AWARD BIOS disk extension support.
* Started docs/grub.texi.
* /sbin/grub GUI now works (but it doesn't yet access disks properly).
  Run `configure --enable-sbin-grub' to build this program in the grub
  subdirectory.

New in 0.5.90 - 1999-03-01, Gordon Matzigkeit:
* Bug fixes.
* GRUB understands symlinks on ext2fs (but still not ffs).
* Many source code and build cleanups to comply with GNU standards.

New in 0.5 - 1998-08-20, Erich Boleyn:

* Improved error messages in the stage1 to be strings (easier to read
  than the previous case of single characters), and removed any
  display in the case of no error (less confusing).

* New document describing error conditions and messages.

* Improved configure/build process.

* Made the early bootup interrupt-safe.  Wasn't doing cli/sti when
  necessary sometimes.

* GRUB now shuts off the floppy before transferring control to any
  other programs/modules/loaders.  (chain-loading doesn't matter here,
  just loading 32-bit modules/kernels)

* Fixed a few stupid bugs, including a several in the ext2fs code.

* Linux boot format support extended from just "zImage" to include
  "bzImage" and initial ramdisk (also called "initrd") support for
  both.  "initrd" support is untested, but the critical parts were
  taken from a supplied patch and seem OK.

* Several new command features.  See the command-listing for details.

New in 0.4 - 1998-03-19, Erich Boleyn:

* GRUB now correctly points ES:SI at a partition descriptor when
  chain-loading.

* Many minor bugs fixed (some in the build scripts).

* Intel MPS 1.4 config/check code is totally new, and the "syscmd="
  command is completely removed.  Check command-listing for details.

Version 0.4-pre, Erich Boleyn:

* Reorganized docs, moved most "NOTE" items to a FAQ (with new entries
  as well).

* Now supports automatic decompression of any files loaded via the
  GRUB stage2 filesystem code.  Simply compress the file using GNU
  gzip normally, then when loading, the GRUB internals will see the
  contents in the decompressed state...  i.e. all GRUB functions
  operate normally as if it is the uncompressed file.  An extra
  version of the "module" loading function has been added which
  disables this functionality if desired (in all the other cases, not
  decompressing doesn't make sense).

* Changed device strings used in filesystem code to more logical
  format.  Added "relative" disk and partition capability, see
  command-listing and filesystem syntax description for details.

* "install=" command vastly improved.  Also moved to non-debug area.
  Check command-listing and install documentation for details.

* Added several new commands: "rootnoverify=", "uppermem=", and a new
  debug command "displaymem".  Check command-listing for details.

* Added versioning numbers (and subsequently broke compatibility with
  some of the previous code, so GRUB should be re-installed!).

* Added unattended booting support via new "fallback=" command.

* During debug probe of SMP configuration table compatible with Intel
  MPS 1.4 standard, GRUB now checks for a pointer in the EBDA.

* Using a "default=" entry greater than 11 caused the UI to do funny
  things (it didn't pre-scroll the list to the appropriate place).

* Reading files on FAT floppies had yet more problems related by many
  users of version 0.3 6/17/96.  Again, all known problems fixed.

* "Extended" partitions now work (still cannot make an extended
  partition active with "makeactive" command).

* The build environment is greatly simplified, now using an
  autoconf-like "configure" script.

New in 0.3-19960617 - 1996-06-17, Erich Boleyn:

* Yet more documentation improvements.

* Known bugs in floppy operation fixed (12-bit FAT didn't work for
  most cases, and inserting other floppies didn't flush the filesystem
  cache).

* NASTY uninitialized pointer bug causing "raw" floppy operation to
  crash on several PCs is now fixed.  This seems to have been the root
  cause of all of the compatibility problems that have currently been
  observed.

* debug-mode command added to automate most difficult step of
  installation for common cases (new install method #4).

* Testing "mini-debugger" now merged with command-line when "DEBUG"
  defined in compile (no SYSDEBUG option anymore).  See description of
  commands in the command-line for details.

New in 0.3-19960602 - 1996-06-02, Erich Boleyn:

* Completed initial licenses.

* Initial filesystem documentation written.

* Block-list and FAT filesystems now work as documented (in
  particular, for the blocklist filesystem, shortcuts like "+1" for
  "0+1,512" now work correctly).

* Fixed several problems (old and new) in the various filesystems (for
  example, the ext2fs filesystem code is now much faster, as it caches
  some mapping blocks where it didn't at all before).  Filesystem
  semantics are much more uniform as well (symbolic links and reading
  a directory as a file now return errors where it would silently fail
  before).

* "makeactive" now works for standard PC partitions on hard disks (not
  extended partitions...  so any PC partition number above 3 will give
  a "no such partition" error).  If a BSD sub-partition is is used, it
  will ignore it, and only use the primary PC partition number.

New in 0.3-19960520 - 1996-05-20, Erich Boleyn:

* Updated instructions (though still very sparse).

* New floppy probe (works much like the Linux floppy boot probe)
  attempts to find the size of a floppy in a drive.  Might still need
  work!  Please try on various floppy drives with various media!

* New floppy handler will claim a non-existent drive if the floppy
  disk isn't present in the drive.  (for example, it won't be on the
  list of installed drives unless a floppy is present)

* Stage1 now compatible with both a hard disk MBR and the DOS BIOS
  parameter block (see "install/README" for more details on how this
  can be used).

* Block-list filesystem partially works, as described in the file
  "NOTES".  Loading an a.out or elf kernel won't work with it, but all
  other filetypes pretty much should.  (certainly chain-loading works
  OK)

  NOTE: you must use the full format "0+1,512" for just he first
  block...  no parameters can be implicit in this version.. THis is
  being fixed too.

* Linux ext2 filesystem works.  (it's very slow for big files, but
  this is being fixed)

* Linux boot type now supported.  Use a standard piggybacked image as
  with LILO.  Put in hack to support >64MB via GRUB placing the RAM
  size as the first item on the command-line automatically.  Must pass
  root partition on command-line using normal Linux syntax...  if not,
  it uses it's builtin root partition.

* Supports chain-loading.  For details, see "COMMANDS" and the
  examples directory.  (was able to boot DOS and Windows NT on my test
  box).  NOTE that the "root partition" must be set to work right.
  "makeactive" is currently a no-op.

* Several weird bugs fixed.  One important note: If you recompile, it
  will warn about a clash with builtin "strcmp".  This is normal...
  do NOT remove the strcmp definition, as then GCC will possibly put
  inline code from it's own builtin function in some places. (my
  strcmp has slightly different functionality, hence the problem)

* Mini-debugger is currently broken.

New in 0.2 - 1996-04-12, Erich Boleyn:

* Completely new menu-based UI.  See "COMMANDS" and the examples
  directory for details.  NOTE that the argument to a command must be
  preceded by a space between it and the '=', in both the config file
  and the command-line.  This will be fixed.

New in 0.1 - 1996-03-31, Erich Boleyn:

* Newer version of Multiboot Standard (version 0.6) supported.

* Autodetects kernel types.  Supports Multiboot, FreeBSD, NetBSD
  (Linux isn't finished).

* Stage 1.5 works now.  Default setup is now for working with a BSD
  FFS floppy loading "/grub/stage2" as the main bootloader.

* Filesystem support improved.  It didn't work on many floppies before
  (problem with the partition-detection code).

* Memory probe now supports arbitrary amounts of RAM (some technical
  limitations exist, see Multiboot standard version 0.6 for details).

* A mini-debugger is included by default, activated by hitting '~' on
  the command-line (it might interfere with things, but it seems OK
  for my alpha-testing).  The commands are in the function
  "enter_sysdebug" defined in "common.c".  If you have an Intel MPS-
  compatible machine, there are extra commands enabled for SMP cpu
  testing.  'q' exits and goes back to what you were doing before.

New in 0.0-19960206 - 1996-02-06, Erich Boleyn:

* Newer version of Multiboot Standard (version 0.4) supported.

New in 0.0-19951210 - 1995-12-10, Erich Boleyn:

* You can now perform TAB-based completion listing of any valid
  partially completed disk/partition/file-name combination.  Try it
  out to see what you like, examples are in the NOTES file under
  "Device completion".

* Fixed a bug causing the memory size routine to sometimes report
  ridiculous values.

* Fixed some documentation (what little there is :-/ and a few
  assembly bugs in the BIOS access routines that nobody reported yet,
  so I won't detail it here.
