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

📄 yconfig.y

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 Y
📖 第 1 页 / 共 2 页
字号:
		cur.d_name = $3;		cur.d_type = PSEUDO_DEVICE;		cur.d_slave = $4;		} |	BUS Init_dev Dev	      = {		cur.d_name = $3;		cur.d_type = BUS;		} |	BUS Init_dev Dev NUMBER	      = {		cur.d_name = $3;		cur.d_type = BUS;		cur.d_slave = $4;		} |        SHADOW Shad_dev_name ON Shad_const_list          ;Dev_name:	Init_dev Dev NUMBER	      = {		cur.d_name = $2;		if (eq($2, "mba"))			seen_mba = 1;		else if (eq($2, "uba")) {			seen_uba = 1;			if ($3 > highuba) {				highuba = $3;			}		}		cur.d_unit = $3;		};Init_dev:	/* lambda */	      = { init_dev(&cur); };Dev_info:	Con_info Info_list		|	/* lambda */		;Con_info:	AT Dev NUMBER	      = {		if (must_nexus(cur.d_name))			yyerror(sprintf(errbuf,			    "You can not connect a %s to a %s", cur.d_name,$2));		if ((cur.d_conn = connect($2, $3)) != 0) {			cur.d_adaptor = cur.d_conn ->d_adaptor;			cur.d_nexus = cur.d_conn ->d_nexus;			cur.d_extranum = cur.d_conn->d_extranum;			if(needs_csr(cur.d_conn->d_name)) {			    cur.d_addr = cur.d_conn->d_addr;			    cur.d_conn->d_addr = 0;			}			if(needs_vector(cur.d_conn->d_name)){			    cur.d_vec = cur.d_conn->d_vec;			    cur.d_conn->d_vec = 0;			}		}		} |		AT MSCP = {			/* create a mscp pseudo if it doesn't exist */			/* and link this one to it */		    if (first_mscp) {			struct device tempdev;		    	init_dev(&tempdev);	       		tempdev.d_type = CONTROLLER;			tempdev.d_name = ns("mscp");			tempdev.d_unit = 0;			psuedo_controller.d_name = ns("mscp");		        tempdev.d_conn = &psuedo_controller;		    	newdev(&tempdev);			first_mscp = 0;		    }		    cur.d_conn = connect("mscp", 0);		    cur.d_drive = QUES;		}|			AT NEXUS NUMBER	      = { check_nexus(&cur, $3); cur.d_conn = TO_NEXUS;		cur.d_adaptor = cur.d_unit;		} |	AT Dev NUMBER NEXUS NUMBER	      = { if(!(eq($2, "vaxbi") || eq($2, "xmi")||eq($2,"vba")|| eq($2, "ci") || eq($2, "msi")))			yyerror(sprintf(errbuf,			 "You can't specify a %s at a(n) %s with a node or nexus number",			 cur.d_name,$2));/* hack */			cur.d_conn = connect($2,$3);			cur.d_adaptor = $3;			cur.d_nexus = $5;			if(needs_pseudo_uba(cur.d_name)) {			    cur.d_extranum = extrauba++;			}		} |	AT Dev NUMBER REMOTE_CONTROLLER NUMBER	     =	{			cur.d_conn = connect($2,$3);			cur.d_adaptor = $3;			cur.d_rcntl = $5;	      	};		Info_list:	Info_list Info		|	/* lambda */		;Info:	CSR NUMBER	      = {     cur.d_addr = $2; } | 	CSR NUMBER CSR NUMBER NUMBER	      = { cur.d_addr = $2;		  cur.d_addr2 = $5;    } |	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");		} |	FLAGS NUMBER	      = { cur.d_flags = $2; };Int_spec:	VECTOR Id_list	      = { cur.d_vec = $2;   } |	VECTOR Id_list NUMBER	      = { cur.d_vec = $2;		  cur.d_ivnum = $3; } |	PRIORITY NUMBER 	      = { cur.d_pri = $2;   } |	PRIORITY NUMBER VECTOR Id_list	      = { cur.d_pri = $2;		  cur.d_vec = $4;   } |	PRIORITY NUMBER VECTOR Id_list NUMBER	      = { cur.d_pri = $2;		  cur.d_vec = $4;		  cur.d_ivnum = $5; } |	/* 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;		};Shad_dev_name:	device_name              = {                mk_shaddev($1);                }        ;Shad_const_list:	Shad_const_list AND Shad_const      | Shad_const         ;Shad_const:	device_name              = {                 add_shaddev($1);                 }	;   %%yyerror(s)	char *s;{	fprintf(stderr, "config: line %d: %s\n", yyline, 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;	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;	int i;	fl = (struct file_list *) malloc(sizeof *fl);	fl->f_type = SYSTEMSPEC;	fl->f_needs[0] = sysname;	for (i = 1; i < NNEEDS; i++) {		fl->f_needs[i] = 0;	}	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 *newswap(){	struct file_list *fl = (struct file_list *)malloc(sizeof (*fl));	int i;	fl->f_type = SWAPSPEC;	fl->f_next = 0;	fl->f_swapdev = NODEV;	fl->f_swapsize = 0;	for (i = 0; i < NNEEDS; i++) {		fl->f_needs[i] = 0;	}	fl->f_fn = 0;	return (fl);}/* * Add a swap device to the system's configuration */mkswap(system, fl, size)	struct file_list *system, *fl;	int size;{	register struct file_list **flp;	char *cp, 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;	/*	 * 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") || eq(fl->f_fn, "boot") || eq(fl->f_fn, "none"))		system->f_fn = ns(fl->f_fn);	else		system->f_fn = ns(system->f_needs[0]);}/* * 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){			yyerror(sprintf(errbuf,			    "%s connected to non-controller", dev));			return (0);		}		return (dp);	}	yyerror(sprintf(errbuf, "%s %d not defined", dev, num));	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) {		yyerror(sprintf(errbuf, "no %s's to wildcard", dev));		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 ?")	 */	if(dp->d_unit != -1)	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_adaptor = dp->d_nexus = QUES;		dp->d_name = ns(dev);		dp->d_type = oldtype;		dp->d_next = 0;		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_addr2 = dp->d_ivnum = 0;        dp->d_pri = dp->d_flags = dp->d_dk = 0;	dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;	dp->d_adaptor = dp->d_nexus = dp->d_extranum = UNKNOWN;}/* * 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(!can_nexus(dev->d_name))			yyerror("only vba's, uba's, mba's, xmi's, and vaxbi's should be connected to the nexus");		if (num != QUES)			yyerror("can't give specific nexus numbers");		break;	case MACHINE_SUN:		if (!eq(dev->d_name, "mb"))			yyerror("only mb's should be connected to the nexus");		break;	}}/* * Check the timezone to make certain it is sensible */check_tz(){	if (abs(timezone) > 12 * 60)		yyerror("timezone is unreasonable");	else		hadtz = 1;}/* * Check system specification and apply defaulting * rules on root, 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") || eq(swap->f_fn, "boot"));	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 = newswap();		dev = fl->f_rootdev;		if (minor(dev) & 07) {			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) {			sprintf(buf, "root device specified with %s swap",					fl->f_fn);			yyerror(buf);		}		if (fl->f_dumpdev != NODEV) {			sprintf(buf, "dump device specified with %s swap",					fl->f_fn);			yyerror(buf);		}		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;		sprintf(buf, "Warning, orphaned dump device, %s",			"do you know what you're doing");		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[0], "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[0], "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") || eq(fl->f_fn, "boot")||			eq(fl->f_fn, "none"))			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);}/* * 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. */finddev(dev)	dev_t dev;{	/* punt on this right now */	return (1);}char *tbl_pseudo_uba[] = { "kdb", "kdm", "klesib", 0 } ; /* * look up this device in a table to see if it needs a pseudo_uba. */needs_pseudo_uba(str)register	char	*str;{	register	char	**ptr = tbl_pseudo_uba;	while(*ptr) if(!strcmp(str,*ptr++)) return(1);		return(0);}char *tbl_must_nexus[] = { "mba", "vaxbi", "ci",  "xmi", "ibus", "vba", 0 };/* * See if the device must be connected to a nexus */must_nexus(str)register	char	*str;{	register	char	**ptr = tbl_must_nexus;	while(*ptr) if(!strcmp(str,*ptr++)) return(1);		return(0);}char *tbl_can_nexus[] = { "uba", "mba", "vaxbi", "ci", "xmi", "msi","ibus", "vba", 0 };/* * See if the device can be connected to a nexus */can_nexus(str)register	char	*str;{	register	char	**ptr = tbl_can_nexus;	while(*ptr) if(!strcmp(str,*ptr++)) return(1);		return(0);}/* * If a shadow device is used for storing the root file system, we * create a configuration data structure that will indicate the shadow * device and the associated physical devices. */mk_shaddev(name)register char *name;{    register struct shad_device *sp;    sp = (struct shad_device *) malloc(sizeof *sp);    sp->next_shad = NULL;    sp->shad_devt = shadnametodev(name, 1, 'a');     sp->num_of_const = 0;    if ( cur_shadp == 0 ) {        shad_tabp = sp;            }    else {        cur_shadp->next_shad = sp;    }    cur_shadp = sp;}/* * This function records the additional constituents of the shadow set. */add_shaddev(name)register char *name;{    register int i;    i = cur_shadp->num_of_const;    cur_shadp->constituents[i] = nametodev(name, 1, 'a');    cur_shadp->num_of_const++;}

⌨️ 快捷键说明

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