console.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 158 行

C
158
字号
/*  **************************************************************************** * (C) 2006 - Grzegorz Milos - Cambridge University **************************************************************************** * *        File: console.h *      Author: Grzegorz Milos *     Changes:  *               *        Date: Mar 2006 *  * Environment: Xen Minimal OS * Description: Console interface. * * Handles console I/O. Defines printk. * **************************************************************************** * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER  * DEALINGS IN THE SOFTWARE. */ #include <types.h>#include <wait.h>#include <mm.h>#include <hypervisor.h>#include <events.h>#include <os.h>#include <lib.h>#include <xenbus.h>#include <xen/io/console.h>/* Copies all print output to the Xen emergency console apart   of standard dom0 handled console */#define USE_XEN_CONSOLE/* If console not initialised the printk will be sent to xen serial line    NOTE: you need to enable verbose in xen/Rules.mk for it to work. */static int console_initialised = 0;#ifndef HAVE_LIBCvoid xencons_rx(char *buf, unsigned len, struct pt_regs *regs){    if(len > 0)    {        /* Just repeat what's written */        buf[len] = '\0';        printk("%s", buf);                if(buf[len-1] == '\r')            printk("\nNo console input handler.\n");    }}void xencons_tx(void){    /* Do nothing, handled by _rx */}#endifvoid console_print(char *data, int length){    char *curr_char, saved_char;    int part_len;    int (*ring_send_fn)(const char *data, unsigned length);    if(!console_initialised)        ring_send_fn = xencons_ring_send_no_notify;    else        ring_send_fn = xencons_ring_send;            for(curr_char = data; curr_char < data+length-1; curr_char++)    {        if(*curr_char == '\n')        {            saved_char = *(curr_char+1);            *(curr_char+1) = '\r';            part_len = curr_char - data + 2;            ring_send_fn(data, part_len);            *(curr_char+1) = saved_char;            data = curr_char+1;            length -= part_len - 1;        }    }        ring_send_fn(data, length);        if(data[length-1] == '\n')        ring_send_fn("\r", 1);}void print(int direct, const char *fmt, va_list args){    static char   buf[1024];        (void)vsnprintf(buf, sizeof(buf), fmt, args);     if(direct)    {        (void)HYPERVISOR_console_io(CONSOLEIO_write, strlen(buf), buf);        return;    } else {#ifndef USE_XEN_CONSOLE    if(!console_initialised)#endif                (void)HYPERVISOR_console_io(CONSOLEIO_write, strlen(buf), buf);                console_print(buf, strlen(buf));    }}void printk(const char *fmt, ...){    va_list       args;    va_start(args, fmt);    print(0, fmt, args);    va_end(args);        }void xprintk(const char *fmt, ...){    va_list       args;    va_start(args, fmt);    print(1, fmt, args);    va_end(args);        }void init_console(void){       printk("Initialising console ... ");    xencons_ring_init();        console_initialised = 1;    /* This is also required to notify the daemon */    printk("done.\n");}void fini_console(void){    /* Destruct the console and get the parameters of the restarted one */}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?