Update boot[12] program to compile ELF binary.

Submitted by:	Nobuyuki Koganemaru <n-kogane@syd.odn.ne.jp> and
		kawanobe@st.rim.or.jp (Kawanobe Koh)
This commit is contained in:
Yoshihiro Takahashi 2001-05-24 11:18:32 +00:00
parent 9d9bdb3dc5
commit f040ac4cec
6 changed files with 92 additions and 117 deletions

View File

@ -8,12 +8,13 @@ SRCS+= probe_keyboard.c io.c disk.c sys.c
BINDIR= /boot
BINMODE= 444
CFLAGS= -Os -malign-functions=0 -malign-jumps=0 -malign-loops=0 \
CFLAGS= -elf -Os -fno-builtin -fforce-addr -fdata-sections \
-malign-functions=0 -malign-jumps=0 -malign-loops=0 \
-mpreferred-stack-boundary=2 -mrtd \
-DPC98 -DBOOTWAIT=${BOOTWAIT} -DTIMEOUT=${TIMEOUT}
CFLAGS+= -DBOOTSEG=${BOOTSEG} -DBOOTSTACK=${BOOTSTACK}
CFLAGS+= ${CWARNFLAGS}
CFLAGS+= -I${.CURDIR}/../../.. -aout
CFLAGS+= -I${.CURDIR}/../../..
# By default, if a serial port is going to be used as console, use COM1
@ -49,7 +50,7 @@ CFLAGS+= -DCONSPEED=${BOOT_COMCONSOLE_SPEED}
# BOOT_HD_BIAS=1 makes da(0,a) correspond to 1:da(0,a) instead of 0:da(0,a).
CLEANFILES+= boot.nohdr boot.strip boot1 boot2 sizetest
LDFLAGS+= -N -T 0 -nostdlib
LDFLAGS+= -N -Ttext 0 -nostdlib -e start
NOSHARED= YES
NOMAN=
STRIP=
@ -65,13 +66,8 @@ BOOTSEG= 0x1000
# Offset in BOOTSEG for the top of the stack, keep this 16 byte aligned
BOOTSTACK= 0xFFF0
boot.strip: boot
cp -p boot boot.strip
strip -aout boot.strip
size -aout boot.strip
boot.nohdr: boot.strip
dd if=boot.strip of=boot.nohdr ibs=32 skip=1 obs=1024b
boot.nohdr: boot
objcopy -S -O binary boot boot.nohdr
ls -l boot.nohdr
boot1: boot.nohdr
@ -92,6 +88,5 @@ install:
${INSTALL} ${COPY} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
boot1 boot2 ${DESTDIR}${BINDIR}
.include <bsd.kern.mk>
.include <bsd.prog.mk>

View File

@ -58,7 +58,7 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
CR0_PE_ON = 0x1
CR0_PE_OFF = 0xfffffffe
.code16
.text
/*
@ -72,14 +72,15 @@ ENTRY(real_to_prot)
cli
/* load the gdtr */
.code32
addr32
data32
lgdt EXT(Gdtr)
.code16
/* set the PE bit of CR0 */
mov %cr0, %eax
data32
or $CR0_PE_ON, %eax
mov %eax, %cr0
@ -87,18 +88,22 @@ ENTRY(real_to_prot)
* make intrasegment jump to flush the processor pipeline and
* reload CS register
*/
.code32
data32
ljmp $0x18, $xprot
.code16
xprot:
/*
* we are in USE32 mode now
* set up the protected mode segment registers : DS, SS, ES, FS
*/
data32
movw $0x20, %ax /* data segment */
mov %ax, %ds /* gas would waste a prefix byte for movw */
mov %ax, %ss
mov %ax, %es
data32
movw $0x10, %ax /* flat segment */
mov %ax, %fs
@ -119,10 +124,13 @@ xprot:
ENTRY(prot_to_real)
/* Prepare %ax while we're still in a mode that gas understands. */
data32
movw $0x30, %ax
/* Change to use16 mode. */
.code32
ljmp $0x28, $x16
.code16
x16:
mov %ax, %ds
@ -132,7 +140,6 @@ x16:
/* clear the PE bit of CR0 */
mov %cr0, %eax
data32
and $CR0_PE_OFF, %eax
mov %eax, %cr0
@ -140,8 +147,10 @@ x16:
* make intersegment jmp to flush the processor pipeline
* and reload CS register
*/
.code32
data32
ljmp $BOOTSEG, $xreal
.code16
xreal:
/*
@ -174,12 +183,14 @@ xreal:
*/
ENTRY(startprog)
.code32
push %ebp
mov %esp, %ebp
movl %esp, %eax /* Use eax as the old stack pointer */
/* convert the current stack to a 32 bit flat model */
movw $0x10, %bx
data32
mov %bx, %ss
addl $(BOOTSEG<<4),%esp
@ -200,7 +211,9 @@ ENTRY(startprog)
/* convert over the other data segs */
movw $0x10, %bx
data32
mov %bx, %ds
data32
mov %bx, %es
/* convert the PC (and code seg) */
@ -215,6 +228,7 @@ ourreturn:
*/
ENTRY(pcpy)
.code32
push %ebp
mov %esp, %ebp
push %es

View File

@ -69,8 +69,8 @@
#define LB(x,n) n
#ifdef __STDC__
#define EXT(x) _ ## x
#define LEXT(x) _ ## x ## :
#define EXT(x) x
#define LEXT(x) x ## :
#define LBb(x,n) n ## b
#define LBf(x,n) n ## f

View File

@ -110,6 +110,7 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
ENTRY(biosread)
.code32
push %ebp
mov %esp, %ebp
@ -141,20 +142,20 @@ fd:
xor %ebx, %ebx
addr32
movb 0x18(%ebp), %bl /* number of sectors */
data32
.code16
shl $9, %ebx
data32
push %ebx
.code32
addr32
data32
mov 0x1c(%ebp), %ebx
data32
.code16
mov %ebx, %ebp
data32
pop %ebx
int $0x1b
jc 1f
.code32
xor %eax, %eax
1:
/* save return value (actually movw %ax, %bx) */
@ -274,6 +275,7 @@ ENTRY(biosreadlba)
*/
ENTRY(getc)
.code32
push %ebp
mov %esp, %ebp
push %ebx /* save %ebx */
@ -281,12 +283,14 @@ ENTRY(getc)
push %edi
call EXT(prot_to_real)
.code16
movb $0x0, %ah
int $0x18
movb %al, %bl /* real_to_prot uses %eax */
.code32
data32
call EXT(real_to_prot)
@ -312,6 +316,7 @@ ENTRY(getc)
* %bh = 0
*/
ENTRY(ischar)
.code32
push %ebp
mov %esp, %ebp
push %ebx
@ -321,6 +326,7 @@ ENTRY(ischar)
call EXT(prot_to_real) /* enter real mode */
xor %ebx, %ebx
.code16
movb $0x1, %ah
int $0x18
andb %bh, %bh
@ -329,6 +335,7 @@ ENTRY(ischar)
movb %al, %bl
nochar:
.code32
data32
call EXT(real_to_prot)
@ -349,6 +356,7 @@ nochar:
*/
ENTRY(get_diskinfo)
.code32
push %ebp
mov %esp, %ebp
push %ebx
@ -357,6 +365,7 @@ ENTRY(get_diskinfo)
movb 0x8(%ebp), %dl /* diskinfo(drive #) */
call EXT(prot_to_real) /* enter real mode */
.code16
movb %dl, %al /* ask for disk info */
andb $0xf0, %al
@ -392,7 +401,7 @@ fdd:
/* es:di = parameter table */
/* carry = 0 */
ok:
.code32
data32
call EXT(real_to_prot) /* back to protected mode */
@ -422,6 +431,7 @@ ok:
*/
ENTRY(memsize)
.code32
push %ebp
mov %esp, %ebp
push %ebx

View File

@ -53,37 +53,36 @@
* boot2() -- second stage boot
* SP points to default string if found
*/
.code16
ENTRY(boot2)
data32
subl %eax, %eax
mov %cs, %ax
mov %ax, %ds
mov %ax, %es
data32
shll $4, %eax
/* fix up GDT entries for bootstrap */
#define FIXUP(gdt_index) \
.code32; \
addr32; \
movl %eax, EXT(Gdt)+(8*gdt_index)+2; /* actually movw %ax */ \
addr32; \
movb %bl, EXT(Gdt)+(8*gdt_index)+4
movb %bl, EXT(Gdt)+(8*gdt_index)+4; \
.code16
data32
shld $16, %eax, %ebx
FIXUP(BOOT_CS_INDEX)
FIXUP(BOOT_CS16_INDEX)
FIXUP(BOOT_DS_INDEX)
/* fix up GDT pointer */
data32
movl %eax, %ecx
data32
addl $ EXT(Gdt), %eax
.code32
addr32
data32
movl %eax, EXT(Gdtr)+2
.code16
#ifdef BDE_DEBUGGER
/* fix up GDT entry for GDT */
@ -158,6 +157,7 @@ ENTRY(boot2)
#endif /* BDE_DEBUGGER */
/* change to protected mode */
.code32
data32
call EXT(real_to_prot)

View File

@ -72,23 +72,22 @@ NAMEBLOCKMAGIC= 0xfadefeed /* value of magicnumebr for block2 */
data32 ; \
call message
.code16
.text
.globl start
ENTRY(boot1)
jmp start
start:
jmp main
boot_cyl:
.word 0
String "IPL1 "
start:
main:
/* set up %ds */
xor %ax, %ax
mov %ax, %ds
/* set up %ss and %esp */
data32
mov $BOOTSEG, %eax
mov %ax, %ss
/*
@ -96,17 +95,15 @@ start:
* us to save the default bootstring we might find..
* effectively, we push the bootstring.
*/
data32
mov $BOOTSTACK-64, %esp
/* set up %es, (where we will load boot2 to) */
mov %ax, %es
push %es
push %cx
push %ecx
push %dx
data32
mov $0xa000, %eax
mov %ax, %es
@ -117,7 +114,6 @@ start:
movb $0x40, %ah
int $0x18
data32
mov $0x0a00, %eax /* 80 x 25 mode */
int $0x18
@ -125,7 +121,7 @@ start:
int $0x18
/* cursor home and on */
xor %edx, %edx
xor %dx, %dx
movb $0x13, %ah
int $0x18
movb $0x11, %ah
@ -136,11 +132,8 @@ start:
int $0x18
/* transfer PC-9801 system common area to 0xa1000 */
data32
mov $0x0000, %esi
data32
mov $0x1000, %edi
data32
mov $0x0630, %ecx
cld
rep
@ -148,37 +141,24 @@ start:
/* transfer EPSON machine type to 0xa1200 */
push %ds
data32
mov $0xfd00, %eax
mov %ax, %ds
addr32
data32
mov 0x804, %eax
data32
and $0x00ffffff, %eax
addr32
data32
.byte 0x26
mov %eax, %es: (0x1624)
pop %ds
pop %dx
pop %cx
pop %ecx
pop %es
/* bootstrap passes */
mov %cs, %bx
data32
cmp $0x1fe0, %ebx
cmp $0x1fe0, %bx
jz fd
data32
cmp $0x1fc0, %ebx
cmp $0x1fc0, %bx
jnz hd
data32
mov %ebp, %ecx
data32
mov %ebp, %edx
addr32
xor %cx, %cx
movb 0x584, %al
andb $0xf0, %al
cmpb $0x30, %al
@ -186,20 +166,19 @@ start:
cmpb $0x90, %al
jnz hd
fd:
data32
mov $0x0200, %ecx
data32
mov $0x0001, %edx
mov $0x0200, %cx
mov $0x0001, %dx
movb $0xd6, %ah
jmp load
hd:
data32
and %ecx, %ecx
and %cx, %cx
jnz 1f
.code32
addr32
data32
mov %cs: (boot_cyl), %ecx
mov %cs: (boot_cyl), %ecx /* actualy %cx in real mode */
.code16
1:
xor %dx, %dx
movb $0x06, %ah
/*
@ -375,11 +354,9 @@ notours:
data32
pop %ecx
#endif
data32
mov $LOADSZ, %ebx
addr32
movb 0x584, %al
xor %ebp, %ebp /* %bp = 0, put it at 0 in the BOOTSEG */
xor %bp, %bp /* %bp = 0, put it at 0 in the BOOTSEG */
int $0x1b
jc read_error
@ -389,19 +366,18 @@ notours:
* as an internal buffer "intbuf".
*/
.code32
data32
ljmp $BOOTSEG, $ EXT(boot2)
.code16
/*
* read_error
*/
read_error:
data32
mov $eread, %esi
err_stop:
data32
call message
data32
jmp stop
/*
@ -409,30 +385,22 @@ err_stop:
*/
message:
data32
push %eax
data32
push %ebx
push %ds
push %es
data32
mov $0xe000, %eax
mov %ax, %es
addr32
mov $0xe000, %dx
mov 0x501, %al
testb $0x08, %al
jnz 1f
data32
mov $0xa000, %eax
mov %ax, %es
mov $0xa000, %dx
1:
mov %dx, %es
mov %cs, %ax
mov %ax, %ds
addr32
data32
mov vram, %edi
data32
mov $0x00e1, %ebx
mov vram, %di
mov $0x00e1, %bx
mov $160, %cx
cld
nextb:
@ -443,48 +411,36 @@ nextb:
je cr_code
cmpb $0x0a, %al
je lf_code
addr32
movb %al, (%edi)
addr32
movb %bl, 0x2000(%edi)
data32
inc %edi
data32
inc %edi
jmp nextb
cr_code:
data32
add $80, %edi
jmp nextb
movb %bl, %es:0x2000(%di)
stosb
inc %di
jmp move_cursor
lf_code:
data32
mov %edi, %eax
data32
mov $80, %edx
data32
div %ebx
data32
sub %ebx, %edi
add %cx, %di
jmp move_cursor
cr_code:
xor %dx, %dx
mov %di, %ax
div %cx
sub %dx, %di
move_cursor:
mov %di, %dx
movb $0x13, %ah
int $0x18
jmp nextb
done:
addr32
data32
mov %edi, vram
mov %di, vram
pop %es
pop %ds
data32
pop %ebx
data32
pop %eax
data32
ret
stop: hlt
data32
jmp stop /* halt doesnt actually halt forever */
vram:
.long 0
.word 0
/* error messages */
@ -502,7 +458,7 @@ eread: String "Read error\r\n\0"
enoboot: String "No bootable partition\r\n\0"
endofcode:
. = EXT(boot1) + 0x1be
. = EXT(start) + 0x1be
/* Partition table */
@ -516,4 +472,4 @@ endofcode:
.value SIGNATURE
ENTRY(disklabel)
. = EXT(boot1) + 0x400
. = EXT(start) + 0x400