x86: retrieve keyboard shift status flags from BIOS Recent Linux tries to make use of this, and has no way of getting at these bits without Xen assisting it. There doesn't appear to be a way to obtain the same information from UEFI. Signed-off-by: Jan Beulich --- a/xen/arch/x86/boot/trampoline.S +++ b/xen/arch/x86/boot/trampoline.S @@ -184,11 +184,16 @@ trampoline_boot_cpu_entry: * 1. Get memory map. * 2. Get Enhanced Disk Drive (EDD) information. * 3. Set video mode. + * 4. Get keyboard shift flags. */ call get_memory_map call get_edd call video + mov $0x0200,%ax + int $0x16 + mov %al,bootsym(kbd_shift_flags) + /* Disable irqs before returning to protected mode. */ cli @@ -221,6 +226,10 @@ trampoline_boot_cpu_entry: skip_realmode: .byte 0 + .globl kbd_shift_flags +kbd_shift_flags: + .byte 0 + rm_idt: .word 256*4-1, 0, 0 #include "mem.S" --- a/xen/arch/x86/platform_hypercall.c +++ b/xen/arch/x86/platform_hypercall.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "cpu/mtrr/mtrr.h" #include @@ -319,6 +320,18 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe u.firmware_info.u.efi_info) ) ret = -EFAULT; break; + case XEN_FW_KBD_SHIFT_FLAGS: + ret = -ESRCH; + if ( op->u.firmware_info.index != 0 ) + break; + + op->u.firmware_info.u.kbd_shift_flags = bootsym(kbd_shift_flags); + + ret = 0; + if ( copy_field_to_guest(u_xenpf_op, op, + u.firmware_info.u.kbd_shift_flags) ) + ret = -EFAULT; + break; default: ret = -EINVAL; break; --- a/xen/include/asm-x86/setup.h +++ b/xen/include/asm-x86/setup.h @@ -41,4 +41,6 @@ int xen_in_range(unsigned long mfn); void microcode_grab_module( unsigned long *, const multiboot_info_t *, void *(*)(const module_t *)); +extern uint8_t kbd_shift_flags; + #endif --- a/xen/include/public/platform.h +++ b/xen/include/public/platform.h @@ -218,6 +218,7 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_efi_runtim #define XEN_FW_EFI_VENDOR 2 #define XEN_FW_EFI_MEM_INFO 3 #define XEN_FW_EFI_RT_VERSION 4 +#define XEN_FW_KBD_SHIFT_FLAGS 5 struct xenpf_firmware_info { /* IN variables. */ uint32_t type; @@ -266,6 +267,9 @@ struct xenpf_firmware_info { uint32_t type; } mem; } efi_info; /* XEN_FW_EFI_INFO */ + + /* Int16, Fn02: Get keyboard shift flags. */ + uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ } u; }; typedef struct xenpf_firmware_info xenpf_firmware_info_t;