39,19 → 39,9 |
#include <console/chardev.h> |
#include <console/console.h> |
#include <arch/hypercall.h> |
#include <mm/frame.h> |
|
#define MASK_INDEX(index, ring) ((index) & (sizeof(ring) - 1)) |
|
typedef struct { |
char in[1024]; |
char out[2048]; |
uint32_t in_cons; |
uint32_t in_prod; |
uint32_t out_cons; |
uint32_t out_prod; |
} xencons_t; |
|
static bool asynchronous = false; |
static void xen_putchar(chardev_t *d, const char ch); |
|
71,22 → 61,21 |
void xen_putchar(chardev_t *d, const char ch) |
{ |
if (asynchronous) { |
xencons_t *console = (xencons_t *) PA2KA(MA2PA(PFN2ADDR(start_info.console_mfn))); |
uint32_t cons = console->out_cons; |
uint32_t prod = console->out_prod; |
uint32_t cons = console_page.out_cons; |
uint32_t prod = console_page.out_prod; |
|
memory_barrier(); |
|
if ((prod - cons) > sizeof(console->out)) |
if ((prod - cons) > sizeof(console_page.out)) |
return; |
|
if (ch == '\n') |
console->out[MASK_INDEX(prod++, console->out)] = '\r'; |
console->out[MASK_INDEX(prod++, console->out)] = ch; |
console_page.out[MASK_INDEX(prod++, console_page.out)] = '\r'; |
console_page.out[MASK_INDEX(prod++, console_page.out)] = ch; |
|
write_barrier(); |
|
console->out_prod = prod; |
console_page.out_prod = prod; |
|
xen_notify_remote(start_info.console_evtchn); |
} else |