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