[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 4/9] x86/PVH: provide VGA console info to Dom0
Like PV Dom0 in order to use the console if in a mode other than text 80x25 the kernel needs to be provided information about this mode. Bump HVM start info's "current" version to 2 and use a previously reserved 32-bit field to provide struct dom0_vga_console_info's position and size. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- v3: New. --- a/xen/arch/x86/hvm/dom0_build.c +++ b/xen/arch/x86/hvm/dom0_build.c @@ -19,6 +19,7 @@ */ #include <xen/acpi.h> +#include <xen/console.h> #include <xen/init.h> #include <xen/libelf.h> #include <xen/multiboot.h> @@ -549,6 +550,11 @@ static int __init pvh_load_kernel(struct paddr_t last_addr; struct hvm_start_info start_info = { 0 }; struct hvm_modlist_entry mod = { 0 }; +#ifdef CONFIG_VIDEO + struct dom0_vga_console_info vga_info = { 0 }; +#else + struct {} __maybe_unused vga_info; +#endif struct vcpu *v = d->vcpu[0]; int rc; @@ -598,7 +604,7 @@ static int __init pvh_load_kernel(struct * split into smaller allocations, done as a single region in order to * simplify it. */ - last_addr = find_memory(d, &elf, sizeof(start_info) + + last_addr = find_memory(d, &elf, sizeof(start_info) + sizeof(vga_info) + (initrd ? ROUNDUP(initrd->mod_end, PAGE_SIZE) + sizeof(mod) : 0) + @@ -672,6 +678,22 @@ static int __init pvh_load_kernel(struct last_addr += sizeof(mod); } +#ifdef CONFIG_VIDEO + if ( fill_console_start_info(&vga_info) ) + { + rc = hvm_copy_to_guest_phys(last_addr + sizeof(start_info), + &vga_info, sizeof(vga_info), v); + if ( !rc ) + { + start_info.version = 2; + start_info.vga_info.offset = sizeof(start_info); + start_info.vga_info.size = sizeof(vga_info); + } + else + printk("Unable to copy VGA info to guest\n"); + } +#endif + start_info.magic = XEN_HVM_START_MAGIC_VALUE; start_info.flags = SIF_PRIVILEGED | SIF_INITDOMAIN; rc = hvm_copy_to_guest_phys(last_addr, &start_info, sizeof(start_info), v); --- a/xen/include/public/arch-x86/hvm/start_info.h +++ b/xen/include/public/arch-x86/hvm/start_info.h @@ -33,7 +33,7 @@ * | magic | Contains the magic value XEN_HVM_START_MAGIC_VALUE * | | ("xEn3" with the 0x80 bit of the "E" set). * 4 +----------------+ - * | version | Version of this structure. Current version is 1. New + * | version | Version of this structure. Current version is 2. New * | | versions are guaranteed to be backwards-compatible. * 8 +----------------+ * | flags | SIF_xxx flags. @@ -55,7 +55,15 @@ * | | if there is no memory map being provided. Only * | | present in version 1 and newer of the structure. * 52 +----------------+ - * | reserved | Version 1 and newer only. + * | vga_info.offset| Offset of struct dom0_vga_console_info from base of + * | | struct hvm_start_info. Optional and only present in + * | | version 2 and newer of the structure when + * | | SIF_INITDOMAIN is set; zero if absent. + * 54 +----------------+ + * | vga_info.size | Size of present parts of struct dom0_vga_console_info. + * | | Optional and only present in version 2 and newer of + * | | the structure when SIF_INITDOMAIN is set; zero if + * | | absent. * 56 +----------------+ * * The layout of each entry in the module structure is the following: @@ -139,7 +147,15 @@ struct hvm_start_info { uint32_t memmap_entries; /* Number of entries in the memmap table. */ /* Value will be zero if there is no memory */ /* map being provided. */ - uint32_t reserved; /* Must be zero. */ + /* + * The following sub-structure is only present in version 2 and newer + * when SIF_INITDOMAIN is set. It is reserved in version 1 or when + * SIF_INITDOMAIN is clear, and absent in version 0. + */ + struct { /* Coord-s of struct dom0_vga_console_info. */ + uint16_t offset; /* ... from base of struct hvm_start_info. */ + uint16_t size; /* ... of present parts of the struct. */ + } vga_info; }; struct hvm_modlist_entry {
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |