Module Name: src
Committed By: nonaka
Date: Tue May 23 08:54:39 UTC 2017
Modified Files:
src/sys/arch/amd64/amd64: db_interface.c mainbus.c vector.S
src/sys/arch/amd64/include: i82093reg.h
src/sys/arch/i386/i386: db_interface.c mainbus.c vector.S
src/sys/arch/i386/include: i82093reg.h
src/sys/arch/x86/include: cpuvar.h i82489var.h intr.h mpacpi.h
src/sys/arch/x86/pci: msipic.c
src/sys/arch/x86/x86: cpu.c lapic.c pmc.c tprof_amdpmi.c tprof_pmi.c
src/sys/arch/xen/include: intr.h mpacpi.h
src/sys/arch/xen/x86: intr.c mainbus.c
Log Message:
x86: Add preliminary x2APIC support.
x2APIC is used only when x2APIC is enabled in BIOS/UEFI.
LAPIC ID is not supported above 256.
To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/amd64/amd64/db_interface.c
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/amd64/amd64/mainbus.c
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/amd64/amd64/vector.S
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/amd64/include/i82093reg.h
cvs rdiff -u -r1.71 -r1.72 src/sys/arch/i386/i386/db_interface.c
cvs rdiff -u -r1.102 -r1.103 src/sys/arch/i386/i386/mainbus.c
cvs rdiff -u -r1.68 -r1.69 src/sys/arch/i386/i386/vector.S
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/i386/include/i82093reg.h
cvs rdiff -u -r1.49 -r1.50 src/sys/arch/x86/include/cpuvar.h \
src/sys/arch/x86/include/intr.h
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/x86/include/i82489var.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/x86/include/mpacpi.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/x86/pci/msipic.c
cvs rdiff -u -r1.124 -r1.125 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/x86/x86/lapic.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/x86/x86/pmc.c \
src/sys/arch/x86/x86/tprof_amdpmi.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/x86/x86/tprof_pmi.c
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/xen/include/intr.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/xen/include/mpacpi.h
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/xen/x86/intr.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/xen/x86/mainbus.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/db_interface.c
diff -u src/sys/arch/amd64/amd64/db_interface.c:1.24 src/sys/arch/amd64/amd64/db_interface.c:1.25
--- src/sys/arch/amd64/amd64/db_interface.c:1.24 Thu Aug 11 19:52:52 2011
+++ src/sys/arch/amd64/amd64/db_interface.c Tue May 23 08:54:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: db_interface.c,v 1.24 2011/08/11 19:52:52 cherry Exp $ */
+/* $NetBSD: db_interface.c,v 1.25 2017/05/23 08:54:38 nonaka Exp $ */
/*
* Mach Operating System
@@ -33,11 +33,13 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.24 2011/08/11 19:52:52 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.25 2017/05/23 08:54:38 nonaka Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
+#include "lapic.h"
+
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/reboot.h>
@@ -93,7 +95,7 @@ static bool ddb_mp_online;
int ddb_cpu = NOCPU;
typedef void (vector)(void);
-extern vector Xintrddb;
+extern vector Xintrddb, Xx2apic_intrddb;
void
db_machine_init(void)
@@ -101,9 +103,14 @@ db_machine_init(void)
#ifdef MULTIPROCESSOR
#ifndef XEN
+ vector *handler = &Xintrddb;
+#if NLAPIC > 0
+ if (lapic_is_x2apic())
+ handler = &Xx2apic_intrddb;
+#endif
ddb_vec = idt_vec_alloc(0xf0, 0xff);
- setgate((struct gate_descriptor *)&idt[ddb_vec], &Xintrddb, 1,
- SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
+ setgate(&idt[ddb_vec], handler, 1, SDT_SYS386IGT, SEL_KPL,
+ GSEL(GCODE_SEL, SEL_KPL));
#else
/* Initialised as part of xen_ipi_init() */
#endif /* XEN */
Index: src/sys/arch/amd64/amd64/mainbus.c
diff -u src/sys/arch/amd64/amd64/mainbus.c:1.37 src/sys/arch/amd64/amd64/mainbus.c:1.38
--- src/sys/arch/amd64/amd64/mainbus.c:1.37 Tue Jun 21 11:33:32 2016
+++ src/sys/arch/amd64/amd64/mainbus.c Tue May 23 08:54:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.37 2016/06/21 11:33:32 nonaka Exp $ */
+/* $NetBSD: mainbus.c,v 1.38 2017/05/23 08:54:38 nonaka Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.37 2016/06/21 11:33:32 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.38 2017/05/23 08:54:38 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -126,6 +126,9 @@ int mp_nintr;
int mp_isa_bus = -1;
int mp_eisa_bus = -1;
+bool acpi_present;
+bool mpacpi_active;
+
# ifdef MPVERBOSE
# if MPVERBOSE > 0
int mp_verbose = MPVERBOSE;
@@ -160,13 +163,9 @@ mainbus_attach(device_t parent, device_t
#if NPCI > 0
int mode;
#endif
-#if NACPICA > 0
- int acpi_present = 0;
-#endif
#ifdef MPBIOS
int mpbios_present = 0;
#endif
- int mpacpi_active = 0;
int numcpus = 0;
#if defined(PCI_BUS_FIXUP)
int pci_maxbus = 0;
@@ -202,14 +201,14 @@ mainbus_attach(device_t parent, device_t
#if NACPICA > 0
if ((boothowto & RB_MD2) == 0 && acpi_check(self, "acpibus"))
- acpi_present = acpi_probe();
+ acpi_present = acpi_probe() != 0;
/*
* First, see if the MADT contains CPUs, and possibly I/O APICs.
* Building the interrupt routing structures can only
* be done later (via a callback).
*/
if (acpi_present)
- mpacpi_active = mpacpi_scan_apics(self, &numcpus);
+ mpacpi_active = mpacpi_scan_apics(self, &numcpus) != 0;
#endif
if (!mpacpi_active) {
Index: src/sys/arch/amd64/amd64/vector.S
diff -u src/sys/arch/amd64/amd64/vector.S:1.48 src/sys/arch/amd64/amd64/vector.S:1.49
--- src/sys/arch/amd64/amd64/vector.S:1.48 Fri Nov 25 14:12:55 2016
+++ src/sys/arch/amd64/amd64/vector.S Tue May 23 08:54:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vector.S,v 1.48 2016/11/25 14:12:55 maxv Exp $ */
+/* $NetBSD: vector.S,v 1.49 2017/05/23 08:54:38 nonaka Exp $ */
/*-
* Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -118,7 +118,19 @@ IDTVEC(recurse_lapic_ipi)
INTRENTRY
jmp 1f
IDTVEC_END(recurse_lapic_ipi)
-
+IDTVEC(intr_x2apic_ipi)
+ pushq $0
+ pushq $T_ASTFLT
+ INTRENTRY
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ movl CPUVAR(ILEVEL),%ebx
+ cmpl $IPL_HIGH,%ebx
+ jae 2f
+ jmp 1f
+IDTVEC_END(intr_x2apic_ipi)
IDTVEC(intr_lapic_ipi)
pushq $0
pushq $T_ASTFLT
@@ -128,6 +140,7 @@ IDTVEC(intr_lapic_ipi)
movl CPUVAR(ILEVEL),%ebx
cmpl $IPL_HIGH,%ebx
jae 2f
+IDTVEC_END(intr_lapic_ipi)
IDTVEC(resume_lapic_ipi)
1:
incl CPUVAR(IDEPTH)
@@ -140,7 +153,6 @@ IDTVEC(resume_lapic_ipi)
orl $(1 << LIR_IPI),CPUVAR(IPENDING)
INTRFASTEXIT
IDTVEC_END(resume_lapic_ipi)
-IDTVEC_END(intr_lapic_ipi)
#if defined(DDB)
IDTVEC(intrddb)
@@ -158,6 +170,24 @@ IDTVEC(intrddb)
movq %rax,%cr8
INTRFASTEXIT
IDTVEC_END(intrddb)
+
+IDTVEC(x2apic_intrddb)
+1:
+ pushq $0
+ pushq $T_BPTFLT
+ INTRENTRY
+ movl $0xf,%eax
+ movq %rax,%cr8
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ sti
+ call _C_LABEL(ddb_ipi)
+ xorl %eax,%eax
+ movq %rax,%cr8
+ INTRFASTEXIT
+IDTVEC_END(x2apic_intrddb)
#endif /* DDB */
#endif /* MULTIPROCESSOR */
@@ -171,7 +201,19 @@ IDTVEC(recurse_lapic_ltimer)
INTRENTRY
jmp 1f
IDTVEC_END(recurse_lapic_ltimer)
-
+IDTVEC(intr_x2apic_ltimer)
+ pushq $0
+ pushq $T_ASTFLT
+ INTRENTRY
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ movl CPUVAR(ILEVEL),%ebx
+ cmpl $IPL_CLOCK,%ebx
+ jae 2f
+ jmp 1f
+IDTVEC_END(intr_x2apic_ltimer)
IDTVEC(intr_lapic_ltimer)
pushq $0
pushq $T_ASTFLT
@@ -181,6 +223,7 @@ IDTVEC(intr_lapic_ltimer)
movl CPUVAR(ILEVEL),%ebx
cmpl $IPL_CLOCK,%ebx
jae 2f
+IDTVEC_END(intr_lapic_ltimer)
IDTVEC(resume_lapic_ltimer)
1:
incl CPUVAR(IDEPTH)
@@ -195,7 +238,6 @@ IDTVEC(resume_lapic_ltimer)
orl $(1 << LIR_TIMER),CPUVAR(IPENDING)
INTRFASTEXIT
IDTVEC_END(resume_lapic_ltimer)
-IDTVEC_END(intr_lapic_ltimer)
#endif /* NLAPIC > 0 */
#ifndef XEN
@@ -212,6 +254,18 @@ IDTVEC(intr_lapic_tlb)
INTRFASTEXIT
IDTVEC_END(intr_lapic_tlb)
+IDTVEC(intr_x2apic_tlb)
+ pushq $0
+ pushq $T_ASTFLT
+ INTRENTRY
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ callq _C_LABEL(pmap_tlb_intr)
+ INTRFASTEXIT
+IDTVEC_END(intr_x2apic_tlb)
+
#endif /* !XEN */
#define voidop(num)
@@ -397,6 +451,72 @@ INTRSTUB(ioapic_level,29,voidop,ioapic_a
INTRSTUB(ioapic_level,30,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
INTRSTUB(ioapic_level,31,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_edge,0,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,1,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,2,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,3,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,4,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,5,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,6,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,7,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,8,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,9,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,10,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,11,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,12,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,13,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,14,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,15,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,16,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,17,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,18,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,19,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,20,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,21,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,22,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,23,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,24,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,25,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,26,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,27,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,28,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,29,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,30,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,31,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+
+INTRSTUB(x2apic_level,0,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,1,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,2,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,3,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,4,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,5,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,6,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,7,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,8,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,9,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,10,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,11,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,12,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,13,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,14,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,15,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,16,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,17,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,18,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,19,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,20,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,21,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,22,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,23,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,24,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,25,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,26,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,27,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,28,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,29,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,30,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,31,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+
#endif
.type _C_LABEL(i8259_stubs), @object
@@ -571,6 +691,142 @@ LABEL(ioapic_level_stubs)
.quad _C_LABEL(Xintr_ioapic_level31), _C_LABEL(Xrecurse_ioapic_level31)
.quad _C_LABEL(Xresume_ioapic_level31)
END(ioapic_level_stubs)
+
+ .type _C_LABEL(x2apic_edge_stubs), @object
+LABEL(x2apic_edge_stubs)
+ .quad _C_LABEL(Xintr_x2apic_edge0), _C_LABEL(Xrecurse_x2apic_edge0)
+ .quad _C_LABEL(Xresume_x2apic_edge0)
+ .quad _C_LABEL(Xintr_x2apic_edge1), _C_LABEL(Xrecurse_x2apic_edge1)
+ .quad _C_LABEL(Xresume_x2apic_edge1)
+ .quad _C_LABEL(Xintr_x2apic_edge2), _C_LABEL(Xrecurse_x2apic_edge2)
+ .quad _C_LABEL(Xresume_x2apic_edge2)
+ .quad _C_LABEL(Xintr_x2apic_edge3), _C_LABEL(Xrecurse_x2apic_edge3)
+ .quad _C_LABEL(Xresume_x2apic_edge3)
+ .quad _C_LABEL(Xintr_x2apic_edge4), _C_LABEL(Xrecurse_x2apic_edge4)
+ .quad _C_LABEL(Xresume_x2apic_edge4)
+ .quad _C_LABEL(Xintr_x2apic_edge5), _C_LABEL(Xrecurse_x2apic_edge5)
+ .quad _C_LABEL(Xresume_x2apic_edge5)
+ .quad _C_LABEL(Xintr_x2apic_edge6), _C_LABEL(Xrecurse_x2apic_edge6)
+ .quad _C_LABEL(Xresume_x2apic_edge6)
+ .quad _C_LABEL(Xintr_x2apic_edge7), _C_LABEL(Xrecurse_x2apic_edge7)
+ .quad _C_LABEL(Xresume_x2apic_edge7)
+ .quad _C_LABEL(Xintr_x2apic_edge8), _C_LABEL(Xrecurse_x2apic_edge8)
+ .quad _C_LABEL(Xresume_x2apic_edge8)
+ .quad _C_LABEL(Xintr_x2apic_edge9), _C_LABEL(Xrecurse_x2apic_edge9)
+ .quad _C_LABEL(Xresume_x2apic_edge9)
+ .quad _C_LABEL(Xintr_x2apic_edge10), _C_LABEL(Xrecurse_x2apic_edge10)
+ .quad _C_LABEL(Xresume_x2apic_edge10)
+ .quad _C_LABEL(Xintr_x2apic_edge11), _C_LABEL(Xrecurse_x2apic_edge11)
+ .quad _C_LABEL(Xresume_x2apic_edge11)
+ .quad _C_LABEL(Xintr_x2apic_edge12), _C_LABEL(Xrecurse_x2apic_edge12)
+ .quad _C_LABEL(Xresume_x2apic_edge12)
+ .quad _C_LABEL(Xintr_x2apic_edge13), _C_LABEL(Xrecurse_x2apic_edge13)
+ .quad _C_LABEL(Xresume_x2apic_edge13)
+ .quad _C_LABEL(Xintr_x2apic_edge14), _C_LABEL(Xrecurse_x2apic_edge14)
+ .quad _C_LABEL(Xresume_x2apic_edge14)
+ .quad _C_LABEL(Xintr_x2apic_edge15), _C_LABEL(Xrecurse_x2apic_edge15)
+ .quad _C_LABEL(Xresume_x2apic_edge15)
+ .quad _C_LABEL(Xintr_x2apic_edge16), _C_LABEL(Xrecurse_x2apic_edge16)
+ .quad _C_LABEL(Xresume_x2apic_edge16)
+ .quad _C_LABEL(Xintr_x2apic_edge17), _C_LABEL(Xrecurse_x2apic_edge17)
+ .quad _C_LABEL(Xresume_x2apic_edge17)
+ .quad _C_LABEL(Xintr_x2apic_edge18), _C_LABEL(Xrecurse_x2apic_edge18)
+ .quad _C_LABEL(Xresume_x2apic_edge18)
+ .quad _C_LABEL(Xintr_x2apic_edge19), _C_LABEL(Xrecurse_x2apic_edge19)
+ .quad _C_LABEL(Xresume_x2apic_edge19)
+ .quad _C_LABEL(Xintr_x2apic_edge20), _C_LABEL(Xrecurse_x2apic_edge20)
+ .quad _C_LABEL(Xresume_x2apic_edge20)
+ .quad _C_LABEL(Xintr_x2apic_edge21), _C_LABEL(Xrecurse_x2apic_edge21)
+ .quad _C_LABEL(Xresume_x2apic_edge21)
+ .quad _C_LABEL(Xintr_x2apic_edge22), _C_LABEL(Xrecurse_x2apic_edge22)
+ .quad _C_LABEL(Xresume_x2apic_edge22)
+ .quad _C_LABEL(Xintr_x2apic_edge23), _C_LABEL(Xrecurse_x2apic_edge23)
+ .quad _C_LABEL(Xresume_x2apic_edge23)
+ .quad _C_LABEL(Xintr_x2apic_edge24), _C_LABEL(Xrecurse_x2apic_edge24)
+ .quad _C_LABEL(Xresume_x2apic_edge24)
+ .quad _C_LABEL(Xintr_x2apic_edge25), _C_LABEL(Xrecurse_x2apic_edge25)
+ .quad _C_LABEL(Xresume_x2apic_edge25)
+ .quad _C_LABEL(Xintr_x2apic_edge26), _C_LABEL(Xrecurse_x2apic_edge26)
+ .quad _C_LABEL(Xresume_x2apic_edge26)
+ .quad _C_LABEL(Xintr_x2apic_edge27), _C_LABEL(Xrecurse_x2apic_edge27)
+ .quad _C_LABEL(Xresume_x2apic_edge27)
+ .quad _C_LABEL(Xintr_x2apic_edge28), _C_LABEL(Xrecurse_x2apic_edge28)
+ .quad _C_LABEL(Xresume_x2apic_edge28)
+ .quad _C_LABEL(Xintr_x2apic_edge29), _C_LABEL(Xrecurse_x2apic_edge29)
+ .quad _C_LABEL(Xresume_x2apic_edge29)
+ .quad _C_LABEL(Xintr_x2apic_edge30), _C_LABEL(Xrecurse_x2apic_edge30)
+ .quad _C_LABEL(Xresume_x2apic_edge30)
+ .quad _C_LABEL(Xintr_x2apic_edge31), _C_LABEL(Xrecurse_x2apic_edge31)
+ .quad _C_LABEL(Xresume_x2apic_edge31)
+END(x2apic_edge_stubs)
+
+ .type _C_LABEL(x2apic_level_stubs), @object
+LABEL(x2apic_level_stubs)
+ .quad _C_LABEL(Xintr_x2apic_level0), _C_LABEL(Xrecurse_x2apic_level0)
+ .quad _C_LABEL(Xresume_x2apic_level0)
+ .quad _C_LABEL(Xintr_x2apic_level1), _C_LABEL(Xrecurse_x2apic_level1)
+ .quad _C_LABEL(Xresume_x2apic_level1)
+ .quad _C_LABEL(Xintr_x2apic_level2), _C_LABEL(Xrecurse_x2apic_level2)
+ .quad _C_LABEL(Xresume_x2apic_level2)
+ .quad _C_LABEL(Xintr_x2apic_level3), _C_LABEL(Xrecurse_x2apic_level3)
+ .quad _C_LABEL(Xresume_x2apic_level3)
+ .quad _C_LABEL(Xintr_x2apic_level4), _C_LABEL(Xrecurse_x2apic_level4)
+ .quad _C_LABEL(Xresume_x2apic_level4)
+ .quad _C_LABEL(Xintr_x2apic_level5), _C_LABEL(Xrecurse_x2apic_level5)
+ .quad _C_LABEL(Xresume_x2apic_level5)
+ .quad _C_LABEL(Xintr_x2apic_level6), _C_LABEL(Xrecurse_x2apic_level6)
+ .quad _C_LABEL(Xresume_x2apic_level6)
+ .quad _C_LABEL(Xintr_x2apic_level7), _C_LABEL(Xrecurse_x2apic_level7)
+ .quad _C_LABEL(Xresume_x2apic_level7)
+ .quad _C_LABEL(Xintr_x2apic_level8), _C_LABEL(Xrecurse_x2apic_level8)
+ .quad _C_LABEL(Xresume_x2apic_level8)
+ .quad _C_LABEL(Xintr_x2apic_level9), _C_LABEL(Xrecurse_x2apic_level9)
+ .quad _C_LABEL(Xresume_x2apic_level9)
+ .quad _C_LABEL(Xintr_x2apic_level10), _C_LABEL(Xrecurse_x2apic_level10)
+ .quad _C_LABEL(Xresume_x2apic_level10)
+ .quad _C_LABEL(Xintr_x2apic_level11), _C_LABEL(Xrecurse_x2apic_level11)
+ .quad _C_LABEL(Xresume_x2apic_level11)
+ .quad _C_LABEL(Xintr_x2apic_level12), _C_LABEL(Xrecurse_x2apic_level12)
+ .quad _C_LABEL(Xresume_x2apic_level12)
+ .quad _C_LABEL(Xintr_x2apic_level13), _C_LABEL(Xrecurse_x2apic_level13)
+ .quad _C_LABEL(Xresume_x2apic_level13)
+ .quad _C_LABEL(Xintr_x2apic_level14), _C_LABEL(Xrecurse_x2apic_level14)
+ .quad _C_LABEL(Xresume_x2apic_level14)
+ .quad _C_LABEL(Xintr_x2apic_level15), _C_LABEL(Xrecurse_x2apic_level15)
+ .quad _C_LABEL(Xresume_x2apic_level15)
+ .quad _C_LABEL(Xintr_x2apic_level16), _C_LABEL(Xrecurse_x2apic_level16)
+ .quad _C_LABEL(Xresume_x2apic_level16)
+ .quad _C_LABEL(Xintr_x2apic_level17), _C_LABEL(Xrecurse_x2apic_level17)
+ .quad _C_LABEL(Xresume_x2apic_level17)
+ .quad _C_LABEL(Xintr_x2apic_level18), _C_LABEL(Xrecurse_x2apic_level18)
+ .quad _C_LABEL(Xresume_x2apic_level18)
+ .quad _C_LABEL(Xintr_x2apic_level19), _C_LABEL(Xrecurse_x2apic_level19)
+ .quad _C_LABEL(Xresume_x2apic_level19)
+ .quad _C_LABEL(Xintr_x2apic_level20), _C_LABEL(Xrecurse_x2apic_level20)
+ .quad _C_LABEL(Xresume_x2apic_level20)
+ .quad _C_LABEL(Xintr_x2apic_level21), _C_LABEL(Xrecurse_x2apic_level21)
+ .quad _C_LABEL(Xresume_x2apic_level21)
+ .quad _C_LABEL(Xintr_x2apic_level22), _C_LABEL(Xrecurse_x2apic_level22)
+ .quad _C_LABEL(Xresume_x2apic_level22)
+ .quad _C_LABEL(Xintr_x2apic_level23), _C_LABEL(Xrecurse_x2apic_level23)
+ .quad _C_LABEL(Xresume_x2apic_level23)
+ .quad _C_LABEL(Xintr_x2apic_level24), _C_LABEL(Xrecurse_x2apic_level24)
+ .quad _C_LABEL(Xresume_x2apic_level24)
+ .quad _C_LABEL(Xintr_x2apic_level25), _C_LABEL(Xrecurse_x2apic_level25)
+ .quad _C_LABEL(Xresume_x2apic_level25)
+ .quad _C_LABEL(Xintr_x2apic_level26), _C_LABEL(Xrecurse_x2apic_level26)
+ .quad _C_LABEL(Xresume_x2apic_level26)
+ .quad _C_LABEL(Xintr_x2apic_level27), _C_LABEL(Xrecurse_x2apic_level27)
+ .quad _C_LABEL(Xresume_x2apic_level27)
+ .quad _C_LABEL(Xintr_x2apic_level28), _C_LABEL(Xrecurse_x2apic_level28)
+ .quad _C_LABEL(Xresume_x2apic_level28)
+ .quad _C_LABEL(Xintr_x2apic_level29), _C_LABEL(Xrecurse_x2apic_level29)
+ .quad _C_LABEL(Xresume_x2apic_level29)
+ .quad _C_LABEL(Xintr_x2apic_level30), _C_LABEL(Xrecurse_x2apic_level30)
+ .quad _C_LABEL(Xresume_x2apic_level30)
+ .quad _C_LABEL(Xintr_x2apic_level31), _C_LABEL(Xrecurse_x2apic_level31)
+ .quad _C_LABEL(Xresume_x2apic_level31)
+END(x2apic_level_stubs)
#endif
#else /* !XEN */
Index: src/sys/arch/amd64/include/i82093reg.h
diff -u src/sys/arch/amd64/include/i82093reg.h:1.7 src/sys/arch/amd64/include/i82093reg.h:1.8
--- src/sys/arch/amd64/include/i82093reg.h:1.7 Fri Nov 25 14:12:55 2016
+++ src/sys/arch/amd64/include/i82093reg.h Tue May 23 08:54:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: i82093reg.h,v 1.7 2016/11/25 14:12:55 maxv Exp $ */
+/* $NetBSD: i82093reg.h,v 1.8 2017/05/23 08:54:38 nonaka Exp $ */
#include <x86/i82093reg.h>
@@ -12,6 +12,12 @@
movq _C_LABEL(local_apic_va),%rax ; \
movl $0,LAPIC_EOI(%rax)
+#define x2apic_asm_ack(num) \
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx ; \
+ xorl %eax,%eax ; \
+ xorl %edx,%edx ; \
+ wrmsr
+
#ifdef MULTIPROCESSOR
#define ioapic_asm_lock(num) \
Index: src/sys/arch/i386/i386/db_interface.c
diff -u src/sys/arch/i386/i386/db_interface.c:1.71 src/sys/arch/i386/i386/db_interface.c:1.72
--- src/sys/arch/i386/i386/db_interface.c:1.71 Fri Feb 28 10:16:51 2014
+++ src/sys/arch/i386/i386/db_interface.c Tue May 23 08:54:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: db_interface.c,v 1.71 2014/02/28 10:16:51 skrll Exp $ */
+/* $NetBSD: db_interface.c,v 1.72 2017/05/23 08:54:38 nonaka Exp $ */
/*
* Mach Operating System
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.71 2014/02/28 10:16:51 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.72 2017/05/23 08:54:38 nonaka Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -105,7 +105,7 @@ db_regs_t *ddb_regp = 0;
int ddb_cpu = NOCPU;
typedef void (vector)(void);
-extern vector Xintrddbipi;
+extern vector Xintrddbipi, Xx2apic_intrddbipi;
void
db_machine_init(void)
@@ -113,8 +113,13 @@ db_machine_init(void)
#ifdef MULTIPROCESSOR
#ifndef XEN
+ vector *handler = &Xintrddbipi;
+#if NLAPIC > 0
+ if (lapic_is_x2apic())
+ handler = &Xx2apic_intrddbipi;
+#endif
ddb_vec = idt_vec_alloc(0xf0, 0xff);
- idt_vec_set(ddb_vec, &Xintrddbipi);
+ idt_vec_set(ddb_vec, handler);
#else
/* Initialised as part of xen_ipi_init() */
#endif /* XEN */
Index: src/sys/arch/i386/i386/mainbus.c
diff -u src/sys/arch/i386/i386/mainbus.c:1.102 src/sys/arch/i386/i386/mainbus.c:1.103
--- src/sys/arch/i386/i386/mainbus.c:1.102 Tue Jun 21 11:33:32 2016
+++ src/sys/arch/i386/i386/mainbus.c Tue May 23 08:54:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.102 2016/06/21 11:33:32 nonaka Exp $ */
+/* $NetBSD: mainbus.c,v 1.103 2017/05/23 08:54:38 nonaka Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.102 2016/06/21 11:33:32 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.103 2017/05/23 08:54:38 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -102,8 +102,6 @@ struct mainbus_softc {
device_t sc_pci;
device_t sc_mca;
device_t sc_pnpbios;
- bool sc_acpi_present;
- bool sc_mpacpi_active;
};
CFATTACH_DECL2_NEW(mainbus, sizeof(struct mainbus_softc),
@@ -161,6 +159,9 @@ int mp_nintr;
int mp_isa_bus = -1; /* XXX */
int mp_eisa_bus = -1; /* XXX */
+bool acpi_present;
+bool mpacpi_active;
+
# ifdef MPVERBOSE
# if MPVERBOSE > 0
int mp_verbose = MPVERBOSE;
@@ -256,17 +257,17 @@ mainbus_attach(device_t parent, device_t
#if NACPICA > 0
if ((boothowto & RB_MD2) == 0 && acpi_check(self, "acpibus"))
- sc->sc_acpi_present = acpi_probe() != 0;
+ acpi_present = acpi_probe() != 0;
/*
* First, see if the MADT contains CPUs, and possibly I/O APICs.
* Building the interrupt routing structures can only
* be done later (via a callback).
*/
- if (sc->sc_acpi_present)
- sc->sc_mpacpi_active = mpacpi_scan_apics(self, &numcpus) != 0;
+ if (acpi_present)
+ mpacpi_active = mpacpi_scan_apics(self, &numcpus) != 0;
#endif
- if (!sc->sc_mpacpi_active) {
+ if (!mpacpi_active) {
#ifdef MPBIOS
if (mpbios_present)
mpbios_scan(self, &numcpus);
@@ -335,7 +336,7 @@ mainbus_rescan(device_t self, const char
#endif
if (ifattr_match(ifattr, "acpibus") && sc->sc_acpi == NULL &&
- sc->sc_acpi_present) {
+ acpi_present) {
#if NACPICA > 0
mba.mba_acpi.aa_iot = x86_bus_space_io;
mba.mba_acpi.aa_memt = x86_bus_space_mem;
@@ -415,7 +416,7 @@ mainbus_rescan(device_t self, const char
mba.mba_pba.pba_sub = 255;
mba.mba_pba.pba_bridgetag = NULL;
#if NACPICA > 0 && defined(ACPI_SCANPCI)
- if (npcibus == 0 && sc->sc_mpacpi_active)
+ if (npcibus == 0 && mpacpi_active)
npcibus = mp_pci_scan(self, &mba.mba_pba, pcibusprint);
#endif
#if defined(MPBIOS) && defined(MPBIOS_SCANPCI)
Index: src/sys/arch/i386/i386/vector.S
diff -u src/sys/arch/i386/i386/vector.S:1.68 src/sys/arch/i386/i386/vector.S:1.69
--- src/sys/arch/i386/i386/vector.S:1.68 Fri Nov 25 14:12:55 2016
+++ src/sys/arch/i386/i386/vector.S Tue May 23 08:54:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vector.S,v 1.68 2016/11/25 14:12:55 maxv Exp $ */
+/* $NetBSD: vector.S,v 1.69 2017/05/23 08:54:38 nonaka Exp $ */
/*
* Copyright 2002 (c) Wasabi Systems, Inc.
@@ -65,7 +65,7 @@
*/
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.68 2016/11/25 14:12:55 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.69 2017/05/23 08:54:38 nonaka Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -158,6 +158,19 @@ IDTVEC(recurse_lapic_ipi)
INTRENTRY
jmp 1f
IDTVEC_END(recurse_lapic_ipi)
+IDTVEC(intr_x2apic_ipi)
+ pushl $0
+ pushl $T_ASTFLT
+ INTRENTRY
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ movl CPUVAR(ILEVEL),%ebx
+ cmpl $IPL_HIGH,%ebx
+ jae 2f
+ jmp 1f
+IDTVEC_END(intr_x2apic_ipi)
IDTVEC(intr_lapic_ipi)
pushl $0
pushl $T_ASTFLT
@@ -195,6 +208,18 @@ IDTVEC(intr_lapic_tlb)
INTRFASTEXIT
IDTVEC_END(intr_lapic_tlb)
+IDTVEC(intr_x2apic_tlb)
+ pushl $0
+ pushl $T_ASTFLT
+ INTRENTRY
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ call _C_LABEL(pmap_tlb_intr)
+ INTRFASTEXIT
+IDTVEC_END(intr_x2apic_tlb)
+
#if defined(DDB)
/*
* No need to use INTRENTRY, since we were brought here through a task-gate
@@ -219,6 +244,32 @@ IDTVEC(intrddbipi)
iret
jmp 1b
IDTVEC_END(intrddbipi)
+
+IDTVEC(x2apic_intrddbipi)
+1:
+ str %ax
+ GET_TSS
+ movzwl (%eax),%eax
+ GET_TSS
+ pushl %eax
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_TPRI),%ecx
+ movl 0xff,%eax
+ xorl %edx,%edx
+ wrmsr
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ sti
+ call _C_LABEL(ddb_ipi_tss)
+ addl $4,%esp
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_TPRI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ iret
+ jmp 1b
+IDTVEC_END(x2apic_intrddbipi)
#endif /* DDB */
#endif /* MULTIPROCESSOR */
@@ -234,6 +285,19 @@ IDTVEC(recurse_lapic_ltimer)
INTRENTRY
jmp 1f
IDTVEC_END(recurse_lapic_ltimer)
+IDTVEC(intr_x2apic_ltimer)
+ pushl $0
+ pushl $T_ASTFLT
+ INTRENTRY
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx
+ xorl %eax,%eax
+ xorl %edx,%edx
+ wrmsr
+ movl CPUVAR(ILEVEL),%ebx
+ cmpl $IPL_CLOCK,%ebx
+ jae 2f
+ jmp 1f
+IDTVEC_END(intr_x2apic_ltimer)
IDTVEC(intr_lapic_ltimer)
pushl $0
pushl $T_ASTFLT
@@ -243,6 +307,7 @@ IDTVEC(intr_lapic_ltimer)
movl CPUVAR(ILEVEL),%ebx
cmpl $IPL_CLOCK,%ebx
jae 2f
+IDTVEC_END(intr_lapic_ltimer)
IDTVEC(resume_lapic_ltimer)
1:
pushl %ebx
@@ -257,7 +322,7 @@ IDTVEC(resume_lapic_ltimer)
2:
orl $(1 << LIR_TIMER),CPUVAR(IPENDING)
INTRFASTEXIT
-IDTVEC_END(intr_lapic_ltimer)
+IDTVEC_END(resume_lapic_ltimer)
#endif /* NLAPIC > 0 */
@@ -450,6 +515,72 @@ INTRSTUB(ioapic_level,29,voidop,ioapic_a
INTRSTUB(ioapic_level,30,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
INTRSTUB(ioapic_level,31,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_edge,0,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,1,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,2,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,3,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,4,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,5,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,6,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,7,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,8,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,9,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,10,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,11,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,12,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,13,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,14,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,15,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,16,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,17,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,18,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,19,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,20,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,21,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,22,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,23,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,24,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,25,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,26,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,27,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,28,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,29,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,30,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+INTRSTUB(x2apic_edge,31,voidop,x2apic_asm_ack,voidop,voidop,voidop)
+
+INTRSTUB(x2apic_level,0,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,1,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,2,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,3,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,4,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,5,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,6,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,7,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,8,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,9,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,10,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,11,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,12,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,13,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,14,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,15,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,16,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,17,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,18,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,19,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,20,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,21,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,22,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,23,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,24,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,25,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,26,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,27,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,28,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,29,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,30,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+INTRSTUB(x2apic_level,31,voidop,x2apic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
+
#endif
.type _C_LABEL(i8259_stubs), @object
@@ -624,6 +755,142 @@ LABEL(ioapic_level_stubs)
.long _C_LABEL(Xintr_ioapic_level31), _C_LABEL(Xrecurse_ioapic_level31)
.long _C_LABEL(Xresume_ioapic_level31)
END(ioapic_level_stubs)
+
+ .type _C_LABEL(x2apic_edge_stubs), @object
+LABEL(x2apic_edge_stubs)
+ .long _C_LABEL(Xintr_x2apic_edge0), _C_LABEL(Xrecurse_x2apic_edge0)
+ .long _C_LABEL(Xresume_x2apic_edge0)
+ .long _C_LABEL(Xintr_x2apic_edge1), _C_LABEL(Xrecurse_x2apic_edge1)
+ .long _C_LABEL(Xresume_x2apic_edge1)
+ .long _C_LABEL(Xintr_x2apic_edge2), _C_LABEL(Xrecurse_x2apic_edge2)
+ .long _C_LABEL(Xresume_x2apic_edge2)
+ .long _C_LABEL(Xintr_x2apic_edge3), _C_LABEL(Xrecurse_x2apic_edge3)
+ .long _C_LABEL(Xresume_x2apic_edge3)
+ .long _C_LABEL(Xintr_x2apic_edge4), _C_LABEL(Xrecurse_x2apic_edge4)
+ .long _C_LABEL(Xresume_x2apic_edge4)
+ .long _C_LABEL(Xintr_x2apic_edge5), _C_LABEL(Xrecurse_x2apic_edge5)
+ .long _C_LABEL(Xresume_x2apic_edge5)
+ .long _C_LABEL(Xintr_x2apic_edge6), _C_LABEL(Xrecurse_x2apic_edge6)
+ .long _C_LABEL(Xresume_x2apic_edge6)
+ .long _C_LABEL(Xintr_x2apic_edge7), _C_LABEL(Xrecurse_x2apic_edge7)
+ .long _C_LABEL(Xresume_x2apic_edge7)
+ .long _C_LABEL(Xintr_x2apic_edge8), _C_LABEL(Xrecurse_x2apic_edge8)
+ .long _C_LABEL(Xresume_x2apic_edge8)
+ .long _C_LABEL(Xintr_x2apic_edge9), _C_LABEL(Xrecurse_x2apic_edge9)
+ .long _C_LABEL(Xresume_x2apic_edge9)
+ .long _C_LABEL(Xintr_x2apic_edge10), _C_LABEL(Xrecurse_x2apic_edge10)
+ .long _C_LABEL(Xresume_x2apic_edge10)
+ .long _C_LABEL(Xintr_x2apic_edge11), _C_LABEL(Xrecurse_x2apic_edge11)
+ .long _C_LABEL(Xresume_x2apic_edge11)
+ .long _C_LABEL(Xintr_x2apic_edge12), _C_LABEL(Xrecurse_x2apic_edge12)
+ .long _C_LABEL(Xresume_x2apic_edge12)
+ .long _C_LABEL(Xintr_x2apic_edge13), _C_LABEL(Xrecurse_x2apic_edge13)
+ .long _C_LABEL(Xresume_x2apic_edge13)
+ .long _C_LABEL(Xintr_x2apic_edge14), _C_LABEL(Xrecurse_x2apic_edge14)
+ .long _C_LABEL(Xresume_x2apic_edge14)
+ .long _C_LABEL(Xintr_x2apic_edge15), _C_LABEL(Xrecurse_x2apic_edge15)
+ .long _C_LABEL(Xresume_x2apic_edge15)
+ .long _C_LABEL(Xintr_x2apic_edge16), _C_LABEL(Xrecurse_x2apic_edge16)
+ .long _C_LABEL(Xresume_x2apic_edge16)
+ .long _C_LABEL(Xintr_x2apic_edge17), _C_LABEL(Xrecurse_x2apic_edge17)
+ .long _C_LABEL(Xresume_x2apic_edge17)
+ .long _C_LABEL(Xintr_x2apic_edge18), _C_LABEL(Xrecurse_x2apic_edge18)
+ .long _C_LABEL(Xresume_x2apic_edge18)
+ .long _C_LABEL(Xintr_x2apic_edge19), _C_LABEL(Xrecurse_x2apic_edge19)
+ .long _C_LABEL(Xresume_x2apic_edge19)
+ .long _C_LABEL(Xintr_x2apic_edge20), _C_LABEL(Xrecurse_x2apic_edge20)
+ .long _C_LABEL(Xresume_x2apic_edge20)
+ .long _C_LABEL(Xintr_x2apic_edge21), _C_LABEL(Xrecurse_x2apic_edge21)
+ .long _C_LABEL(Xresume_x2apic_edge21)
+ .long _C_LABEL(Xintr_x2apic_edge22), _C_LABEL(Xrecurse_x2apic_edge22)
+ .long _C_LABEL(Xresume_x2apic_edge22)
+ .long _C_LABEL(Xintr_x2apic_edge23), _C_LABEL(Xrecurse_x2apic_edge23)
+ .long _C_LABEL(Xresume_x2apic_edge23)
+ .long _C_LABEL(Xintr_x2apic_edge24), _C_LABEL(Xrecurse_x2apic_edge24)
+ .long _C_LABEL(Xresume_x2apic_edge24)
+ .long _C_LABEL(Xintr_x2apic_edge25), _C_LABEL(Xrecurse_x2apic_edge25)
+ .long _C_LABEL(Xresume_x2apic_edge25)
+ .long _C_LABEL(Xintr_x2apic_edge26), _C_LABEL(Xrecurse_x2apic_edge26)
+ .long _C_LABEL(Xresume_x2apic_edge26)
+ .long _C_LABEL(Xintr_x2apic_edge27), _C_LABEL(Xrecurse_x2apic_edge27)
+ .long _C_LABEL(Xresume_x2apic_edge27)
+ .long _C_LABEL(Xintr_x2apic_edge28), _C_LABEL(Xrecurse_x2apic_edge28)
+ .long _C_LABEL(Xresume_x2apic_edge28)
+ .long _C_LABEL(Xintr_x2apic_edge29), _C_LABEL(Xrecurse_x2apic_edge29)
+ .long _C_LABEL(Xresume_x2apic_edge29)
+ .long _C_LABEL(Xintr_x2apic_edge30), _C_LABEL(Xrecurse_x2apic_edge30)
+ .long _C_LABEL(Xresume_x2apic_edge30)
+ .long _C_LABEL(Xintr_x2apic_edge31), _C_LABEL(Xrecurse_x2apic_edge31)
+ .long _C_LABEL(Xresume_x2apic_edge31)
+END(x2apic_edge_stubs)
+
+ .type _C_LABEL(x2apic_level_stubs), @object
+LABEL(x2apic_level_stubs)
+ .long _C_LABEL(Xintr_x2apic_level0), _C_LABEL(Xrecurse_x2apic_level0)
+ .long _C_LABEL(Xresume_x2apic_level0)
+ .long _C_LABEL(Xintr_x2apic_level1), _C_LABEL(Xrecurse_x2apic_level1)
+ .long _C_LABEL(Xresume_x2apic_level1)
+ .long _C_LABEL(Xintr_x2apic_level2), _C_LABEL(Xrecurse_x2apic_level2)
+ .long _C_LABEL(Xresume_x2apic_level2)
+ .long _C_LABEL(Xintr_x2apic_level3), _C_LABEL(Xrecurse_x2apic_level3)
+ .long _C_LABEL(Xresume_x2apic_level3)
+ .long _C_LABEL(Xintr_x2apic_level4), _C_LABEL(Xrecurse_x2apic_level4)
+ .long _C_LABEL(Xresume_x2apic_level4)
+ .long _C_LABEL(Xintr_x2apic_level5), _C_LABEL(Xrecurse_x2apic_level5)
+ .long _C_LABEL(Xresume_x2apic_level5)
+ .long _C_LABEL(Xintr_x2apic_level6), _C_LABEL(Xrecurse_x2apic_level6)
+ .long _C_LABEL(Xresume_x2apic_level6)
+ .long _C_LABEL(Xintr_x2apic_level7), _C_LABEL(Xrecurse_x2apic_level7)
+ .long _C_LABEL(Xresume_x2apic_level7)
+ .long _C_LABEL(Xintr_x2apic_level8), _C_LABEL(Xrecurse_x2apic_level8)
+ .long _C_LABEL(Xresume_x2apic_level8)
+ .long _C_LABEL(Xintr_x2apic_level9), _C_LABEL(Xrecurse_x2apic_level9)
+ .long _C_LABEL(Xresume_x2apic_level9)
+ .long _C_LABEL(Xintr_x2apic_level10), _C_LABEL(Xrecurse_x2apic_level10)
+ .long _C_LABEL(Xresume_x2apic_level10)
+ .long _C_LABEL(Xintr_x2apic_level11), _C_LABEL(Xrecurse_x2apic_level11)
+ .long _C_LABEL(Xresume_x2apic_level11)
+ .long _C_LABEL(Xintr_x2apic_level12), _C_LABEL(Xrecurse_x2apic_level12)
+ .long _C_LABEL(Xresume_x2apic_level12)
+ .long _C_LABEL(Xintr_x2apic_level13), _C_LABEL(Xrecurse_x2apic_level13)
+ .long _C_LABEL(Xresume_x2apic_level13)
+ .long _C_LABEL(Xintr_x2apic_level14), _C_LABEL(Xrecurse_x2apic_level14)
+ .long _C_LABEL(Xresume_x2apic_level14)
+ .long _C_LABEL(Xintr_x2apic_level15), _C_LABEL(Xrecurse_x2apic_level15)
+ .long _C_LABEL(Xresume_x2apic_level15)
+ .long _C_LABEL(Xintr_x2apic_level16), _C_LABEL(Xrecurse_x2apic_level16)
+ .long _C_LABEL(Xresume_x2apic_level16)
+ .long _C_LABEL(Xintr_x2apic_level17), _C_LABEL(Xrecurse_x2apic_level17)
+ .long _C_LABEL(Xresume_x2apic_level17)
+ .long _C_LABEL(Xintr_x2apic_level18), _C_LABEL(Xrecurse_x2apic_level18)
+ .long _C_LABEL(Xresume_x2apic_level18)
+ .long _C_LABEL(Xintr_x2apic_level19), _C_LABEL(Xrecurse_x2apic_level19)
+ .long _C_LABEL(Xresume_x2apic_level19)
+ .long _C_LABEL(Xintr_x2apic_level20), _C_LABEL(Xrecurse_x2apic_level20)
+ .long _C_LABEL(Xresume_x2apic_level20)
+ .long _C_LABEL(Xintr_x2apic_level21), _C_LABEL(Xrecurse_x2apic_level21)
+ .long _C_LABEL(Xresume_x2apic_level21)
+ .long _C_LABEL(Xintr_x2apic_level22), _C_LABEL(Xrecurse_x2apic_level22)
+ .long _C_LABEL(Xresume_x2apic_level22)
+ .long _C_LABEL(Xintr_x2apic_level23), _C_LABEL(Xrecurse_x2apic_level23)
+ .long _C_LABEL(Xresume_x2apic_level23)
+ .long _C_LABEL(Xintr_x2apic_level24), _C_LABEL(Xrecurse_x2apic_level24)
+ .long _C_LABEL(Xresume_x2apic_level24)
+ .long _C_LABEL(Xintr_x2apic_level25), _C_LABEL(Xrecurse_x2apic_level25)
+ .long _C_LABEL(Xresume_x2apic_level25)
+ .long _C_LABEL(Xintr_x2apic_level26), _C_LABEL(Xrecurse_x2apic_level26)
+ .long _C_LABEL(Xresume_x2apic_level26)
+ .long _C_LABEL(Xintr_x2apic_level27), _C_LABEL(Xrecurse_x2apic_level27)
+ .long _C_LABEL(Xresume_x2apic_level27)
+ .long _C_LABEL(Xintr_x2apic_level28), _C_LABEL(Xrecurse_x2apic_level28)
+ .long _C_LABEL(Xresume_x2apic_level28)
+ .long _C_LABEL(Xintr_x2apic_level29), _C_LABEL(Xrecurse_x2apic_level29)
+ .long _C_LABEL(Xresume_x2apic_level29)
+ .long _C_LABEL(Xintr_x2apic_level30), _C_LABEL(Xrecurse_x2apic_level30)
+ .long _C_LABEL(Xresume_x2apic_level30)
+ .long _C_LABEL(Xintr_x2apic_level31), _C_LABEL(Xrecurse_x2apic_level31)
+ .long _C_LABEL(Xresume_x2apic_level31)
+END(x2apic_level_stubs)
#endif
#else /* XEN */
#define voidop(num)
Index: src/sys/arch/i386/include/i82093reg.h
diff -u src/sys/arch/i386/include/i82093reg.h:1.9 src/sys/arch/i386/include/i82093reg.h:1.10
--- src/sys/arch/i386/include/i82093reg.h:1.9 Fri Nov 25 14:12:55 2016
+++ src/sys/arch/i386/include/i82093reg.h Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: i82093reg.h,v 1.9 2016/11/25 14:12:55 maxv Exp $ */
+/* $NetBSD: i82093reg.h,v 1.10 2017/05/23 08:54:39 nonaka Exp $ */
#include <x86/i82093reg.h>
@@ -12,6 +12,12 @@
movl _C_LABEL(local_apic_va),%eax ; \
movl $0,LAPIC_EOI(%eax)
+#define x2apic_asm_ack(num) \
+ movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx ; \
+ xorl %eax,%eax ; \
+ xorl %edx,%edx ; \
+ wrmsr
+
#ifdef MULTIPROCESSOR
#define ioapic_asm_lock(num) \
Index: src/sys/arch/x86/include/cpuvar.h
diff -u src/sys/arch/x86/include/cpuvar.h:1.49 src/sys/arch/x86/include/cpuvar.h:1.50
--- src/sys/arch/x86/include/cpuvar.h:1.49 Wed Apr 19 06:43:05 2017
+++ src/sys/arch/x86/include/cpuvar.h Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: cpuvar.h,v 1.49 2017/04/19 06:43:05 nonaka Exp $ */
+/* $NetBSD: cpuvar.h,v 1.50 2017/05/23 08:54:39 nonaka Exp $ */
/*-
* Copyright (c) 2000, 2007 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@ struct cpufeature_attach_args {
#include "opt_multiprocessor.h"
#endif /* defined(_KERNEL_OPT) */
-int x86_ipi(int, int, int);
+extern int (*x86_ipi)(int, int, int);
int x86_ipi_init(int);
int x86_ipi_startup(int, int);
void x86_errata(void);
Index: src/sys/arch/x86/include/intr.h
diff -u src/sys/arch/x86/include/intr.h:1.49 src/sys/arch/x86/include/intr.h:1.50
--- src/sys/arch/x86/include/intr.h:1.49 Thu Jul 7 06:55:39 2016
+++ src/sys/arch/x86/include/intr.h Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.49 2016/07/07 06:55:39 msaitoh Exp $ */
+/* $NetBSD: intr.h,v 1.50 2017/05/23 08:54:39 nonaka Exp $ */
/*-
* Copyright (c) 1998, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -177,6 +177,8 @@ void Xpreemptresume(void);
extern struct intrstub i8259_stubs[];
extern struct intrstub ioapic_edge_stubs[];
extern struct intrstub ioapic_level_stubs[];
+extern struct intrstub x2apic_edge_stubs[];
+extern struct intrstub x2apic_level_stubs[];
struct cpu_info;
Index: src/sys/arch/x86/include/i82489var.h
diff -u src/sys/arch/x86/include/i82489var.h:1.18 src/sys/arch/x86/include/i82489var.h:1.19
--- src/sys/arch/x86/include/i82489var.h:1.18 Sat Apr 22 04:29:31 2017
+++ src/sys/arch/x86/include/i82489var.h Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: i82489var.h,v 1.18 2017/04/22 04:29:31 nonaka Exp $ */
+/* $NetBSD: i82489var.h,v 1.19 2017/05/23 08:54:39 nonaka Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -36,27 +36,11 @@
* Software definitions belonging to Local APIC driver.
*/
-static __inline uint32_t i82489_readreg(int);
-static __inline void i82489_writereg(int, uint32_t);
-
#ifdef _KERNEL
extern volatile vaddr_t local_apic_va;
+extern bool x2apic_mode;
#endif
-static __inline uint32_t
-i82489_readreg(int reg)
-{
- return *((volatile uint32_t *)(local_apic_va + reg));
-}
-
-static __inline void
-i82489_writereg(int reg, uint32_t val)
-{
- *((volatile uint32_t *)(local_apic_va + reg)) = val;
-}
-
-#define lapic_cpu_number() (i82489_readreg(LAPIC_ID) >> LAPIC_ID_SHIFT)
-
/*
* "spurious interrupt vector"; vector used by interrupt which was
* aborted because the CPU masked it after it happened but before it
@@ -70,11 +54,13 @@ extern void Xintrspurious(void);
* Vectors used for inter-processor interrupts.
*/
extern void Xintr_lapic_ipi(void);
+extern void Xintr_x2apic_ipi(void);
extern void Xrecurse_lapic_ipi(void);
extern void Xresume_lapic_ipi(void);
#define LAPIC_IPI_VECTOR 0xe0
extern void Xintr_lapic_tlb(void);
+extern void Xintr_x2apic_tlb(void);
#define LAPIC_TLB_VECTOR 0xe1
/*
@@ -82,6 +68,7 @@ extern void Xintr_lapic_tlb(void);
*/
extern void Xintr_lapic_ltimer(void);
+extern void Xintr_x2apic_ltimer(void);
extern void Xresume_lapic_ltimer(void);
extern void Xrecurse_lapic_ltimer(void);
#define LAPIC_TIMER_VECTOR 0xc0
@@ -104,6 +91,11 @@ extern void lapic_enable(void);
extern void lapic_calibrate_timer(struct cpu_info *ci);
extern void lapic_initclocks(void);
+extern uint32_t lapic_readreg(u_int);
+extern void lapic_writereg(u_int, uint32_t);
extern void lapic_write_tpri(uint32_t);
+extern void lapic_eoi(void);
+extern uint32_t lapic_cpu_number(void);
+extern bool lapic_is_x2apic(void);
#endif
Index: src/sys/arch/x86/include/mpacpi.h
diff -u src/sys/arch/x86/include/mpacpi.h:1.10 src/sys/arch/x86/include/mpacpi.h:1.11
--- src/sys/arch/x86/include/mpacpi.h:1.10 Sun Mar 31 19:45:06 2013
+++ src/sys/arch/x86/include/mpacpi.h Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mpacpi.h,v 1.10 2013/03/31 19:45:06 chs Exp $ */
+/* $NetBSD: mpacpi.h,v 1.11 2017/05/23 08:54:39 nonaka Exp $ */
#ifndef _X86_MPACPI_H_
#define _X86_MPACPI_H_
@@ -13,4 +13,7 @@ int mpacpi_pci_attach_hook(device_t, dev
struct mp_intr_map;
int mpacpi_findintr_linkdev(struct mp_intr_map *);
+extern bool acpi_present;
+extern bool mpacpi_active;
+
#endif /* _X86_MPACPI_H_ */
Index: src/sys/arch/x86/pci/msipic.c
diff -u src/sys/arch/x86/pci/msipic.c:1.8 src/sys/arch/x86/pci/msipic.c:1.9
--- src/sys/arch/x86/pci/msipic.c:1.8 Tue Nov 17 17:51:42 2015
+++ src/sys/arch/x86/pci/msipic.c Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: msipic.c,v 1.8 2015/11/17 17:51:42 msaitoh Exp $ */
+/* $NetBSD: msipic.c,v 1.9 2017/05/23 08:54:39 nonaka Exp $ */
/*
* Copyright (c) 2015 Internet Initiative Japan Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msipic.c,v 1.8 2015/11/17 17:51:42 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msipic.c,v 1.9 2017/05/23 08:54:39 nonaka Exp $");
#include "opt_intrdebug.h"
@@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: msipic.c,v 1
#include <dev/pci/pcivar.h>
#include <machine/i82489reg.h>
+#include <machine/i82489var.h>
#include <machine/i82093reg.h>
#include <machine/i82093var.h>
#include <machine/pic.h>
@@ -257,6 +258,7 @@ msipic_construct_common_msi_pic(const st
}
memcpy(pic, pic_tmpl, sizeof(*pic));
+ pic->pic_edge_stubs = x2apic_mode ? x2apic_edge_stubs : ioapic_edge_stubs,
pic->pic_msipic = msipic;
msipic->mp_pic = pic;
pci_decompose_tag(pa->pa_pc, pa->pa_tag,
@@ -431,8 +433,6 @@ static struct pic msi_pic_tmpl = {
.pic_hwunmask = msi_hwunmask,
.pic_addroute = msi_addroute,
.pic_delroute = msi_delroute,
- .pic_edge_stubs = ioapic_edge_stubs,
- .pic_ioapic = NULL,
};
/*
@@ -603,7 +603,6 @@ static struct pic msix_pic_tmpl = {
.pic_hwunmask = msix_hwunmask,
.pic_addroute = msix_addroute,
.pic_delroute = msix_delroute,
- .pic_edge_stubs = ioapic_edge_stubs,
};
struct pic *
Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.124 src/sys/arch/x86/x86/cpu.c:1.125
--- src/sys/arch/x86/x86/cpu.c:1.124 Sat Apr 22 04:29:31 2017
+++ src/sys/arch/x86/x86/cpu.c Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.124 2017/04/22 04:29:31 nonaka Exp $ */
+/* $NetBSD: cpu.c,v 1.125 2017/05/23 08:54:39 nonaka Exp $ */
/*-
* Copyright (c) 2000-2012 NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.124 2017/04/22 04:29:31 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.125 2017/05/23 08:54:39 nonaka Exp $");
#include "opt_ddb.h"
#include "opt_mpbios.h" /* for MPDEBUG */
@@ -346,8 +346,8 @@ cpu_attach(device_t parent, device_t sel
aprint_verbose_dev(self, "running CPU at apic %d"
" instead of at expected %d", lapic_cpu_number(),
cpunum);
- reg = i82489_readreg(LAPIC_ID);
- i82489_writereg(LAPIC_ID, (reg & ~LAPIC_ID_MASK) |
+ reg = lapic_readreg(LAPIC_ID);
+ lapic_writereg(LAPIC_ID, (reg & ~LAPIC_ID_MASK) |
(cpunum << LAPIC_ID_SHIFT));
}
if (cpunum != lapic_cpu_number()) {
@@ -972,7 +972,7 @@ tss_init(struct i386tss *tss, void *stac
typedef void (vector)(void);
extern vector IDTVEC(tss_trap08);
#if defined(DDB) && defined(MULTIPROCESSOR)
-extern vector Xintrddbipi;
+extern vector Xintrddbipi, Xx2apic_intrddbipi;
extern int ddb_vec;
#endif
@@ -1001,7 +1001,8 @@ cpu_set_tss_gates(struct cpu_info *ci)
*/
ci->ci_ddbipi_stack = (char *)uvm_km_alloc(kernel_map, USPACE, 0,
UVM_KMF_WIRED);
- tss_init(&ci->ci_ddbipi_tss, ci->ci_ddbipi_stack, Xintrddbipi);
+ tss_init(&ci->ci_ddbipi_tss, ci->ci_ddbipi_stack,
+ x2apic_mode ? Xx2apic_intrddbipi : Xintrddbipi);
setsegment(&sd, &ci->ci_ddbipi_tss, sizeof(struct i386tss) - 1,
SDT_SYS386TSS, SEL_KPL, 0, 0);
Index: src/sys/arch/x86/x86/lapic.c
diff -u src/sys/arch/x86/x86/lapic.c:1.57 src/sys/arch/x86/x86/lapic.c:1.58
--- src/sys/arch/x86/x86/lapic.c:1.57 Tue May 23 03:23:58 2017
+++ src/sys/arch/x86/x86/lapic.c Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: lapic.c,v 1.57 2017/05/23 03:23:58 nonaka Exp $ */
+/* $NetBSD: lapic.c,v 1.58 2017/05/23 08:54:39 nonaka Exp $ */
/*-
* Copyright (c) 2000, 2008 The NetBSD Foundation, Inc.
@@ -32,8 +32,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lapic.c,v 1.57 2017/05/23 03:23:58 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lapic.c,v 1.58 2017/05/23 08:54:39 nonaka Exp $");
+#include "acpica.h"
+#include "ioapic.h"
+#include "opt_acpi.h"
#include "opt_ddb.h"
#include "opt_mpbios.h" /* for MPDEBUG */
#include "opt_multiprocessor.h"
@@ -55,6 +58,7 @@ __KERNEL_RCSID(0, "$NetBSD: lapic.c,v 1.
#include <machine/cpuvar.h>
#include <machine/pmap.h>
#include <machine/vmparam.h>
+#include <machine/mpacpi.h>
#include <machine/mpbiosvar.h>
#include <machine/pcb.h>
#include <machine/specialreg.h>
@@ -66,11 +70,31 @@ __KERNEL_RCSID(0, "$NetBSD: lapic.c,v 1.
#include <machine/i82489reg.h>
#include <machine/i82489var.h>
+#if NACPICA > 0
+#include <dev/acpi/acpica.h>
+#include <dev/acpi/acpivar.h>
+#endif
+
+#ifdef DDB
+#include <machine/db_machdep.h>
+#ifdef MULTIPROCESSOR
+#ifdef __x86_64__
+typedef void (vector)(void);
+extern vector Xx2apic_intrddb;
+extern int ddb_vec;
+#endif
+#endif
+#endif
+
+#include <x86/x86/vmtreg.h> /* for vmt_hvcall() */
+#include <x86/x86/vmtvar.h> /* for vmt_hvcall() */
+
/* Referenced from vector.S */
void lapic_clockintr(void *, struct intrframe *);
static void lapic_delay(unsigned int);
static uint32_t lapic_gettick(void);
+static void lapic_setup_bsp(paddr_t);
static void lapic_map(paddr_t);
static void lapic_hwmask(struct pic *, int);
@@ -89,18 +113,241 @@ struct pic local_pic = {
.pic_delroute = lapic_setup,
};
+static int i82489_ipi(int vec, int target, int dl);
+static int x2apic_ipi(int vec, int target, int dl);
+int (*x86_ipi)(int, int, int) = i82489_ipi;
+
+bool x2apic_mode __read_mostly;
+#ifdef LAPIC_ENABLE_X2APIC
+bool x2apic_enable = true;
+#else
+bool x2apic_enable = false;
+#endif
+
+static uint32_t
+i82489_readreg(u_int reg)
+{
+ return *((volatile uint32_t *)(local_apic_va + reg));
+}
+
+static void
+i82489_writereg(u_int reg, uint32_t val)
+{
+ *((volatile uint32_t *)(local_apic_va + reg)) = val;
+}
+
+static uint32_t
+i82489_cpu_number(void)
+{
+ return i82489_readreg(LAPIC_ID) >> LAPIC_ID_SHIFT;
+}
+
+static uint32_t
+x2apic_readreg(u_int reg)
+{
+ return rdmsr(MSR_X2APIC_BASE + (reg >> 4));
+}
+
+static void
+x2apic_writereg(u_int reg, uint32_t val)
+{
+ x86_mfence();
+ wrmsr(MSR_X2APIC_BASE + (reg >> 4), val);
+}
+
+static void
+x2apic_writereg64(u_int reg, uint64_t val)
+{
+ KDASSERT(reg == LAPIC_ICRLO);
+ x86_mfence();
+ wrmsr(MSR_X2APIC_BASE + (reg >> 4), val);
+}
+
+static void
+x2apic_write_icr(uint32_t hi, uint32_t lo)
+{
+ x2apic_writereg64(LAPIC_ICRLO, ((uint64_t)hi << 32) | lo);
+}
+
+static uint32_t
+x2apic_cpu_number(void)
+{
+ return x2apic_readreg(LAPIC_ID);
+}
+
+uint32_t
+lapic_readreg(u_int reg)
+{
+ if (x2apic_mode)
+ return x2apic_readreg(reg);
+ return i82489_readreg(reg);
+}
+
+void
+lapic_writereg(u_int reg, uint32_t val)
+{
+ if (x2apic_mode)
+ x2apic_writereg(reg, val);
+ else
+ i82489_writereg(reg, val);
+}
+
void
lapic_write_tpri(uint32_t val)
{
val &= LAPIC_TPRI_MASK;
#ifdef i386
- i82489_writereg(LAPIC_TPRI, val);
+ lapic_writereg(LAPIC_TPRI, val);
#else
lcr8(val >> 4);
#endif
}
+void
+lapic_eoi(void)
+{
+ lapic_writereg(LAPIC_EOI, 0);
+}
+
+uint32_t
+lapic_cpu_number(void)
+{
+ if (x2apic_mode)
+ return x2apic_cpu_number();
+ return i82489_cpu_number();
+}
+
+static void
+lapic_enable_x2apic(void)
+{
+ uint64_t apicbase;
+
+ apicbase = rdmsr(MSR_APICBASE);
+ if (!ISSET(apicbase, APICBASE_EN)) {
+ apicbase |= APICBASE_EN;
+ wrmsr(MSR_APICBASE, apicbase);
+ }
+ apicbase |= APICBASE_EXTD;
+ wrmsr(MSR_APICBASE, apicbase);
+}
+
+bool
+lapic_is_x2apic(void)
+{
+ uint64_t r;
+
+ r = rdmsr(MSR_APICBASE);
+ return (r & (APICBASE_EN | APICBASE_EXTD)) == (APICBASE_EN | APICBASE_EXTD);
+}
+
+/*
+ * Initialize the local APIC on the BSP.
+ */
+static void
+lapic_setup_bsp(paddr_t lapic_base)
+{
+ u_int regs[4];
+ const char *reason = NULL;
+ const char *hw_vendor;
+ bool bios_x2apic;
+
+ if (ISSET(cpu_feature[1], CPUID2_X2APIC)) {
+#if NACPICA > 0
+ if (acpi_present) {
+ ACPI_TABLE_DMAR *dmar;
+ ACPI_STATUS status;
+
+ /*
+ * Automatically detect several configurations where
+ * x2APIC mode is known to cause troubles. User can
+ * override the setting with hw.x2apic_enable tunable.
+ */
+ status = AcpiGetTable(ACPI_SIG_DMAR, 1,
+ (ACPI_TABLE_HEADER **)&dmar);
+ if (ACPI_SUCCESS(status)) {
+ if (ISSET(dmar->Flags, ACPI_DMAR_X2APIC_OPT_OUT)) {
+ reason = "by DMAR table";
+ }
+ AcpiPutTable(&dmar->Header);
+ }
+ }
+#endif /* NACPICA > 0 */
+ if (vm_guest == VM_GUEST_VMWARE) {
+ vmt_hvcall(VM_CMD_GET_VCPU_INFO, regs);
+ if (ISSET(regs[0], VCPUINFO_VCPU_RESERVED) ||
+ !ISSET(regs[0], VCPUINFO_LEGACY_X2APIC))
+ reason = "inside VMWare without intr redirection";
+ } else if (vm_guest == VM_GUEST_XEN) {
+ reason = "due to running under XEN";
+ } else if (vm_guest == VM_GUEST_NO &&
+ CPUID_TO_FAMILY(curcpu()->ci_signature) == 6 &&
+ CPUID_TO_MODEL(curcpu()->ci_signature) == 0x2a) {
+ hw_vendor = pmf_get_platform("board-vendor");
+ if (hw_vendor != NULL) {
+ /*
+ * It seems that some Lenovo and ASUS
+ * SandyBridge-based notebook BIOSes have a bug
+ * which prevents booting AP in x2APIC mode.
+ * Since the only way to detect mobile CPU is
+ * to check northbridge pci id, which cannot be done
+ * that early, disable x2APIC for all Lenovo and ASUS
+ * SandyBridge machines.
+ */
+ if (strcmp(hw_vendor, "LENOVO") == 0 ||
+ strcmp(hw_vendor, "ASUSTeK Computer Inc.") == 0) {
+ reason =
+ "for a suspected SandyBridge BIOS bug";
+ }
+ }
+ }
+ bios_x2apic = lapic_is_x2apic();
+ if (reason != NULL && bios_x2apic) {
+ aprint_verbose("x2APIC should be disabled %s but "
+ "already enabled by BIOS; enabling.\n", reason);
+ reason = NULL;
+ }
+ if (reason == NULL)
+ x2apic_mode = true;
+ else
+ aprint_verbose("x2APIC available but disabled %s\n", reason);
+ if (x2apic_enable != x2apic_mode) {
+ if (bios_x2apic && !x2apic_enable)
+ aprint_verbose("x2APIC disabled by user and "
+ "enabled by BIOS; ignoring user setting.\n");
+ else
+ x2apic_mode = x2apic_enable;
+ }
+ }
+ if (x2apic_mode) {
+ x86_ipi = x2apic_ipi;
+#if NIOAPIC > 0
+ struct ioapic_softc *ioapic;
+ for (ioapic = ioapics; ioapic != NULL; ioapic = ioapic->sc_next) {
+ ioapic->sc_pic.pic_edge_stubs = x2apic_edge_stubs;
+ ioapic->sc_pic.pic_level_stubs = x2apic_level_stubs;
+ }
+#endif
+#if defined(DDB) && defined(MULTIPROCESSOR)
+#ifdef __x86_64__
+ setgate(&idt[ddb_vec], &Xx2apic_intrddb, 1, SDT_SYS386IGT, SEL_KPL,
+ GSEL(GCODE_SEL, SEL_KPL));
+#else
+ /* Set DDB IPI handler in cpu_set_tss_gates() when cpu0 is attached. */
+#endif
+#endif
+
+ x86_disable_intr();
+ lapic_enable_x2apic();
+#ifdef MULTIPROCESSOR
+ cpu_init_first(); /* catch up to changed cpu_number() */
+#endif
+ lapic_write_tpri(0);
+ x86_enable_intr();
+ } else
+ lapic_map(lapic_base);
+}
+
static void
lapic_map(paddr_t lapic_base)
{
@@ -152,7 +399,7 @@ lapic_map(paddr_t lapic_base)
void
lapic_enable(void)
{
- i82489_writereg(LAPIC_SVR, LAPIC_SVR_ENABLE | LAPIC_SPURIOUS_VECTOR);
+ lapic_writereg(LAPIC_SVR, LAPIC_SVR_ENABLE | LAPIC_SPURIOUS_VECTOR);
}
void
@@ -166,9 +413,9 @@ lapic_set_lvt(void)
#ifdef MULTIPROCESSOR
if (mp_verbose) {
apic_format_redir(device_xname(ci->ci_dev), "prelint", 0, 0,
- i82489_readreg(LAPIC_LVINT0));
+ lapic_readreg(LAPIC_LVINT0));
apic_format_redir(device_xname(ci->ci_dev), "prelint", 1, 0,
- i82489_readreg(LAPIC_LVINT1));
+ lapic_readreg(LAPIC_LVINT1));
}
#endif
@@ -177,18 +424,18 @@ lapic_set_lvt(void)
* the 8259A for interrupt delivery. Otherwise request the LAPIC to
* get external interrupts via LINT0 for the primary CPU.
*/
- lint0 = LAPIC_DLMODE_EXTINT;
+ lint0 = LAPIC_LVT_DM_EXTINT;
if (nioapics > 0 || !CPU_IS_PRIMARY(curcpu()))
lint0 |= LAPIC_LVT_MASKED;
- i82489_writereg(LAPIC_LVINT0, lint0);
+ lapic_writereg(LAPIC_LVINT0, lint0);
/*
* Non Maskable Interrupts are to be delivered to the primary CPU.
*/
- lint1 = LAPIC_DLMODE_NMI;
+ lint1 = LAPIC_LVT_DM_NMI;
if (!CPU_IS_PRIMARY(curcpu()))
lint1 |= LAPIC_LVT_MASKED;
- i82489_writereg(LAPIC_LVINT1, lint1);
+ lapic_writereg(LAPIC_LVINT1, lint1);
for (i = 0; i < mp_nintr; i++) {
mpi = &mp_intrs[i];
@@ -199,9 +446,9 @@ lapic_set_lvt(void)
"%s: WARNING: bad pin value %d\n",
__func__, mpi->ioapic_pin);
if (mpi->ioapic_pin == 0)
- i82489_writereg(LAPIC_LVINT0, mpi->redir);
+ lapic_writereg(LAPIC_LVINT0, mpi->redir);
else
- i82489_writereg(LAPIC_LVINT1, mpi->redir);
+ lapic_writereg(LAPIC_LVINT1, mpi->redir);
}
}
@@ -217,25 +464,27 @@ lapic_set_lvt(void)
void
lapic_boot_init(paddr_t lapic_base)
{
- lapic_map(lapic_base);
+
+ lapic_setup_bsp(lapic_base);
#ifdef MULTIPROCESSOR
idt_vec_reserve(LAPIC_IPI_VECTOR);
- idt_vec_set(LAPIC_IPI_VECTOR, Xintr_lapic_ipi);
+ idt_vec_set(LAPIC_IPI_VECTOR, x2apic_mode ? Xintr_x2apic_ipi : Xintr_lapic_ipi);
idt_vec_reserve(LAPIC_TLB_VECTOR);
- idt_vec_set(LAPIC_TLB_VECTOR, Xintr_lapic_tlb);
+ idt_vec_set(LAPIC_TLB_VECTOR, x2apic_mode ? Xintr_x2apic_tlb : Xintr_lapic_tlb);
#endif
idt_vec_reserve(LAPIC_SPURIOUS_VECTOR);
idt_vec_set(LAPIC_SPURIOUS_VECTOR, Xintrspurious);
idt_vec_reserve(LAPIC_TIMER_VECTOR);
- idt_vec_set(LAPIC_TIMER_VECTOR, Xintr_lapic_ltimer);
+ idt_vec_set(LAPIC_TIMER_VECTOR, x2apic_mode ? Xintr_x2apic_ltimer :
+ Xintr_lapic_ltimer);
}
static uint32_t
lapic_gettick(void)
{
- return i82489_readreg(LAPIC_CCR_TIMER);
+ return lapic_readreg(LAPIC_CCR_TIMER);
}
#include <sys/kernel.h> /* for hz */
@@ -279,7 +528,7 @@ lapic_get_timecount(struct timecounter *
if (cur_timer >= lapic_tval - 1) {
uint16_t reg = LAPIC_IRR + LAPIC_TIMER_VECTOR / 32 * 16;
- if (i82489_readreg(reg) & (1 << (LAPIC_TIMER_VECTOR % 32))) {
+ if (lapic_readreg(reg) & (1 << (LAPIC_TIMER_VECTOR % 32))) {
cur_timer -= lapic_tval;
}
} else if (ci->ci_istate.ipending & (1 << LIR_TIMER))
@@ -327,11 +576,11 @@ lapic_initclocks(void)
* then set divisor,
* then unmask and set the vector.
*/
- i82489_writereg(LAPIC_LVTT, LAPIC_LVTT_TM | LAPIC_LVTT_M);
- i82489_writereg(LAPIC_DCR_TIMER, LAPIC_DCRT_DIV1);
- i82489_writereg(LAPIC_ICR_TIMER, lapic_tval);
- i82489_writereg(LAPIC_LVTT, LAPIC_LVTT_TM | LAPIC_TIMER_VECTOR);
- i82489_writereg(LAPIC_EOI, 0);
+ lapic_writereg(LAPIC_LVTT, LAPIC_LVTT_TM | LAPIC_LVTT_M);
+ lapic_writereg(LAPIC_DCR_TIMER, LAPIC_DCRT_DIV1);
+ lapic_writereg(LAPIC_ICR_TIMER, lapic_tval);
+ lapic_writereg(LAPIC_LVTT, LAPIC_LVTT_TM | LAPIC_TIMER_VECTOR);
+ lapic_eoi();
}
extern unsigned int gettick(void); /* XXX put in header file */
@@ -364,9 +613,9 @@ lapic_calibrate_timer(struct cpu_info *c
* Configure timer to one-shot, interrupt masked,
* large positive number.
*/
- i82489_writereg(LAPIC_LVTT, LAPIC_LVTT_M);
- i82489_writereg(LAPIC_DCR_TIMER, LAPIC_DCRT_DIV1);
- i82489_writereg(LAPIC_ICR_TIMER, 0x80000000);
+ lapic_writereg(LAPIC_LVTT, LAPIC_LVTT_M);
+ lapic_writereg(LAPIC_DCR_TIMER, LAPIC_DCRT_DIV1);
+ lapic_writereg(LAPIC_ICR_TIMER, 0x80000000);
x86_disable_intr();
@@ -400,10 +649,10 @@ lapic_calibrate_timer(struct cpu_info *c
lapic_tval = (lapic_per_second * 2) / hz;
lapic_tval = (lapic_tval / 2) + (lapic_tval & 0x1);
- i82489_writereg(LAPIC_LVTT, LAPIC_LVTT_TM | LAPIC_LVTT_M
+ lapic_writereg(LAPIC_LVTT, LAPIC_LVTT_TM | LAPIC_LVTT_M
| LAPIC_TIMER_VECTOR);
- i82489_writereg(LAPIC_DCR_TIMER, LAPIC_DCRT_DIV1);
- i82489_writereg(LAPIC_ICR_TIMER, lapic_tval);
+ lapic_writereg(LAPIC_DCR_TIMER, LAPIC_DCRT_DIV1);
+ lapic_writereg(LAPIC_ICR_TIMER, lapic_tval);
/*
* Compute fixed-point ratios between cycles and
@@ -496,23 +745,21 @@ i82489_icr_wait(void)
}
}
-int
-x86_ipi_init(int target)
+static int
+i82489_ipi_init(int target)
{
uint32_t esr;
i82489_writereg(LAPIC_ESR, 0);
(void)i82489_readreg(LAPIC_ESR);
- if ((target&LAPIC_DEST_MASK)==0)
- i82489_writereg(LAPIC_ICRHI, target<<LAPIC_ID_SHIFT);
+ i82489_writereg(LAPIC_ICRHI, target << LAPIC_ID_SHIFT);
- i82489_writereg(LAPIC_ICRLO, (target & LAPIC_DEST_MASK) |
- LAPIC_DLMODE_INIT | LAPIC_LEVEL_ASSERT );
+ i82489_writereg(LAPIC_ICRLO, LAPIC_DLMODE_INIT | LAPIC_LEVEL_ASSERT);
i82489_icr_wait();
i8254_delay(10000);
- i82489_writereg(LAPIC_ICRLO, (target & LAPIC_DEST_MASK) |
- LAPIC_DLMODE_INIT | LAPIC_TRIGGER_LEVEL | LAPIC_LEVEL_DEASSERT);
+ i82489_writereg(LAPIC_ICRLO,
+ LAPIC_DLMODE_INIT | LAPIC_TRIGGER_LEVEL | LAPIC_LEVEL_DEASSERT);
i82489_icr_wait();
if ((i82489_readreg(LAPIC_ICRLO) & LAPIC_DLSTAT_BUSY) != 0)
@@ -520,13 +767,13 @@ x86_ipi_init(int target)
esr = i82489_readreg(LAPIC_ESR);
if (esr != 0)
- aprint_debug("x86_ipi_init: ESR %08x\n", esr);
+ aprint_debug("%s: ESR %08x\n", __func__, esr);
return 0;
}
-int
-x86_ipi_startup(int target, int vec)
+static int
+i82489_ipi_startup(int target, int vec)
{
uint32_t esr;
@@ -544,13 +791,13 @@ x86_ipi_startup(int target, int vec)
esr = i82489_readreg(LAPIC_ESR);
if (esr != 0)
- aprint_debug("x86_ipi_startup: ESR %08x\n", esr);
+ aprint_debug("%s: ESR %08x\n", __func__, esr);
return 0;
}
-int
-x86_ipi(int vec, int target, int dl)
+static int
+i82489_ipi(int vec, int target, int dl)
{
int result, s;
@@ -576,6 +823,58 @@ x86_ipi(int vec, int target, int dl)
return result;
}
+static int
+x2apic_ipi_init(int target)
+{
+
+ x2apic_write_icr(target, LAPIC_DLMODE_INIT | LAPIC_LEVEL_ASSERT);
+
+ i8254_delay(10000);
+
+ x2apic_write_icr(0,
+ LAPIC_DLMODE_INIT | LAPIC_TRIGGER_LEVEL | LAPIC_LEVEL_DEASSERT);
+
+ return 0;
+}
+
+static int
+x2apic_ipi_startup(int target, int vec)
+{
+
+ x2apic_write_icr(target, vec | LAPIC_DLMODE_STARTUP | LAPIC_LEVEL_ASSERT);
+
+ return 0;
+}
+
+static int
+x2apic_ipi(int vec, int target, int dl)
+{
+ uint32_t dest_id = 0;
+
+ if ((target & LAPIC_DEST_MASK) == 0)
+ dest_id = target;
+
+ x2apic_write_icr(dest_id,
+ (target & LAPIC_DEST_MASK) | vec | dl | LAPIC_LEVEL_ASSERT);
+
+ return 0;
+}
+
+int
+x86_ipi_init(int target)
+{
+ if (x2apic_mode)
+ return x2apic_ipi_init(target);
+ return i82489_ipi_init(target);
+}
+
+int
+x86_ipi_startup(int target, int vec)
+{
+ if (x2apic_mode)
+ return x2apic_ipi_startup(target, vec);
+ return i82489_ipi_startup(target, vec);
+}
/*
* Using 'pin numbers' as:
@@ -594,9 +893,9 @@ lapic_hwmask(struct pic *pic, int pin)
uint32_t val;
reg = LAPIC_LVTT + (pin << 4);
- val = i82489_readreg(reg);
+ val = lapic_readreg(reg);
val |= LAPIC_LVT_MASKED;
- i82489_writereg(reg, val);
+ lapic_writereg(reg, val);
}
static void
@@ -606,9 +905,9 @@ lapic_hwunmask(struct pic *pic, int pin)
uint32_t val;
reg = LAPIC_LVTT + (pin << 4);
- val = i82489_readreg(reg);
+ val = lapic_readreg(reg);
val &= ~LAPIC_LVT_MASKED;
- i82489_writereg(reg, val);
+ lapic_writereg(reg, val);
}
static void
@@ -623,13 +922,13 @@ lapic_dump(void)
struct cpu_info *ci = curcpu();
apic_format_redir(device_xname(ci->ci_dev), "timer", 0, 0,
- i82489_readreg(LAPIC_LVTT));
+ lapic_readreg(LAPIC_LVTT));
apic_format_redir(device_xname(ci->ci_dev), "pcint", 0, 0,
- i82489_readreg(LAPIC_PCINT));
+ lapic_readreg(LAPIC_PCINT));
apic_format_redir(device_xname(ci->ci_dev), "lint", 0, 0,
- i82489_readreg(LAPIC_LVINT0));
+ lapic_readreg(LAPIC_LVINT0));
apic_format_redir(device_xname(ci->ci_dev), "lint", 1, 0,
- i82489_readreg(LAPIC_LVINT1));
+ lapic_readreg(LAPIC_LVINT1));
apic_format_redir(device_xname(ci->ci_dev), "err", 0, 0,
- i82489_readreg(LAPIC_LVERR));
+ lapic_readreg(LAPIC_LVERR));
}
Index: src/sys/arch/x86/x86/pmc.c
diff -u src/sys/arch/x86/x86/pmc.c:1.6 src/sys/arch/x86/x86/pmc.c:1.7
--- src/sys/arch/x86/x86/pmc.c:1.6 Tue Apr 18 15:14:28 2017
+++ src/sys/arch/x86/x86/pmc.c Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pmc.c,v 1.6 2017/04/18 15:14:28 maya Exp $ */
+/* $NetBSD: pmc.c,v 1.7 2017/05/23 08:54:39 nonaka Exp $ */
/*
* Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmc.c,v 1.6 2017/04/18 15:14:28 maya Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmc.c,v 1.7 2017/05/23 08:54:39 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -156,8 +156,8 @@ pmc_apply_cpu(void *arg1, void *arg2)
struct cpu_info *ci = curcpu();
if (start) {
- pmc_lapic_image[cpu_index(ci)] = i82489_readreg(LAPIC_PCINT);
- i82489_writereg(LAPIC_PCINT, LAPIC_DLMODE_NMI);
+ pmc_lapic_image[cpu_index(ci)] = lapic_readreg(LAPIC_PCINT);
+ lapic_writereg(LAPIC_PCINT, LAPIC_DLMODE_NMI);
}
wrmsr(pmc->ctrmsr, pmc->ctrinitval);
@@ -173,7 +173,7 @@ pmc_apply_cpu(void *arg1, void *arg2)
pmc_val_cpus[cpu_index(ci)].overfl = 0;
if (!start) {
- i82489_writereg(LAPIC_PCINT, pmc_lapic_image[cpu_index(ci)]);
+ lapic_writereg(LAPIC_PCINT, pmc_lapic_image[cpu_index(ci)]);
}
}
Index: src/sys/arch/x86/x86/tprof_amdpmi.c
diff -u src/sys/arch/x86/x86/tprof_amdpmi.c:1.6 src/sys/arch/x86/x86/tprof_amdpmi.c:1.7
--- src/sys/arch/x86/x86/tprof_amdpmi.c:1.6 Sat Feb 11 13:22:58 2017
+++ src/sys/arch/x86/x86/tprof_amdpmi.c Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tprof_amdpmi.c,v 1.6 2017/02/11 13:22:58 maxv Exp $ */
+/* $NetBSD: tprof_amdpmi.c,v 1.7 2017/05/23 08:54:39 nonaka Exp $ */
/*-
* Copyright (c)2008,2009 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tprof_amdpmi.c,v 1.6 2017/02/11 13:22:58 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tprof_amdpmi.c,v 1.7 2017/05/23 08:54:39 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -120,8 +120,8 @@ tprof_amdpmi_start_cpu(void *arg1, void
wrmsr(PERFCTR(ctrno), counter_reset_val);
wrmsr(PERFEVTSEL(ctrno), pesr);
- tprof_amdpmi_lapic_saved[cpu_index(ci)] = i82489_readreg(LAPIC_PCINT);
- i82489_writereg(LAPIC_PCINT, LAPIC_DLMODE_NMI);
+ tprof_amdpmi_lapic_saved[cpu_index(ci)] = lapic_readreg(LAPIC_PCINT);
+ lapic_writereg(LAPIC_PCINT, LAPIC_DLMODE_NMI);
wrmsr(PERFEVTSEL(ctrno), pesr | PESR_EN);
}
@@ -133,7 +133,7 @@ tprof_amdpmi_stop_cpu(void *arg1, void *
wrmsr(PERFEVTSEL(ctrno), 0);
- i82489_writereg(LAPIC_PCINT, tprof_amdpmi_lapic_saved[cpu_index(ci)]);
+ lapic_writereg(LAPIC_PCINT, tprof_amdpmi_lapic_saved[cpu_index(ci)]);
}
static int
Index: src/sys/arch/x86/x86/tprof_pmi.c
diff -u src/sys/arch/x86/x86/tprof_pmi.c:1.13 src/sys/arch/x86/x86/tprof_pmi.c:1.14
--- src/sys/arch/x86/x86/tprof_pmi.c:1.13 Fri Nov 15 08:47:55 2013
+++ src/sys/arch/x86/x86/tprof_pmi.c Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tprof_pmi.c,v 1.13 2013/11/15 08:47:55 msaitoh Exp $ */
+/* $NetBSD: tprof_pmi.c,v 1.14 2017/05/23 08:54:39 nonaka Exp $ */
/*-
* Copyright (c)2008,2009 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tprof_pmi.c,v 1.13 2013/11/15 08:47:55 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tprof_pmi.c,v 1.14 2017/05/23 08:54:39 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -138,8 +138,8 @@ tprof_pmi_start_cpu(void *arg1, void *ar
wrmsr(msr->msr_counter, counter_reset_val);
wrmsr(msr->msr_escr, escr);
wrmsr(msr->msr_cccr, cccr);
- tprof_pmi_lapic_saved[cpu_index(ci)] = i82489_readreg(LAPIC_PCINT);
- i82489_writereg(LAPIC_PCINT, LAPIC_DLMODE_NMI);
+ tprof_pmi_lapic_saved[cpu_index(ci)] = lapic_readreg(LAPIC_PCINT);
+ lapic_writereg(LAPIC_PCINT, LAPIC_DLMODE_NMI);
}
static void
@@ -158,7 +158,7 @@ tprof_pmi_stop_cpu(void *arg1, void *arg
wrmsr(msr->msr_escr, 0);
wrmsr(msr->msr_cccr, 0);
- i82489_writereg(LAPIC_PCINT, tprof_pmi_lapic_saved[cpu_index(ci)]);
+ lapic_writereg(LAPIC_PCINT, tprof_pmi_lapic_saved[cpu_index(ci)]);
}
static int
@@ -199,9 +199,9 @@ tprof_pmi_nmi(const struct trapframe *tf
wrmsr(msr->msr_cccr, cccr & ~CCCR_OVF);
/* unmask PMI */
- pcint = i82489_readreg(LAPIC_PCINT);
+ pcint = lapic_readreg(LAPIC_PCINT);
KASSERT((pcint & LAPIC_LVT_MASKED) != 0);
- i82489_writereg(LAPIC_PCINT, pcint & ~LAPIC_LVT_MASKED);
+ lapic_writereg(LAPIC_PCINT, pcint & ~LAPIC_LVT_MASKED);
return 1;
}
Index: src/sys/arch/xen/include/intr.h
diff -u src/sys/arch/xen/include/intr.h:1.39 src/sys/arch/xen/include/intr.h:1.40
--- src/sys/arch/xen/include/intr.h:1.39 Mon Oct 17 18:23:50 2016
+++ src/sys/arch/xen/include/intr.h Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.39 2016/10/17 18:23:50 jdolecek Exp $ */
+/* $NetBSD: intr.h,v 1.40 2017/05/23 08:54:39 nonaka Exp $ */
/* NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp */
/*-
@@ -76,6 +76,8 @@ struct intrstub {
extern struct intrstub i8259_stubs[];
extern struct intrstub ioapic_edge_stubs[];
extern struct intrstub ioapic_level_stubs[];
+extern struct intrstub x2apic_edge_stubs[];
+extern struct intrstub x2apic_level_stubs[];
struct iplsource {
struct intrhand *ipl_handlers; /* handler chain */
Index: src/sys/arch/xen/include/mpacpi.h
diff -u src/sys/arch/xen/include/mpacpi.h:1.1 src/sys/arch/xen/include/mpacpi.h:1.2
--- src/sys/arch/xen/include/mpacpi.h:1.1 Thu Sep 28 18:53:15 2006
+++ src/sys/arch/xen/include/mpacpi.h Tue May 23 08:54:39 2017
@@ -1,5 +1,3 @@
-/* $NetBSD: mpacpi.h,v 1.1 2006/09/28 18:53:15 bouyer Exp $ */
+/* $NetBSD: mpacpi.h,v 1.2 2017/05/23 08:54:39 nonaka Exp $ */
#include <x86/mpacpi.h>
-extern int acpi_present;
-extern int mpacpi_active;
Index: src/sys/arch/xen/x86/intr.c
diff -u src/sys/arch/xen/x86/intr.c:1.30 src/sys/arch/xen/x86/intr.c:1.31
--- src/sys/arch/xen/x86/intr.c:1.30 Mon Oct 17 18:23:50 2016
+++ src/sys/arch/xen/x86/intr.c Tue May 23 08:54:39 2017
@@ -103,7 +103,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.30 2016/10/17 18:23:50 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.31 2017/05/23 08:54:39 nonaka Exp $");
#include "opt_multiprocessor.h"
#include "opt_xen.h"
@@ -135,6 +135,8 @@ struct intrstub i8259_stubs[NUM_LEGACY_I
/* for x86/ioapic.c */
struct intrstub ioapic_edge_stubs[MAX_INTR_SOURCES] = {{0,0}};
struct intrstub ioapic_level_stubs[MAX_INTR_SOURCES] = {{0,0}};
+struct intrstub x2apic_edge_stubs[MAX_INTR_SOURCES] = {{0,0}};
+struct intrstub x2apic_level_stubs[MAX_INTR_SOURCES] = {{0,0}};
#include <machine/i82093var.h>
int irq2vect[256] = {0};
Index: src/sys/arch/xen/x86/mainbus.c
diff -u src/sys/arch/xen/x86/mainbus.c:1.18 src/sys/arch/xen/x86/mainbus.c:1.19
--- src/sys/arch/xen/x86/mainbus.c:1.18 Mon Mar 3 22:09:32 2014
+++ src/sys/arch/xen/x86/mainbus.c Tue May 23 08:54:39 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.18 2014/03/03 22:09:32 dsl Exp $ */
+/* $NetBSD: mainbus.c,v 1.19 2017/05/23 08:54:39 nonaka Exp $ */
/* NetBSD: mainbus.c,v 1.53 2003/10/27 14:11:47 junyoung Exp */
/*
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.18 2014/03/03 22:09:32 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.19 2017/05/23 08:54:39 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -87,8 +87,8 @@ int mp_nintr;
int mp_isa_bus = -1; /* XXX */
int mp_eisa_bus = -1; /* XXX */
-int acpi_present = 0;
-int mpacpi_active = 0;
+bool acpi_present;
+bool mpacpi_active;
#ifdef MPVERBOSE
int mp_verbose = 1;
#else /* MPVERBOSE */
@@ -168,9 +168,9 @@ mainbus_attach(device_t parent, device_t
}
#endif /* PCI_BUS_FIXUP */
#if NACPICA > 0
- acpi_present = acpi_probe();
+ acpi_present = acpi_probe() != 0;
if (acpi_present)
- mpacpi_active = mpacpi_scan_apics(self, &numcpus);
+ mpacpi_active = mpacpi_scan_apics(self, &numcpus) != 0;
if (!mpacpi_active)
#endif
{