Support for Bruce Evans' new dynamic interrupt support.

Submitted by:	Bruce Evans
This commit is contained in:
David Greenman 1994-08-18 05:11:32 +00:00
parent 8912c0ed61
commit 5ced58e474
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=2104
4 changed files with 91 additions and 87 deletions

View File

@ -1,7 +1,7 @@
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= config
CFLAGS+=-I. -I${.CURDIR}
CFLAGS+=-I. -I${.CURDIR} -DSTATCLOCK
SRCS= config.c main.c lang.c mkioconf.c mkmakefile.c mkglue.c mkheaders.c \
mkswapconf.c
MAN8= config.8

View File

@ -112,9 +112,8 @@ they are:
a description
of what I/O devices are attached to the system;
.Pa vector.h ,
a set of interrupt service routines for devices
attached to the bus plus
offsets into a structure used for counting per-device interrupts;
definitions of
macros related to counting interrupts;
.Pa Makefile ,
used by
.Xr make 1

View File

@ -332,71 +332,65 @@ dump_ctrs(fp)
/*
* Create the ISA interrupt vector glue file.
*
* The interrupt handlers are hardwired into vector.s and are attached
* at runtime depending on the data in ioconf.c and on the results of
* probing. Here we only need to generate the names of the interrupt
* handlers in an ancient form suitable for vmstat (the _eintrcnt label
* can't be expressed in C). We give the names of all devices to
* simplify the correspondence between devices and interrupt handlers.
* The order must match that in mkioconf.c.
*/
vector() {
register FILE *fp, *gp;
register struct device *dp, *mp;
int count;
vector()
{
int dev_id;
FILE *fp;
fp = fopen(path("vector.h"), "w");
if (fp == 0) {
if (fp == NULL) {
perror(path("vector.h"));
exit(1);
}
fprintf(fp, "\
/*\n\
* AT/386\n\
* Macros for interrupt vector routines\n\
* Generated by config program\n\
*/\n\
\n");
fprintf(fp, "\
#define BUILD_VECTORS \\\n\
BUILD_VECTOR(clk, 0,0,0, _high_imask, _clkintr,1,1, al);\\\n");
fprintf(fp,
"BUILD_VECTOR(rtc, 0,8,1, _stat_imask, _rtcintr,2,1_AND_2, ah);\\\n");
count=2;
for (dp = dtab; dp != 0; dp = dp->d_next) {
mp = dp->d_conn;
if (mp != 0 && /* mp != (struct device *)-1 &&*/
eq(mp->d_name, "isa")) {
struct idlst *id, *id2;
for (id = dp->d_vec; id; id = id->id_next) {
for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
if (id2 == id) {
build_vector(fp, dp, id, count);
count++;
if (!strcmp(id->id, id2->id))
break;
}
}
}
}
}
fprintf(fp, "\n\n#define NR_REAL_INT_HANDLERS %d\n", count);
fprintf(fp, "/*\n");
fprintf(fp, " * vector.h\n");
fprintf(fp, " * Macros for interrupt vector routines\n");
fprintf(fp, " * Generated by config program\n");
fprintf(fp, " */\n\n");
fprintf(fp, "#define\tDEVICE_NAMES \"\\\n");
fprintf(fp, "clk0 irqnn\\0\\\n");
#ifdef STATCLOCK
/*
* XXX _all_ devices should be configured so that there is no need
* for kludges like this.
*/
fprintf(fp, "rtc0 irqnn\\0\\\n");
dev_id = 2;
#else
dev_id = 1;
#endif
vector_devtab(fp, "bio", &dev_id);
vector_devtab(fp, "tty", &dev_id);
vector_devtab(fp, "net", &dev_id);
vector_devtab(fp, "null", &dev_id);
fprintf(fp, "\"\n\n");
fprintf(fp, "#define\tNR_DEVICES\t%d\n", dev_id);
(void) fclose(fp);
}
build_vector(fp, dp, id, offset)
register FILE *fp;
register struct device *dp;
struct idlst *id;
int offset;
vector_devtab(fp, table, dev_idp)
FILE *fp;
char *table;
int *dev_idp;
{
fprintf(fp, "\tBUILD_%sVECTOR(%s%d, %d,%d,%d",
strcmp(dp->d_name, "sio") == 0 ? "FAST_" : "",
dp->d_name, dp->d_unit, dp->d_unit, dp->d_irq, offset);
if (eq(dp->d_mask, "null"))
fprintf(fp, ", _%s%d_imask,", dp->d_name, dp->d_unit);
else
fprintf(fp, ", _%s_imask, ", dp->d_mask);
fprintf(fp, " _%s,%d,1", id->id, 1 + dp->d_irq / 8);
if (dp->d_irq < 8)
fprintf(fp, ", al");
else
fprintf(fp, "_AND_2, ah");
fprintf(fp, ");\\\n");
register struct device *dp, *mp;
for (dp = dtab; dp != NULL; dp = dp->d_next) {
if (dp->d_unit == QUES || !eq(dp->d_mask, table))
continue;
mp = dp->d_conn;
if (mp == NULL || mp == TO_NEXUS || !eq(mp->d_name, "isa"))
continue;
fprintf(fp, "%s%d irqnn\\0\\\n", dp->d_name, dp->d_unit);
(*dev_idp)++;
}
}

View File

@ -606,6 +606,7 @@ i386_ioconf()
{
register struct device *dp, *mp, *np;
register int uba_n, slave;
int dev_id;
FILE *fp;
fp = fopen(path("ioconf.c"), "w");
@ -617,11 +618,8 @@ i386_ioconf()
fprintf(fp, " * ioconf.c \n");
fprintf(fp, " * Generated by config program\n");
fprintf(fp, " */\n\n");
fprintf(fp, "#include \"machine/pte.h\"\n");
fprintf(fp, "#include \"sys/param.h\"\n");
fprintf(fp, "#include \"sys/buf.h\"\n");
fprintf(fp, "\n");
fprintf(fp, "#define V(s)\t__CONCAT(V,s)\n");
fprintf(fp, "#define C (caddr_t)\n\n");
/*
* First print the isa initialization structures
@ -635,7 +633,9 @@ i386_ioconf()
fprintf(fp, "#include \"i386/isa/isa_device.h\"\n");
fprintf(fp, "#include \"i386/isa/isa.h\"\n");
fprintf(fp, "#include \"i386/isa/icu.h\"\n\n");
fprintf(fp, "/*\n");
fprintf(fp, " * XXX misplaced external declarations.\n");
fprintf(fp, " */\n");
for (dp = dtab; dp != 0; dp = dp->d_next) {
mp = dp->d_conn;
if (mp == 0 || mp == TO_NEXUS ||
@ -650,18 +650,23 @@ i386_ioconf()
fprintf(stderr, "remapped irq 2 to irq 9, please update your config file\n");
dp->d_irq = 9;
}
if (dp->d_irq != -1)
fprintf(fp, " extern void %s();", shandler(dp));
if (dp->d_vec != NULL && dp->d_vec->id != NULL)
fprintf(fp, " inthand2_t %s;", shandler(dp));
fprintf(fp, "\n");
}
isa_devtab(fp, "bio");
#ifdef STATCLOCK
dev_id = 2;
#else
dev_id = 1;
#endif
isa_devtab(fp, "bio", &dev_id);
if(seen_wdc)
isa_biotab(fp, "wdc");
if(seen_fdc)
isa_biotab(fp, "fdc");
isa_devtab(fp, "tty");
isa_devtab(fp, "net");
isa_devtab(fp, "null");
isa_devtab(fp, "tty", &dev_id);
isa_devtab(fp, "net", &dev_id);
isa_devtab(fp, "null", &dev_id);
}
/* XXX David did this differently!!! */
/* pseudo_ioconf(fp); */
@ -676,13 +681,13 @@ isa_biotab(fp, table)
fprintf(fp, "\n\nstruct isa_device isa_biotab_%s[] = {\n", table);
fprintf(fp, "\
/* driver iobase irq drq maddr msiz intr unit flags drive*/\n");
/* id driver iobase irq drq maddr msiz intr unit flags drive*/\n");
for (dp = dtab; dp != 0; dp = dp->d_next) {
mp = dp->d_conn;
if (dp->d_unit == QUES || mp == 0 ||
mp == TO_NEXUS || !eq(mp->d_name, table))
continue;
fprintf(fp, "{ &%3.3sdriver, %8.8s,",
fprintf(fp, "{ -1, &%3.3sdriver, %8.8s,",
mp->d_name, mp->d_port);
fprintf(fp, "%6.6s, %2d, C 0x%05X, %5d, %8.8s, %2d, 0x%04X, %2d },\n",
sirq(mp->d_irq), mp->d_drq, mp->d_maddr,
@ -698,27 +703,27 @@ isa_biotab(fp, table)
*
* 4/26/93 rgrimes
*/
isa_devtab(fp, table)
isa_devtab(fp, table, dev_idp)
FILE *fp;
char *table;
int *dev_idp;
{
register struct device *dp, *mp;
fprintf(fp, "\n\nstruct isa_device isa_devtab_%s[] = {\n", table);
fprintf(fp, "\
/* driver iobase irq drq maddr msiz intr unit flags */\n");
/* id driver iobase irq drq maddr msiz intr unit flags */\n");
for (dp = dtab; dp != 0; dp = dp->d_next) {
mp = dp->d_conn;
if (dp->d_unit == QUES || mp == 0 ||
mp == TO_NEXUS || !eq(mp->d_name, "isa"))
if (dp->d_unit == QUES || !eq(dp->d_mask, table))
continue;
if (strcmp(dp->d_mask, table)) continue;
mp = dp->d_conn;
if (mp == NULL || mp == TO_NEXUS || !eq(mp->d_name, "isa"))
continue;
fprintf(fp, "{ %2d, &%3.3sdriver,", (*dev_idp)++, dp->d_name);
if (dp->d_port)
fprintf(fp, "{ &%3.3sdriver, %8.8s,",
dp->d_name, dp->d_port);
fprintf(fp, " %8.8s,", dp->d_port);
else
fprintf(fp, "{ &%3.3sdriver, 0x%04x,",
dp->d_name, dp->d_portn);
fprintf(fp, " 0x%04x,", dp->d_portn);
fprintf(fp, "%6.6s, %2d, C 0x%05X, %5d, %8.8s, %2d, 0x%04X },\n",
sirq(dp->d_irq), dp->d_drq, dp->d_maddr,
dp->d_msize, shandler(dp), dp->d_unit,
@ -736,11 +741,17 @@ char *
shandler(dp)
register struct device *dp;
{
static char buf[32 + 20];
static char buf[32 + 1];
if (dp->d_irq == -1)
return ("NULL");
sprintf(buf, "V(%.32s%d)", dp->d_name, dp->d_unit);
if (dp->d_vec == NULL || dp->d_vec->id == NULL)
return "NULL";
/*
* This is for ISA. We only support one interrupt handler in the
* devtabs. Handlers in the config file after the first for each
* device are ignored. Special handlers may be registered at
* runtime.
*/
sprintf(buf, "%.32s", dp->d_vec->id);
return (buf);
}