git: 9front

Download patch

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;
 
--