diff options
-rw-r--r-- | sys/arch/i386/include/biosvar.h | 3 | ||||
-rw-r--r-- | sys/arch/i386/stand/cdboot/Makefile | 46 | ||||
-rw-r--r-- | sys/arch/i386/stand/cdboot/cdboot.8 | 96 | ||||
-rw-r--r-- | sys/arch/i386/stand/cdboot/conf.c | 107 | ||||
-rw-r--r-- | sys/arch/i386/stand/cdboot/srt0.S | 243 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/biosdev.c | 37 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/dev_i386.c | 20 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/diskprobe.c | 93 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/libsa.h | 3 |
9 files changed, 630 insertions, 18 deletions
diff --git a/sys/arch/i386/include/biosvar.h b/sys/arch/i386/include/biosvar.h index 7e4d98933b4..e6cfe1a57c6 100644 --- a/sys/arch/i386/include/biosvar.h +++ b/sys/arch/i386/include/biosvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: biosvar.h,v 1.43 2004/06/13 21:49:16 niklas Exp $ */ +/* $OpenBSD: biosvar.h,v 1.44 2004/06/23 00:21:49 tom Exp $ */ /* * Copyright (c) 1997-1999 Michael Shalayeff @@ -158,6 +158,7 @@ typedef struct _bios_diskinfo { #define BDI_INVALID 0x00000001 /* I/O error during checksumming */ #define BDI_GOODLABEL 0x00000002 /* Had SCSI or ST506/ESDI disklabel */ #define BDI_BADLABEL 0x00000004 /* Had another disklabel */ +#define BDI_EL_TORITO 0x00000008 /* 2,048-byte sectors */ #define BDI_PICKED 0x80000000 /* kernel-only: cksum matched */ } bios_diskinfo_t; diff --git a/sys/arch/i386/stand/cdboot/Makefile b/sys/arch/i386/stand/cdboot/Makefile new file mode 100644 index 00000000000..3adc18677f7 --- /dev/null +++ b/sys/arch/i386/stand/cdboot/Makefile @@ -0,0 +1,46 @@ +# $OpenBSD: Makefile,v 1.1 2004/06/23 00:21:49 tom Exp $ + +.include "${.CURDIR}/../Makefile.inc" + +MAN= cdboot.8 + +.if ${MACHINE} == "i386" +PROG= cdboot +LD?= ld +SIZE?= size +LDFLAGS+=-nostdlib -Bstatic +INSTALL_STRIP= + +LDFLAGS+=-Ttext $(LINKADDR) -N -x -noinhibit-exec +CLEANFILES+= crt0.o +SRCS= srt0.S + +SRCS+= boot.c cmd.c vars.c bootarg.c conf.c +S =${.CURDIR}/../../../.. +SADIR= ${.CURDIR}/.. + +LDADD= ${LIBSA} ${LIBZ} +DPADD= ${LIBSA} ${LIBZ} + +.PATH: ${S}/stand/boot + +${PROG}: $(OBJS) $(DPADD) + $(LD) $(LDFLAGS) -o ${PROG} $(OBJS) $(LDADD) + @$(SIZE) ${PROG} + @if [ -x ${.OBJDIR}/${PROG} ]; then \ + objcopy -O binary ${PROG} ${.OBJDIR}/.tmp;\ + mv -f ${.OBJDIR}/.tmp ${.OBJDIR}/${PROG}; \ + ls -l ${.OBJDIR}/${PROG}; \ + fi + +.else +NOPROG= +.endif + +.include <bsd.prog.mk> + +CPPFLAGS+=-DBOOTMAGIC=$(BOOTMAGIC) ${DEBUGFLAGS} +CPPFLAGS+=-DLINKADDR=${LINKADDR} +CFLAGS+=${SACFLAGS} -D__INTERNAL_LIBSA_CREAD +#AFLAGS+=-Wa,-R +# AFLAGS+=-Wa,-a diff --git a/sys/arch/i386/stand/cdboot/cdboot.8 b/sys/arch/i386/stand/cdboot/cdboot.8 new file mode 100644 index 00000000000..1cad9712be3 --- /dev/null +++ b/sys/arch/i386/stand/cdboot/cdboot.8 @@ -0,0 +1,96 @@ +.\" $OpenBSD: cdboot.8,v 1.1 2004/06/23 00:21:49 tom Exp $ +.\" Copyright (c) 2004 Tom Cosgrove +.\" Copyright (c) 2003 Matthias Drochner +.\" Copyright (c) 1999 Doug White +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.Dd June 13, 2004 +.Dt CDBOOT 8 i386 +.Os +.Sh NAME +.Nm cdboot +.Nd +i386-specific second-stage CD-specific bootstrap +.Sh DESCRIPTION +.Nm +is a modified version of the i386 second-stage bootstrap program, +.Xr boot 8 , +configured to be run by the +.Ox +El Torito CD-ROM boot sector +.Pa cdbr . +.Nm +will look for an +.Pa /etc/boot.conf +configuration +file on the CD-ROM. +If it finds one, it processes the commands within it. +.Pp +.Nm +then sits in a loop, +processing commands given by the user. +It accepts all the commands accepted by +.Xr boot 8 . +.Pp +If no commands are given for a short time, +.Nm +will then attempt to load an +.Ox +kernel +.Pa /bsd +from the CD. +It may be told to boot an alternative kernel, +either by commands in the +.Pa boot.conf +file, +or by commands typed by the user at the +.Ic boot> +prompt. +.Sh FILES +.Bl -tag -width /usr/mdec/cdbootxx -compact +.It Pa /usr/mdec/cdboot +CD-specific second-stage bootstrap +.It Pa /etc/boot.conf +.Nm +configuration file (read from CD) +.El +.Sh EXAMPLES +Boot the install kernel: +.Pp +.Dl boot> bsd.rd +.Sh SEE ALSO +.Xr boot 8 , +.Xr boot_i386 8 +.Rs +.%T "El Torito" Bootable CD-ROM Format Specification +.%N Version 1.0 +.%D January 25, 1995 +.%A Curtis E. Stevens, Phoenix Technologies +.%A Stan Merkin, IBM +.Re +.Sh HISTORY +The +.Nm +command first appeared in +.Ox 3.6 . diff --git a/sys/arch/i386/stand/cdboot/conf.c b/sys/arch/i386/stand/cdboot/conf.c new file mode 100644 index 00000000000..d51dd50e1e9 --- /dev/null +++ b/sys/arch/i386/stand/cdboot/conf.c @@ -0,0 +1,107 @@ +/* $OpenBSD: conf.c,v 1.1 2004/06/23 00:21:49 tom Exp $ */ + +/* + * Copyright (c) 2004 Tom Cosgrove + * Copyright (c) 1996 Michael Shalayeff + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <netinet/in.h> +#include <libsa.h> +#include <lib/libsa/ufs.h> +#include <lib/libsa/cd9660.h> +#ifdef notdef +#include <lib/libsa/fat.h> +#include <lib/libsa/nfs.h> +#include <lib/libsa/tftp.h> +#include <lib/libsa/netif.h> +#endif +#include <lib/libsa/unixdev.h> +#include <biosdev.h> +#include <dev/cons.h> +#include "debug.h" + +const char version[] = "1.00"; +int debug = 1; + +#undef _TEST + + +void (*sa_cleanup)(void) = NULL; + + +void (*i386_probe1[])(void) = { + ps2probe, gateA20on, debug_init, cninit, apmprobe, + pciprobe, /* smpprobe, */ memprobe +}; +void (*i386_probe2[])(void) = { + diskprobe, cdprobe +}; + +struct i386_boot_probes probe_list[] = { + { "probing", i386_probe1, NENTS(i386_probe1) }, + { "disk", i386_probe2, NENTS(i386_probe2) }, +}; +int nibprobes = NENTS(probe_list); + +struct fs_ops file_system[] = { + { ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, + ufs_stat, ufs_readdir }, + { cd9660_open, cd9660_close, cd9660_read, cd9660_write, cd9660_seek, + cd9660_stat, cd9660_readdir }, +#ifdef notdef + { tftp_open, tftp_close, tftp_read, tftp_write, tftp_seek, + tftp_stat, tftp_readdir }, + { nfs_open, nfs_close, nfs_read, nfs_write, nfs_seek, + nfs_stat, nfs_readdir }, + { fat_open, fat_close, fat_read, fat_write, fat_seek, + fat_stat, fat_readdir }, +#endif +#ifdef _TEST + { null_open, null_close, null_read, null_write, null_seek, + null_stat, null_readdir } +#endif +}; +int nfsys = NENTS(file_system); + +struct devsw devsw[] = { +#ifdef _TEST + { "UNIX", unixstrategy, unixopen, unixclose, unixioctl }, +#else + { "BIOS", biosstrategy, biosopen, biosclose, biosioctl }, +#endif +}; +int ndevs = NENTS(devsw); + +struct consdev constab[] = { +#ifdef _TEST + { unix_probe, unix_init, unix_getc, unix_putc }, +#else + { pc_probe, pc_init, pc_getc, pc_putc }, + { com_probe, com_init, com_getc, com_putc }, +#endif + { NULL } +}; +struct consdev *cn_tab = constab; diff --git a/sys/arch/i386/stand/cdboot/srt0.S b/sys/arch/i386/stand/cdboot/srt0.S new file mode 100644 index 00000000000..261191b1e9f --- /dev/null +++ b/sys/arch/i386/stand/cdboot/srt0.S @@ -0,0 +1,243 @@ +/* $OpenBSD: srt0.S,v 1.1 2004/06/23 00:21:49 tom Exp $ */ + +/* + * Copyright (c) 1997 Michael Shalayeff + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +#include <machine/asm.h> +#include <assym.h> + +#define BOOTSTACK 0xfffc + + .globl _C_LABEL(end) + .globl _C_LABEL(edata) + .globl _C_LABEL(boot) + .globl _C_LABEL(_rtt) + .globl _C_LABEL(bios_bootdev) + .globl _ASM_LABEL(pmm_init) + .globl Gdtr + + .text + .code16 + .globl _start +_start: +#ifdef DEBUG + movl $0xb80a0, %ebx + addr32 movl $0x07420742, (%ebx) +#endif + +/* Clobbers %ax, maybe more */ +#define putc(c) movb $c, %al; call Lchr + + /* + * We operate as a no emulation boot image, as defined by the + * El Torito Bootable CD-ROM Format Specification v1.0. We use + * a load segment of 0x07C0 (physical load address of 0x7C00). + * Like the standard /boot, we are linked to run at 0x40120 + * (load address 0x40000), so we relocate to there. + * + * From 0x7C00 to 0x40000 is 0x38400 (230400) bytes, so don't + * have to worry about an overlapping copy until cdboot is + * over 225 KB. + * + * Note that there are other reasons to be worried if + * sizeof(/boot) > 64 KB. So currently we copy a maximum of 64 KB. + * + * Our cdbr CD-ROM boot sector passes us the drive number to use + * in %dl. + */ +#define CDBOOTADDR 0x7c00 /* Address where BIOS loads up */ + xorw %ax, %ax + movw %ax, %ss /* CPU disables interrupts till... */ + movl $CDBOOTADDR-4, %esp /* after this instruction */ + + movw $(CDBOOTADDR >> 4), %ax + movw %ax, %ds + xorw %si, %si /* Where we're coming from */ + + movw $(LINKADDR >> 4), %ax + movw %ax, %es /* Set %es = 0x4000 */ + xorw %di, %di /* Where we're going to */ + + movl $_C_LABEL(end), %ecx + subl $_C_LABEL(_start), %ecx /* How big are we? */ + + cld + rep; movsb /* Copy into place */ + + jmpl $(LINKADDR >> 4), $(relocated-_start) /* Now relocate */ + +relocated: + /* + * In 16-bit mode, we have segment registers == 0x4012, and + * offsets work from here, with offset(_start) == 0. + * + * In 32-bit mode, we have a flat memory model, where + * offset(_start) == 0x40120. This is how we're linked. + * + * Now transition to protected mode. + * + * First, initialise the global descriptor table. + */ + cli + push %cs + pop %ds + addr32 data32 lgdt (Gdtr - LINKADDR) + + movl %cr0, %eax + orl $CR0_PE, %eax + data32 movl %eax, %cr0 + data32 ljmp $8, $1f /* Seg sel 0x08 is flat 32-bit code */ +1: + .code32 + movl $0x10, %eax /* Seg sel 0x10 is flat 32-bit data */ + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + mov %ax, %ss + movl $BOOTSTACK, %esp +#ifdef DEBUG + movl $0xb8000, %ebx + movl $0x07420742, (%ebx) +#endif + + movzbl %dl, %eax + orl $0x100, %eax /* Indicate that it's a cd device */ + pushl %eax /* boot() takes this as a parameter */ + + /* Set up an interrupt descriptor table for protected mode. */ + call _ASM_LABEL(pmm_init) +#ifdef DEBUG + movl $0xb80a4, %ebx + movl $0x07520752, (%ebx) +#endif + + /* Zero .bss */ + xorl %eax, %eax + movl $_C_LABEL(end), %ecx + subl $_C_LABEL(edata), %ecx + movl $_C_LABEL(edata), %edi + cld + rep; stosb + + /* Set our program name ("CDBOOT", not "BOOT"). */ + movl $cd_progname, %eax + movl %eax, progname + + /* Put the boot device number into the globals that need it */ + popl %eax /* Get this back from the stack */ + pushl %eax /* boot() takes this as a parameter */ + movl %eax, _C_LABEL(bios_bootdev) + movl %eax, _C_LABEL(bios_cddev) + + /* + * Now call "main()". + * + * We run in flat 32-bit protected mode, with no address mapping. + */ +#ifdef DEBUG + movl $0xb8004, %ebx + movl $0x07410741, (%ebx) +#endif + call _C_LABEL(boot) + + /* boot() should not return. If it does, reset computer. */ + jmp _C_LABEL(_rtt) + +ENTRY(debugchar) + pushl %ebx + movl 8(%esp), %ebx + addl %ebx, %ebx + addl $0xb8000, %ebx + + xorl %eax, %eax + movb 12(%esp), %al + + andl $0xfffffffe, %ebx + movb %al, (%ebx) + popl %ebx + ret + + .code16 + +/* + * Display ASCIZ string at %si. Trashes %si. + */ +Lstr: + pushw %ax + cld +1: + lodsb /* %al = *%si++ */ + testb %al, %al + jz 1f + call Lchr + jmp 1b +1: popw %ax + ret + +/* + * Write out value in %ax in hex + */ +hex_word: + pushw %ax + mov %ah, %al + call hex_byte + popw %ax + /* fall thru */ +/* + * Write out value in %al in hex + */ +hex_byte: + pushw %ax + shrb $4, %al + call hex_nibble + popw %ax + /* fall thru */ + +/* Write out nibble in %al */ +hex_nibble: + and $0x0F, %al + add $'0', %al + cmpb $'9', %al + jbe Lchr + addb $'A'-'9'-1, %al + /* fall thru to Lchr */ +/* + * Lchr: write the character in %al to console + */ +Lchr: + pushw %bx + movb $0x0e, %ah + xorw %bx, %bx + incw %bx /* movw $0x01, %bx */ + int $0x10 + popw %bx + ret + +cd_progname: + .asciz "CDBOOT" + + .end diff --git a/sys/arch/i386/stand/libsa/biosdev.c b/sys/arch/i386/stand/libsa/biosdev.c index 4ad9aaa1f15..84a0387e1d4 100644 --- a/sys/arch/i386/stand/libsa/biosdev.c +++ b/sys/arch/i386/stand/libsa/biosdev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: biosdev.c,v 1.68 2004/03/09 19:12:12 tom Exp $ */ +/* $OpenBSD: biosdev.c,v 1.69 2004/06/23 00:21:49 tom Exp $ */ /* * Copyright (c) 1996 Michael Shalayeff @@ -34,6 +34,7 @@ #include <machine/tss.h> #include <machine/biosvar.h> #include <lib/libsa/saerrno.h> +#include <isofs/cd9660/iso.h> #include "disk.h" #include "debug.h" #include "libsa.h" @@ -47,6 +48,7 @@ static int EDD_rw (int, int, u_int64_t, u_int32_t, void *); extern int debug; int bios_bootdev; +int bios_cddev = -1; /* Set by srt0 if coming from CD */ #if 0 struct biosdisk { @@ -241,17 +243,35 @@ biosd_io(int rw, bios_diskinfo_t *bd, daddr_t off, int nsect, void *buf) int dev = bd->bios_number; int j, error; void *bb; + int bbsize = nsect * DEV_BSIZE; + + if (bd->flags & BDI_EL_TORITO) { /* It's a CD device */ + dev &= 0xff; /* Mask out this flag bit */ - /* use a bounce buffer to not cross 64k DMA boundary */ - if ((((u_int32_t)buf) & ~0xffff) != - (((u_int32_t)buf + nsect * DEV_BSIZE) & ~0xffff)) { + /* + * sys/lib/libsa/cd9600.c converts 2,048-byte CD sectors + * to DEV_BSIZE blocks before calling the device strategy + * routine. However, the El Torito spec says that the + * BIOS will work in 2,048-byte sectors. So shift back. + */ + off >>= (ISO_DEFAULT_BLOCK_SHIFT - DEV_BSHIFT); + nsect >>= (ISO_DEFAULT_BLOCK_SHIFT - DEV_BSHIFT); + } + + /* + * Use a bounce buffer to not cross 64k DMA boundary, and to + * not access above 1 MB. + */ + if (((((u_int32_t)buf) & ~0xffff) != + (((u_int32_t)buf + bbsize) & ~0xffff)) || + (((u_int32_t)buf) > 0x100000)) { /* * XXX we believe that all the io is buffered * by fs routines, so no big reads anyway */ - bb = alloca(nsect * DEV_BSIZE); + bb = alloca(bbsize); if (rw != F_READ) - bcopy(buf, bb, nsect * DEV_BSIZE); + bcopy(buf, bb, bbsize); } else bb = buf; @@ -302,7 +322,7 @@ biosd_io(int rw, bios_diskinfo_t *bd, daddr_t off, int nsect, void *buf) } if (bb != buf && rw == F_READ) - bcopy(bb, buf, nsect * DEV_BSIZE); + bcopy(bb, buf, bbsize); #ifdef BIOS_DEBUG if (debug) { @@ -442,6 +462,9 @@ biosopen(struct open_file *f, ...) break; case 2: /* fd */ break; + case 6: /* cd */ + biosdev = bios_bootdev & 0xff; + break; default: return ENXIO; } diff --git a/sys/arch/i386/stand/libsa/dev_i386.c b/sys/arch/i386/stand/libsa/dev_i386.c index 45afe2243c7..4db4b1e0b6f 100644 --- a/sys/arch/i386/stand/libsa/dev_i386.c +++ b/sys/arch/i386/stand/libsa/dev_i386.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev_i386.c,v 1.28 2004/03/09 19:12:12 tom Exp $ */ +/* $OpenBSD: dev_i386.c,v 1.29 2004/06/23 00:21:49 tom Exp $ */ /* * Copyright (c) 1996-1999 Michael Shalayeff @@ -97,12 +97,18 @@ devboot(dev_t bootdev, char *p) *p++ = '/'; *p++ = 'r'; #endif - if (bootdev & 0x80) - *p++ = 'h'; - else - *p++ = 'f'; - *p++ = 'd'; - *p++ = '0' + (bootdev & 0x7f); + if (bootdev & 0x100) { + *p++ = 'c'; + *p++ = 'd'; + *p++ = '0'; + } else { + if (bootdev & 0x80) + *p++ = 'h'; + else + *p++ = 'f'; + *p++ = 'd'; + *p++ = '0' + (bootdev & 0x7f); + } *p++ = 'a'; *p = '\0'; } diff --git a/sys/arch/i386/stand/libsa/diskprobe.c b/sys/arch/i386/stand/libsa/diskprobe.c index 27cc00c7d47..838117b6a7c 100644 --- a/sys/arch/i386/stand/libsa/diskprobe.c +++ b/sys/arch/i386/stand/libsa/diskprobe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diskprobe.c,v 1.26 2004/03/19 13:48:18 tom Exp $ */ +/* $OpenBSD: diskprobe.c,v 1.27 2004/06/23 00:21:49 tom Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -53,6 +53,8 @@ struct disklist_lh disklist; struct diskinfo *bootdev_dip; extern int debug; +extern int bios_bootdev; +extern int bios_cddev; /* Probe for all BIOS floppies */ static void @@ -205,6 +207,84 @@ diskprobe(void) } +void +cdprobe(void) +{ + struct diskinfo *dip; + int cddev = bios_cddev & 0xff; + + /* Another BIOS boot device... */ + + if (bios_cddev == -1) /* Not been set, so don't use */ + return; + + dip = alloc(sizeof(struct diskinfo)); + bzero(dip, sizeof(*dip)); + +#if 0 + if (bios_getdiskinfo(cddev, &dip->bios_info)) { + printf(" <!cd0>"); /* XXX */ + free(dip, 0); + return; + } +#endif + + printf(" cd0"); + + dip->bios_info.bios_number = cddev; + dip->bios_info.bios_edd = 1; /* Use the LBA calls */ + dip->bios_info.flags |= BDI_GOODLABEL | BDI_EL_TORITO; + dip->bios_info.checksum = 0; /* just in case */ + dip->bios_info.bsd_dev = + MAKEBOOTDEV(0, 0, 0, 0xff, RAW_PART); + + /* Create an imaginary disk label */ + dip->disklabel.d_secsize = 2048; + dip->disklabel.d_ntracks = 1; + dip->disklabel.d_nsectors = 100; + dip->disklabel.d_ncylinders = 1; + dip->disklabel.d_secpercyl = dip->disklabel.d_ntracks * + dip->disklabel.d_nsectors; + if (dip->disklabel.d_secpercyl == 0) { + dip->disklabel.d_secpercyl = 100; + /* as long as it's not 0, since readdisklabel divides by it */ + } + + strncpy(dip->disklabel.d_typename, "ATAPI CD-ROM", + sizeof(dip->disklabel.d_typename)); + dip->disklabel.d_type = DTYPE_ATAPI; + + strncpy(dip->disklabel.d_packname, "fictitious", + sizeof(dip->disklabel.d_packname)); + dip->disklabel.d_secperunit = 100; + dip->disklabel.d_rpm = 300; + dip->disklabel.d_interleave = 1; + dip->disklabel.d_flags = D_REMOVABLE; + + dip->disklabel.d_bbsize = 2048; + dip->disklabel.d_sbsize = 2048; + + dip->disklabel.d_magic = DISKMAGIC; + dip->disklabel.d_magic2 = DISKMAGIC; + dip->disklabel.d_checksum = dkcksum(&dip->disklabel); + + /* 'a' partition covering the "whole" disk */ + dip->disklabel.d_partitions[0].p_offset = 0; + dip->disklabel.d_partitions[0].p_size = 100; + dip->disklabel.d_partitions[0].p_fstype = FS_UNUSED; + + /* The raw partition is special */ + dip->disklabel.d_partitions[RAW_PART].p_offset = 0; + dip->disklabel.d_partitions[RAW_PART].p_size = 100; + dip->disklabel.d_partitions[RAW_PART].p_fstype = FS_UNUSED; + + dip->disklabel.d_npartitions = RAW_PART + 1; + + /* Add to queue of disks */ + TAILQ_INSERT_TAIL(&disklist, dip, list); +} + + /* Find info on given BIOS disk */ struct diskinfo * dklookup(int dev) @@ -227,9 +307,18 @@ dump_diskinfo(void) for (dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)) { bios_diskinfo_t *bdi = &dip->bios_info; int d = bdi->bios_number; + int u = d & 0x7f; + char c; + + if (bdi->flags & BDI_EL_TORITO) { + c = 'c'; + u = 0; + } else { + c = (d & 0x80) ? 'h' : 'f'; + } printf("%cd%d\t0x%x\t%s\t%d\t%d\t%d\t0x%x\t0x%x\n", - (d & 0x80)?'h':'f', d & 0x7F, d, + c, u, d, (bdi->flags & BDI_BADLABEL)?"*none*":"label", bdi->bios_cylinders, bdi->bios_heads, bdi->bios_sectors, bdi->flags, bdi->checksum); diff --git a/sys/arch/i386/stand/libsa/libsa.h b/sys/arch/i386/stand/libsa/libsa.h index f2cae0987f1..2da7e66bd79 100644 --- a/sys/arch/i386/stand/libsa/libsa.h +++ b/sys/arch/i386/stand/libsa/libsa.h @@ -1,4 +1,4 @@ -/* $OpenBSD: libsa.h,v 1.39 2004/03/19 13:48:18 tom Exp $ */ +/* $OpenBSD: libsa.h,v 1.40 2004/06/23 00:21:49 tom Exp $ */ /* * Copyright (c) 1996-1999 Michael Shalayeff @@ -49,6 +49,7 @@ void ps2probe(void); void pciprobe(void); void memprobe(void); void diskprobe(void); +void cdprobe(void); void apmprobe(void); void apmfixmem(void); void dump_biosmem(bios_memmap_t *); |