Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 1831 → Rev 1832

/trunk/kernel/arch/xen32/include/drivers/xconsole.h
35,6 → 35,19
#ifndef __XCONSOLE_H__
#define __XCONSOLE_H__
 
#include <arch/types.h>
 
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;
 
extern xencons_t console_page;
 
extern void xen_console_init(void);
 
#endif
/trunk/kernel/arch/xen32/src/xen32.c
79,6 → 79,11
pte.frame_address = ADDR2PFN((uintptr_t) start_info.shared_info);
xen_update_va_mapping(&shared_info, pte, UVMF_INVLPG);
pte.present = 1;
pte.writeable = 1;
pte.frame_address = start_info.console_mfn;
xen_update_va_mapping(&console_page, pte, UVMF_INVLPG);
xen_set_callbacks(XEN_CS, xen_callback, XEN_CS, xen_failsafe_callback);
/* Create identity mapping */
/trunk/kernel/arch/xen32/src/boot/boot.S
77,3 → 77,8
.org 0x1000
shared_info:
.space PAGE_SIZE
 
.global console_page
.org 0x2000
console_page:
.space PAGE_SIZE
/trunk/kernel/arch/xen32/src/drivers/xconsole.c
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