diff options
author | jhb <jhb@FreeBSD.org> | 2008-12-11 15:56:30 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2008-12-11 15:56:30 +0000 |
commit | 160f4765ebc806001eb215709142b3b083b75c15 (patch) | |
tree | 69921b69da19ea4249fabb1eac32dbb38ce1ea79 /sys/amd64 | |
parent | 200cc006cbe7c03477d4ce44111850ef854df2d0 (diff) | |
download | FreeBSD-src-160f4765ebc806001eb215709142b3b083b75c15.zip FreeBSD-src-160f4765ebc806001eb215709142b3b083b75c15.tar.gz |
Add constants for fields in the local APIC error status register and a
routine to read it.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/local_apic.c | 13 | ||||
-rw-r--r-- | sys/amd64/include/apicreg.h | 8 | ||||
-rw-r--r-- | sys/amd64/include/apicvar.h | 1 |
3 files changed, 22 insertions, 0 deletions
diff --git a/sys/amd64/amd64/local_apic.c b/sys/amd64/amd64/local_apic.c index cb085f1..6991969 100644 --- a/sys/amd64/amd64/local_apic.c +++ b/sys/amd64/amd64/local_apic.c @@ -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) { diff --git a/sys/amd64/include/apicreg.h b/sys/amd64/include/apicreg.h index d5d5dc3..81c4b7e 100644 --- a/sys/amd64/include/apicreg.h +++ b/sys/amd64/include/apicreg.h @@ -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 diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h index d36a4f4..623d637 100644 --- a/sys/amd64/include/apicvar.h +++ b/sys/amd64/include/apicvar.h @@ -200,6 +200,7 @@ void lapic_create(u_int apic_id, int boot_cpu); 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); |