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

📄 config.y

📁 早期freebsd实现
💻 Y
📖 第 1 页 / 共 2 页
字号:
		|	/* lambda */		;Info:	CSR NUMBER	      = { cur.d_addr = $2; } |	DRIVE NUMBER	      = { cur.d_drive = $2; } |	SLAVE NUMBER	      = {		if (cur.d_conn != 0 && cur.d_conn != TO_NEXUS &&		    cur.d_conn->d_type == MASTER)			cur.d_slave = $2;		else			yyerror("can't specify slave--not to master");		} |	IRQ NUMBER	      = { cur.d_irq = $2; } |	DRQ NUMBER	      = { cur.d_drq = $2; } |	IOMEM NUMBER	      = { cur.d_maddr = $2; } |	IOSIZ NUMBER	      = { cur.d_msize = $2; } |	PORT device_name	      = { cur.d_port = ns($2); } |	PORT NUMBER	      = { cur.d_portn = $2; } |	TTY 	      = { cur.d_mask = "tty"; } |	BIO 	      = { cur.d_mask = "bio"; } |	NET 	      = { cur.d_mask = "net"; } |	FLAGS NUMBER	      = { cur.d_flags = $2; };Int_spec:	VECTOR Id_list	      = { cur.d_vec = $2; } |	PRIORITY NUMBER	      = { cur.d_pri = $2; } |	/* lambda */		;Id_list:	Save_id	      = {		struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));		a->id = $1; a->id_next = 0; $$ = a;		} |	Save_id Id_list =		{		struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));	        a->id = $1; a->id_next = $2; $$ = a;		};%%yyerror(s)	char *s;{	fprintf(stderr, "config: line %d: %s\n", yyline + 1, s);}/* * return the passed string in a new space */char *ns(str)	register char *str;{	register char *cp;	cp = malloc((unsigned)(strlen(str)+1));	(void) strcpy(cp, str);	return (cp);}/* * add a device to the list of devices */newdev(dp)	register struct device *dp;{	register struct device *np;	np = (struct device *) malloc(sizeof *np);	*np = *dp;	np->d_next = 0;	if (curp == 0)		dtab = np;	else		curp->d_next = np;	curp = np;}/* * note that a configuration should be made */mkconf(sysname)	char *sysname;{	register struct file_list *fl, **flp;	fl = (struct file_list *) malloc(sizeof *fl);	fl->f_type = SYSTEMSPEC;	fl->f_needs = sysname;	fl->f_rootdev = NODEV;	fl->f_dumpdev = NODEV;	fl->f_fn = 0;	fl->f_next = 0;	for (flp = confp; *flp; flp = &(*flp)->f_next)		;	*flp = fl;	confp = flp;}struct file_list *newflist(ftype)	u_char ftype;{	struct file_list *fl = (struct file_list *)malloc(sizeof (*fl));	fl->f_type = ftype;	fl->f_next = 0;	fl->f_swapdev = NODEV;	fl->f_swapsize = 0;	fl->f_needs = 0;	fl->f_fn = 0;	return (fl);}/* * Add a swap device to the system's configuration */mkswap(system, fl, size, flag)	struct file_list *system, *fl;	int size, flag;{	register struct file_list **flp;	char name[80];	if (system == 0 || system->f_type != SYSTEMSPEC) {		yyerror("\"swap\" spec precedes \"config\" specification");		return;	}	if (size < 0) {		yyerror("illegal swap partition size");		return;	}	/*	 * Append swap description to the end of the list.	 */	flp = &system->f_next;	for (; *flp && (*flp)->f_type == SWAPSPEC; flp = &(*flp)->f_next)		;	fl->f_next = *flp;	*flp = fl;	fl->f_swapsize = size;	fl->f_swapflag = flag;	/*	 * If first swap device for this system,	 * set up f_fn field to insure swap	 * files are created with unique names.	 */	if (system->f_fn)		return;	if (eq(fl->f_fn, "generic"))		system->f_fn = ns(fl->f_fn);	else		system->f_fn = ns(system->f_needs);}mkcomp(dp)	register struct device *dp;{	register struct file_list *fl, **flp;	char buf[80];	fl = (struct file_list *) malloc(sizeof *fl);	fl->f_type = COMPDEVICE;	fl->f_compinfo = dp->d_unit;	fl->f_fn = ns(dp->d_name);	(void) sprintf(buf, "%s%d", dp->d_name, dp->d_unit);	fl->f_needs = ns(buf);	fl->f_next = 0;	for (flp = compp; *flp; flp = &(*flp)->f_next)		;	*flp = fl;	compp = flp;}addcomp(compdev, fl)	struct file_list *compdev, *fl;{	register struct file_list **flp;	char name[80];	if (compdev == 0 || compdev->f_type != COMPDEVICE) {		yyerror("component spec precedes device specification");		return;	}	/*	 * Append description to the end of the list.	 */	flp = &compdev->f_next;	for (; *flp && (*flp)->f_type == COMPSPEC; flp = &(*flp)->f_next)		;	fl->f_next = *flp;	*flp = fl;}/* * find the pointer to connect to the given device and number. * returns 0 if no such device and prints an error message */struct device *connect(dev, num)	register char *dev;	register int num;{	register struct device *dp;	struct device *huhcon();	if (num == QUES)		return (huhcon(dev));	for (dp = dtab; dp != 0; dp = dp->d_next) {		if ((num != dp->d_unit) || !eq(dev, dp->d_name))			continue;		if (dp->d_type != CONTROLLER && dp->d_type != MASTER) {			(void) sprintf(errbuf,			    "%s connected to non-controller", dev);			yyerror(errbuf);			return (0);		}		return (dp);	}	(void) sprintf(errbuf, "%s %d not defined", dev, num);	yyerror(errbuf);	return (0);}/* * connect to an unspecific thing */struct device *huhcon(dev)	register char *dev;{	register struct device *dp, *dcp;	struct device rdev;	int oldtype;	/*	 * First make certain that there are some of these to wildcard on	 */	for (dp = dtab; dp != 0; dp = dp->d_next)		if (eq(dp->d_name, dev))			break;	if (dp == 0) {		(void) sprintf(errbuf, "no %s's to wildcard", dev);		yyerror(errbuf);		return (0);	}	oldtype = dp->d_type;	dcp = dp->d_conn;	/*	 * Now see if there is already a wildcard entry for this device	 * (e.g. Search for a "uba ?")	 */	for (; dp != 0; dp = dp->d_next)		if (eq(dev, dp->d_name) && dp->d_unit == -1)			break;	/*	 * If there isn't, make one because everything needs to be connected	 * to something.	 */	if (dp == 0) {		dp = &rdev;		init_dev(dp);		dp->d_unit = QUES;		dp->d_name = ns(dev);		dp->d_type = oldtype;		newdev(dp);		dp = curp;		/*		 * Connect it to the same thing that other similar things are		 * connected to, but make sure it is a wildcard unit		 * (e.g. up connected to sc ?, here we make connect sc? to a		 * uba?).  If other things like this are on the NEXUS or		 * if they aren't connected to anything, then make the same		 * connection, else call ourself to connect to another		 * unspecific device.		 */		if (dcp == TO_NEXUS || dcp == 0)			dp->d_conn = dcp;		else			dp->d_conn = connect(dcp->d_name, QUES);	}	return (dp);}init_dev(dp)	register struct device *dp;{	dp->d_name = "OHNO!!!";	dp->d_type = DEVICE;	dp->d_conn = 0;	dp->d_vec = 0;	dp->d_addr = dp->d_flags = dp->d_dk = 0;	dp->d_pri = -1;	dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;	dp->d_port = (char *)0;	dp->d_portn = 0;	dp->d_irq = -1;	dp->d_drq = -1;	dp->d_maddr = 0;	dp->d_msize = 0;	dp->d_mask = "null";}/* * make certain that this is a reasonable type of thing to connect to a nexus */check_nexus(dev, num)	register struct device *dev;	int num;{	switch (machine) {	case MACHINE_VAX:		if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba") &&		    !eq(dev->d_name, "bi"))			yyerror("only uba's, mba's, and bi's should be connected to the nexus");		if (num != QUES)			yyerror("can't give specific nexus numbers");		break;	case MACHINE_TAHOE:		if (!eq(dev->d_name, "vba")) 			yyerror("only vba's should be connected to the nexus");		break;	case MACHINE_HP300:	case MACHINE_LUNA68K:		if (num != QUES)			dev->d_addr = num;		break;	case MACHINE_I386:		if (!eq(dev->d_name, "isa"))			yyerror("only isa's should be connected to the nexus");		break;	case MACHINE_NEWS3400:		if (!eq(dev->d_name, "iop") && !eq(dev->d_name, "hb") &&		    !eq(dev->d_name, "vme"))			yyerror("only iop's, hb's and vme's should be connected to the nexus");		break;	}}/* * Check the timezone to make certain it is sensible */check_tz(){	if (abs(zone) > 12 * 60)		yyerror("timezone is unreasonable");	else		hadtz = 1;}/* * Check system specification and apply defaulting * rules on root, argument, dump, and swap devices. */checksystemspec(fl)	register struct file_list *fl;{	char buf[BUFSIZ];	register struct file_list *swap;	int generic;	if (fl == 0 || fl->f_type != SYSTEMSPEC) {		yyerror("internal error, bad system specification");		exit(1);	}	swap = fl->f_next;	generic = swap && swap->f_type == SWAPSPEC && eq(swap->f_fn, "generic");	if (fl->f_rootdev == NODEV && !generic) {		yyerror("no root device specified");		exit(1);	}	/*	 * Default swap area to be in 'b' partition of root's	 * device.  If root specified to be other than on 'a'	 * partition, give warning, something probably amiss.	 */	if (swap == 0 || swap->f_type != SWAPSPEC) {		dev_t dev;		swap = newflist(SWAPSPEC);		dev = fl->f_rootdev;		if (minor(dev) & 07) {			(void) sprintf(buf, "Warning, swap defaulted to 'b' partition with root on '%c' partition",				(minor(dev) & 07) + 'a');			yyerror(buf);		}		swap->f_swapdev =		   makedev(major(dev), (minor(dev) &~ 07) | ('b' - 'a'));		swap->f_fn = devtoname(swap->f_swapdev);		mkswap(fl, swap, 0);	}	/*	 * Make sure a generic swap isn't specified, along with	 * other stuff (user must really be confused).	 */	if (generic) {		if (fl->f_rootdev != NODEV)			yyerror("root device specified with generic swap");		if (fl->f_dumpdev != NODEV)			yyerror("dump device specified with generic swap");		return;	}	/*	 * Default dump device and warn if place is not a	 * swap area.	 */	if (fl->f_dumpdev == NODEV)		fl->f_dumpdev = swap->f_swapdev;	if (fl->f_dumpdev != swap->f_swapdev) {		struct file_list *p = swap->f_next;		for (; p && p->f_type == SWAPSPEC; p = p->f_next)			if (fl->f_dumpdev == p->f_swapdev)				return;		(void) sprintf(buf,		    "Warning: dump device is not a swap partition");		yyerror(buf);	}}/* * Verify all devices specified in the system specification * are present in the device specifications. */verifysystemspecs(){	register struct file_list *fl;	dev_t checked[50], *verifyswap();	register dev_t *pchecked = checked;	for (fl = conf_list; fl; fl = fl->f_next) {		if (fl->f_type != SYSTEMSPEC)			continue;		if (!finddev(fl->f_rootdev))			deverror(fl->f_needs, "root");		*pchecked++ = fl->f_rootdev;		pchecked = verifyswap(fl->f_next, checked, pchecked);#define	samedev(dev1, dev2) \	((minor(dev1) &~ 07) != (minor(dev2) &~ 07))		if (!alreadychecked(fl->f_dumpdev, checked, pchecked)) {			if (!finddev(fl->f_dumpdev))				deverror(fl->f_needs, "dump");			*pchecked++ = fl->f_dumpdev;		}	}}/* * Do as above, but for swap devices. */dev_t *verifyswap(fl, checked, pchecked)	register struct file_list *fl;	dev_t checked[];	register dev_t *pchecked;{	for (;fl && fl->f_type == SWAPSPEC; fl = fl->f_next) {		if (eq(fl->f_fn, "generic"))			continue;		if (alreadychecked(fl->f_swapdev, checked, pchecked))			continue;		if (!finddev(fl->f_swapdev))			fprintf(stderr,			   "config: swap device %s not configured", fl->f_fn);		*pchecked++ = fl->f_swapdev;	}	return (pchecked);}/* * Verify that components of a compound device have themselves been config'ed */verifycomp(fl)	register struct file_list *fl;{	char *dname = fl->f_needs;	for (fl = fl->f_next; fl; fl = fl->f_next) {		if (fl->f_type != COMPSPEC || finddev(fl->f_compdev))			continue;		fprintf(stderr,			"config: %s: component device %s not configured\n",			dname, fl->f_needs);	}}/* * Has a device already been checked * for it's existence in the configuration? */alreadychecked(dev, list, last)	dev_t dev, list[];	register dev_t *last;{	register dev_t *p;	for (p = list; p < last; p++)		if (samedev(*p, dev))			return (1);	return (0);}deverror(systemname, devtype)	char *systemname, *devtype;{	fprintf(stderr, "config: %s: %s device not configured\n",		systemname, devtype);}/* * Look for the device in the list of * configured hardware devices.  Must * take into account stuff wildcarded. *//*ARGSUSED*/finddev(dev)	dev_t dev;{	/* punt on this right now */	return (1);}

⌨️ 快捷键说明

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