clock function crashes /usr/ucb/px

Steven M. Schultz sms at wlv.imsd.contel.com
Sat Jan 6 08:34:56 AEST 1990


Subject: clock function crashes 'px'
Index:	ucb/pascal/px/34fun.s 2.10BSD

Description:
	The "clock" function causes a floating point exception core
	dump in /usr/ucb/px.

Repeat-By:
	Put the following test program into p.p,

program spin(input,output);

var
	i,j: integer;

begin
	i := clock;
	writeln(i);
	j := 0;
	repeat
		j := j+1;
	until j >= 100000;
	i := clock;
	writeln(i);
end.

	Then:
	
	pi p.p
	px obj

	Note the floating point exception.

Fix:
	Even if the floating point exception did not occur, the
	answers returned could be wrong because only the low order
	of the time values were being used in the calculations.

	Actual cause of the exception was a divide by zero, there
	was a missing 'setl' instruction which led to a zero being
	used in the ticks to milliseconds conversion.

	In addition to returning the correct answer, the code has
	also been reduced in size.

	Apply the following patch to /usr/src/ucb/pascal/px/34fun.s,
	recompile and install 'px'.

*** 34fun.s.old	Fri Mar 13 05:27:43 1987
--- 34fun.s	Tue Jan  2 15:58:46 1990
***************
*** 36,46 ****
  	mov	$EARGV,_perrno
  	error	EARGV
  _SCLCK:
! 	mov	$6,-(sp)
  	br	1f
  _CLCK:
! 	mov	$2,-(sp)
  1:
  	sub	$16.,sp
  	mov	sp,r0
  	mov	r0,-(sp)
--- 36,47 ----
  	mov	$EARGV,_perrno
  	error	EARGV
  _SCLCK:
! 	mov	$4,-(sp)
  	br	1f
  _CLCK:
! 	clr	-(sp)
  1:
+ 	seti
  	sub	$16.,sp
  	mov	sp,r0
  	mov	r0,-(sp)
***************
*** 48,63 ****
  	tst	(sp)+
  	mov	sp,r0
  	add	16.(sp),r0
! 	mov	(r0),r0
  	add	$18.,sp
- 	mul	$1000.,r0
- 	mov	r1,-(sp)
- 	mov	r0,-(sp)
- 	movif	(sp)+,fr0
- 	mov	$HZ,-(sp)
- 	sxt	-(sp)
- 	movif	(sp)+,fr1
  	divf	fr1,fr0
  	movfi	fr0,-(sp)
  	return
  _DATE:
--- 49,60 ----
  	tst	(sp)+
  	mov	sp,r0
  	add	16.(sp),r0
! 	movif	$HZ,fr1
! 	setl
! 	movif	(r0),fr0
  	add	$18.,sp
  	divf	fr1,fr0
+ 	mulf	$042572,fr0		/ mulf $1000.,fr0 
  	movfi	fr0,-(sp)
  	return
  _DATE:



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