summaryrefslogtreecommitdiff
path: root/sys/src/boot
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-05-15 12:16:01 +0000
committercinap_lenrek <cinap_lenrek@centraldogma>2011-05-15 12:16:01 +0000
commit5648d53cdbccdf9fd2f4eb0290f75e3ba23c0de8 (patch)
tree517da5b481523c21d193d118ef1e97f16e95f467 /sys/src/boot
parenta67e921c7fcbb1a173801818fff49d01eafb9aaa (diff)
9boot: use 500 ms timeout
Diffstat (limited to 'sys/src/boot')
-rw-r--r--sys/src/boot/pc/fns.h1
-rw-r--r--sys/src/boot/pc/l.s11
-rw-r--r--sys/src/boot/pc/sub.c20
3 files changed, 29 insertions, 3 deletions
diff --git a/sys/src/boot/pc/fns.h b/sys/src/boot/pc/fns.h
index 11176f07f..8a36ce04b 100644
--- a/sys/src/boot/pc/fns.h
+++ b/sys/src/boot/pc/fns.h
@@ -9,6 +9,7 @@ void start(void *sp);
int getc(void);
int gotc(void);
void putc(int c);
+void usleep(int t);
void halt(void);
void jump(void *pc);
diff --git a/sys/src/boot/pc/l.s b/sys/src/boot/pc/l.s
index e8fa45954..8e47c4bf9 100644
--- a/sys/src/boot/pc/l.s
+++ b/sys/src/boot/pc/l.s
@@ -171,6 +171,17 @@ _pret32:
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
diff --git a/sys/src/boot/pc/sub.c b/sys/src/boot/pc/sub.c
index 981d3f61a..428bc8cf5 100644
--- a/sys/src/boot/pc/sub.c
+++ b/sys/src/boot/pc/sub.c
@@ -129,6 +129,18 @@ readline(void *f, char buf[64])
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 @@ Loop:
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;