Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Feb 2004 10:38:17 -0500
From:      Ken Smith <kensmith@cse.Buffalo.EDU>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        freebsd-current@freebsd.org
Subject:   Re: Recent problems with -current on alpha...
Message-ID:  <20040227153817.GA22405@electra.cse.Buffalo.EDU>
In-Reply-To: <20040228010638.F2867@gamplex.bde.org>
References:  <20040227041147.GC26920@electra.cse.Buffalo.EDU> <20040228010638.F2867@gamplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Feb 28, 2004 at 02:00:44AM +1100, Bruce Evans wrote:
> On Thu, 26 Feb 2004, Ken Smith wrote:
> > My patch moves the initialization of the promcons stuff until after
> > the VM system is initialzed and comments out all the printf()'s I
> > could find that might have happened before the console is initialized.
> 
> This would break use of ddb until after the vm system is initialized
> (unless it is already broken).  i386 console initialization tries hard
> to initiatialize the console as early as possible so that it can be
> used for debugging.  This is less needed with gdb, but early printfs
> still need a console.

Yup, this was bothering me too.  Basically I'd like to get beast to
the point I don't need to manually boot it every day, but I'm stubborn
enough to not disable the nightly rebuild/reboot cron job just on the
principle of it.  :-)  So, I've been poking around at this as best I
can just to try and help isolate exactly what the problem is, I figured
then maybe someone(s) with a bigger clue than me can take it from there.

I don't know if this patch is an appropriate short-term fix (I'd tend
to agree with Marcel that Alpha's console handling could use a fairly
extensive overhaul).  But it demonstrates the problem and with this
patch beast seems to boot and runs just fine.  This is better than
what I had last night I think because it doesn't disturb what had
been in place before except for delaying when make_dev() gets called.
I don't know if that would have any bad side-effects.

If I move the call to promcons_delayed_makedev() above the code block
that this patch currently puts it under, and if I force the make_dev()
to be called (beast doesn't actually use promcons for its console
except during the early phase of the boot, it winds up switching to
a different console in machdep.c at the point the comment block
says "Initialize the real console, ...") then beast crashes with the
kernel stack issues.  With promcons_delayed_makedev() called where
this patch puts it and similarly forcing the call to make_dev() beast
doesn't crash and prints out two copies of every character sent to
the console during boot so I'm fairly sure the patch is doing what
is intended...

Further comments welcome...  I'm not totally sure where to go from
here unless Marcel and/or Drew wants to take over... :-)

Index: machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/alpha/alpha/machdep.c,v
retrieving revision 1.216
diff -u -r1.216 machdep.c
--- machdep.c	3 Jan 2004 02:02:24 -0000	1.216
+++ machdep.c	27 Feb 2004 13:28:23 -0000
@@ -201,6 +201,9 @@
 long	unknownmem;		/* amount of memory with an unknown use */
 int	ncpus;			/* number of cpus */
 
+int	promcons_dly_mkdev = 1;	/* need to delay call to make_dev() */
+void	promcons_delayed_makedev(void);
+
 vm_offset_t phys_avail[10];
 
 /* must be 2 less so 0 0 can signal end of chunks */
@@ -887,6 +890,14 @@
 		thread0.td_md.md_kernnest = 1;
 #endif
 	}
+
+	/*
+	 * Check to see if promcons needs to make_dev() now,
+	 * doing it before now crashes with kernel stack issues.
+	 */
+	if (promcons_dly_mkdev > 1)
+		promcons_delayed_makedev();
+	promcons_dly_mkdev = 0;
 
 	/*
 	 * Initialize the virtual memory system, and set the
Index: promcons.c
===================================================================
RCS file: /home/ncvs/src/sys/alpha/alpha/promcons.c,v
retrieving revision 1.34
diff -u -r1.34 promcons.c
--- promcons.c	21 Feb 2004 21:10:38 -0000	1.34
+++ promcons.c	27 Feb 2004 13:38:29 -0000
@@ -83,6 +83,9 @@
 int	promparam(struct tty *, struct termios *);
 void	promstop(struct tty *, int);
 
+extern	int promcons_dly_mkdev;
+void	promcons_delayed_makedev(void);
+
 int
 promopen(dev, flag, mode, td)
 	dev_t dev;
@@ -248,9 +251,22 @@
 {
 	prom_consdev.cn_pri = CN_NORMAL;
 	sprintf(prom_consdev.cn_name, "promcons");
-	make_dev(&prom_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "promcons");
-	cnadd(&prom_consdev);
+	if (promcons_dly_mkdev)
+		promcons_dly_mkdev++;
+	else {
+		make_dev(&prom_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "promcons");
+		cnadd(&prom_consdev);
+	}
 	promcn_attached = 1;
+}
+
+void
+promcons_delayed_makedev(void)
+{
+	if (promcn_attached) {
+		make_dev(&prom_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "promcons");
+		cnadd(&prom_consdev);
+	}
 }
 
 void


-- 
						Ken Smith
- From there to here, from here to      |       kensmith@cse.buffalo.edu
  there, funny things are everywhere.   |
                      - Theodore Geisel |



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