static int dcons_drv_init(int stage) { int size, size0, offset; if (drv_init) return(drv_init); drv_init = -1; dcons_bufsize = DCONS_BUF_SIZE; #ifndef KLD_MODULE if (stage == 0) /* XXX or cold */ /* * DCONS_FORCE_CONSOLE == 1 and statically linked. * called from cninit(). can't use contigmalloc yet . */ dcons_buf = (struct dcons_buf *) bssbuf; else #endif /* * DCONS_FORCE_CONSOLE == 0 or kernel module case. * if the module is loaded after boot, * dcons_buf could be non-continuous. */ dcons_buf = (struct dcons_buf *) contigmalloc(dcons_bufsize, M_DEVBUF, 0, 0x10000, 0xffffffff, PAGE_SIZE, 0ul); offset = DCONS_HEADER_SIZE; size = (dcons_bufsize - offset); size0 = size * 3 / 4; dcons_init_port(0, offset, size0); offset += size0; dcons_init_port(1, offset, size - size0); dcons_buf->version = htonl(DCONS_VERSION); dcons_buf->magic = ntohl(DCONS_MAGIC); #if DDB && DCONS_FORCE_GDB #if CONS_NODEV gdbconsdev.cn_arg = (void *)&sc[DCONS_GDB]; #if __FreeBSD_version >= 501109 sprintf(gdbconsdev.cn_name, "dgdb"); #endif gdb_arg = &gdbconsdev; #else gdbdev = makedev(CDEV_MAJOR, DCONS_GDB); #endif gdb_getc = dcons_cngetc; gdb_putc = dcons_cnputc; #endif drv_init = 1; return 0; }
void dcons_init(struct dcons_buf *buf, int size, struct dcons_softc *sc) { int size0, size1, offset; offset = DCONS_HEADER_SIZE; size0 = (size - offset); size1 = size0 * 3 / 4; /* console port buffer */ dcons_init_port(0, offset, size1, buf, sc); offset += size1; dcons_init_port(1, offset, size0 - size1, buf, sc); buf->version = htonl(DCONS_VERSION); buf->magic = ntohl(DCONS_MAGIC); }