[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Spock@SAMSON.cadr.dialnet.symbolics.com: IFU]



Yes, there are problems in the IFU.  We have probably 25 or so IFU
machines.  *Most* of them work fine most of the time.  We've had a
couple of problematic machines.  For some reason, the problems like you
described appear to occur on particular machines (even with different board
sets).  My particular machine was plagued by the RPLACD errors.  They seemed
to come in bunches.  Another machine here was plagued with CALL-1 errors.

At least some people within Symbolics know there are problems.  I seriously
doubt that anything will be done about it (I don't like it, but that may
just be life).  It's sorta like the decision not to put an Ivory card out
to fit in the L-Bus machines.  Not enough manpower nor enough market.

Here is some code that I wrote to *try* to catch and prevent the CALL-1 errors.
This code should be considered somewhat untrusted as I've never seen it
correct the error.  However, the machine it was put into was getting the errors
almost daily but it has been running with this code for about 2 weeks without
having the error occur.   Notice that it tries to fix both a CALL-1 error and
an error on +.  I haven't had the RPLACD problem since I wrote this code so
I haven't tried to incorporate it.   Maybe you can...  (This code is based on
an idea from someone inside Symbolics (who had his own code but flushed it
before I asked for it) but all coding mistakes are my own.)

And, yes, it usually does help to replace the IFU.  But you may get the problem
back eventually.


;;; -*- Mode: LISP; Syntax: Common-Lisp; Package: USER; Base: 10; Default-character-style: (:FIX :ROMAN :NORMAL) -*-

;;; Specials so we can see what happened after the fact
(defvar 1*LAST-IFU-FIXER-PC* 0nil)
(defvar 1*LAST-IFU-FIXER-INSTRUCTION* 0nil)
(defvar 1*LAST-IFU-FIXER-ARGS* 0nil)
(defvar 1*LAST-IFU-FIXER-FRAME* 0nil)
(defvar 1*LAST-IFU-FIXER-ERR* 0nil)
(defvar 1*LAST-IFU-FIXER-FUNCTION* 0nil)

(define-global-handler 1IFU-FIXER 0DBG::RANDOM-WRONG-TYPE-ARGUMENT-TRAP (err)
  (DBG::WITH-ERRING-FRAME (frame err)
    (let* ((pc (send err :macro-pc))
	   (instruction (dbg::pc-instruction pc))
	   (function (dbg::instruction-function instruction))
	   (args (dbg::decode-instruction-arguments instruction)))
      (setq *last-ifu-fixer-pc* pc
	    *last-ifu-fixer-instruction* instruction
	    *last-ifu-fixer-function* function
	    *last-ifu-fixer-args* args
	    *last-ifu-fixer-frame* frame
	    *last-ifu-fixer-err* err)
      (when (and (eq function 'sys:call-1-stack)	;2We are only looking at this kind of error
0		 (null				;2See if it is ok the second time we check it...
0		   (dbg::check-arg-types
		     (second (symbol-value-in-instance err 'dbg:error-table-entry))	;2arg-desc
0		     args			;2args
0		     (symbol-value-in-instance err 'dbg::type-test)	;2type-test
0		     function			;2function
0		     (symbol-value-in-instance err 'dbg:error-table-entry)	;2error-table-entry
0		     pc				;2macro-pc
0		     (symbol-value-in-instance err 'dbg::error-handler-base-frame)))	;2error-handler-base-frame
0		 (dbg::proceed-type-p err :no-action))	;2See that NO-ACTION is defined
0	(tv:notify nil "Retrying a call to ~A that originally had an error ~S at ~A." function err pc)	;2Log the error
0	(sys:proceed err :no-action))		;2All ok, just go ahead
0      nil)))					;2Otherwise don't handle the error

0(define-global-handler 1IFU-FIXER-2 0DBG::WRONG-TYPE-ARGUMENT-TRAP (err)
  (DBG::WITH-ERRING-FRAME (frame err)
    (let* ((pc (send err :macro-pc))
	   (instruction (dbg::pc-instruction pc))
	   (function (dbg::instruction-function instruction))
	   (args (dbg::decode-instruction-arguments instruction)))
      (setq *last-ifu-fixer-pc* pc
	    *last-ifu-fixer-instruction* instruction
	    *last-ifu-fixer-function* function
	    *last-ifu-fixer-args* args
	    *last-ifu-fixer-frame* frame
	    *last-ifu-fixer-err* err)
      (when (and (eq function 'sys:+-internal)	;2We are only looking at this kind of error
0		 (null				;2See if it is ok the second time we check it...
0		   (dbg::check-arg-types
		     (second (symbol-value-in-instance err 'dbg:error-table-entry))	;2arg-desc
0		     args			;2args
0		     (symbol-value-in-instance err 'dbg::type-test)	;2type-test
0		     function			;2function
0		     (symbol-value-in-instance err 'dbg:error-table-entry)	;2error-table-entry
0		     pc				;2macro-pc
0		     (symbol-value-in-instance err 'dbg::error-handler-base-frame)))	;2error-handler-base-frame
0		 (dbg::proceed-type-p err :no-action))	;2See that NO-ACTION is defined
0	(tv:notify nil "Retrying a call to ~A that originally had an error ~S at ~A." function err pc)	;2Log the error
0	(sys:proceed err :no-action))		;2All ok, just go ahead
0      nil)))