⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vga.c

📁 xen虚拟机源代码安装包
💻 C
字号:
/****************************************************************************** * vga.c *  * VGA support routines. */#include <xen/config.h>#include <xen/init.h>#include <xen/lib.h>#include <xen/mm.h>#include <xen/errno.h>#include <xen/console.h>#include <xen/vga.h>#include <asm/io.h>/* Filled in by arch boot code. */struct xen_vga_console_info vga_console_info;static int vgacon_keep;static unsigned int xpos, ypos;static unsigned char *video;static void vga_text_puts(const char *s);static void vga_noop_puts(const char *s) {}void (*vga_puts)(const char *) = vga_noop_puts;/* * 'vga=<mode-specifier>[,keep]' where <mode-specifier> is one of: *  *   'vga=ask': *      display a vga menu of available modes *  *   'vga=current': *      use the current vga mode without modification *  *   'vga=text-80x<rows>': *      text mode, where <rows> is one of {25,28,30,34,43,50,60} *  *   'vga=gfx-<width>x<height>x<depth>': *      graphics mode, e.g., vga=gfx-1024x768x16 *  *   'vga=mode-<mode>: *      specifies a mode as specified in 'vga=ask' menu *      (NB. menu modes are displayed in hex, so mode numbers here must *           be prefixed with '0x' (e.g., 'vga=mode-0x0318')) *  * The option 'keep' causes Xen to continue to print to the VGA console even  * after domain 0 starts to boot. The default behaviour is to relinquish * control of the console to domain 0. */static char opt_vga[30] = "";string_param("vga", opt_vga);/* VGA text-mode definitions. */static unsigned int columns, lines;#define ATTRIBUTE   7#ifdef CONFIG_X86_64void vesa_early_init(void);void vesa_endboot(void);#else#define vesa_early_init() ((void)0)#define vesa_endboot()    ((void)0)#endifvoid __init vga_init(void){    char *p;    /* Look for 'keep' in comma-separated options. */    for ( p = opt_vga; p != NULL; p = strchr(p, ',') )    {        if ( *p == ',' )            p++;        if ( strncmp(p, "keep", 4) == 0 )            vgacon_keep = 1;    }    switch ( vga_console_info.video_type )    {    case XEN_VGATYPE_TEXT_MODE_3:        if ( memory_is_conventional_ram(0xB8000) ||             ((video = ioremap(0xB8000, 0x8000)) == NULL) )            return;        outw(0x200a, 0x3d4); /* disable cursor */        columns = vga_console_info.u.text_mode_3.columns;        lines   = vga_console_info.u.text_mode_3.rows;        memset(video, 0, columns * lines * 2);        vga_puts = vga_text_puts;        break;    case XEN_VGATYPE_VESA_LFB:        vesa_early_init();        break;    default:        memset(&vga_console_info, 0, sizeof(vga_console_info));        break;    }}void __init vga_endboot(void){    if ( vga_puts == vga_noop_puts )        return;    printk("Xen is %s VGA console.\n",           vgacon_keep ? "keeping" : "relinquishing");    vesa_endboot();    if ( !vgacon_keep )        vga_puts = vga_noop_puts;}static void vga_text_puts(const char *s){    char c;    while ( (c = *s++) != '\0' )    {        if ( (c == '\n') || (xpos >= columns) )        {            if ( ++ypos >= lines )            {                ypos = lines - 1;                memmove(video, video + 2 * columns, ypos * 2 * columns);                memset(video + ypos * 2 * columns, 0, 2 * xpos);            }            xpos = 0;        }        if ( c != '\n' )        {            video[(xpos + ypos * columns) * 2]     = c;            video[(xpos + ypos * columns) * 2 + 1] = ATTRIBUTE;            xpos++;        }    }}int __init fill_console_start_info(struct dom0_vga_console_info *ci){    memcpy(ci, &vga_console_info, sizeof(*ci));    return 1;}

⌨️ 快捷键说明

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