Jan Beulich
2012-Sep-11 11:41 UTC
[PATCH] 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 <jbeulich@suse.com> --- 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 <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(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; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Keir Fraser
2012-Sep-11 13:33 UTC
Re: [PATCH] x86: retrieve keyboard shift status flags from BIOS
On 11/09/2012 12:41, "Jan Beulich" <JBeulich@suse.com> wrote:> 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>> --- 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 <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(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; > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel
Konrad Rzeszutek Wilk
2012-Sep-21 16:34 UTC
Re: [PATCH] x86: retrieve keyboard shift status flags from BIOS
On Tue, Sep 11, 2012 at 12:41:30PM +0100, Jan Beulich wrote:> 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.And here is a variant for the upstream: From 21b4fdf0592156ac3020f5c492139368dcdfcf71 Mon Sep 17 00:00:00 2001 From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Date: Fri, 21 Sep 2012 12:30:35 -0400 Subject: [PATCH] xen/x86: retrieve keyboard shift status flags from hypervisor. The xen c/s 25873 allows the hypervisor to retrieve the NUMLOCK flag. With this patch, the Linux kernel can get the state according to the data in the BIOS. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> --- arch/x86/xen/enlighten.c | 8 ++++++++ include/xen/interface/platform.h | 3 +++ 2 files changed, 11 insertions(+), 0 deletions(-) diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 9642d4a..89a7c57 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -1441,11 +1441,19 @@ asmlinkage void __init xen_start_kernel(void) const struct dom0_vga_console_info *info (void *)((char *)xen_start_info + xen_start_info->console.dom0.info_off); + struct xen_platform_op op = { + .cmd = XENPF_firmware_info, + .interface_version = XENPF_INTERFACE_VERSION, + .u.firmware_info.type = XEN_FW_KBD_SHIFT_FLAGS, + }; xen_init_vga(info, xen_start_info->console.dom0.info_size); xen_start_info->console.domU.mfn = 0; xen_start_info->console.domU.evtchn = 0; + if (HYPERVISOR_dom0_op(&op) == 0) + boot_params.kbd_status = op.u.firmware_info.u.kbd_shift_flags; + xen_init_apic(); /* Make sure ACS will be enabled */ diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h index 61fa661..81eee3b 100644 --- a/include/xen/interface/platform.h +++ b/include/xen/interface/platform.h @@ -112,6 +112,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t); #define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ #define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ #define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ +#define XEN_FW_KBD_SHIFT_FLAGS 5 /* Int16, Fn02: Get keyboard shift flags. */ struct xenpf_firmware_info { /* IN variables. */ uint32_t type; @@ -142,6 +143,8 @@ struct xenpf_firmware_info { /* must refer to 128-byte buffer */ GUEST_HANDLE(uchar) edid; } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ + uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ + } u; }; DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); -- 1.7.7.6
Jan Beulich
2012-Sep-24 10:48 UTC
Re: [PATCH] x86: retrieve keyboard shift status flags from BIOS
>>> On 21.09.12 at 18:34, Konrad Rzeszutek Wilk <konrad@kernel.org> wrote: > And here is a variant for the upstream: > > From 21b4fdf0592156ac3020f5c492139368dcdfcf71 Mon Sep 17 00:00:00 2001 > From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> > Date: Fri, 21 Sep 2012 12:30:35 -0400 > Subject: [PATCH] xen/x86: retrieve keyboard shift status flags from > hypervisor. > > The xen c/s 25873 allows the hypervisor to retrieve the NUMLOCK flag. > With this patch, the Linux kernel can get the state according to the > data in the BIOS. > > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>Acked-by: Jan Beulich <jbeulich@suse.com> (but also see below)> --- a/arch/x86/xen/enlighten.c > +++ b/arch/x86/xen/enlighten.c > @@ -1441,11 +1441,19 @@ asmlinkage void __init xen_start_kernel(void) > const struct dom0_vga_console_info *info > (void *)((char *)xen_start_info + > xen_start_info->console.dom0.info_off); > + struct xen_platform_op op = { > + .cmd = XENPF_firmware_info, > + .interface_version = XENPF_INTERFACE_VERSION, > + .u.firmware_info.type = XEN_FW_KBD_SHIFT_FLAGS, > + }; > > xen_init_vga(info, xen_start_info->console.dom0.info_size); > xen_start_info->console.domU.mfn = 0; > xen_start_info->console.domU.evtchn = 0; > > + if (HYPERVISOR_dom0_op(&op) == 0) > + boot_params.kbd_status = op.u.firmware_info.u.kbd_shift_flags; > + > xen_init_apic(); > > /* Make sure ACS will be enabled */ > diff --git a/include/xen/interface/platform.h > b/include/xen/interface/platform.h > index 61fa661..81eee3b 100644 > --- a/include/xen/interface/platform.h > +++ b/include/xen/interface/platform.h > @@ -112,6 +112,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t); > #define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ > #define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ > #define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ > +#define XEN_FW_KBD_SHIFT_FLAGS 5 /* Int16, Fn02: Get keyboard shift > flags. */ > struct xenpf_firmware_info { > /* IN variables. */ > uint32_t type; > @@ -142,6 +143,8 @@ struct xenpf_firmware_info { > /* must refer to 128-byte buffer */ > GUEST_HANDLE(uchar) edid; > } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ > + uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ > +I''d prefer to not have stray empty line here - if anything, it should go before the new union member. Jan> } u; > }; > DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); > -- > 1.7.7.6
Konrad Rzeszutek Wilk
2012-Sep-24 13:25 UTC
Re: [PATCH] x86: retrieve keyboard shift status flags from BIOS
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> > > Acked-by: Jan Beulich <jbeulich@suse.com> > > (but also see below).. snip..> > flags. */ > > struct xenpf_firmware_info { > > /* IN variables. */ > > uint32_t type; > > @@ -142,6 +143,8 @@ struct xenpf_firmware_info { > > /* must refer to 128-byte buffer */ > > GUEST_HANDLE(uchar) edid; > > } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ > > + uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ > > + > > I''d prefer to not have stray empty line here - if anything, it should > go before the new union member. >Done! Thx for the review.
Apparently Analagous Threads
- [PATCH 0/3] Xen Microcode update driver for 2.6.38
- [PATCH] nouveau/video: make sure that firmware is present when checking caps
- [PATCH] xen/xsm: Compile error due to naming clash between XSM and EFI runtime
- [RFC PATCH 0/2] GLOBAL() macro for asm code.
- [PATCH][Retry 1] 1/4: cpufreq/PowerNow! in Xen: Xen timer changes