Project

General

Profile

Bug #1044 ยป boot0sio.patch

mneumann, 07/04/2008 08:22 PM

View differences:

boot0/Makefile 4 Jul 2008 19:39:23 -0000
# $FreeBSD: src/sys/boot/i386/boot0/Makefile,v 1.17 2002/09/17 01:48:54 peter Exp $
# $DragonFly: src/sys/boot/pc32/boot0/Makefile,v 1.5 2004/07/19 23:30:31 dillon Exp $
PROG= boot0
PROG?= boot0
NOMAN=
STRIP=
BINDIR?= /boot
......
# The default set of flags compiled into boot0. This enables update (writing
# the modified boot0 back to disk after running so that the selection made is
# saved), packet mode (detect and use the BIOS EDD extensions if we try to
# boot past the 1024 cylinder liimt), and booting from all valid slices.
# boot past the 1024 cylinder limit), and booting from all valid slices.
BOOT_BOOT0_FLAGS?= 0xf
# The number of timer ticks to wait for a keypress before assuming the default
......
# 0xb6 (182d) corresponds to 10 seconds.
BOOT_BOOT0_TICKS?= 0xb6
# Comm settings for boot0sio.
# Bit(s) Description
# 7-5 data rate (110,150,300,600,1200,2400,4800,9600 bps)
# 4-3 parity (00 or 10 = none, 01 = odd, 11 = even)
# 2 stop bits (set = 2, clear = 1)
# 1-0 data bits (00 = 5, 01 = 6, 10 = 7, 11 = 8)
.if !defined(BOOT_BOOT0_COMCONSOLE_SPEED)
BOOT_COMCONSOLE_SPEED?= 9600
.if ${BOOT_COMCONSOLE_SPEED} == 9600
BOOT_BOOT0_COMCONSOLE_SPEED= "7 << 5 + 3"
.elif ${BOOT_COMCONSOLE_SPEED} == 4800
BOOT_BOOT0_COMCONSOLE_SPEED= "6 << 5 + 3"
.elif ${BOOT_COMCONSOLE_SPEED} == 2400
BOOT_BOOT0_COMCONSOLE_SPEED= "5 << 5 + 3"
.elif ${BOOT_COMCONSOLE_SPEED} == 1200
BOOT_BOOT0_COMCONSOLE_SPEED= "4 << 5 + 3"
.elif ${BOOT_COMCONSOLE_SPEED} == 600
BOOT_BOOT0_COMCONSOLE_SPEED= "3 << 5 + 3"
.elif ${BOOT_COMCONSOLE_SPEED} == 300
BOOT_BOOT0_COMCONSOLE_SPEED= "2 << 5 + 3"
.elif ${BOOT_COMCONSOLE_SPEED} == 150
BOOT_BOOT0_COMCONSOLE_SPEED= "1 << 5 + 3"
.elif ${BOOT_COMCONSOLE_SPEED} == 110
BOOT_BOOT0_COMCONSOLE_SPEED= "0 << 5 + 3"
.else
BOOT_BOOT0_COMCONSOLE_SPEED= "7 << 5 + 3"
.endif
.endif
CFLAGS+=-DFLAGS=${BOOT_BOOT0_FLAGS} \
-DTICKS=${BOOT_BOOT0_TICKS} \
-DCOMSPEED=${BOOT_BOOT0_COMCONSOLE_SPEED}
# pull BOOT0_ORIGIN out of bootasm.h
#
#
boot0: boot0.o bootasmdef.nx
${PROG}: boot0.o bootasmdef.nx
@echo "boot0 origin set to `${.OBJDIR}/bootasmdef.nx BOOT0_ORIGIN`"
${LD} -N -e start -Ttext `${.OBJDIR}/bootasmdef.nx BOOT0_ORIGIN` -o boot0.out boot0.o
objcopy -S -O binary boot0.out ${.TARGET}
boot0.o: boot0.S
${CC} -c -DFLAGS=${BOOT_BOOT0_FLAGS} -DTICKS=${BOOT_BOOT0_TICKS} \
${AFLAGS} ${.IMPSRC} -o ${.TARGET}
${CC} -c ${CFLAGS} ${AFLAGS} ${.IMPSRC} -o ${.TARGET}
CLEANFILES+= boot0.out boot0.o bootasmdef.nx
boot0/boot0.S 4 Jul 2008 19:26:12 -0000
#include "../bootasm.h"
#ifdef SIO
/* ... using a serial console on COM1. */
#endif
/*
* A 512-byte boot manager.
*/
......
.set KEY_F1,0x3b # F1 key scan code
.set KEY_1,0x02 # #1 key scan code
.set ASCII_BEL,0x07 # ASCII code for <BEL>
.set ASCII_CR,0x0D # ASCII code for <CR>
/*
* Addresses in the sector of embedded data values. Accessed
* with negative offsets from the end of the relocated sector
......
pushw $main # Jump to relocated code
retw
main:
#if defined(SIO) && COMSPEED != 0
/*
* Initialize the serial port.
* bioscom preserves the driver number in DX.
*/
movw $COMSPEED,%ax # defined by Makefile
callw bioscom
#endif
/*
* Check what flags were loaded with us, specifically, Use a
* predefined Drive. If what the bios gives us is bad, use
* the '0' in the block instead, as well.
*/
main: testb $0x20,_FLAGS(%bp) # Set number drive?
testb $0x20,_FLAGS(%bp) # Set number drive?
jnz main.1 # Yes
testb %dl,%dl # Drive number valid?
js main.2 # Possibly (0x80 set)
main.1: movb _SETDRV(%bp),%dl # Drive number to use
/*
......
* Busy loop, looking for keystrokes but
* keeping one eye on the time.
*/
main.8: movb $0x1,%ah # BIOS: Check
main.8:
#ifndef SIO
movb $0x1,%ah # BIOS: Check
int $0x16 # for keypress
jnz main.11 # Have one
#else /* SIO */
movb $0x03,%ah # BIOS: Read COM
call bioscom
testb $0x01,%ah # Check line status
jnz main.11 # (bit 1 indicates input)
#endif /* SIO */
xorb %ah,%ah # BIOS: Get
int $0x1a # system time
cmpw %di,%dx # Timeout?
......
* until either the timeout occurs or the user hits a good
* key.
*/
main.10: movb $0x7,%al # Signal
main.10: movb $ASCII_BEL,%al # Signal
callw putchr # error
/*
* Get the keystroke.
*/
main.11: xorb %ah,%ah # BIOS: Get
main.11:
#ifndef SIO
xorb %ah,%ah # BIOS: Get
int $0x16 # keypress
movb %ah,%al # Scan code
#else
movb $0x02,%ah # BIOS: Receive
call bioscom
#endif
/*
* If it's CR act as if timed out.
*/
#ifndef SIO
cmpb $KEY_ENTER,%al # Enter pressed?
#else
cmpb $ASCII_CR,%al # Enter pressed?
#endif
je main.9 # Yes
/*
* Otherwise check if legal
* If not ask again.
*/
#ifndef SIO
subb $KEY_F1,%al # Less F1 scan code
cmpb $0x4,%al # F1..F5?
jna main.12 # Yes
subb $(KEY_1 - KEY_F1),%al # Less #1 scan code
#else
subb $'1',%al # Less '1' ascii character
#endif
cmpb $0x4,%al # #1..#5?
ja main.10 # No
......
/*
* Display routines
*/
putkey: movb $'F',%al # Display
putkey:
#ifndef SIO
movb $'F',%al # Display
callw putchr # 'F'
#endif
movb $'1',%al # Prepare
addb %dl,%al # digit
jmp putstr.1 # Display the rest
......
jmp putstr # Continue
putstr.2: andb $~0x80,%al # Clear MSB
putchr: pusha # Save
#ifndef SIO
putchr:
pusha # Save
movw $0x7,%bx # Page:attribute
movb $0xe,%ah # BIOS: Display
int $0x10 # character
popa # Restore
retw # To caller
#else /* SIO */
putchr:
movb $0x01,%ah # BIOS: Send
bioscom:
pusha # Save
xorw %dx,%dx # Use COM1
int $0x14 # Character
popa # Restore
retw # To caller
#endif
/*
* One-sector disk I/O routine
-- /dev/null 2008-07-04 18:33:36 +0000
++ boot0sio/Makefile 2008-07-04 19:33:33 +0000
......
# $FreeBSD: src/sys/boot/i386/boot0sio/Makefile,v 1.4 2004/04/28 21:31:20 ru Exp $
# $DragonFly:$
.PATH: ${.CURDIR}/../boot0
PROG= boot0sio
CFLAGS+= -DSIO
.include "${.CURDIR}/../boot0/Makefile"
    (1-1/1)