preserve a magic number used by Windows NT.

This commit is contained in:
okuji 2000-08-26 17:28:27 +00:00
parent 16cbb2b422
commit f1c162c0c6
9 changed files with 53 additions and 17 deletions

View file

@ -1,3 +1,23 @@
2000-08-27 OKUJI Yoshinori <okuji@gnu.org>
Preserve a magic number used by Windows NT in a MBR. Shit!
Reported by Khimenko Victor.
* stage1/stage1.h (STAGE1_WINDOWS_NT_MAGIC): New macro.
* stage1/stage1.S (copy_buffer): Use pusha and popa, instead of
pushing/poping %cx and %si separately, to reduce the code size.
(nt_magic): New label. Set the offset to _start plus
STAGE1_WINDOWS_NT_MAGIC
(part_start): New label.
* stage2/builtins.c (install_func): If DEST_DRIVE is a hard
disk, copy the possible partition table and Windows NT magic to
STAGE1_BUFFER from OLD_SECT.
2000-08-26 OKUJI Yoshinori <okuji@gnu.org>
* stage2/char_io.c (translate_keycode) [SUPPORT_SERIAL]: Don't
drain the input buffer, since that was irritating.
2000-08-26 OKUJI Yoshinori <okuji@gnu.org>
Don't save/restore fragile registers unnecessarily.

1
NEWS
View file

@ -24,6 +24,7 @@ New in 0.5.96 - XXXX-XX-XX:
a new option `--enable-serial'. If 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.
New in 0.5.95 - 2000-06-27:
* NetBSD ELF kernel support is added. You have to specify the new option

View file

@ -344,9 +344,8 @@ copy_buffer:
* We need to save %cx and %si because the startup code in
* stage2 uses them without initializing them.
*/
pushw %cx
pusha
pushw %ds
pushw %si
movw $0x100, %cx
movw %bx, %ds
@ -358,9 +357,8 @@ copy_buffer:
rep
movsw
popw %si
popw %ds
popw %cx
popa
/* boot stage2 */
jmp *(stage2_address)
@ -420,12 +418,21 @@ message:
jne 1b /* if not end of string, jmp to display */
ret
/*
* Windows NT breaks the compatibility by embedding a magic
* number here.
*/
nt_magic:
. = _start + STAGE1_WINDOWS_NT_MAGIC
/*
* This is where an MBR would go if on a hard disk. The code
* here isn't even referenced unless we're on a floppy. Kinda
* sneaky, huh?
*/
part_start:
. = _start + STAGE1_PARTSTART
probe_values:

View file

@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 1999 Free Software Foundation, Inc.
* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -51,6 +51,9 @@
/* The offset of STAGE2_SEGMENT. */
#define STAGE1_STAGE2_SEGMENT 0x48
/* The offset of a magic number used by Windows NT. */
#define STAGE1_WINDOWS_NT_MAGIC 0x1b8
/* The offset of the start of the partition table. */
#define STAGE1_PARTSTART 0x1be

View file

@ -1625,10 +1625,10 @@ install_func (char *arg, int flags)
BOOTSEC_BPB_LENGTH);
/* If for a hard disk, copy the possible MBR/extended part table. */
if ((dest_drive & 0x80) && current_partition == 0xFFFFFF)
grub_memmove (stage1_buffer + BOOTSEC_PART_OFFSET,
old_sect + BOOTSEC_PART_OFFSET,
BOOTSEC_PART_LENGTH);
if (dest_drive & 0x80)
grub_memmove (stage1_buffer + STAGE1_WINDOWS_NT_MAGIC,
old_sect + STAGE1_WINDOWS_NT_MAGIC,
STAGE1_PARTEND - STAGE1_WINDOWS_NT_MAGIC);
/* Check for the version and the signature of Stage 1. */
if (*((short *)(stage1_buffer + STAGE1_VER_MAJ_OFFS)) != COMPAT_VERSION

View file

@ -668,12 +668,6 @@ translate_keycode (int c)
break;
}
}
/* Drain the input buffer, because so-called VT100-compatible
terminals could send key codes which aren't handled in the
code above. */
while (checkkey () != -1)
(void) getkey ();
}
}
else

View file

@ -45,6 +45,10 @@ static struct divisor divisor_tab[] =
{ 115200, 0x0001 }
};
/* The position of the cursor. */
int serial_x;
int serial_y;
/* Read a byte from a port. */
static inline unsigned char

View file

@ -65,6 +65,13 @@
/* Turn on DTR, RTS, and OUT2. */
#define UART_ENABLE_MODEM 0x0B
/* Variable prototypes. */
/* In the serial terminal, trace the cursor in GRUB itself. */
extern int serial_x;
extern int serial_y;
/* Function prototypes. */

View file

@ -122,9 +122,9 @@ print_border (int y, int size)
#ifndef GRUB_UTIL
/* Color the menu. The menu is 75 * 14 characters. */
#ifdef SUPPORT_SERIAL
# ifdef SUPPORT_SERIAL
if (terminal & TERMINAL_CONSOLE)
#endif
# endif
{
for (i = 0; i < 14; i++)
{