Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Mar 1995 08:23:32 +0100 (MET)
From:      J Wunsch <j@uriah.heep.sax.de>
To:        freebsd-hackers@FreeBSD.org (FreeBSD hackers)
Subject:   Re: calling up ddb from a comconsole
Message-ID:  <199503140723.IAA01352@uriah.heep.sax.de>
In-Reply-To: <199503140037.AAA01029@bagpuss.demon.co.uk> from "Karl Strickland" at Mar 14, 95 00:37:09 am

next in thread | previous in thread | raw e-mail | index | archive | help
As Karl Strickland wrote:
> 
> ideally i'd like to do this on 1.x, though if anyone has a patch for either
> 1.x or 2.x, please send it to me!

Had a hard time getting this machine up again...  This once happened
to work on a 2.0 box (actually, it still works).  It uses a BREAK
character to trigger DDB.  The patch is rather complex since it
adds another argument to siointr1 in order to pass the unit # down
(and decide if this port has been the console port).

Does anyone else have comments on this?


*** sio.c.orig	Wed Oct 12 19:11:00 1994
--- sio.c	Mon Oct 31 12:01:49 1994
***************
*** 272,278 ****
  static	timeout_t siodtrwakeup;
  static	void	comflush	__P((struct com_s *com));
  static	void	comhardclose	__P((struct com_s *com));
! static	void	siointr1	__P((struct com_s *com));
  static	void	commctl		__P((struct com_s *com, int bits, int how));
  static	int	comparam	__P((struct tty *tp, struct termios *t));
  static	int	sioprobe	__P((struct isa_device *dev));
--- 272,278 ----
  static	timeout_t siodtrwakeup;
  static	void	comflush	__P((struct com_s *com));
  static	void	comhardclose	__P((struct com_s *com));
! static	void	siointr1	__P((struct com_s *com, int unit));
  static	void	commctl		__P((struct com_s *com, int bits, int how));
  static	int	comparam	__P((struct tty *tp, struct termios *t));
  static	int	sioprobe	__P((struct isa_device *dev));
***************
*** 999,1005 ****
  	int	unit;
  {
  #ifndef COM_MULTIPORT
! 	siointr1(com_addr(unit));
  #else /* COM_MULTIPORT */
  	struct com_s    *com;
  	bool_t		possibly_more_intrs;
--- 999,1005 ----
  	int	unit;
  {
  #ifndef COM_MULTIPORT
! 	siointr1(com_addr(unit), unit);
  #else /* COM_MULTIPORT */
  	struct com_s    *com;
  	bool_t		possibly_more_intrs;
***************
*** 1018,1024 ****
  			if (com != NULL
  			    && (inb(com->int_id_port) & IIR_IMASK)
  			       != IIR_NOPEND) {
! 				siointr1(com);
  				possibly_more_intrs = TRUE;
  			}
  		}
--- 1018,1024 ----
  			if (com != NULL
  			    && (inb(com->int_id_port) & IIR_IMASK)
  			       != IIR_NOPEND) {
! 				siointr1(com, unit);
  				possibly_more_intrs = TRUE;
  			}
  		}
***************
*** 1027,1034 ****
  }
  
  static void
! siointr1(com)
  	struct com_s *com;
  {
  	u_char	line_status;
  	u_char	modem_status;
--- 1027,1035 ----
  }
  
  static void
! siointr1(com, unit)
  	struct com_s *com;
+ 	int unit;
  {
  	u_char	line_status;
  	u_char	modem_status;
***************
*** 1060,1065 ****
--- 1061,1080 ----
  				continue;
  			}
  #endif /* KGDB */
+ #if defined(COMCONSOLE) && defined(DDB)
+ 			if ((line_status & LSR_BI) /* BREAK */
+ 			    && unit == comconsole) {
+ 				static bool_t in_Debugger = FALSE;
+ 
+ 				if(!in_Debugger) {
+ 					in_Debugger = TRUE;
+ 					Debugger("console break");
+ 					in_Debugger = FALSE;
+ 					goto next;
+ 				}
+ 			}
+ #endif /* COMCONSOLE && DDB */
+ 
  			ioptr = com->iptr;
  			if (ioptr >= com->ibufend)
  				CE_RECORD(com, CE_INTERRUPT_BUF_OVERFLOW);
***************
*** 1085,1090 ****
--- 1100,1108 ----
  			 * "& 0x7F" is to avoid the gcc-1.40 generating a slow
  			 * jump from the top of the loop to here
  			 */
+ #if defined(COMCONSOLE) && defined(DDB)
+ 		      next:
+ #endif
  			line_status = inb(com->line_status_port) & 0x7F;
  		}
  
***************
*** 1715,1721 ****
  	 * stale input in sioopen().
  	 */
  	if (com->state >= (CS_BUSY | CS_TTGO))
! 		siointr1(com);
  
  	enable_intr();
  	splx(s);
--- 1733,1739 ----
  	 * stale input in sioopen().
  	 */
  	if (com->state >= (CS_BUSY | CS_TTGO))
! 		siointr1(com, unit);
  
  	enable_intr();
  	splx(s);
***************
*** 1767,1773 ****
  #endif
  	if (com->state & CS_BUSY) {
  		disable_intr();
! 		siointr1(com);
  		enable_intr();
  	} else if (tp->t_outq.c_cc != 0) {
  		u_int	ocount;
--- 1785,1791 ----
  #endif
  	if (com->state & CS_BUSY) {
  		disable_intr();
! 		siointr1(com, unit);
  		enable_intr();
  	} else if (tp->t_outq.c_cc != 0) {
  		u_int	ocount;
***************
*** 1777,1783 ****
  		disable_intr();
  		com->obufend = (com->optr = com->obuf) + ocount;
  		com->state |= CS_BUSY;
! 		siointr1(com);	/* fake interrupt to start output */
  		enable_intr();
  	}
  out:
--- 1795,1801 ----
  		disable_intr();
  		com->obufend = (com->optr = com->obuf) + ocount;
  		com->state |= CS_BUSY;
! 		siointr1(com, unit); /* fake interrupt to start output */
  		enable_intr();
  	}
  out:
***************
*** 1864,1870 ****
  		if (com != NULL
  		    && (com->state >= (CS_BUSY | CS_TTGO) || com->poll)) {
  			disable_intr();
! 			siointr1(com);
  			enable_intr();
  		}
  	}
--- 1882,1888 ----
  		if (com != NULL
  		    && (com->state >= (CS_BUSY | CS_TTGO) || com->poll)) {
  			disable_intr();
! 			siointr1(com, unit);
  			enable_intr();
  		}
  	}


-- 
cheers, J"org

joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/
Never trust an operating system you don't have sources for. ;-)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199503140723.IAA01352>