Date: Fri, 29 Nov 1996 02:27:19 +0100 (MET) From: Tor Egge <Tor.Egge@idt.ntnu.no> To: FreeBSD-gnats-submit@freebsd.org Subject: i386/2117: nb8390.com hangs with some BIOS combinations Message-ID: <199611290127.CAA12304@ikke.idt.unit.no> Resent-Message-ID: <199611290130.RAA21854@freefall.freebsd.org>
index | next in thread | raw e-mail
>Number: 2117
>Category: i386
>Synopsis: nb8390.com hangs with some BIOS combinations
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Nov 28 17:30:01 PST 1996
>Last-Modified:
>Originator: Tor Egge
>Organization:
Norwegian University of Science and Technology, Trondheim, Norway
>Release: FreeBSD 3.0-CURRENT i386
>Environment:
Intel motherboard (Neptune Chipset)
NCR 53C815 SCSI controller
AMIBIOS (C) 1992 American Megatrends, Inc.
BIOS Version 1.00.16.AX1
NCR SDMS (TM) V3.0 PCI SCSI BIOS, PCI Rev. 2.0
Copyright 1993 NCR Corporation.
NCRPCI04-3.04.00
MS DOS 6.0 or PCDOS 7.0
nb8390.com
>Description:
nb8390.com hangs when getting disk parameters from BIOS.
This is probably due to a bug in the BIOS present on the
NCR 53C815 SCSI controller.
>How-To-Repeat:
Get a similar configuration.
>Fix:
The only critical part of this diff is clearing %ebp before
calling int $0x13 and int $0x19. It may also be necessary to
clear %ebp in the BOOTROM case before exiting.
The changes are
- clear %ebp before calling $int 0x13, to avoid hang at startup.
- clear %ebp before calling $int 0x19, to avoid hang during boot
from disk after the "Starting PC DOS..." message when using
the diskboot command.
- workarounds for other possible BIOS quirks by saving/restoring
some registers which gcc expects to be unchanged.
- use of smaller use16 segment during transition to real mode
(64 KB in size, instead of 1 MB).
- use of CR0_PE_ON and CR0_PE_OFF (as used by corresponding routines
in biosboot/asm.S) instead of CR0_PE.
Index: start2.S
===================================================================
RCS file: /export/akg1/cvs/src/sys/i386/boot/netboot/start2.S,v
retrieving revision 1.4
diff -c -r1.4 start2.S
*** start2.S 1996/11/11 14:27:12 1.4
--- start2.S 1996/11/29 00:54:12
***************
*** 3,9 ****
#define KERN_CODE_SEG 0x08
#define KERN_DATA_SEG 0x10
#define REAL_MODE_SEG 0x18
! #define CR0_PE 1
#define opsize .byte 0x66
#define addrsize .byte 0x67
--- 3,10 ----
#define KERN_CODE_SEG 0x08
#define KERN_DATA_SEG 0x10
#define REAL_MODE_SEG 0x18
! CR0_PE_ON = 0x1
! CR0_PE_OFF = 0xfffffffe
#define opsize .byte 0x66
#define addrsize .byte 0x67
***************
*** 117,122 ****
--- 118,125 ----
push %eax
lret
#else
+ opsize
+ xor %ebp,%ebp
int $0x19
#endif
***************
*** 127,134 ****
_currticks:
push %ebp
mov %esp,%ebp
! push %ecx
! push %edx
xor %edx,%edx
call _prot_to_real
xor %eax,%eax
--- 130,138 ----
_currticks:
push %ebp
mov %esp,%ebp
! push %ebx
! push %esi
! push %edi
xor %edx,%edx
call _prot_to_real
xor %eax,%eax
***************
*** 139,146 ****
shl $16,%ecx
mov %edx,%eax
or %ecx,%eax
! pop %edx
! pop %ecx
pop %ebp
ret
--- 143,151 ----
shl $16,%ecx
mov %edx,%eax
or %ecx,%eax
! pop %edi
! pop %esi
! pop %ebx
pop %ebp
ret
***************
*** 151,158 ****
_putchar:
push %ebp
mov %esp,%ebp
- push %ecx
push %ebx
movb 8(%ebp),%cl
call _prot_to_real
opsize
--- 156,164 ----
_putchar:
push %ebp
mov %esp,%ebp
push %ebx
+ push %esi
+ push %edi
movb 8(%ebp),%cl
call _prot_to_real
opsize
***************
*** 162,169 ****
int $0x10
opsize
call _real_to_prot
pop %ebx
- pop %ecx
pop %ebp
ret
--- 168,176 ----
int $0x10
opsize
call _real_to_prot
+ pop %edi
+ pop %esi
pop %ebx
pop %ebp
ret
***************
*** 175,180 ****
--- 182,189 ----
push %ebp
mov %esp,%ebp
push %ebx
+ push %esi
+ push %edi
call _prot_to_real
movb $0x0,%ah
int $0x16
***************
*** 183,188 ****
--- 192,199 ----
call _real_to_prot
xor %eax,%eax
movb %bl,%al
+ pop %edi
+ pop %esi
pop %ebx
pop %ebp
ret
***************
*** 195,200 ****
--- 206,213 ----
push %ebp
mov %esp,%ebp
push %ebx
+ push %esi
+ push %edi
call _prot_to_real
xor %ebx,%ebx
movb $0x1,%ah
***************
*** 207,212 ****
--- 220,227 ----
call _real_to_prot
xor %eax,%eax
movb %bl,%al
+ pop %edi
+ pop %esi
pop %ebx
pop %ebp
ret
***************
*** 270,276 ****
lgdt gdtarg-RELOC
mov %cr0, %eax
opsize
! or $CR0_PE, %eax
mov %eax, %cr0 /* turn on protected mode */
/* jump to relocation, flush prefetch queue, and reload %cs */
--- 285,291 ----
lgdt gdtarg-RELOC
mov %cr0, %eax
opsize
! or $CR0_PE_ON, %eax
mov %eax, %cr0 /* turn on protected mode */
/* jump to relocation, flush prefetch queue, and reload %cs */
***************
*** 298,309 ****
sub $RELOC,%eax /* Adjust return address */
push %eax
sub $RELOC,%esp /* Adjust stack pointer */
! ljmp $REAL_MODE_SEG, $1f /* jump to a 16 bit segment */
1:
/* clear the PE bit of CR0 */
mov %cr0, %eax
opsize
! andl $0!CR0_PE, %eax
mov %eax, %cr0
/* make intersegment jmp to flush the processor pipeline
--- 313,324 ----
sub $RELOC,%eax /* Adjust return address */
push %eax
sub $RELOC,%esp /* Adjust stack pointer */
! ljmp $REAL_MODE_SEG, $1f-RELOC /* jump to a 16 bit segment */
1:
/* clear the PE bit of CR0 */
mov %cr0, %eax
opsize
! andl $CR0_PE_OFF, %eax
mov %eax, %cr0
/* make intersegment jmp to flush the processor pipeline
***************
*** 346,351 ****
--- 361,367 ----
push %edx
movb 0x8(%ebp), %dl /* diskinfo(drive #) */
+ xor %ebp,%ebp /* AMIBIOS compatibility */
call _prot_to_real /* enter real mode */
movb $0x8, %ah /* ask for disk info */
***************
*** 418,425 ****
.byte 0, 0x93, 0xcf, 0
/* 16 bit real mode */
! .word 0xffff, 0
! .byte 0, 0x9b, 0x0f, 0
.align 4
gdtarg:
--- 434,441 ----
.byte 0, 0x93, 0xcf, 0
/* 16 bit real mode */
! .word 0xffff, RELOC&0xffff
! .byte (RELOC>>16), 0x9e, 0x00, (RELOC>>24)
.align 4
gdtarg:
>Audit-Trail:
>Unformatted:
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199611290127.CAA12304>
