PERFORCE change 69412 for review
Peter Wemm
peter at FreeBSD.org
Thu Jan 20 18:09:50 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=69412
Change 69412 by peter at peter_daintree on 2005/01/21 02:09:28
integ -b i386_hammer
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/db_trace.c#27 integrate
.. //depot/projects/hammer/sys/amd64/amd64/io_apic.c#32 integrate
.. //depot/projects/hammer/sys/amd64/amd64/machdep.c#111 integrate
.. //depot/projects/hammer/sys/amd64/amd64/mptable.c#35 integrate
.. //depot/projects/hammer/sys/amd64/conf/NOTES#52 integrate
.. //depot/projects/hammer/sys/amd64/include/intr_machdep.h#16 integrate
.. //depot/projects/hammer/sys/amd64/isa/atpic.c#46 integrate
.. //depot/projects/hammer/sys/amd64/isa/elcr.c#3 integrate
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/db_trace.c#27 (text+ko) ====
@@ -302,10 +302,16 @@
rbp = db_get_value((long) &(*fp)->f_frame, 8, FALSE);
/*
- * Figure out frame type.
+ * Figure out frame type. We look at the address just before
+ * the saved instruction pointer as the saved EIP is after the
+ * call function, and if the function being called is marked as
+ * dead (such as panic() at the end of dblfault_handler()), then
+ * the instruction at the saved EIP will be part of a different
+ * function (syscall() in this example) rather than the one that
+ * actually made the call.
*/
frame_type = NORMAL;
- sym = db_search_symbol(rip, DB_STGY_ANY, &offset);
+ sym = db_search_symbol(rip - 1, DB_STGY_ANY, &offset);
db_symbol_values(sym, &name, NULL);
if (name != NULL) {
if (strcmp(name, "calltrap") == 0 ||
==== //depot/projects/hammer/sys/amd64/amd64/io_apic.c#32 (text+ko) ====
@@ -424,7 +424,7 @@
* them to be set to active low.
*
* XXX: Should we write to the ELCR if the trigger mode changes for
- * an EISA IRQ?
+ * an EISA IRQ or an ISA IRQ with the ELCR present?
*/
if (intpin->io_bus == APIC_BUS_EISA)
pol = INTR_POLARITY_HIGH;
==== //depot/projects/hammer/sys/amd64/amd64/machdep.c#111 (text+ko) ====
@@ -1213,6 +1213,7 @@
cninit();
#ifdef DEV_ATPIC
+ elcr_probe();
atpic_startup();
#endif
==== //depot/projects/hammer/sys/amd64/amd64/mptable.c#35 (text+ko) ====
@@ -575,11 +575,17 @@
KASSERT(src_bus <= mptable_maxbusid, ("bus id %d too large", src_bus));
switch (busses[src_bus].bus_type) {
case ISA:
- return (INTR_TRIGGER_EDGE);
+#ifndef PC98
+ if (elcr_found)
+ return (elcr_read_trigger(src_bus_irq));
+ else
+#endif
+ return (INTR_TRIGGER_EDGE);
case PCI:
return (INTR_TRIGGER_LEVEL);
case EISA:
KASSERT(src_bus_irq < 16, ("Invalid EISA IRQ %d", src_bus_irq));
+ KASSERT(elcr_found, ("Missing ELCR"));
return (elcr_read_trigger(src_bus_irq));
default:
panic("%s: unknown bus type %d", __func__,
==== //depot/projects/hammer/sys/amd64/conf/NOTES#52 (text+ko) ====
@@ -4,7 +4,7 @@
# This file contains machine dependent kernel configuration notes. For
# machine independent notes, look in /sys/conf/NOTES.
#
-# (XXX from i386:NOTES,v 1.1177)
+# (XXX from i386:NOTES,v 1.1178)
# $FreeBSD: src/sys/amd64/conf/NOTES,v 1.20 2004/09/22 01:04:54 peter Exp $
#
==== //depot/projects/hammer/sys/amd64/include/intr_machdep.h#16 (text+ko) ====
@@ -84,6 +84,7 @@
struct intrframe;
extern struct mtx icu_lock;
+extern int elcr_found;
/* XXX: The elcr_* prototypes probably belong somewhere else. */
int elcr_probe(void);
==== //depot/projects/hammer/sys/amd64/isa/atpic.c#46 (text+ko) ====
@@ -95,7 +95,6 @@
static void atpic_init(void *dummy);
unsigned int imen; /* XXX */
-static int using_elcr;
inthand_t
IDTVEC(atpic_intr0), IDTVEC(atpic_intr1), IDTVEC(atpic_intr2),
@@ -293,7 +292,7 @@
if (ai->at_irq == 0) {
i8259_init(ap, ap == &atpics[SLAVE]);
- if (ap == &atpics[SLAVE] && using_elcr)
+ if (ap == &atpics[SLAVE] && elcr_found)
elcr_resume();
}
}
@@ -337,7 +336,7 @@
vector);
return (EINVAL);
}
- if (!using_elcr) {
+ if (!elcr_found) {
if (bootverbose)
printf("atpic: No ELCR to configure IRQ%u as %s\n",
vector, trig == INTR_TRIGGER_EDGE ? "edge/high" :
@@ -428,8 +427,7 @@
* assume level trigger for any interrupt that we aren't sure is
* edge triggered.
*/
- if (elcr_probe() == 0) {
- using_elcr = 1;
+ if (elcr_found) {
for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++)
ai->at_trigger = elcr_read_trigger(i);
} else {
==== //depot/projects/hammer/sys/amd64/isa/elcr.c#3 (text+ko) ====
@@ -57,9 +57,7 @@
#define ELCR_MASK(irq) (1 << (irq))
static int elcr_status;
-#ifdef INVARIANTS
-static int elcr_found;
-#endif
+int elcr_found;
/*
* Check to see if we have what looks like a valid ELCR. We do this by
@@ -88,9 +86,7 @@
}
if (resource_disabled("elcr", 0))
return (ENXIO);
-#ifdef INVARIANTS
elcr_found = 1;
-#endif
return (0);
}
More information about the p4-projects
mailing list