Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Jun 2011 23:03:38 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r222795 - head/sys/dev/atkbdc
Message-ID:  <201106062303.p56N3cjs053024@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jkim
Date: Mon Jun  6 23:03:37 2011
New Revision: 222795
URL: http://svn.freebsd.org/changeset/base/222795

Log:
  Validate INT 15h and 16h vectors more strictly.  Traditionally these entry
  points are fixed addresses and (U)EFI CSM specification also mandated that.
  Unfortunately, (U)EFI CSM specification does not specifically mention this
  is to call service routine via interrupt vector table or to jump directly
  to the entry point.  As a result, some CSM seems to install two routines
  and acts differently, depending on how it was executed, unfortunately.
  When INT 15h is used, it calls a function pointer (which is probably a UEFI
  service function).  When it jumps directly to the entry point, it executes
  a simple and traditional INT 15h service routine.  Therefore, actually there
  are two possible fixes, i. e., this fix or jumping directly to the fixed
  entry point.  However, we chose this fix because a) keyboard typematic
  support via BIOS is becoming extremely rarer and b) we cannot support random
  service routine installed by a firmware or a boot loader.  This should fix
  Lenovo X220 laptop, specifically.
  
  Reviewed by:	delphij
  MFC after:	3 days

Modified:
  head/sys/dev/atkbdc/atkbd.c

Modified: head/sys/dev/atkbdc/atkbd.c
==============================================================================
--- head/sys/dev/atkbdc/atkbd.c	Mon Jun  6 22:26:02 2011	(r222794)
+++ head/sys/dev/atkbdc/atkbd.c	Mon Jun  6 23:03:37 2011	(r222795)
@@ -1097,7 +1097,8 @@ get_typematic(keyboard_t *kbd)
 	x86regs_t regs;
 	uint8_t *p;
 
-	if (x86bios_get_intr(0x15) == 0 || x86bios_get_intr(0x16) == 0)
+	if (x86bios_get_intr(0x15) != 0xf000f859 ||
+	    x86bios_get_intr(0x16) != 0xf000e82e)
 		return (ENODEV);
 
 	/* Is BIOS system configuration table supported? */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106062303.p56N3cjs053024>