# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1192187297 -3600
# Node ID d34182a37ba947980e109c94eb77f3f9314e3227
# Parent d081f7efcb60adf5a82b943f9cc524cfa254e413
linux/x86: retrieve VESA capabilities in dom0
Also, move some more common code to dom0_init_screen_info().
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
arch/i386/kernel/setup-xen.c | 23 ++++++-----------------
arch/x86_64/kernel/setup-xen.c | 23 ++++++-----------------
drivers/xen/Kconfig | 2 +-
drivers/xen/console/console.c | 32 +++++++++++++++++++++++++++-----
include/xen/xencons.h | 2 +-
5 files changed, 41 insertions(+), 41 deletions(-)
diff -r d081f7efcb60 -r d34182a37ba9 arch/i386/kernel/setup-xen.c
--- a/arch/i386/kernel/setup-xen.c Fri Oct 12 12:07:32 2007 +0100
+++ b/arch/i386/kernel/setup-xen.c Fri Oct 12 12:08:17 2007 +0100
@@ -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
diff -r d081f7efcb60 -r d34182a37ba9 arch/x86_64/kernel/setup-xen.c
--- a/arch/x86_64/kernel/setup-xen.c Fri Oct 12 12:07:32 2007 +0100
+++ b/arch/x86_64/kernel/setup-xen.c Fri Oct 12 12:08:17 2007 +0100
@@ -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
diff -r d081f7efcb60 -r d34182a37ba9 drivers/xen/Kconfig
--- a/drivers/xen/Kconfig Fri Oct 12 12:07:32 2007 +0100
+++ b/drivers/xen/Kconfig Fri Oct 12 12:08:17 2007 +0100
@@ -13,7 +13,7 @@ if XEN
if XEN
config XEN_INTERFACE_VERSION
hex
- default 0x00030205
+ default 0x00030206
menu "XEN"
diff -r d081f7efcb60 -r d34182a37ba9 drivers/xen/console/console.c
--- a/drivers/xen/console/console.c Fri Oct 12 12:07:32 2007 +0100
+++ b/drivers/xen/console/console.c Fri Oct 12 12:08:17 2007 +0100
@@ -276,13 +276,23 @@ void xencons_force_flush(void)
}
-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;
@@ -290,7 +300,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.gbl_caps))
+ 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;
@@ -306,6 +320,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.gbl_caps)
+ + sizeof(info->u.vesa_lfb.gbl_caps))
+ screen_info.capabilities = info->u.vesa_lfb.gbl_caps;
+ if (size >= offsetof(struct dom0_vga_console_info,
+ u.vesa_lfb.mode_attrs)
+ + sizeof(info->u.vesa_lfb.mode_attrs))
+ screen_info.vesa_attributes =
info->u.vesa_lfb.mode_attrs;
break;
}
}
diff -r d081f7efcb60 -r d34182a37ba9 include/xen/xencons.h
--- a/include/xen/xencons.h Fri Oct 12 12:07:32 2007 +0100
+++ b/include/xen/xencons.h Fri Oct 12 12:08:17 2007 +0100
@@ -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-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|