diff options
| -rw-r--r-- | arch/x86/xen/enlighten.c | 8 | ||||
| -rw-r--r-- | 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 47b3acdc2ac5..67897152237c 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -1440,11 +1440,19 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1440 | const struct dom0_vga_console_info *info = | 1440 | const struct dom0_vga_console_info *info = |
| 1441 | (void *)((char *)xen_start_info + | 1441 | (void *)((char *)xen_start_info + |
| 1442 | xen_start_info->console.dom0.info_off); | 1442 | xen_start_info->console.dom0.info_off); |
| 1443 | struct xen_platform_op op = { | ||
| 1444 | .cmd = XENPF_firmware_info, | ||
| 1445 | .interface_version = XENPF_INTERFACE_VERSION, | ||
| 1446 | .u.firmware_info.type = XEN_FW_KBD_SHIFT_FLAGS, | ||
| 1447 | }; | ||
| 1443 | 1448 | ||
| 1444 | xen_init_vga(info, xen_start_info->console.dom0.info_size); | 1449 | xen_init_vga(info, xen_start_info->console.dom0.info_size); |
| 1445 | xen_start_info->console.domU.mfn = 0; | 1450 | xen_start_info->console.domU.mfn = 0; |
| 1446 | xen_start_info->console.domU.evtchn = 0; | 1451 | xen_start_info->console.domU.evtchn = 0; |
| 1447 | 1452 | ||
| 1453 | if (HYPERVISOR_dom0_op(&op) == 0) | ||
| 1454 | boot_params.kbd_status = op.u.firmware_info.u.kbd_shift_flags; | ||
| 1455 | |||
| 1448 | xen_init_apic(); | 1456 | xen_init_apic(); |
| 1449 | 1457 | ||
| 1450 | /* Make sure ACS will be enabled */ | 1458 | /* Make sure ACS will be enabled */ |
diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h index a3275a850e54..54ad6f9e4725 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); | |||
| 112 | #define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ | 112 | #define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ |
| 113 | #define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ | 113 | #define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ |
| 114 | #define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ | 114 | #define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ |
| 115 | #define XEN_FW_KBD_SHIFT_FLAGS 5 /* Int16, Fn02: Get keyboard shift flags. */ | ||
| 115 | struct xenpf_firmware_info { | 116 | struct xenpf_firmware_info { |
| 116 | /* IN variables. */ | 117 | /* IN variables. */ |
| 117 | uint32_t type; | 118 | uint32_t type; |
| @@ -142,6 +143,8 @@ struct xenpf_firmware_info { | |||
| 142 | /* must refer to 128-byte buffer */ | 143 | /* must refer to 128-byte buffer */ |
| 143 | GUEST_HANDLE(uchar) edid; | 144 | GUEST_HANDLE(uchar) edid; |
| 144 | } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ | 145 | } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ |
| 146 | |||
| 147 | uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ | ||
| 145 | } u; | 148 | } u; |
| 146 | }; | 149 | }; |
| 147 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); | 150 | DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); |
