PERFORCE change 42198 for review
Peter Wemm
peter at FreeBSD.org
Wed Nov 12 16:43:50 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=42198
Change 42198 by peter at peter_daintree on 2003/11/12 16:43:01
integ -I -b smp_hammer. Gah, conflict city. I guess jhb has been
waiting to pay me back for committing Bosko's tlb fixes :-)
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/apic_vector.S#4 integrate
.. //depot/projects/hammer/sys/amd64/amd64/intr_machdep.c#8 integrate
.. //depot/projects/hammer/sys/amd64/amd64/io_apic.c#17 integrate
.. //depot/projects/hammer/sys/amd64/amd64/local_apic.c#19 integrate
.. //depot/projects/hammer/sys/amd64/amd64/mp_machdep.c#28 integrate
.. //depot/projects/hammer/sys/amd64/include/apicvar.h#10 integrate
.. //depot/projects/hammer/sys/amd64/isa/atpic.c#18 integrate
.. //depot/projects/hammer/sys/amd64/isa/atpic_vector.S#5 integrate
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/apic_vector.S#4 (text+ko) ====
@@ -32,7 +32,7 @@
* SUCH DAMAGE.
*
* from: vector.s, 386BSD 0.1 unknown origin
- * $FreeBSD: src/sys/i386/i386/apic_vector.s,v 1.91 2003/11/03 21:53:36 jhb Exp $
+ * $FreeBSD: src/sys/i386/i386/apic_vector.s,v 1.92 2003/11/12 18:13:57 jhb Exp $
*/
/*
==== //depot/projects/hammer/sys/amd64/amd64/intr_machdep.c#8 (text+ko) ====
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/i386/intr_machdep.c,v 1.1 2003/11/03 21:25:52 jhb Exp $
+ * $FreeBSD: src/sys/i386/i386/intr_machdep.c,v 1.2 2003/11/12 18:13:57 jhb Exp $
*/
/*
@@ -49,6 +49,7 @@
#include <sys/proc.h>
#include <sys/syslog.h>
#include <sys/systm.h>
+#include <machine/clock.h>
#include <machine/intr_machdep.h>
#ifdef DDB
#include <ddb/ddb.h>
@@ -152,10 +153,14 @@
void
intr_execute_handlers(struct intsrc *isrc, struct intrframe *iframe)
{
+ struct thread *td;
struct ithd *it;
struct intrhand *ih;
int error, vector;
+ td = curthread;
+ td->td_intr_nesting_level++;
+
/*
* We count software interrupts when we process them. The
* code here follows previous practice, but there's an
@@ -165,18 +170,25 @@
atomic_add_long(isrc->is_count, 1);
atomic_add_int(&cnt.v_intr, 1);
+ it = isrc->is_ithread;
+ ih = TAILQ_FIRST(&it->it_handlers);
+
/*
- * Execute fast interrupt handlers directly.
- * To support clock handlers, if a handler registers
- * with a NULL argument, then we pass it a pointer to
- * a trapframe as its argument.
+ * XXX: We assume that IRQ 0 is only used for the ISA timer
+ * device (clk).
*/
- it = isrc->is_ithread;
- ih = TAILQ_FIRST(&it->it_handlers);
+ vector = isrc->is_pic->pic_vector(isrc);
+ if (vector == 0)
+ clkintr_pending = 1;
+
critical_enter();
- if (ih == NULL)
- error = EINVAL;
- else if (ih->ih_flags & IH_FAST) {
+ if (ih != NULL && ih->ih_flags & IH_FAST) {
+ /*
+ * Execute fast interrupt handlers directly.
+ * To support clock handlers, if a handler registers
+ * with a NULL argument, then we pass it a pointer to
+ * a trapframe as its argument.
+ */
TAILQ_FOREACH(ih, &it->it_handlers, ih_next) {
MPASS(ih->ih_flags & IH_FAST);
CTR3(KTR_INTR, "%s: executing handler %p(%p)",
@@ -188,13 +200,22 @@
else
ih->ih_handler(ih->ih_argument);
}
- isrc->is_pic->pic_enable_source(isrc);
+ isrc->is_pic->pic_eoi_source(isrc);
error = 0;
- } else
- error = ithread_schedule(it, !cold);
+ } else {
+ /*
+ * For stray and threaded interrupts, we mask and EOI the
+ * source.
+ */
+ isrc->is_pic->pic_disable_source(isrc);
+ isrc->is_pic->pic_eoi_source(isrc);
+ if (ih == NULL)
+ error = EINVAL;
+ else
+ error = ithread_schedule(it, !cold);
+ }
critical_exit();
if (error == EINVAL) {
- vector = isrc->is_pic->pic_vector(isrc);
atomic_add_long(isrc->is_straycount, 1);
if (*isrc->is_straycount < MAX_STRAY_LOG)
log(LOG_ERR, "stray irq%d\n", vector);
@@ -203,6 +224,7 @@
"too many stray irq %d's: not logging anymore\n",
vector);
}
+ td->td_intr_nesting_level--;
}
void
==== //depot/projects/hammer/sys/amd64/amd64/io_apic.c#17 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/io_apic.c,v 1.5 2003/11/07 23:44:35 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/io_apic.c,v 1.6 2003/11/12 18:13:57 jhb Exp $");
#include "opt_isa.h"
#include "opt_mixed_mode.h"
@@ -201,8 +201,7 @@
ioapic_eoi_source(struct intsrc *isrc)
{
- TODO;
- /* lapic_eoi(); */
+ lapic_eoi();
}
/*
==== //depot/projects/hammer/sys/amd64/amd64/local_apic.c#19 (text+ko) ====
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/local_apic.c,v 1.1 2003/11/03 21:53:36 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/local_apic.c,v 1.2 2003/11/12 18:13:57 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -466,20 +466,22 @@
}
void
+lapic_eoi(void)
+{
+
+ lapic->eoi = 0;
+}
+
+void
lapic_handle_intr(void *cookie, struct intrframe frame)
{
struct intsrc *isrc;
- struct thread *td = curthread;
int vec = (uintptr_t)cookie;
- td->td_intr_nesting_level++;
if (vec == -1)
panic("Couldn't get vector from ISR!");
isrc = intr_lookup_source(apic_idt_to_irq(vec));
- isrc->is_pic->pic_disable_source(isrc);
- lapic->eoi = 0;
intr_execute_handlers(isrc, &frame);
- td->td_intr_nesting_level--;
}
/* Translate between IDT vectors and IRQ vectors. */
==== //depot/projects/hammer/sys/amd64/amd64/mp_machdep.c#28 (text+ko) ====
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/mp_machdep.c,v 1.223 2003/11/11 17:16:15 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/mp_machdep.c,v 1.224 2003/11/12 18:13:57 jhb Exp $");
#include "opt_cpu.h"
#include "opt_kstack_pages.h"
@@ -781,10 +781,11 @@
void
forwarded_statclock(struct clockframe frame)
{
- struct thread *td = curthread;
+ struct thread *td;
+ CTR0(KTR_SMP, "forwarded_statclock");
+ td = curthread;
td->td_intr_nesting_level++;
- CTR0(KTR_SMP, "forwarded_statclock");
if (profprocs != 0)
profclock(&frame);
if (pscnt == psdiv)
@@ -817,10 +818,11 @@
void
forwarded_hardclock(struct clockframe frame)
{
- struct thread *td = curthread;
+ struct thread *td;
+ CTR0(KTR_SMP, "forwarded_hardclock");
+ td = curthread;
td->td_intr_nesting_level++;
- CTR0(KTR_SMP, "forwarded_hardclock");
hardclock_process(&frame);
td->td_intr_nesting_level--;
}
==== //depot/projects/hammer/sys/amd64/include/apicvar.h#10 (text+ko) ====
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/include/apicvar.h,v 1.1 2003/11/03 21:53:38 jhb Exp $
+ * $FreeBSD: src/sys/i386/include/apicvar.h,v 1.2 2003/11/12 18:13:57 jhb Exp $
*/
#ifndef _MACHINE_APICVAR_H_
@@ -149,6 +149,7 @@
void lapic_disable(void);
void lapic_dump(const char *str);
void lapic_enable_intr(u_int vector);
+void lapic_eoi(void);
int lapic_id(void);
void lapic_init(uintptr_t addr);
int lapic_intr_pending(u_int vector);
==== //depot/projects/hammer/sys/amd64/isa/atpic.c#18 (text+ko) ====
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/isa/atpic.c,v 1.2 2003/11/04 13:13:04 nyan Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/isa/atpic.c,v 1.3 2003/11/12 18:13:57 jhb Exp $");
#include "opt_isa.h"
@@ -169,6 +169,10 @@
mtx_unlock_spin(&icu_lock);
}
+/*
+ * The data sheet says no auto-EOI on slave, but it sometimes works.
+ * So, if AUTO_EOI_2 is enabled, we use it.
+ */
static void
atpic_eoi_slave(struct intsrc *isrc)
{
@@ -293,17 +297,14 @@
SYSINIT(atpic_init, SI_SUB_INTR, SI_ORDER_SECOND + 1, atpic_init, NULL)
void
-atpic_sched_ithd(void *cookie, struct intrframe iframe)
+atpic_handle_intr(void *cookie, struct intrframe iframe)
{
struct intsrc *isrc;
- struct thread *td = curthread;
int vec = (uintptr_t)cookie;
KASSERT(vec < ICU_LEN, ("unknown int %d\n", vec));
- td->td_intr_nesting_level++;
isrc = &atintrs[vec].at_intsrc;
intr_execute_handlers(isrc, &iframe);
- td->td_intr_nesting_level--;
}
#ifdef DEV_ISA
==== //depot/projects/hammer/sys/amd64/isa/atpic_vector.S#5 (text+ko) ====
@@ -32,7 +32,7 @@
* SUCH DAMAGE.
*
* from: vector.s, 386BSD 0.1 unknown origin
- * $FreeBSD: src/sys/i386/isa/atpic_vector.s,v 1.38 2003/11/03 21:34:45 jhb Exp $
+ * $FreeBSD: src/sys/i386/isa/atpic_vector.s,v 1.39 2003/11/12 18:13:57 jhb Exp $
*/
/*
@@ -46,29 +46,10 @@
#include "assym.s"
-#define IRQ_BIT(irq_num) (1 << ((irq_num) % 8))
-#define IRQ_BYTE(irq_num) ((irq_num) >> 3)
-
-#define ENABLE_ICU1 \
- movb $ICU_EOI,%al ; /* as soon as possible send EOI ... */ \
- outb %al,$IO_ICU1 /* ... to clear in service bit */
-
-#define ENABLE_ICU1_AND_2 \
- movb $ICU_EOI,%al ; /* as above */ \
- outb %al,$IO_ICU2 ; /* but do second icu first ... */ \
- outb %al,$IO_ICU1 /* ... then first icu */
-
/*
* Macros for interrupt interrupt entry, call to handler, and exit.
- *
- * XXX Most of the parameters here are obsolete. Fix this when we're
- * done.
- * XXX we really shouldn't return via doreti if we just schedule the
- * interrupt handler and don't run anything. We could just do an
- * iret. FIXME.
- * XXX move the mask, EOI and td_intr_nesting_level frobbing into C code.
*/
-#define INTR(irq_num, vec_name, icu, enable_icus, maybe_extra_ipending) \
+#define INTR(irq_num, vec_name) \
.text ; \
SUPERALIGN_TEXT ; \
IDTVEC(vec_name) ; \
@@ -91,12 +72,6 @@
movq %r13,TF_R13(%rsp) ; \
movq %r14,TF_R14(%rsp) ; \
movq %r15,TF_R15(%rsp) ; \
- maybe_extra_ipending ; \
- movb imen + IRQ_BYTE(irq_num),%al ; \
- orb $IRQ_BIT(irq_num),%al ; \
- movb %al,imen + IRQ_BYTE(irq_num) ; \
- outb %al,$icu+ICU_IMR_OFFSET ; \
- enable_icus ; \
FAKE_MCOUNT(13*4(%esp)) ; /* XXX late to avoid double count */ \
movq $irq_num, %rdi; /* pass the IRQ */ \
call atpic_sched_ithd ; \
@@ -104,22 +79,20 @@
jmp doreti
MCOUNT_LABEL(bintr)
-#define CLKINTR_PENDING movl $1,CNAME(clkintr_pending)
-/* Threaded interrupts */
- INTR(0,atpic_intr0, IO_ICU1, ENABLE_ICU1, CLKINTR_PENDING)
- INTR(1,atpic_intr1, IO_ICU1, ENABLE_ICU1,)
- INTR(2,atpic_intr2, IO_ICU1, ENABLE_ICU1,)
- INTR(3,atpic_intr3, IO_ICU1, ENABLE_ICU1,)
- INTR(4,atpic_intr4, IO_ICU1, ENABLE_ICU1,)
- INTR(5,atpic_intr5, IO_ICU1, ENABLE_ICU1,)
- INTR(6,atpic_intr6, IO_ICU1, ENABLE_ICU1,)
- INTR(7,atpic_intr7, IO_ICU1, ENABLE_ICU1,)
- INTR(8,atpic_intr8, IO_ICU2, ENABLE_ICU1_AND_2,)
- INTR(9,atpic_intr9, IO_ICU2, ENABLE_ICU1_AND_2,)
- INTR(10,atpic_intr10, IO_ICU2, ENABLE_ICU1_AND_2,)
- INTR(11,atpic_intr11, IO_ICU2, ENABLE_ICU1_AND_2,)
- INTR(12,atpic_intr12, IO_ICU2, ENABLE_ICU1_AND_2,)
- INTR(13,atpic_intr13, IO_ICU2, ENABLE_ICU1_AND_2,)
- INTR(14,atpic_intr14, IO_ICU2, ENABLE_ICU1_AND_2,)
- INTR(15,atpic_intr15, IO_ICU2, ENABLE_ICU1_AND_2,)
+ INTR(0, atpic_intr0)
+ INTR(1, atpic_intr1)
+ INTR(2, atpic_intr2)
+ INTR(3, atpic_intr3)
+ INTR(4, atpic_intr4)
+ INTR(5, atpic_intr5)
+ INTR(6, atpic_intr6)
+ INTR(7, atpic_intr7)
+ INTR(8, atpic_intr8)
+ INTR(9, atpic_intr9)
+ INTR(10, atpic_intr10)
+ INTR(11, atpic_intr11)
+ INTR(12, atpic_intr12)
+ INTR(13, atpic_intr13)
+ INTR(14, atpic_intr14)
+ INTR(15, atpic_intr15)
MCOUNT_LABEL(eintr)
More information about the p4-projects
mailing list