svn commit: r272193 - head/sys/amd64/vmm/io

Peter Grehan grehan at FreeBSD.org
Sat Sep 27 01:15:25 UTC 2014


Author: grehan
Date: Sat Sep 27 01:15:24 2014
New Revision: 272193
URL: http://svnweb.freebsd.org/changeset/base/272193

Log:
  Allow the PIC's IMR register to be read before ICW initialisation.
  
  As of git submit e179f6914152eca9, the Linux kernel does a simple
  probe of the PIC by writing a pattern to the IMR and then reading it
  back, prior to the init sequence of ICW words.
  
  The bhyve PIC emulation wasn't allowing the IMR to be read until
  the ICW sequence was complete. This limitation isn't required so
  relax the test.
  
  With this change, Linux kernels 3.15-rc2 and later won't hang
  on boot when calibrating the local APIC.
  
  Reviewed by:	tychon
  MFC after:	3 days

Modified:
  head/sys/amd64/vmm/io/vatpic.c

Modified: head/sys/amd64/vmm/io/vatpic.c
==============================================================================
--- head/sys/amd64/vmm/io/vatpic.c	Fri Sep 26 23:01:27 2014	(r272192)
+++ head/sys/amd64/vmm/io/vatpic.c	Sat Sep 27 01:15:24 2014	(r272193)
@@ -606,20 +606,19 @@ vatpic_write(struct vatpic *vatpic, stru
 	VATPIC_LOCK(vatpic);
 
 	if (port & ICU_IMR_OFFSET) {
-		if (atpic->ready) {
+		switch (atpic->icw_num) {
+		case 2:
+			error = vatpic_icw2(vatpic, atpic, val);
+			break;
+		case 3:
+			error = vatpic_icw3(vatpic, atpic, val);
+			break;
+		case 4:
+			error = vatpic_icw4(vatpic, atpic, val);
+			break;
+		default:
 			error = vatpic_ocw1(vatpic, atpic, val);
-		} else {
-			switch (atpic->icw_num) {
-			case 2:
-				error = vatpic_icw2(vatpic, atpic, val);
-				break;
-			case 3:
-				error = vatpic_icw3(vatpic, atpic, val);
-				break;
-			case 4:
-				error = vatpic_icw4(vatpic, atpic, val);
-				break;
-			}
+			break;
 		}
 	} else {
 		if (val & (1 << 4))


More information about the svn-src-head mailing list