Ignore:
Timestamp:
2006-08-01T23:34:02Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
adf7f9c
Parents:
5b23a82
Message:

xen32: proper virtual traps, domU asynchronous console

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/xen32/src/drivers/xconsole.c

    r5b23a82 r7c5a8dd  
    4040#include <console/console.h>
    4141#include <arch/hypercall.h>
     42#include <mm/frame.h>
    4243
     44#define MASK_INDEX(index, ring) ((index) & (sizeof(ring) - 1))
     45
     46typedef struct {
     47        char in[1024];
     48        char out[2048];
     49    uint32_t in_cons;
     50        uint32_t in_prod;
     51    uint32_t out_cons;
     52        uint32_t out_prod;
     53} xencons_t;
     54
     55static bool asynchronous = false;
    4356static void xen_putchar(chardev_t *d, const char ch);
    4457
     
    5265        chardev_initialize("xen_out", &xen_console, &xen_ops);
    5366        stdout = &xen_console;
     67        if (!(start_info.flags & SIF_INITDOMAIN))
     68                asynchronous = true;
    5469}
    5570
    5671void xen_putchar(chardev_t *d, const char ch)
    5772{
    58         xen_console_io(CONSOLE_IO_WRITE, 1, &ch);
     73        if (asynchronous) {
     74                xencons_t *console = (xencons_t *) PA2KA(MA2PA(PFN2ADDR(start_info.console_mfn)));
     75                uint32_t cons = console->out_cons;
     76                uint32_t prod = console->out_prod;
     77               
     78                memory_barrier();
     79               
     80                if ((prod - cons) > sizeof(console->out))
     81                        return;
     82               
     83                if (ch == '\n')
     84                        console->out[MASK_INDEX(prod++, console->out)] = '\r';
     85                console->out[MASK_INDEX(prod++, console->out)] = ch;
     86               
     87                write_barrier();
     88               
     89                console->out_prod = prod;
     90               
     91                xen_notify_remote(start_info.console_evtchn);
     92        } else
     93                xen_console_io(CONSOLE_IO_WRITE, 1, &ch);
    5994}
    6095
Note: See TracChangeset for help on using the changeset viewer.