Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Jan 1995 02:07:01 -0500 (EST)
From:      Wankle Rotary Engine <wpaul@skynet.ctr.columbia.edu>
To:        bde@zeta.org.au (Bruce Evans)
Cc:        freebsd-hackers@FreeBSD.org
Subject:   Re: Is this a bug?!?
Message-ID:  <199501250707.CAA02379@skynet.ctr.columbia.edu>
In-Reply-To: <199501240536.QAA10618@godzilla.zeta.org.au> from "Bruce Evans" at Jan 24, 95 04:36:02 pm

next in thread | previous in thread | raw e-mail | index | archive | help
They say this Bruce Evans person was kidding when he wrote:
> 
> >that writing to /dev/ttyv0 actually causes the kernel to go from
> >write(), to vn_write(), to ffsspec_write(), to spec_write(), to cn_write(),
> >to scwrite(), to ttwrite() and then to b_to_q() and a panic. The
> 
> This layering seems excessive.

A man after my own heart! This isn't the end of the line either. Normally 
(without panics) ttwrite() would eventually get to putc(), which would then 
find its way back to syscons and scput(). It looks to me though that
there's no way to improve on this without changing a huge number of 
related things.
 
> 0/0 is correct for the console.  It gets translated to 12/0 in cons.c.
> The current version of syscons, and all versions of sio, cannot tell
> if they are working with the 0/0 device, and this causes problems when
> the 12/0 device is closed while the 0/0 device is open or vice versa.
> I fixed this, but now the process group info for the 12/0 device doesn't
> go away when the 12/0 device is closed, and TIOCSTTY fails in login_tty().
> 
> Bruce

"My lord, I have a cunning plan."

Hurm. Okay, I think I have a fix for this (conceptually at least: I
only just now managed to wrap my brain around this whole process in a 
satisfactory manner, and now I'm too tired to code). I think the answer
is to stop trying to share one tty struct between what are fast becoming
two seperate devices and instead give /dev/console a tty struct of its 
very own. (I wonder if we should start thinking of giving it a devconf
entry too... maybe later -- one disgusting hack at a time. :) There's a 
small amount of nastiness in what I have in mind, but it's far better 
than throwing in a ton of special case handling code to keep /dev/console 
and its associated physical device from tripping over each other.

First off, I like the idea of wedging cn{open, close}() in between
spec_{open, close}() and sc{open,close}(). But I think that having
cnopen() 'lie' to the underlying device driver is a Bad Thing: it always 
passes 12/0 to scopen() as a device value, which means that there's no 
way for syscons to know if it's dealing with /dev/ttyv0 or /dev/console.
Yes, I know this would mean tying different device drivers together
in a disgusting way, but cons.c can't handle this by itself. What I 
propose is this:

- Have cons.c declare a tty struct for itself (thus eating up a small
  chunk of memory. oh well).
- Pass the real device value to the underlying driver. (0/0, 12/0 or 28/0,
  depending on the circumstances)
- Let scopen() (and sioopen()) test the value of 'dev' that's passed to
  it: if it's given a device with a major value of 0, then it knows that
  it's being asked to handle the console, and it can point 'tp' at the 
  console's tty struct instead of one of its own array of tty structs.
  If major(dev) isn't 0, then go about business as usual.
- Implement similar hackery for scclose() (and sioclose()).

I think this would prevent the process group info straight (you'd no
longer have to worry about the two different open and close calls
clobbering each other since you'd have two independent sets of 
data -- I don't see an immediate problem with this, but then again I'm 
also half asleep). If done right, it should also allow for the correct 
t_dev value to show up in the process table, which would solve the 
problem of 'w' not working right when using /dev/console as a real live 
login device. This in turn would allow me to implement my Master Plan (tm), 
which is to actually have people *use* /dev/console as a login device. 
(Call me crazy, but "Last login on console" just looks cooler than "Last 
login on ttyv0.") Finally, this would keep all the changes isloated to
the i386-specific code, which is a pretty good idea since this is 
largely an i386-specific bug. :)

I can see only one problem with all this: it would break PCVT, though 
hopefully not so badly that the PCVT author would be seized with an  
irresistable urge to hunt me down and force me to watch Highlander II 
until my eyes bleed.

Tomorrow I'll take a whack at this to see if it'll actually work. 

"So what do you think sirs?"

-Bill

-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~T~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Bill Paul            (212) 854-6020 | System Manager
Work:         wpaul@ctr.columbia.edu | Center for Telecommunications Research
Home:  wpaul@skynet.ctr.columbia.edu | Columbia University, New York City
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Møøse Illuminati: ignore it and be confused, or join it and be confusing!
~~~~~~~~ FreeBSD 2.1.0-Development #1: Fri Jan 20 14:28:17 EST 1995 ~~~~~~~~~



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