x86: a little bit of 16-bit video mode setting code cleanup To "compensate" for the code size growth by an earlier change: - drop "trampoline" labels (in almost all cases the target label is reachable with an 8-bit-displacement branch anyway, and a single 16- bit-displacement branch is still better than a pair of two branches) - drop an entirely dead insn from wakeup.S:mode_setw - reduce code size in a few other (obvious I hope) cases, by more suitable insn/operands selection Also drop redundant #define-s (move suitable #include a little earlier instead) and add two alignment directives. Signed-off-by: Jan Beulich --- v2: Minor adjustment to description. Re-base. --- a/xen/arch/x86/boot/trampoline.S +++ b/xen/arch/x86/boot/trampoline.S @@ -176,6 +176,7 @@ start64: jmpq *%rdi +#include "video.h" #include "wakeup.S" .balign 8 @@ -282,8 +283,6 @@ trampoline_boot_cpu_entry: /* Jump to the common bootstrap entry point. */ jmp trampoline_protmode_entry -#include "video.h" - .align 2 /* Keep in sync with cmdline.c:early_boot_opts_t type! */ early_boot_opts: --- a/xen/arch/x86/boot/video.S +++ b/xen/arch/x86/boot/video.S @@ -384,9 +384,6 @@ lmbad: leaw bootsym(unknt), %si jmp mode_menu lmdef: ret -_setrec: jmp setrec # Ugly... -_set_80x25: jmp set_80x25 - # Setting of user mode (AX=mode ID) => CF=success mode_set: movw %ax, bootsym(boot_vid_mode) @@ -396,7 +393,7 @@ mode_set: je setvesabysize testb $VIDEO_RECALC>>8, %ah - jnz _setrec + jnz setrec cmpb $VIDEO_FIRST_SPECIAL>>8, %ah jz setspc @@ -421,7 +418,7 @@ setspc: xorb %bh, %bh setmenu: orb %al, %al # 80x25 is an exception - jz _set_80x25 + jz set_80x25 pushw %bx # Set mode chosen from menu call mode_table # Build the mode table @@ -441,36 +438,32 @@ check_vesa: cmpw $0x004f, %ax jnz setbad - leaw vesa_mode_info, %di - subb $VIDEO_FIRST_VESA>>8, %bh - movw %bx, %cx # Get mode information structure + leaw vesa_mode_info, %di # Get mode information structure + leaw -VIDEO_FIRST_VESA(%bx), %cx movw $0x4f01, %ax int $0x10 - addb $VIDEO_FIRST_VESA>>8, %bh cmpw $0x004f, %ax jnz setbad movb (%di), %al # Check mode attributes. andb $0x99, %al cmpb $0x99, %al - jnz _setbad # Doh! No linear frame buffer. + jnz setbad # Doh! No linear frame buffer. pushw %bx subb $VIDEO_FIRST_VESA>>8, %bh - orw $0x4000, %bx # Use linear frame buffer + orb $0x40, %bh # Use linear frame buffer movw $0x4f02, %ax # VESA BIOS mode set call int $0x10 popw %bx cmpw $0x004f, %ax # AL=4f if implemented - jnz _setbad # AH=0 if OK + jnz setbad # AH=0 if OK movb $1, bootsym(graphic_mode) # flag graphic mode movw %bx, bootsym(video_mode) stc ret -_setbad: jmp setbad # Ugly... - # Recalculate vertical display end registers -- this fixes various # inconsistencies of extended modes on many adapters. Called when # the VIDEO_RECALC flag is set in the mode ID. @@ -515,7 +508,7 @@ setvesabysize: leaw modelist,%si 1: add $8,%si cmpw $ASK_VGA,-8(%si) # End? - je _setbad + je setbad movw -6(%si),%ax cmpw %ax,bootsym(vesa_size)+0 jne 1b @@ -948,6 +941,7 @@ store_edid: #endif ret + .p2align 1 mt_end: .word 0 # End of video mode table if built edit_buf: .space 6 # Line editor buffer card_name: .word 0 # Pointer to adapter name @@ -991,6 +985,7 @@ vesa_name: .asciz "VESA" name_bann: .asciz "Video adapter: " + .p2align 1 force_size: .word 0 # Use this size instead of the one in BIOS vars GLOBAL(boot_vid_info) --- a/xen/arch/x86/boot/wakeup.S +++ b/xen/arch/x86/boot/wakeup.S @@ -30,7 +30,7 @@ ENTRY(wakeup_start) jne bogus_real_magic # for acpi_sleep=s3_bios - testl $1, wakesym(video_flags) + testb $1, wakesym(video_flags) jz 1f lcall $0xc000, $3 movw %cs, %ax # In case messed by BIOS @@ -38,9 +38,9 @@ ENTRY(wakeup_start) movw %ax, %ss # Need this? How to ret if clobbered? 1: # for acpi_sleep=s3_mode - testl $2, wakesym(video_flags) + testb $2, wakesym(video_flags) jz 1f - movl wakesym(video_mode), %eax + movw wakesym(video_mode), %ax call mode_setw 1: # Show some progress if VGA is resumed @@ -56,48 +56,26 @@ ENTRY(wakeup_start) ljmpl $BOOT_CS32, $bootsym_rel(wakeup_32, 6) -/* This code uses an extended set of video mode numbers. These include: - * Aliases for standard modes - * NORMAL_VGA (-1) - * EXTENDED_VGA (-2) - * ASK_VGA (-3) - * Video modes numbered by menu position -- NOT RECOMMENDED because of lack - * of compatibility when extending the table. These are between 0x00 and 0xff. - */ -#define VIDEO_FIRST_MENU 0x0000 - -/* Standard BIOS video modes (BIOS number + 0x0100) */ -#define VIDEO_FIRST_BIOS 0x0100 - -/* VESA BIOS video modes (VESA number + 0x0200) */ -#define VIDEO_FIRST_VESA 0x0200 - -/* Video7 special modes (BIOS number + 0x0900) */ -#define VIDEO_FIRST_V7 0x0900 - # Setting of user mode (AX=mode ID) => CF=success mode_setw: movw %ax, %bx cmpb $VIDEO_FIRST_VESA>>8, %ah jnc check_vesaw - decb %ah setbadw: clc ret check_vesaw: subb $VIDEO_FIRST_VESA>>8, %bh - orw $0x4000, %bx # Use linear frame buffer + orb $0x40, %bh # Use linear frame buffer movw $0x4f02, %ax # VESA BIOS mode set call int $0x10 cmpw $0x004f, %ax # AL=4f if implemented - jnz _setbadw # AH=0 if OK + jnz setbadw # AH=0 if OK stc ret -_setbadw: jmp setbadw - bogus_real_magic: movw $0x0e00 + 'B', %fs:(0x12) jmp bogus_real_magic