summaryrefslogtreecommitdiff
path: root/sys/arch/i386/stand/libsa
diff options
context:
space:
mode:
authorTobias Weingartner <weingart@cvs.openbsd.org>1997-04-18 06:54:44 +0000
committerTobias Weingartner <weingart@cvs.openbsd.org>1997-04-18 06:54:44 +0000
commitec0b529dc4ee0faa2e7d18e5378077000b5cb1b5 (patch)
tree021ffdd11d9d6a1a32ab915813a50261264ca618 /sys/arch/i386/stand/libsa
parent45bdba0303bced35cd48a4d868be40dc100988b7 (diff)
Clean up error handling a little. There is a small
problem with marginal disks. This code does not like them at all. I'm too frazzled right now to figure this out. This should give better error messages...
Diffstat (limited to 'sys/arch/i386/stand/libsa')
-rw-r--r--sys/arch/i386/stand/libsa/biosdev.c27
-rw-r--r--sys/arch/i386/stand/libsa/biosdev.h3
-rw-r--r--sys/arch/i386/stand/libsa/biosdisk.S23
3 files changed, 37 insertions, 16 deletions
diff --git a/sys/arch/i386/stand/libsa/biosdev.c b/sys/arch/i386/stand/libsa/biosdev.c
index ce0862184f4..d7600c3dcf9 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.10 1997/04/18 04:23:51 mickey Exp $ */
+/* $OpenBSD: biosdev.c,v 1.11 1997/04/18 06:54:40 weingart Exp $ */
/*
* Copyright (c) 1996 Michael Shalayeff
@@ -307,10 +307,12 @@ biosstrategy(void *devdata, int rw,
if (debug)
printf(" (%d,%d,%d,%d)@%p", cyl, hd, sect, n, bb);
#endif
- for (error = 1, j = 5; error && j--;) {
- error = (rw == F_READ)?
- biosread (bd->biosdev, cyl, hd, sect, n, bb)
- : bioswrite(bd->biosdev, cyl, hd, sect, n, bb);
+ /* Try to do operation up to 5 times */
+ for (error = 1, j = 5; error && (j > 0); j--) {
+ if(rw == F_READ)
+ error = biosread(bd->biosdev, cyl, hd, sect, n, bb);
+ else
+ error = bioswrite(bd->biosdev, cyl, hd, sect, n, bb);
switch (error) {
case 0x00: /* No errors */
@@ -318,15 +320,12 @@ biosstrategy(void *devdata, int rw,
error = 0;
break;
- default:
-#ifdef BIOS_DEBUG
- if (debug) {
- for (p = bd_errors; p < &bd_errors[bd_nents] &&
- p->bd_id != error; p++);
- printf("\nBIOS error %x (%s)\n", p->bd_id, p->msg);
- }
-#endif
- continue;
+ default: /* All other errors */
+ for (p = bd_errors; p < &bd_errors[bd_nents] &&
+ p->bd_id != error; p++);
+ printf("\nBIOS error %x (%s)\n", p->bd_id, p->msg);
+ biosdreset();
+ break;
}
}
diff --git a/sys/arch/i386/stand/libsa/biosdev.h b/sys/arch/i386/stand/libsa/biosdev.h
index 198003f118a..c20004f32d8 100644
--- a/sys/arch/i386/stand/libsa/biosdev.h
+++ b/sys/arch/i386/stand/libsa/biosdev.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: biosdev.h,v 1.4 1997/04/09 08:39:17 mickey Exp $ */
+/* $OpenBSD: biosdev.h,v 1.5 1997/04/18 06:54:42 weingart Exp $ */
/*
* Copyright (c) 1996 Michael Shalayeff
@@ -50,6 +50,7 @@ int biosioctl __P((struct open_file *, u_long, void *));
/* biosdisk.S */
u_int16_t biosdinfo __P((int dev));
+int biosdreset __P((void));
int biosread __P((int dev, int cyl, int hd, int sect, int nsect, void *));
int bioswrite __P((int dev, int cyl, int hd, int sect, int nsect, void *));
diff --git a/sys/arch/i386/stand/libsa/biosdisk.S b/sys/arch/i386/stand/libsa/biosdisk.S
index bd9e0c670ad..06890298926 100644
--- a/sys/arch/i386/stand/libsa/biosdisk.S
+++ b/sys/arch/i386/stand/libsa/biosdisk.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: biosdisk.S,v 1.5 1997/04/09 08:39:20 mickey Exp $ */
+/* $OpenBSD: biosdisk.S,v 1.6 1997/04/18 06:54:43 weingart Exp $ */
/*
* Ported to boot 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
@@ -141,3 +141,24 @@ ENTRY(biosdinfo)
popl %ebp
ret
+
+/*
+#
+# biosdreset(): reset disk system
+#
+*/
+
+ENTRY(biosdreset)
+ pushl %ebp
+ movl %esp, %ebp
+ pushl %ebx
+ pushl %ecx
+
+ movb $0x00, %ah # ask for disk info
+ BIOSINT(0x13)
+
+ popl %ecx
+ popl %ebx
+ popl %ebp
+ ret
+