ref: 2876e681bcf028e9416218ee66536f36fe92c3c1
parent: f03b2310f68df5739f1a18b3156a13f1a439d180
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Sun May 15 08:16:01 EDT 2011
9boot: use 500 ms timeout
--- a/sys/src/boot/pc/fns.h
+++ b/sys/src/boot/pc/fns.h
@@ -9,6 +9,7 @@
int getc(void);
int gotc(void);
void putc(int c);
+void usleep(int t);
void halt(void);
void jump(void *pc);
--- a/sys/src/boot/pc/l.s
+++ b/sys/src/boot/pc/l.s
@@ -171,6 +171,17 @@
ANDL $0xFFFF, AX
RET
+TEXT usleep(SB), $0
+ MOVL t+4(SP), AX
+ PUSHL AX
+ CALL rmode16(SB)
+ CALL16(spllo(SB))
+ POPR(rDX)
+ POPR(rCX)
+ MOVB $0x86, AH
+ BIOSCALL(0x15)
+ JMP _pret32
+
#ifdef PXE
TEXT pxeinit(SB), $0
--- a/sys/src/boot/pc/sub.c
+++ b/sys/src/boot/pc/sub.c
@@ -129,6 +129,18 @@
return p - buf;
}
+static int
+timeout(int ms)
+{+ while(ms > 0){+ if(gotc())
+ return 1;
+ usleep(100000);
+ ms -= 100;
+ }
+ return 0;
+}
+
#define BOOTLINE ((char*)CONFADDR)
#define BOOTLINELEN 64
#define BOOTARGS ((char*)(CONFADDR+BOOTLINELEN))
@@ -176,17 +188,19 @@
print(line); print(crnl);
}
*confend = 0;
+
if(f){close(f);
f = 0;
+
+ if(kern && timeout(500))
+ goto Loop;
}
+
if(!kern){ print("no bootfile\r\n");goto Loop;
}
- for(n=0; n<10000; n++)
- if(gotc())
- goto Loop;
if(p = strrchr(kern, '!'))
kern = p+1;
--
⑨