summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkensmith <kensmith@FreeBSD.org>2004-02-27 19:30:46 +0000
committerkensmith <kensmith@FreeBSD.org>2004-02-27 19:30:46 +0000
commit74ac2d2c4d1597c12027af700def585763cff043 (patch)
treeaaba1e753029dd44f37c1a7429da4e024293cd1a
parent9cfcf409f198993a7a4c8261a85d5831bf03e268 (diff)
downloadFreeBSD-src-74ac2d2c4d1597c12027af700def585763cff043.zip
FreeBSD-src-74ac2d2c4d1597c12027af700def585763cff043.tar.gz
Fix -current builds on alpha. Recent changes in device handling caused
subtle problems with how alpha was handling the promcons device. This moves the call to make_dev() for the promcons device to a later point of the boot-up sequence than where promcons initially gets attached, make_dev() called during the first attach crashes due to kernel stack issues. Reviewed by: gallatin, marcel, phk Discussed on: -current@, -alpha@ Approved by: rwatson (mentor)
-rw-r--r--sys/alpha/alpha/machdep.c11
-rw-r--r--sys/alpha/alpha/promcons.c20
2 files changed, 29 insertions, 2 deletions
diff --git a/sys/alpha/alpha/machdep.c b/sys/alpha/alpha/machdep.c
index 9bd1f5b..227c7fb 100644
--- a/sys/alpha/alpha/machdep.c
+++ b/sys/alpha/alpha/machdep.c
@@ -201,6 +201,9 @@ long unusedmem; /* amount of memory for OS that we don't use */
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 */
@@ -889,6 +892,14 @@ alpha_init(pfn, ptb, bim, bip, biv)
}
/*
+ * 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
* page table base register in proc 0's PCB.
*/
diff --git a/sys/alpha/alpha/promcons.c b/sys/alpha/alpha/promcons.c
index 4d41abc..35cda1b 100644
--- a/sys/alpha/alpha/promcons.c
+++ b/sys/alpha/alpha/promcons.c
@@ -83,6 +83,9 @@ void promtimeout(void *);
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,12 +251,25 @@ promcnattach(int alpha_console)
{
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
promcndetach(void)
{
if (promcn_attached) {
OpenPOWER on IntegriCloud