[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 2/8] x86/boot: obtain video info from boot loader
On Tue, Apr 05, 2022 at 12:57:51PM +0200, Jan Beulich wrote: > On 05.04.2022 11:35, Roger Pau Monné wrote: > > On Thu, Mar 31, 2022 at 11:45:02AM +0200, Jan Beulich wrote: > >> --- a/xen/arch/x86/boot/head.S > >> +++ b/xen/arch/x86/boot/head.S > >> @@ -562,12 +562,18 @@ trampoline_setup: > >> mov %esi, sym_esi(xen_phys_start) > >> mov %esi, sym_esi(trampoline_xen_phys_start) > >> > >> - mov sym_esi(trampoline_phys), %ecx > >> - > >> /* Get bottom-most low-memory stack address. */ > >> + mov sym_esi(trampoline_phys), %ecx > >> add $TRAMPOLINE_SPACE,%ecx > > > > Just for my understanding, since you are already touching the > > instruction, why not switch it to a lea like you do below? > > > > Is that because you would also like to take the opportunity to fold > > the add into the lea and that would be too much of a change? > > No. This MOV cannot be converted, as its source operand isn't an > immediate (or register); such a conversion would also be undesirable, > for increasing insn size. See the later patch doing conversions in > the other direction, to reduce code size. Somewhat similarly ... > > >> +#ifdef CONFIG_VIDEO > >> + lea sym_esi(boot_vid_info), %edx > > ... this LEA also cannot be expressed by a single MOV. > > >> @@ -32,6 +33,39 @@ asm ( > >> #include "../../../include/xen/kconfig.h" > >> #include <public/arch-x86/hvm/start_info.h> > >> > >> +#ifdef CONFIG_VIDEO > >> +# include "video.h" > >> + > >> +/* VESA control information */ > >> +struct __packed vesa_ctrl_info { > >> + uint8_t signature[4]; > >> + uint16_t version; > >> + uint32_t oem_name; > >> + uint32_t capabilities; > >> + uint32_t mode_list; > >> + uint16_t mem_size; > >> + /* We don't use any further fields. */ > >> +}; > >> + > >> +/* VESA 2.0 mode information */ > >> +struct vesa_mode_info { > > > > Should we add __packed here just in case further added fields are no > > longer naturally aligned? (AFAICT all field right now are aligned to > > it's size so there's no need for it). > > I think we should avoid __packed whenever possible. > > >> + uint16_t attrib; > >> + uint8_t window[14]; /* We don't use the individual fields. */ > >> + uint16_t bytes_per_line; > >> + uint16_t width; > >> + uint16_t height; > >> + uint8_t cell_width; > >> + uint8_t cell_height; > >> + uint8_t nr_planes; > >> + uint8_t depth; > >> + uint8_t memory[5]; /* We don't use the individual fields. */ > >> + struct boot_video_colors colors; > >> + uint8_t direct_color; > >> + uint32_t base; > >> + /* We don't use any further fields. */ > >> +}; > > > > Would it make sense to put those struct definitions in boot/video.h > > like you do for boot_video_info? > > Personally I prefer to expose things in headers only when multiple > other files want to consume what is being declared/defined. > > >> @@ -254,17 +291,64 @@ static multiboot_info_t *mbi2_reloc(u32 > >> ++mod_idx; > >> break; > >> > >> +#ifdef CONFIG_VIDEO > >> + case MULTIBOOT2_TAG_TYPE_VBE: > >> + if ( video_out ) > >> + { > >> + const struct vesa_ctrl_info *ci; > >> + const struct vesa_mode_info *mi; > >> + > >> + video = _p(video_out); > >> + ci = (void *)get_mb2_data(tag, vbe, vbe_control_info); > >> + mi = (void *)get_mb2_data(tag, vbe, vbe_mode_info); > >> + > >> + if ( ci->version >= 0x0200 && (mi->attrib & 0x9b) == 0x9b > >> ) > >> + { > >> + video->capabilities = ci->capabilities; > >> + video->lfb_linelength = mi->bytes_per_line; > >> + video->lfb_width = mi->width; > >> + video->lfb_height = mi->height; > >> + video->lfb_depth = mi->depth; > >> + video->lfb_base = mi->base; > >> + video->lfb_size = ci->mem_size; > >> + video->colors = mi->colors; > >> + video->vesa_attrib = mi->attrib; > >> + } > >> + > >> + video->vesapm.seg = get_mb2_data(tag, vbe, > >> vbe_interface_seg); > >> + video->vesapm.off = get_mb2_data(tag, vbe, > >> vbe_interface_off); > >> + } > >> + break; > >> + > >> + case MULTIBOOT2_TAG_TYPE_FRAMEBUFFER: > >> + if ( (get_mb2_data(tag, framebuffer, framebuffer_type) != > >> + MULTIBOOT2_FRAMEBUFFER_TYPE_RGB) ) > >> + { > >> + video_out = 0; > >> + video = NULL; > >> + } > > > > I'm confused, don't you need to store the information in the > > framebuffer tag for use after relocation? > > If there was a consumer - yes. Right now this tag is used only to > invalidate the information taken from the other tag (or to suppress > taking values from there if that other tag came later) in case the > framebuffer type doesn't match what we support. > > >> + break; > >> +#endif /* CONFIG_VIDEO */ > >> + > >> case MULTIBOOT2_TAG_TYPE_END: > >> - return mbi_out; > >> + goto end; /* Cannot "break;" here. */ > >> > >> default: > >> break; > >> } > >> > >> + end: > >> + > >> +#ifdef CONFIG_VIDEO > >> + if ( video ) > >> + video->orig_video_isVGA = 0x23; > > > > I see we use this elsewhere, what's the meaning of this (magic) 0x23? > > This is a value Linux uses (also as a plain number without any #define > iirc; at least it was that way when we first inherited that value). > Short of knowing where they took it from or what meaning they associate > with the value it would be hard for us to give this a (meaningful) name > and hence use a #define. And hence it's equally hard to properly answer > your question. OK, so it's a magic value. I'm happy with the rest, so: Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |