aboutsummaryrefslogtreecommitdiff
path: root/sys/alpha
diff options
context:
space:
mode:
authorKen Smith <kensmith@FreeBSD.org>2004-02-27 19:30:46 +0000
committerKen Smith <kensmith@FreeBSD.org>2004-02-27 19:30:46 +0000
commit44bacdd9bc31c10b13f4e22b37e1de0eec1473e6 (patch)
treeaaba1e753029dd44f37c1a7429da4e024293cd1a /sys/alpha
parent853bd372d1d567d9eb3d833918ba2e51f7d008e4 (diff)
Notes
Diffstat (limited to 'sys/alpha')
-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 9bd1f5b38d630..227c7fb676c31 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 4d41abced4f0a..35cda1b6db925 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) {