⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkioconf.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (c) 1980, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)mkioconf.c	8.2 (Berkeley) 1/21/94";#endif /* not lint */#include <stdio.h>#include "y.tab.h"#include "config.h"/* * build the ioconf.c file */char	*qu();char	*intv();char	*wnum();void	pseudo_ioconf();#if MACHINE_VAXvax_ioconf(){	register struct device *dp, *mp, *np;	register int uba_n, slave;	FILE *fp;	fp = fopen(path("ioconf.c"), "w");	if (fp == 0) {		perror(path("ioconf.c"));		exit(1);	}	fprintf(fp, "#include \"vax/include/pte.h\"\n");	fprintf(fp, "#include \"sys/param.h\"\n");	fprintf(fp, "#include \"sys/buf.h\"\n");	fprintf(fp, "#include \"sys/map.h\"\n");	fprintf(fp, "\n");	fprintf(fp, "#include \"vax/mba/mbavar.h\"\n");	fprintf(fp, "#include \"vax/uba/ubavar.h\"\n\n");	fprintf(fp, "\n");	fprintf(fp, "#define C (caddr_t)\n\n");	/*	 * First print the mba initialization structures	 */	if (seen_mba) {		for (dp = dtab; dp != 0; dp = dp->d_next) {			mp = dp->d_conn;			if (mp == 0 || mp == TO_NEXUS ||			    !eq(mp->d_name, "mba"))				continue;			fprintf(fp, "extern struct mba_driver %sdriver;\n",			    dp->d_name);		}		fprintf(fp, "\nstruct mba_device mbdinit[] = {\n");		fprintf(fp, "\t/* Device,  Unit, Mba, Drive, Dk */\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, "mba"))				continue;			if (dp->d_addr) {				printf("can't specify csr address on mba for %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			if (dp->d_vec != 0) {				printf("can't specify vector for %s%d on mba\n",				    dp->d_name, dp->d_unit);				continue;			}			if (dp->d_drive == UNKNOWN) {				printf("drive not specified for %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			if (dp->d_slave != UNKNOWN) {				printf("can't specify slave number for %s%d\n", 				    dp->d_name, dp->d_unit);				continue;			}			fprintf(fp, "\t{ &%sdriver, %d,   %s,",				dp->d_name, dp->d_unit, qu(mp->d_unit));			fprintf(fp, "  %s,  %d },\n",				qu(dp->d_drive), dp->d_dk);		}		fprintf(fp, "\t0\n};\n\n");		/*		 * Print the mbsinit structure		 * Driver Controller Unit Slave		 */		fprintf(fp, "struct mba_slave mbsinit [] = {\n");		fprintf(fp, "\t/* Driver,  Ctlr, Unit, Slave */\n");		for (dp = dtab; dp != 0; dp = dp->d_next) {			/*			 * All slaves are connected to something which			 * is connected to the massbus.			 */			if ((mp = dp->d_conn) == 0 || mp == TO_NEXUS)				continue;			np = mp->d_conn;			if (np == 0 || np == TO_NEXUS ||			    !eq(np->d_name, "mba"))				continue;			fprintf(fp, "\t{ &%sdriver, %s",			    mp->d_name, qu(mp->d_unit));			fprintf(fp, ",  %2d,    %s },\n",			    dp->d_unit, qu(dp->d_slave));		}		fprintf(fp, "\t0\n};\n\n");	}	/*	 * Now generate interrupt vectors for the unibus	 */	for (dp = dtab; dp != 0; dp = dp->d_next) {		if (dp->d_vec != 0) {			struct idlst *ip;			mp = dp->d_conn;			if (mp == 0 || mp == TO_NEXUS ||			    (!eq(mp->d_name, "uba") && !eq(mp->d_name, "bi")))				continue;			fprintf(fp,			    "extern struct uba_driver %sdriver;\n",			    dp->d_name);			fprintf(fp, "extern ");			ip = dp->d_vec;			for (;;) {				fprintf(fp, "X%s%d()", ip->id, dp->d_unit);				ip = ip->id_next;				if (ip == 0)					break;				fprintf(fp, ", ");			}			fprintf(fp, ";\n");			fprintf(fp, "int\t (*%sint%d[])() = { ", dp->d_name,			    dp->d_unit);			ip = dp->d_vec;			for (;;) {				fprintf(fp, "X%s%d", ip->id, dp->d_unit);				ip = ip->id_next;				if (ip == 0)					break;				fprintf(fp, ", ");			}			fprintf(fp, ", 0 } ;\n");		}	}	fprintf(fp, "\nstruct uba_ctlr ubminit[] = {\n");	fprintf(fp, "/*\t driver,\tctlr,\tubanum,\talive,\tintr,\taddr */\n");	for (dp = dtab; dp != 0; dp = dp->d_next) {		mp = dp->d_conn;		if (dp->d_type != CONTROLLER || mp == TO_NEXUS || mp == 0 ||		    !eq(mp->d_name, "uba"))			continue;		if (dp->d_vec == 0) {			printf("must specify vector for %s%d\n",			    dp->d_name, dp->d_unit);			continue;		}		if (dp->d_addr == 0) {			printf("must specify csr address for %s%d\n",			    dp->d_name, dp->d_unit);			continue;		}		if (dp->d_drive != UNKNOWN || dp->d_slave != UNKNOWN) {			printf("drives need their own entries; dont ");			printf("specify drive or slave for %s%d\n",			    dp->d_name, dp->d_unit);			continue;		}		if (dp->d_flags) {			printf("controllers (e.g. %s%d) ",			    dp->d_name, dp->d_unit);			printf("don't have flags, only devices do\n");			continue;		}		fprintf(fp,		    "\t{ &%sdriver,\t%d,\t%s,\t0,\t%sint%d, C 0%o },\n",		    dp->d_name, dp->d_unit, qu(mp->d_unit),		    dp->d_name, dp->d_unit, dp->d_addr);	}	fprintf(fp, "\t0\n};\n");/* unibus devices */	fprintf(fp, "\nstruct uba_device ubdinit[] = {\n");	fprintf(fp,"\t/* driver,  unit, ctlr,  ubanum, slave,   intr,    addr,    dk, flags*/\n");	for (dp = dtab; dp != 0; dp = dp->d_next) {		mp = dp->d_conn;		if (dp->d_unit == QUES || dp->d_type != DEVICE || mp == 0 ||		    mp == TO_NEXUS || mp->d_type == MASTER ||		    eq(mp->d_name, "mba"))			continue;		np = mp->d_conn;		if (np != 0 && np != TO_NEXUS && eq(np->d_name, "mba"))			continue;		np = 0;		if (eq(mp->d_name, "uba")) {			if (dp->d_vec == 0) {				printf("must specify vector for device %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			if (dp->d_addr == 0) {				printf("must specify csr for device %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			if (dp->d_drive != UNKNOWN || dp->d_slave != UNKNOWN) {				printf("drives/slaves can be specified ");				printf("only for controllers, ");				printf("not for device %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			uba_n = mp->d_unit;			slave = QUES;		} else {			if ((np = mp->d_conn) == 0) {				printf("%s%d isn't connected to anything ",				    mp->d_name, mp->d_unit);				printf(", so %s%d is unattached\n",				    dp->d_name, dp->d_unit);				continue;			}			uba_n = np->d_unit;			if (dp->d_drive == UNKNOWN) {				printf("must specify ``drive number'' ");				printf("for %s%d\n", dp->d_name, dp->d_unit);				continue;			}			/* NOTE THAT ON THE UNIBUS ``drive'' IS STORED IN */			/* ``SLAVE'' AND WE DON'T WANT A SLAVE SPECIFIED */			if (dp->d_slave != UNKNOWN) {				printf("slave numbers should be given only ");				printf("for massbus tapes, not for %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			if (dp->d_vec != 0) {				printf("interrupt vectors should not be ");				printf("given for drive %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			if (dp->d_addr != 0) {				printf("csr addresses should be given only ");				printf("on controllers, not on %s%d\n",				    dp->d_name, dp->d_unit);				continue;			}			slave = dp->d_drive;		}		fprintf(fp, "\t{ &%sdriver,  %2d,   %s,",		    eq(mp->d_name, "uba") ? dp->d_name : mp->d_name, dp->d_unit,		    eq(mp->d_name, "uba") ? " -1" : qu(mp->d_unit));		fprintf(fp, "  %s,    %2d,   %s, C 0%-6o,  %d,  0x%x },\n",		    qu(uba_n), slave, intv(dp), dp->d_addr, dp->d_dk,		    dp->d_flags);	}	fprintf(fp, "\t0\n};\n");	pseudo_ioconf(fp);	(void) fclose(fp);}#endif#if MACHINE_TAHOEtahoe_ioconf(){	register struct device *dp, *mp, *np;	register int vba_n, slave;	FILE *fp;	fp = fopen(path("ioconf.c"), "w");	if (fp == 0) {		perror(path("ioconf.c"));		exit(1);	}	fprintf(fp, "#include \"sys/param.h\"\n");	fprintf(fp, "#include \"tahoe/include/pte.h\"\n");	fprintf(fp, "#include \"sys/buf.h\"\n");	fprintf(fp, "#include \"sys/map.h\"\n");	fprintf(fp, "\n");	fprintf(fp, "#include \"tahoe/vba/vbavar.h\"\n");	fprintf(fp, "\n");	fprintf(fp, "#define C (caddr_t)\n\n");	/*	 * Now generate interrupt vectors for the versabus	 */	for (dp = dtab; dp != 0; dp = dp->d_next) {		mp = dp->d_conn;		if (mp == 0 || mp == TO_NEXUS || !eq(mp->d_name, "vba"))			continue;		if (dp->d_vec != 0) {			struct idlst *ip;			fprintf(fp,			    "extern struct vba_driver %sdriver;\n",			    dp->d_name);			fprintf(fp, "extern ");			ip = dp->d_vec;			for (;;) {				fprintf(fp, "X%s%d()", ip->id, dp->d_unit);				ip = ip->id_next;				if (ip == 0)					break;				fprintf(fp, ", ");			}			fprintf(fp, ";\n");			fprintf(fp, "int\t (*%sint%d[])() = { ", dp->d_name,			    dp->d_unit);			ip = dp->d_vec;			for (;;) {				fprintf(fp, "X%s%d", ip->id, dp->d_unit);				ip = ip->id_next;				if (ip == 0)					break;				fprintf(fp, ", ");			}			fprintf(fp, ", 0 } ;\n");		} else if (dp->d_type == DRIVER)  /* devices w/o interrupts */			fprintf(fp,			    "extern struct vba_driver %sdriver;\n",			    dp->d_name);	}	fprintf(fp, "\nstruct vba_ctlr vbminit[] = {\n");	fprintf(fp, "/*\t driver,\tctlr,\tvbanum,\talive,\tintr,\taddr */\n");	for (dp = dtab; dp != 0; dp = dp->d_next) {		mp = dp->d_conn;		if (dp->d_type != CONTROLLER || mp == TO_NEXUS || mp == 0 ||		    !eq(mp->d_name, "vba"))			continue;		if (dp->d_vec == 0) {			printf("must specify vector for %s%d\n",			    dp->d_name, dp->d_unit);			continue;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -