Jan Beulich
2007-Aug-09 13:12 UTC
[Xen-devel] [PATCH] linux/x86: retrieve VESA capabilities in dom0
Subject: Obtain VESA capabilities and attributes of VESA mode Also, move some more common code to dom0_init_screen_info(). This was tested on 2.6.22.1, and only made apply to 2.6.18 without further testing. Signed-off-by: Jan Beulich <jbeulich@novell.com> Index: head-2007-08-07/arch/i386/kernel/setup-xen.c ==================================================================--- head-2007-08-07.orig/arch/i386/kernel/setup-xen.c 2007-08-07 10:40:43.000000000 +0200 +++ head-2007-08-07/arch/i386/kernel/setup-xen.c 2007-08-09 12:21:12.000000000 +0200 @@ -1669,23 +1669,12 @@ void __init setup_arch(char **cmdline_p) bootloader_type = LOADER_TYPE; if (is_initial_xendomain()) { - /* This is drawn from a dump from vgacon:startup in - * standard Linux. */ - screen_info.orig_video_mode = 3; - screen_info.orig_video_isVGA = 1; - screen_info.orig_video_lines = 25; - screen_info.orig_video_cols = 80; - screen_info.orig_video_ega_bx = 3; - screen_info.orig_video_points = 16; - screen_info.orig_y = screen_info.orig_video_lines - 1; - if (xen_start_info->console.dom0.info_size >- sizeof(struct dom0_vga_console_info)) { - const struct dom0_vga_console_info *info - (struct dom0_vga_console_info *)( - (char *)xen_start_info + - xen_start_info->console.dom0.info_off); - dom0_init_screen_info(info); - } + const struct dom0_vga_console_info *info + (void *)((char *)xen_start_info + + xen_start_info->console.dom0.info_off); + + dom0_init_screen_info(info, + xen_start_info->console.dom0.info_size); xen_start_info->console.domU.mfn = 0; xen_start_info->console.domU.evtchn = 0; } else Index: head-2007-08-07/arch/x86_64/kernel/setup-xen.c ==================================================================--- head-2007-08-07.orig/arch/x86_64/kernel/setup-xen.c 2007-08-07 10:40:43.000000000 +0200 +++ head-2007-08-07/arch/x86_64/kernel/setup-xen.c 2007-08-09 12:21:07.000000000 +0200 @@ -594,23 +594,12 @@ void __init setup_arch(char **cmdline_p) screen_info = SCREEN_INFO; if (is_initial_xendomain()) { - /* This is drawn from a dump from vgacon:startup in - * standard Linux. */ - screen_info.orig_video_mode = 3; - screen_info.orig_video_isVGA = 1; - screen_info.orig_video_lines = 25; - screen_info.orig_video_cols = 80; - screen_info.orig_video_ega_bx = 3; - screen_info.orig_video_points = 16; - screen_info.orig_y = screen_info.orig_video_lines - 1; - if (xen_start_info->console.dom0.info_size >- sizeof(struct dom0_vga_console_info)) { - const struct dom0_vga_console_info *info - (struct dom0_vga_console_info *)( - (char *)xen_start_info + - xen_start_info->console.dom0.info_off); - dom0_init_screen_info(info); - } + const struct dom0_vga_console_info *info + (void *)((char *)xen_start_info + + xen_start_info->console.dom0.info_off); + + dom0_init_screen_info(info, + xen_start_info->console.dom0.info_size); xen_start_info->console.domU.mfn = 0; xen_start_info->console.domU.evtchn = 0; } else Index: head-2007-08-07/drivers/xen/console/console.c ==================================================================--- head-2007-08-07.orig/drivers/xen/console/console.c 2007-08-07 10:14:35.000000000 +0200 +++ head-2007-08-07/drivers/xen/console/console.c 2007-08-09 12:54:01.000000000 +0200 @@ -288,13 +288,23 @@ } -void dom0_init_screen_info(const struct dom0_vga_console_info *info) +void __init dom0_init_screen_info(const struct dom0_vga_console_info *info, size_t size) { + /* This is drawn from a dump from vgacon:startup in + * standard Linux. */ + screen_info.orig_video_mode = 3; + screen_info.orig_video_isVGA = 1; + screen_info.orig_video_lines = 25; + screen_info.orig_video_cols = 80; + screen_info.orig_video_ega_bx = 3; + screen_info.orig_video_points = 16; + screen_info.orig_y = screen_info.orig_video_lines - 1; + switch (info->video_type) { case XEN_VGATYPE_TEXT_MODE_3: - screen_info.orig_video_mode = 3; - screen_info.orig_video_ega_bx = 3; - screen_info.orig_video_isVGA = 1; + if (size < offsetof(struct dom0_vga_console_info, u.text_mode_3) + + sizeof(info->u.text_mode_3)) + break; screen_info.orig_video_lines = info->u.text_mode_3.rows; screen_info.orig_video_cols = info->u.text_mode_3.columns; screen_info.orig_x = info->u.text_mode_3.cursor_x; @@ -302,7 +312,11 @@ void dom0_init_screen_info(const struct screen_info.orig_video_points info->u.text_mode_3.font_height; break; + case XEN_VGATYPE_VESA_LFB: + if (size < offsetof(struct dom0_vga_console_info, + u.vesa_lfb.capabilities)) + break; screen_info.orig_video_isVGA = VIDEO_TYPE_VLFB; screen_info.lfb_width = info->u.vesa_lfb.width; screen_info.lfb_height = info->u.vesa_lfb.height; @@ -318,6 +332,14 @@ void dom0_init_screen_info(const struct screen_info.blue_pos = info->u.vesa_lfb.blue_pos; screen_info.rsvd_size = info->u.vesa_lfb.rsvd_size; screen_info.rsvd_pos = info->u.vesa_lfb.rsvd_pos; + if (size >= offsetof(struct dom0_vga_console_info, + u.vesa_lfb.capabilities) + + sizeof(info->u.vesa_lfb.capabilities)) + screen_info.capabilities = info->u.vesa_lfb.capabilities; + if (size >= offsetof(struct dom0_vga_console_info, + u.vesa_lfb.attributes) + + sizeof(info->u.vesa_lfb.attributes)) + screen_info.vesa_attributes = info->u.vesa_lfb.attributes; break; } } Index: head-2007-08-07/include/xen/interface/xen.h ==================================================================--- head-2007-08-07.orig/include/xen/interface/xen.h 2007-08-07 09:34:51.000000000 +0200 +++ head-2007-08-07/include/xen/interface/xen.h 2007-08-09 12:29:56.000000000 +0200 @@ -565,6 +565,12 @@ typedef struct dom0_vga_console_info { uint8_t green_pos, green_size; uint8_t blue_pos, blue_size; uint8_t rsvd_pos, rsvd_size; +#if __XEN_INTERFACE_VERSION__ >= 0x00030206 + /* VESA capabilities. */ + uint32_t capabilities; + /* Mode attributes. */ + uint16_t attributes; +#endif } vesa_lfb; } u; } dom0_vga_console_info_t; Index: head-2007-08-07/include/xen/xencons.h ==================================================================--- head-2007-08-07.orig/include/xen/xencons.h 2007-08-07 10:14:35.000000000 +0200 +++ head-2007-08-07/include/xen/xencons.h 2007-08-09 12:10:06.000000000 +0200 @@ -2,7 +2,7 @@ #define __ASM_XENCONS_H__ struct dom0_vga_console_info; -void dom0_init_screen_info(const struct dom0_vga_console_info *info); +void dom0_init_screen_info(const struct dom0_vga_console_info *, size_t); void xencons_force_flush(void); void xencons_resume(void); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel