]> xenbits.xensource.com Git - xen.git/commitdiff
x86: retrieve keyboard shift status flags from BIOS
authorJan Beulich <jbeulich@suse.com>
Wed, 12 Sep 2012 08:17:34 +0000 (10:17 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 12 Sep 2012 08:17:34 +0000 (10:17 +0200)
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 <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/arch/x86/boot/trampoline.S
xen/arch/x86/platform_hypercall.c
xen/include/asm-x86/setup.h
xen/include/public/platform.h

index 4421fc2c690efb9f29955a430195cede5714a395..c6bda281033f14313a346c3c17d96f05557723b5 100644 (file)
@@ -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"
index 88880b0d63b55bf3e9a93268ec795fbb1f4f7bb2..d75a83f2bca33427fb2d142d7cbb94fdaa853a74 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/edd.h>
 #include <asm/mtrr.h>
 #include <asm/io_apic.h>
+#include <asm/setup.h>
 #include "cpu/mtrr/mtrr.h"
 #include <xsm/xsm.h>
 
@@ -319,6 +320,18 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
                                      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;
index abbab23afe1540efe1541ee4ed286dd137a8537a..4580f807c876696b9d19c2f151ef4d3ced467877 100644 (file)
@@ -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
index ad51634abdf5a0df78375db86258f0ab122b1f91..6af70ef424f5e9fe8984f19eb39c34c94ffa7398 100644 (file)
@@ -218,6 +218,7 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_efi_runtime_call_t);
 #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;