Missing _ in spl calls

Steven M. Schultz sms at wlv.imsd.contel.com
Thu Jun 6 16:46:57 AEST 1991


Subject: Missing _ in spl calls
Index:	sys/{sys,pdpuba,pdp}/<several> 2.11BSD

Description:
	A missing underscore in front of spl?() functions causes the
	generation of an extra instruction to save the current priority
	level.

	Statements of the form "(void) spl?();" do not need to save
	the current priority level.  The 'ed' scripts used in compiling
	the kernel will not generate the extra instruction if the _spl?()
	form of the call is used.

	The space savings are small (but real), the goal was to save some time.

Repeat-By:
	Examine the generated code.

Fix:
	Apply the following patches  and recompile the kernel.
-------------------------------------------------------------------------
*** /usr/src/sys/pdpuba/dz.c.old	Tue Apr  3 15:44:25 1990
--- /usr/src/sys/pdpuba/dz.c	Wed Jun  5 23:12:12 1991
***************
*** 157,168 ****
  	else
  		dzsoftCAR[unit >> 3] &= ~(1<<(unit&07));
  #endif /* BSD2_10 */
! 	(void) spl5();
  	while ((tp->t_state & TS_CARR_ON) == 0) {
  		tp->t_state |= TS_WOPEN;
  		sleep((caddr_t)&tp->t_rawq, TTIPRI);
  	}
! 	(void) spl0();
  	return ((*linesw[tp->t_line].l_open)(dev, tp));
  }
  
--- 157,168 ----
  	else
  		dzsoftCAR[unit >> 3] &= ~(1<<(unit&07));
  #endif /* BSD2_10 */
! 	(void) _spl5();
  	while ((tp->t_state & TS_CARR_ON) == 0) {
  		tp->t_state |= TS_WOPEN;
  		sleep((caddr_t)&tp->t_rawq, TTIPRI);
  	}
! 	(void) _spl0();
  	return ((*linesw[tp->t_line].l_open)(dev, tp));
  }
  
*** /usr/src/sys/sys/kern_clock.c.old	Fri Jun 22 15:46:17 1990
--- /usr/src/sys/sys/kern_clock.c	Wed Jun  5 23:05:41 1991
***************
*** 144,150 ****
  	}
  
  	if (needsoft && BASEPRI(ps)) {	/* if ps is high, just return */
! 		(void) splsoftclock();
  		softclock(pc,ps);
  	}
  	restormap(map);
--- 144,150 ----
  	}
  
  	if (needsoft && BASEPRI(ps)) {	/* if ps is high, just return */
! 		(void) _splsoftclock();
  		softclock(pc,ps);
  	}
  	restormap(map);
*** /usr/src/sys/sys/kern_sig.c.old	Sat Apr  7 22:39:58 1990
--- /usr/src/sys/sys/kern_sig.c	Wed Jun  5 23:07:01 1991
***************
*** 91,97 ****
  	/*
  	 * Change setting atomically.
  	 */
! 	(void) splhigh();
  	u.u_signal[sig] = sv->sv_handler;
  	u.u_sigmask[sig] = sv->sv_mask &~ cantmask;
  	if (sv->sv_flags & SV_INTERRUPT)
--- 91,97 ----
  	/*
  	 * Change setting atomically.
  	 */
! 	(void) _splhigh();
  	u.u_signal[sig] = sv->sv_handler;
  	u.u_sigmask[sig] = sv->sv_mask &~ cantmask;
  	if (sv->sv_flags & SV_INTERRUPT)
***************
*** 113,119 ****
  		else
  			p->p_sigcatch |= bit;
  	}
! 	(void) spl0();
  }
  
  sigblock()
--- 113,119 ----
  		else
  			p->p_sigcatch |= bit;
  	}
! 	(void) _spl0();
  }
  
  sigblock()
***************
*** 123,132 ****
  	} *uap = (struct a *)u.u_ap;
  	register struct proc *p = u.u_procp;
  
! 	(void) splhigh();
  	u.u_r.r_long = p->p_sigmask;
  	p->p_sigmask |= uap->mask &~ cantmask;
! 	(void) spl0();
  }
  
  sigsetmask()
--- 123,132 ----
  	} *uap = (struct a *)u.u_ap;
  	register struct proc *p = u.u_procp;
  
! 	(void) _splhigh();
  	u.u_r.r_long = p->p_sigmask;
  	p->p_sigmask |= uap->mask &~ cantmask;
! 	(void) _spl0();
  }
  
  sigsetmask()
***************
*** 136,145 ****
  	} *uap = (struct a *)u.u_ap;
  	register struct proc *p = u.u_procp;
  
! 	(void) splhigh();
  	u.u_r.r_long = p->p_sigmask;
  	p->p_sigmask = uap->mask &~ cantmask;
! 	(void) spl0();
  }
  
  sigpause()
--- 136,145 ----
  	} *uap = (struct a *)u.u_ap;
  	register struct proc *p = u.u_procp;
  
! 	(void) _splhigh();
  	u.u_r.r_long = p->p_sigmask;
  	p->p_sigmask = uap->mask &~ cantmask;
! 	(void) _spl0();
  }
  
  sigpause()
***************
*** 758,764 ****
  		 * mask from before the sigpause is what we want restored
  		 * after the signal processing is completed.
  		 */
! 		(void) splhigh();
  		if (p->p_flag & SOMASK) {
  			returnmask = u.u_oldmask;
  			p->p_flag &= ~SOMASK;
--- 758,764 ----
  		 * mask from before the sigpause is what we want restored
  		 * after the signal processing is completed.
  		 */
! 		(void) _splhigh();
  		if (p->p_flag & SOMASK) {
  			returnmask = u.u_oldmask;
  			p->p_flag &= ~SOMASK;
***************
*** 765,771 ****
  		} else
  			returnmask = p->p_sigmask;
  		p->p_sigmask |= u.u_sigmask[sig] | mask;
! 		(void) spl0();
  #ifdef UCB_RUSAGE
  		u.u_ru.ru_nsignals++;
  #endif
--- 765,771 ----
  		} else
  			returnmask = p->p_sigmask;
  		p->p_sigmask |= u.u_sigmask[sig] | mask;
! 		(void) _spl0();
  #ifdef UCB_RUSAGE
  		u.u_ru.ru_nsignals++;
  #endif
*** /usr/src/sys/sys/kern_synch.c.old	Thu May 24 23:49:36 1990
--- /usr/src/sys/sys/kern_synch.c	Wed Jun  5 23:07:32 1991
***************
*** 120,126 ****
  		 * by the filesystem, but for now avoid network interrupts
  		 * that might cause another panic.
  		 */
! 		(void)splnet();
  		noop();
  		splx(s);
  		return;
--- 120,126 ----
  		 * by the filesystem, but for now avoid network interrupts
  		 * that might cause another panic.
  		 */
! 		(void) _splnet();
  		noop();
  		splx(s);
  		return;
***************
*** 142,154 ****
  			if (rp->p_wchan)
  				unsleep(rp);
  			rp->p_stat = SRUN;
! 			(void) spl0();
  			goto psig;
  		}
  		if (rp->p_wchan == 0)
  			goto out;
  		rp->p_stat = SSLEEP;
! 		(void) spl0();
  		/*
  		 * maybe a very small core memory, give swapped out
  		 * processes a chance.
--- 142,154 ----
  			if (rp->p_wchan)
  				unsleep(rp);
  			rp->p_stat = SRUN;
! 			(void) _spl0();
  			goto psig;
  		}
  		if (rp->p_wchan == 0)
  			goto out;
  		rp->p_stat = SSLEEP;
! 		(void) _spl0();
  		/*
  		 * maybe a very small core memory, give swapped out
  		 * processes a chance.
***************
*** 165,171 ****
  			goto psig;
  	} else {
  		rp->p_stat = SSLEEP;
! 		(void) spl0();
  #ifdef UCB_RUSAGE
  		u.u_ru.ru_nvcsw++;
  #endif
--- 165,171 ----
  			goto psig;
  	} else {
  		rp->p_stat = SSLEEP;
! 		(void) _spl0();
  #ifdef UCB_RUSAGE
  		u.u_ru.ru_nvcsw++;
  #endif
*** /usr/src/sys/pdp/machdep2.c.old	Sat May 18 20:11:12 1991
--- /usr/src/sys/pdp/machdep2.c	Wed Jun  5 22:50:37 1991
***************
*** 384,390 ****
  	if ((howto&RB_NOSYNC)==0 && waittime < 0 && bfreelist[0].b_forw) {
  		waittime = 0;
  		printf("syncing disks... ");
! 		(void) splnet();
  		/*
  		 * Release inodes held by texts before update.
  		 */
--- 384,390 ----
  	if ((howto&RB_NOSYNC)==0 && waittime < 0 && bfreelist[0].b_forw) {
  		waittime = 0;
  		printf("syncing disks... ");
! 		(void) _splnet();
  		/*
  		 * Release inodes held by texts before update.
  		 */
***************
*** 406,412 ****
  		}
  		printf("done\n");
  	}
! 	(void)splhigh();
  	if (howto & RB_HALT) {
  		printf("halting\n");
  		halt();
--- 406,412 ----
  		}
  		printf("done\n");
  	}
! 	(void) _splhigh();
  	if (howto & RB_HALT) {
  		printf("halting\n");
  		halt();
*** /usr/src/sys/pdp/trap.c.old	Fri Aug  4 14:44:16 1989
--- /usr/src/sys/pdp/trap.c	Wed Jun  5 22:51:06 1991
***************
*** 94,100 ****
  	 * futher traps will be handled by looping in place.
  	 */
  	if (once_thru) {
! 		(void)splhigh();
  		for(;;);
  	}
  
--- 94,100 ----
  	 * futher traps will be handled by looping in place.
  	 */
  	if (once_thru) {
! 		(void) _splhigh();
  		for(;;);
  	}
  



More information about the Comp.bugs.2bsd mailing list