shithub: riscv

Download patch

ref: 2060daf3b0f7ad91c73cec00516659f248841983
parent: 5ba95fdb07ddc2c32111a1b2f57f17aa27fcbbf5
author: mischief <[email protected]>
date: Tue Jun 24 15:37:03 EDT 2014

xen: fix early console

--- a/sys/src/9/xen/fns.h
+++ b/sys/src/9/xen/fns.h
@@ -59,6 +59,7 @@
 int	intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
 void	intrenable(int, void (*)(Ureg*, void*), void*, int, char*);
 int	ioalloc(int, int, int, char*);
+void	ioinit(void);
 int	isaconfig(char*, int, ISAConf*);
 void	kbdenable(void);
 #define	kmapinval()
--- a/sys/src/9/xen/main.c
+++ b/sys/src/9/xen/main.c
@@ -73,8 +73,9 @@
 {
 	mach0init();
 	options();
-	quotefmtinstall();
+	ioinit();
 	xenconsinit();
+	quotefmtinstall();
 
 	//consdebug = rdb;
 	print("\nPlan 9 (%s)\n", xenstart->magic);
--- a/sys/src/9/xen/uartxen.c
+++ b/sys/src/9/xen/uartxen.c
@@ -90,7 +90,7 @@
 	coherence();
 	while (cons != con->in_prod) {
 		c = con->in[MASK_XENCONS_IDX(cons++, con->in)];
-		uartrecv(uart, c & 0xFF);
+		uartrecv(uart, c);
 	}
 	coherence();
 	con->in_cons = cons;
@@ -232,23 +232,14 @@
 	struct xencons_interface *con = xencons.intf;
 	unsigned long prod;
 
-	c &= 0xFF;
-
 	ilock(&xencons.txlock);
-	/*
-	while(con->out_cons == con->out_prod)
-		HYPERVISOR_yield();
-	*/
-	if(con->out_cons == con->out_prod){
-		iunlock(&xencons.txlock);
-		return;
+	prod = con->out_prod;
+	if((prod - con->out_cons) < sizeof(con->out)){
+		if (c == '\n')
+			con->out[MASK_XENCONS_IDX(prod++, con->out)] = '\r';
+		con->out[MASK_XENCONS_IDX(prod++, con->out)] = c;
 	}
 
-	prod = con->out_prod;
-
-	if((con->out[MASK_XENCONS_IDX(prod++, con->out)] = c) == '\n')
-		con->out[MASK_XENCONS_IDX(prod++, con->out)] = '\r';
-
 	coherence();
 	con->out_prod = prod;
 	xenchannotify(xencons.evtchn);
@@ -303,6 +294,7 @@
 	xencons.evtchn = xenstart->console_evtchn;
 
 	consuart = &xenuart;
+	consuart->console = 1;
 }
 
 void
@@ -326,9 +318,5 @@
 
 	consuart = uart;
 	uart->console = 1;
-
-	uartputs("CONSOLE1\n", 9);
-
-	//*(char*)0 = 0;
 }