diff options
author | kensmith <kensmith@FreeBSD.org> | 2004-02-27 19:30:46 +0000 |
---|---|---|
committer | kensmith <kensmith@FreeBSD.org> | 2004-02-27 19:30:46 +0000 |
commit | 74ac2d2c4d1597c12027af700def585763cff043 (patch) | |
tree | aaba1e753029dd44f37c1a7429da4e024293cd1a /sys/alpha | |
parent | 9cfcf409f198993a7a4c8261a85d5831bf03e268 (diff) | |
download | FreeBSD-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)
Diffstat (limited to 'sys/alpha')
-rw-r--r-- | sys/alpha/alpha/machdep.c | 11 | ||||
-rw-r--r-- | sys/alpha/alpha/promcons.c | 20 |
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) { |