svn commit: r185933 - in head/sys: amd64/amd64 amd64/include i386/i386 i386/include

John Baldwin jhb at FreeBSD.org
Thu Dec 11 07:56:31 PST 2008


Author: jhb
Date: Thu Dec 11 15:56:30 2008
New Revision: 185933
URL: http://svn.freebsd.org/changeset/base/185933

Log:
  Add constants for fields in the local APIC error status register and a
  routine to read it.

Modified:
  head/sys/amd64/amd64/local_apic.c
  head/sys/amd64/include/apicreg.h
  head/sys/amd64/include/apicvar.h
  head/sys/i386/i386/local_apic.c
  head/sys/i386/include/apicreg.h
  head/sys/i386/include/apicvar.h

Modified: head/sys/amd64/amd64/local_apic.c
==============================================================================
--- head/sys/amd64/amd64/local_apic.c	Thu Dec 11 15:44:53 2008	(r185932)
+++ head/sys/amd64/amd64/local_apic.c	Thu Dec 11 15:56:30 2008	(r185933)
@@ -299,6 +299,7 @@ lapic_setup(int boot)
 	/* Program LINT[01] LVT entries. */
 	lapic->lvt_lint0 = lvt_mode(la, LVT_LINT0, lapic->lvt_lint0);
 	lapic->lvt_lint1 = lvt_mode(la, LVT_LINT1, lapic->lvt_lint1);
+
 #ifdef	HWPMC_HOOKS
 	/* Program the PMC LVT entry if present. */
 	if (maxlvt >= LVT_PMC)
@@ -644,6 +645,18 @@ lapic_eoi(void)
 	lapic->eoi = 0;
 }
 
+/*
+ * Read the contents of the error status register.  We have to write
+ * to the register first before reading from it.
+ */
+u_int
+lapic_error(void)
+{
+
+	lapic->esr = 0;
+	return (lapic->esr);
+}
+
 void
 lapic_handle_intr(int vector, struct trapframe *frame)
 {

Modified: head/sys/amd64/include/apicreg.h
==============================================================================
--- head/sys/amd64/include/apicreg.h	Thu Dec 11 15:44:53 2008	(r185932)
+++ head/sys/amd64/include/apicreg.h	Thu Dec 11 15:56:30 2008	(r185933)
@@ -260,6 +260,14 @@ typedef struct IOAPIC ioapic_t;
 # define APIC_TPR_INT		0x000000f0
 # define APIC_TPR_SUB		0x0000000f
 
+/* fields in ESR */
+#define	APIC_ESR_SEND_CS_ERROR		0x00000001
+#define	APIC_ESR_RECEIVE_CS_ERROR	0x00000002
+#define	APIC_ESR_SEND_ACCEPT		0x00000004
+#define	APIC_ESR_RECEIVE_ACCEPT		0x00000008
+#define	APIC_ESR_SEND_ILLEGAL_VECTOR	0x00000020
+#define	APIC_ESR_RECEIVE_ILLEGAL_VECTOR	0x00000040
+#define	APIC_ESR_ILLEGAL_REGISTER	0x00000080
 
 /* fields in ICR_LOW */
 #define APIC_VECTOR_MASK	0x000000ff

Modified: head/sys/amd64/include/apicvar.h
==============================================================================
--- head/sys/amd64/include/apicvar.h	Thu Dec 11 15:44:53 2008	(r185932)
+++ head/sys/amd64/include/apicvar.h	Thu Dec 11 15:56:30 2008	(r185933)
@@ -200,6 +200,7 @@ void	lapic_create(u_int apic_id, int boo
 void	lapic_disable(void);
 void	lapic_dump(const char *str);
 void	lapic_eoi(void);
+u_int	lapic_error(void);
 int	lapic_id(void);
 void	lapic_init(vm_paddr_t addr);
 int	lapic_intr_pending(u_int vector);

Modified: head/sys/i386/i386/local_apic.c
==============================================================================
--- head/sys/i386/i386/local_apic.c	Thu Dec 11 15:44:53 2008	(r185932)
+++ head/sys/i386/i386/local_apic.c	Thu Dec 11 15:56:30 2008	(r185933)
@@ -301,6 +301,7 @@ lapic_setup(int boot)
 	/* Program LINT[01] LVT entries. */
 	lapic->lvt_lint0 = lvt_mode(la, LVT_LINT0, lapic->lvt_lint0);
 	lapic->lvt_lint1 = lvt_mode(la, LVT_LINT1, lapic->lvt_lint1);
+
 #ifdef	HWPMC_HOOKS
 	/* Program the PMC LVT entry if present. */
 	if (maxlvt >= LVT_PMC)
@@ -646,6 +647,18 @@ lapic_eoi(void)
 	lapic->eoi = 0;
 }
 
+/*
+ * Read the contents of the error status register.  We have to write
+ * to the register first before reading from it.
+ */
+u_int
+lapic_error(void)
+{
+
+	lapic->esr = 0;
+	return (lapic->esr);
+}
+
 void
 lapic_handle_intr(int vector, struct trapframe *frame)
 {

Modified: head/sys/i386/include/apicreg.h
==============================================================================
--- head/sys/i386/include/apicreg.h	Thu Dec 11 15:44:53 2008	(r185932)
+++ head/sys/i386/include/apicreg.h	Thu Dec 11 15:56:30 2008	(r185933)
@@ -260,6 +260,14 @@ typedef struct IOAPIC ioapic_t;
 # define APIC_TPR_INT		0x000000f0
 # define APIC_TPR_SUB		0x0000000f
 
+/* fields in ESR */
+#define	APIC_ESR_SEND_CS_ERROR		0x00000001
+#define	APIC_ESR_RECEIVE_CS_ERROR	0x00000002
+#define	APIC_ESR_SEND_ACCEPT		0x00000004
+#define	APIC_ESR_RECEIVE_ACCEPT		0x00000008
+#define	APIC_ESR_SEND_ILLEGAL_VECTOR	0x00000020
+#define	APIC_ESR_RECEIVE_ILLEGAL_VECTOR	0x00000040
+#define	APIC_ESR_ILLEGAL_REGISTER	0x00000080
 
 /* fields in ICR_LOW */
 #define APIC_VECTOR_MASK	0x000000ff

Modified: head/sys/i386/include/apicvar.h
==============================================================================
--- head/sys/i386/include/apicvar.h	Thu Dec 11 15:44:53 2008	(r185932)
+++ head/sys/i386/include/apicvar.h	Thu Dec 11 15:56:30 2008	(r185933)
@@ -211,6 +211,7 @@ void	lapic_create(u_int apic_id, int boo
 void	lapic_disable(void);
 void	lapic_dump(const char *str);
 void	lapic_eoi(void);
+u_int	lapic_error(void);
 int	lapic_id(void);
 void	lapic_init(vm_paddr_t addr);
 int	lapic_intr_pending(u_int vector);


More information about the svn-src-all mailing list