Index: external/bsd/drm2/radeon/radeon_pci.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/radeon/radeon_pci.c,v retrieving revision 1.7 diff -p -r1.7 radeon_pci.c *** external/bsd/drm2/radeon/radeon_pci.c 1 Mar 2015 10:07:01 -0000 1.7 --- external/bsd/drm2/radeon/radeon_pci.c 1 Mar 2015 11:24:38 -0000 *************** radeon_attach(device_t parent, device_t *** 187,192 **** --- 187,194 ---- "i386 radeondrmkms hack\n"); #endif + config_console_incr(self); + config_mountroot(self, &radeon_attach_real); } *************** radeon_attach_real(device_t self) *** 241,246 **** --- 243,249 ---- } out: sc->sc_dev = self; + config_console_decr(self); } static int Index: kern/init_main.c =================================================================== RCS file: /cvsroot/src/sys/kern/init_main.c,v retrieving revision 1.461 diff -p -r1.461 init_main.c *** kern/init_main.c 27 Nov 2014 14:38:09 -0000 1.461 --- kern/init_main.c 1 Mar 2015 11:24:38 -0000 *************** main(void) *** 713,718 **** --- 713,724 ---- panic("fork aiodoned"); /* + * Make sure the console has been configured via any deferred + * mechanisms. + */ + config_finalize_console(); + + /* * Okay, now we can let init(8) exec! It's off to userland! */ mutex_enter(proc_lock); Index: kern/subr_autoconf.c =================================================================== RCS file: /cvsroot/src/sys/kern/subr_autoconf.c,v retrieving revision 1.233 diff -p -r1.233 subr_autoconf.c *** kern/subr_autoconf.c 6 Nov 2014 08:46:04 -0000 1.233 --- kern/subr_autoconf.c 1 Mar 2015 11:24:38 -0000 *************** static volatile int alldevs_nread = 0; *** 225,230 **** --- 225,231 ---- static volatile int alldevs_nwrite = 0; static int config_pending; /* semaphore for mountroot */ + static int config_console; /* semaphore for console */ static kmutex_t config_misc_lock; static kcondvar_t config_misc_cv; *************** config_finalize(void) *** 2136,2141 **** --- 2137,2185 ---- } } + /* + * Manipulate the config_console semaphore. + */ + void + config_console_incr(device_t dev) + { + + mutex_enter(&config_misc_lock); + config_console++; + #ifdef DEBUG_AUTOCONF + printf("%s: %s %d\n", __func__, device_xname(dev), config_console); + #endif + mutex_exit(&config_misc_lock); + } + + void + config_console_decr(device_t dev) + { + + #ifdef DIAGNOSTIC + if (config_console == 0) + panic("config_console_decr: config_console == 0"); + #endif + mutex_enter(&config_misc_lock); + config_console--; + #ifdef DEBUG_AUTOCONF + printf("%s: %s %d\n", __func__, device_xname(dev), config_console); + #endif + if (config_console == 0) + cv_broadcast(&config_misc_cv); + mutex_exit(&config_misc_lock); + } + + void + config_finalize_console(void) + { + + mutex_enter(&config_misc_lock); + while (config_console != 0) + cv_wait(&config_misc_cv, &config_misc_lock); + mutex_exit(&config_misc_lock); + } + void config_twiddle_init(void) { Index: sys/device.h =================================================================== RCS file: /cvsroot/src/sys/sys/device.h,v retrieving revision 1.146 diff -p -r1.146 device.h *** sys/device.h 22 Nov 2014 11:04:57 -0000 1.146 --- sys/device.h 1 Mar 2015 11:24:38 -0000 *************** void config_interrupts(device_t, void (* *** 474,484 **** --- 474,487 ---- void config_mountroot(device_t, void (*)(device_t)); void config_pending_incr(device_t); void config_pending_decr(device_t); + void config_console_incr(device_t); + void config_console_decr(device_t); void config_create_interruptthreads(void); void config_create_mountrootthreads(void); int config_finalize_register(device_t, int (*)(device_t)); void config_finalize(void); + void config_finalize_console(void); void config_twiddle_init(void); void config_twiddle_fn(void *);