Debian grub-0.5-2 release.

This commit is contained in:
gord 1999-02-22 03:11:52 +00:00
parent b117211d4a
commit 6b874486ce
4 changed files with 150 additions and 193 deletions

View file

@ -33,8 +33,8 @@ void (*debug_fs)(int) = NULL;
void (*debug_fs_func)(int) = NULL;
#endif /* NO_FANCY_STUFF */
/* these have the same format as "boot_drive" and "install_partition", but
are meant to be working values */
/* These have the same format as "boot_drive" and "install_partition", but
are meant to be working values. */
unsigned long current_drive = 0xFF;
unsigned long current_partition;
@ -543,7 +543,13 @@ open_partition(void)
/* XX used for device completion in 'set_device' and 'print_completions' */
static int incomplete, disk_choice, part_choice;
static int incomplete, disk_choice;
static enum
{
PART_UNSPECIFIED = 0,
PART_DISK,
PART_CHOSEN,
} part_choice;
char *
@ -554,7 +560,7 @@ set_device(char *device)
incomplete = 0;
disk_choice = 1;
part_choice = 0;
part_choice = PART_UNSPECIFIED;
current_drive = saved_drive;
current_partition = 0xFFFFFF;
@ -580,11 +586,12 @@ set_device(char *device)
if (*device == ')')
{
part_choice = 2;
part_choice = PART_CHOSEN;
retval++;
}
if (*device == ',')
{
/* Either an absolute PC or BSD partition. */
disk_choice = 0;
part_choice++;
device++;
@ -620,7 +627,7 @@ set_device(char *device)
if (*device == ')')
{
if (part_choice == 1)
if (part_choice == PART_DISK)
{
current_partition = saved_partition;
part_choice++;
@ -751,15 +758,14 @@ print_fsys_type(void)
printf(" Filesystem type ");
if (fsys_type != NUM_FSYS)
printf("is %s\n", fsys_table[fsys_type].name);
printf("is %s, ", fsys_table[fsys_type].name);
else
{
printf("unknown, ");
if (current_partition == 0xFFFFFF)
printf("using whole disk\n");
else
printf("partition type 0x%x\n", current_slice);
}
printf("unknown, ");
if (current_partition == 0xFFFFFF)
printf("using whole disk\n");
else
printf("partition type 0x%x\n", current_slice);
}
/*
@ -801,7 +807,7 @@ print_completions(char *filename)
else
{
/* partition completions */
if (part_choice == 1)
if (part_choice == PART_DISK)
{
printf(" Possible partitions are:\n");
real_open_partition(1);
@ -1064,4 +1070,3 @@ dir(char *dirname)
return (*(fsys_table[fsys_type].dir_func))(dirname);
}

View file

@ -27,17 +27,22 @@
#define MAXINT 0x7FFFFFFF
/* 512-byte scratch area */
#define SCRATCHADDR 0x77e00
#define SCRATCHSEG 0x77e0
/*
* This is the location of the raw device buffer. It is 31.5K
* in size.
*/
#define BUFFERSEG 0x7000
#define BUFFERADDR 0x70000
#define BUFFERLEN 0x7e00
#define BUFFERADDR 0x70000
#define BUFFERSEG 0x7000
/* 512-byte scratch area */
#define SCRATCHSEG 0x77e0
#define SCRATCHADDR 0x77e00
#if (BUFFERADDR + BUFFERLEN) != SCRATCHADDR
# error "scratch area isn't at the end of the device buffer"
#endif
/*
* BIOS disk defines
@ -47,12 +52,21 @@
#define BIOSDISK_ERROR_GEOMETRY 0x100
/*
* This is the location of the filesystem (not raw device) buffer.
* This is the filesystem (not raw device) buffer.
* It is 32K in size, do not overrun!
*/
#define FSYS_BUFLEN 0x8000
#define FSYS_BUF 0x68000
#if (FSYS_BUF % 16) != 0
# error "FSYS_BUF is not segment-aligned"
#endif
#if (FSYS_BUF + FSYS_BUFLEN) != BUFFERADDR
# error "device buffer buffer isn't at the end of the filesystem buffer"
#endif
/*
* Linux setup parameters
*/
@ -119,8 +133,6 @@
* defines for use when switching between real and protected mode
*/
#define data32 .byte 0x66
#define addr32 .byte 0x67
#define CR0_PE_ON 0x1
#define CR0_PE_OFF 0xfffffffe
#define PROT_MODE_CSEG 0x8

View file

@ -170,7 +170,7 @@ restart:
commands before booting, or \'c\' for a command-line.");
else
printf(
" Press \'b\' to boot, enter to edit the selected command in the
" Press \'b\' to boot, \'e\' to edit the selected command in the
boot sequence, \'c\' for a command-line, \'o\' to open a new line
after (\'O\' for before) the selected line, \'d\' to remove the
selected line, or escape to go back to the main menu.");
@ -336,8 +336,7 @@ restart:
}
else
{
if ((config_entries && (c == 'e'))
|| (!config_entries && ((c == '\n') || (c == '\r'))))
if (c == 'e')
{
int num_entries = 0, i = 0;
char *new_heap;
@ -435,14 +434,22 @@ restart:
if (!(c = enter_cmdline(cur_entry, heap)))
{
cur_entry = NULL;
first_entry = 0;
entryno = fallback;
fallback = -1;
if (fallback < 0)
break;
else
{
cur_entry = NULL;
first_entry = 0;
entryno = fallback;
fallback = -1;
}
}
}
while (!c);
/* Both the entry and the fallback failed, so wait for input. */
printf("Failed!\n Press any key to continue...");
getkey();
goto restart;
}

View file

@ -36,28 +36,18 @@
/* Absolute addresses
This makes the assembler generate the address without support
from the linker. (ELF can't relocate 16bit addresses!) */
from the linker. (ELF can't relocate 16-bit addresses!) */
#define ABS(x) (x-_start+0x7c00)
/* Relative addresses (for jumps)
These macros use the local label 0, so start with your local
label at 1! */
#define REL(x) .word x-0f; 0:
#define RELB(x) .byte x-0f; 0:
/* Print message string
movw $x, %cx; call message */
#define MSG(x) movw $x, %aw; .byte 0xe8; REL(message)
/* Print message string */
#define MSG(x) movw $x, %si; call message
.file "stage1.S"
.text
/*
* The ".code16" directive only works in GAS, the GNU assembler!
* This adds 32-bit data or addressing directives so that this
* code will work in real mode!
*/
/* Tell GAS to generate 16-bit instructions so that this code works
in real mode. */
.code16
.globl _start; _start:
@ -70,8 +60,7 @@
* parameter block.
*/
/* jmp after_BPB */
.byte 0xeb; RELB(after_BPB)
jmp after_BPB
nop /* do I care about this ??? */
/*
@ -115,11 +104,9 @@ after_BPB:
/*
* Check if we have a forced disk reference here
*/
/* movb firstlist, %al */
.byte 0xa0; .word ABS(firstlist)
movb firstlist, %al
cmpb $0xff, %al
/* je 1f */
.byte 0x74; RELB(1f)
je 1f
movb %al, %dl
1:
/* save drive reference first thing! */
@ -130,9 +117,7 @@ after_BPB:
*/
movb %dl, %al
andb $BIOS_HD_FLAG, %al
/* jz floppy_probe */
.byte 0x0f, 0x84; REL(floppy_probe)
jz floppy_probe
/*
* Determine the hard disk geometry from the BIOS!
@ -141,16 +126,14 @@ after_BPB:
int $0x13
/* if BIOS geometry call fails, display error and die! */
/* jc hd_probe_error (16-bit)*/
.byte 0x0f, 0x82; REL(hd_probe_error)
jc hd_probe_error
final_init:
/* save number of heads */
xorb %ah, %ah
movb %dh, %al
incw %ax
/* movw %ax, heads */ /* save num heads */
.byte 0xA3; .word ABS(heads)
movw %ax, heads
xorw %dx, %dx
movb %cl, %dl
@ -158,20 +141,17 @@ final_init:
movb %ch, %al
movb %dh, %ah
/* save number of cylinders */
incw %ax
/* movw %ax, cylinders */ /* save num cylinders */
.byte 0xA3; .word ABS(cylinders)
movw %ax, cylinders
xorw %ax, %ax
movb %dl, %al
shrb $2, %al
/* save a byte on addressing by moving this forward ?? */
/* save number of sectors */
movw $ABS(sectors), %si
/* movw %ax, (%si) */ /* save num sectors */
.byte 0x89, 0x04
movw %ax, (%si)
/* this sets up for the first run through "bootloop" */
movw $ABS(firstlist), %di
@ -183,86 +163,80 @@ bootloop:
/* update position to load from */
subw $LISTSIZ, %di
/* cmpw $0, 4(%di) */ /* check the number of sectors to read */
.byte 0x81, 0x7d, 0x04; .word 0
/* check the number of sectors to read */
cmpw $0, 4(%di)
/* je bootit (16-bit)*/ /* if zero, go to the start function */
.byte 0x0f, 0x84; REL(bootit)
/* if zero, go to the start function */
je bootit
/* movl (%di), %ax */ /* load logical sector start (bottom half) */
.byte 0x8b, 0x05
/* load logical sector start (bottom half) */
movw (%di), %ax
/* movl 2(%di), %dx */ /* load logical sector start (top half) */
.byte 0x8b, 0x55, 0x02
/* load logical sector start (top half) */
movw 2(%di), %dx
/* divw (%si), %dx:%ax */ /* divide by number of sectors */
.byte 0xf7, 0x34
/* divide by number of sectors */
divw (%si)
/* movb %dl, (%di) */ /* save sector start */
.byte 0x88, 0x15
/* save sector start */
movb %dl, (%di)
xorw %dx, %dx /* zero %dx */
/* divw 2(%si), %dx:%ax */ /* divide by number of heads */
.byte 0xf7, 0x74, 0x02
divw 2(%si) /* divide by number of heads */
/* movb %dl, 1(%di) */ /* save head start */
.byte 0x88, 0x55, 0x01
/* save head start */
movb %dl, 1(%di)
/* movw %ax, 2(%di) */ /* save cylinder start */
.byte 0x89, 0x45, 0x02
/* save cylinder start */
movw %ax, 2(%di)
/* cmpw 4(%si), %ax */ /* do we need too many cylinders? */
.byte 0x3b, 0x44, 0x04
/* jge geometry_error (16-bit) */
.byte 0x0f, 0x8d; REL(geometry_error)
/* do we need too many cylinders? */
cmpw 4(%si), %ax
jge geometry_error
setup_sectors:
/* determine the maximum sector length of this read */
/* movw (%si), %ax */ /* get number of sectors per track/head */
.byte 0x8b, 0x04
movw (%si), %ax /* get number of sectors per track/head */
/* subb (%di), %al */ /* subtract sector start */
.byte 0x2a, 0x05
/* subtract sector start */
subb (%di), %al
/* how many do we really want to read? */
/* cmpw %ax, 4(%di) */ /* compare against total number of sectors */
.byte 0x39, 0x45, 0x04
cmpw %ax, 4(%di) /* compare against total number of sectors */
/* jg more_sectors (8-bit)*/ /* which is greater? */
.byte 0x7f; RELB(more_sectors)
/* movw 4(%di), %ax */ /* if less than, set to total */
.byte 0x8b, 0x45, 0x04
/* which is greater? */
jg more_sectors
/* if less than, set to total */
movw 4(%di), %ax
more_sectors:
/* subw %ax, 4(%di) */ /* subtract from total */
.byte 0x29, 0x45, 0x04
/* subtract from total */
subw %ax, 4(%di)
/*
* This is the loop for taking care of BIOS geometry translation (ugh!)
*/
/* movb 3(%di), %dl */ /* get high bits of cylinder */
.byte 0x8a, 0x55, 0x03
/* get high bits of cylinder */
movb 3(%di), %dl
shlb $6, %dl /* shift left by 6 bits */
/* movw (%di), %cl */ /* get sector */
.byte 0x8b, 0x0d
movb (%di), %cl /* get sector */
incb %cl /* normalize sector (sectors go
from 1-N, not 0-(N-1) ) */
orb %dl, %cl /* composite together */
/* movb 2(%di), %ch */ /* sector+hcyl in cl, cylinder in ch */
.byte 0x8a, 0x6d, 0x02
movb 2(%di), %ch /* sector+hcyl in cl, cylinder in ch */
/* restore %dx */
popw %dx
pushw %dx
/* movb 1(%di), %dh */ /* head num */
.byte 0x8a, 0x75, 0x01
/* head number */
movb 1(%di), %dh
pushw %ax /* save %ax from destruction! */
@ -286,15 +260,13 @@ more_sectors:
movb $0x2, %ah /* function 2 */
int $0x13
/* jc read_error */
.byte 0x72; RELB(read_error)
jc read_error
movw %es, %ax
movw %ax, %fs /* load source segment */
/* save source segment */
movw %es, %dx
/* load addresses for copy from disk buffer to destination */
/* movw 6(%di), %es */ /* load destination segment */
.byte 0x8e, 0x45, 0x06
movw 6(%di), %es /* load destination segment */
/* restore %ax */
popw %ax
@ -302,75 +274,63 @@ more_sectors:
/* determine the next possible destination address (presuming
512 byte sectors!) */
shlw $5, %ax /* shift %ax five bits to the left */
/* addw %ax, 6(%di) */ /* add the corrected value to the destination
addw %ax, 6(%di) /* add the corrected value to the destination
address for next time */
.byte 0x01, 0x45, 0x06
/* get the copy length */
shlw $4, %ax
movw %ax, %cx
/* save addressing regs */
pushw %ds
pushw %si
pushw %di
xorw %di, %di /* zero offset of destination addresses */
xorw %si, %si /* zero offset of source addresses */
movw %dx, %ds /* restore the source segment */
cld /* sets the copy direction to forward */
/* perform copy */
rep /* sets a repeat */
fs /* this overrides the source segment from %ds to %fs */
movsb /* this runs the actual copy */
/* restore addressing regs */
popw %di
popw %si
popw %ds
/* check if finished with this dataset */
/* cmpw $0, 4(%di) */
.byte 0x81, 0x7d, 0x04; .word 0
/* je bootloop */
.byte 0x0f, 0x84; REL(bootloop)
cmpw $0, 4(%di)
je bootloop
/* find out the next BIOS set to load in */
/* movb $0, (%di) */ /* set the sector start */
.byte 0xc6, 0x05, 0
movb $0, (%di) /* set the sector start */
xorb %ah, %ah /* zero %ah */
/* movb 1(%di), %al */ /* load head number into %al */
.byte 0x8a, 0x45, 0x01
movb 1(%di), %al /* load head number into %al */
incw %ax /* increment current head number */
/* cmpw 2(%si), %ax */ /* compare to total number of heads */
.byte 0x3b, 0x44, 0x02
cmpw 2(%si), %ax /* compare to total number of heads */
jne update_heads
/* jne update_heads (8-bit)*/
.byte 0x75; RELB(update_heads)
/* movw 2(%di), %ax */ /* load cylinder number into %ax */
.byte 0x8b, 0x45, 0x02
movw 2(%di), %ax /* load cylinder number into %ax */
incw %ax /* increment current cylinder number */
/* cmpw 4(%si), %ax */ /* compare to total number of cylinders */
.byte 0x3b, 0x44, 0x04
cmpw 4(%si), %ax /* compare to total number of cylinders */
/* je geometry_error */ /* display error and die if greater */
.byte 0x74; RELB(geometry_error)
je geometry_error /* display error and die if greater */
/* movw %ax, 2(%di) */ /* store new cylinder number */
.byte 0x89, 0x45, 0x02
movw %ax, 2(%di) /* store new cylinder number */
movb $0, %al /* for storing new head number */
update_heads:
/* movb %al, 1(%di) */ /* store new head number */
.byte 0x88, 0x45, 0x01
movb %al, 1(%di) /* store new head number */
/* jump to "setup_sectors" to determine length of the new read */
/* jmp setup_sectors */
.byte 0xe9; REL(setup_sectors)
jmp setup_sectors
/* END OF MAIN LOOP */
@ -378,38 +338,27 @@ update_heads:
* BIOS Geometry translation error (past the end of the disk geometry!).
*/
geometry_error:
movw $geometry_error_string, %si
/* call message */
.byte 0xe8; REL(message)
/* jmp display_error (8-bit) */
.byte 0xeb; RELB(general_error)
MSG(geometry_error_string)
jmp general_error
/*
* Disk probe failure.
*/
hd_probe_error:
movw $hd_probe_error_string, %si
/* call message */
.byte 0xe8; REL(message)
/* jmp display_error (8-bit) */
.byte 0xeb; RELB(general_error)
MSG(hd_probe_error_string)
jmp general_error
/*
* Read error on the disk.
*/
read_error:
movw $read_error_string, %si
/* call message */
.byte 0xe8; REL(message)
MSG(read_error_string)
general_error:
movw $general_error_string, %si
/* call message */
.byte 0xe8; REL(message)
MSG(general_error_string)
/* go here when you need to stop the machine hard after an error condition */
stop: /* jmp stop (8-bit) */
.byte 0xeb; RELB(stop)
stop: jmp stop
geometry_error_string: .string "Geom"
hd_probe_error_string: .string "Hard Disk"
@ -434,14 +383,10 @@ general_error_string: .string " Error"
incw %si
message:
/* movb (%si), %al */
.byte 0x8a, 0x4
movb (%si), %al
cmpb $0, %al
/* jne 1b */
.byte 0x75; RELB(1b) /* if not end of string, jmp to display */
/* ret */
.byte 0xc3
jne 1b /* if not end of string, jmp to display */
ret
lastlist:
/*
@ -489,16 +434,12 @@ firstlist: /* this label has to be after the list data!!! */
bootit:
popw %dx /* this makes sure %dl is our "boot" drive */
/* ljmp $myoffset, $myseg */
.byte 0xea
#ifdef STAGE1_5
.word 0x2000, 0
#else
.word 0x8000, 0
#endif
ljmp $0, $0x8000 /* FIXME: make 0x2000 for stage1_5 */
/*
* This is the compatibility version number.
* See ../stage2/shared.h for COMPAT_VERSION_* definitions used
* in stage2 and stage1_5 modules.
*
* DO NOT MOVE THIS!!!
*/
@ -528,24 +469,18 @@ probe_loop:
int $0x13
incw %si
/* movb (%si), %cl */
.byte 0x8a, 0x0c
movb (%si), %cl
/* if number of sectors is 0, display error and die */
cmpb $0, %cl
/* jne 1f (8-bit) */
.byte 0x75; RELB(1f)
jne 1f
/*
* Floppy disk probe failure.
*/
movw $fd_probe_error_string, %si
/* call message */
.byte 0xe8; REL(message)
/* jmp display_error (16-bit) */
.byte 0xe9; REL(general_error)
call message
jmp general_error
fd_probe_error_string: .string "Floppy"
@ -558,15 +493,13 @@ fd_probe_error_string: .string "Floppy"
int $0x13
/* if error, jump to "probe_loop" */
/* jc probe_loop (8-bit)*/
.byte 0x72; RELB(probe_loop)
jc probe_loop
/* %cl is already the correct value! */
movb $1, %dh
movb $79, %ch
/* jmp final_init */
.byte 0xe9; REL(final_init)
jmp final_init
. = _start + PARTEND