Module Name:    src
Committed By:   tsutsui
Date:           Sun Nov 20 15:38:00 UTC 2011

Modified Files:
        src/sys/arch/news68k/conf: GENERIC INSTALL files.news68k majors.news68k
        src/sys/arch/news68k/dev: if_le.c kb_hb.c si.c zs.c
        src/sys/arch/news68k/include: cpu.h vmparam.h
        src/sys/arch/news68k/news68k: locore.s machdep.c pmap_bootstrap.c
Added Files:
        src/sys/arch/news68k/news68k: romcalls.S romcons.c

Log Message:
Add preliminary PROM internal function based framebuffer console support,
which was demonstrated at Open Source Conference 2011 Kansai @ Kyoto
back in July:
http://www.NetBSD.org/gallery/events.html#opensourceconf2011-Kansai

- map 0xc0000000-0xffffffff PA region (which is mirror of PA 0x0-0x3fffffff)
  to the same VA via %tt0 and %tt1 registers and move KVA space accordingly
  (like luna68k does for its devices)
- save trap #0 vector for PROM function calls in early bootstrap
  and register it to trap #14 to call it from kernel for console output
- add dumb romcall based tty attachment taken from src/sys/dev/ofw/ofcons.c
- add rom function call stubs from news68k/stand/common/romcalls.S
- remove IIOV() macro for device registers where now mapped PA==VA via %tt1

XXX: romcons is not enabled yet because there is no generic interface
XXX: to attach wskbd(4) to non wsdisplay(4) devices like this romcons.


To generate a diff of this commit:
cvs rdiff -u -r1.106 -r1.107 src/sys/arch/news68k/conf/GENERIC
cvs rdiff -u -r1.53 -r1.54 src/sys/arch/news68k/conf/INSTALL
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/news68k/conf/files.news68k
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/news68k/conf/majors.news68k
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/news68k/dev/if_le.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/news68k/dev/kb_hb.c
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/news68k/dev/si.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/news68k/dev/zs.c
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/news68k/include/cpu.h
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/news68k/include/vmparam.h
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/news68k/news68k/locore.s
cvs rdiff -u -r1.95 -r1.96 src/sys/arch/news68k/news68k/machdep.c
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/news68k/news68k/pmap_bootstrap.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/news68k/news68k/romcalls.S \
    src/sys/arch/news68k/news68k/romcons.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/news68k/conf/GENERIC
diff -u src/sys/arch/news68k/conf/GENERIC:1.106 src/sys/arch/news68k/conf/GENERIC:1.107
--- src/sys/arch/news68k/conf/GENERIC:1.106	Sun Mar  6 17:08:28 2011
+++ src/sys/arch/news68k/conf/GENERIC	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.106 2011/03/06 17:08:28 bouyer Exp $
+# $NetBSD: GENERIC,v 1.107 2011/11/20 15:38:00 tsutsui Exp $
 #
 # GENERIC machine description file
 #
@@ -22,7 +22,7 @@ include		"arch/news68k/conf/std.news68k"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident 		"GENERIC-$Revision: 1.106 $"
+#ident 		"GENERIC-$Revision: 1.107 $"
 
 maxusers	8
 
@@ -221,6 +221,9 @@ ch*	at scsibus? target ? lun ?		# SCSI c
 ss*	at scsibus? target ? lun ?		# SCSI scanners
 uk*	at scsibus? target ? lun ?		# unknown SCSI devices
 
+# PROM console support
+#romcons0 at mainbus0
+
 #
 # accept filters
 pseudo-device   accf_data		# "dataready" accept filter

Index: src/sys/arch/news68k/conf/INSTALL
diff -u src/sys/arch/news68k/conf/INSTALL:1.53 src/sys/arch/news68k/conf/INSTALL:1.54
--- src/sys/arch/news68k/conf/INSTALL:1.53	Sun Mar 13 12:58:02 2011
+++ src/sys/arch/news68k/conf/INSTALL	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-# 	$NetBSD: INSTALL,v 1.53 2011/03/13 12:58:02 he Exp $
+# 	$NetBSD: INSTALL,v 1.54 2011/11/20 15:38:00 tsutsui Exp $
 
 #	config for bootable floppy kernel
 #
@@ -146,6 +146,9 @@ sd*	at scsibus? target ? lun ?		# SCSI d
 st*	at scsibus? target ? lun ?		# SCSI tapes
 cd*	at scsibus? target ? lun ?		# SCSI CD-ROMs
 
+# PROM console support
+#romcons0 at mainbus0
+
 # Misc.
 pseudo-device	loop			# loopback interface; required
 pseudo-device	pty		2	# pseudo-terminals (Sysinst needs two)

Index: src/sys/arch/news68k/conf/files.news68k
diff -u src/sys/arch/news68k/conf/files.news68k:1.32 src/sys/arch/news68k/conf/files.news68k:1.33
--- src/sys/arch/news68k/conf/files.news68k:1.32	Sun Jun 12 03:35:44 2011
+++ src/sys/arch/news68k/conf/files.news68k	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: files.news68k,v 1.32 2011/06/12 03:35:44 rmind Exp $
+#	$NetBSD: files.news68k,v 1.33 2011/11/20 15:38:00 tsutsui Exp $
 
 #	NEWS68K-specific configuration info
 
@@ -19,6 +19,7 @@ file	arch/news68k/news68k/isr.c
 file	arch/news68k/news68k/machdep.c
 file	arch/news68k/news68k/mainbus.c
 file	arch/news68k/news68k/pmap_bootstrap.c	compile-with "${NOPROF_C}"
+file	arch/news68k/news68k/romcalls.S
 file	arch/news68k/news68k/trap.c
 file	arch/m68k/m68k/cacheops.c
 file	arch/m68k/m68k/db_memrw.c		ddb | kgdb
@@ -99,6 +100,11 @@ device fd: disk
 attach fd at fdc
 file arch/news68k/dev/fd.c			fdc | fd needs-flag
 
+# PROM console support
+device romcons
+attach romcons at mainbus
+file arch/news68k/news68k/romcons.c		romcons needs-flag
+
 # Machine-independent SCSI driver
 include "dev/scsipi/files.scsipi"
 

Index: src/sys/arch/news68k/conf/majors.news68k
diff -u src/sys/arch/news68k/conf/majors.news68k:1.22 src/sys/arch/news68k/conf/majors.news68k:1.23
--- src/sys/arch/news68k/conf/majors.news68k:1.22	Thu Jun 30 20:09:34 2011
+++ src/sys/arch/news68k/conf/majors.news68k	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: majors.news68k,v 1.22 2011/06/30 20:09:34 wiz Exp $
+#	$NetBSD: majors.news68k,v 1.23 2011/11/20 15:38:00 tsutsui Exp $
 #
 # Device majors for news68k
 #
@@ -44,6 +44,7 @@ device-major	clockctl	char 76			clockctl
 device-major	cgd		char 78  block 33	cgd
 device-major	ksyms		char 79			ksyms
 device-major	wsfont		char 80			wsfont
+device-major	romcons		char 81			romcons
 
 device-major	nsmb		char 98			nsmb
 

Index: src/sys/arch/news68k/dev/if_le.c
diff -u src/sys/arch/news68k/dev/if_le.c:1.18 src/sys/arch/news68k/dev/if_le.c:1.19
--- src/sys/arch/news68k/dev/if_le.c:1.18	Tue Jan 19 22:06:21 2010
+++ src/sys/arch/news68k/dev/if_le.c	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_le.c,v 1.18 2010/01/19 22:06:21 pooka Exp $	*/
+/*	$NetBSD: if_le.c,v 1.19 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.18 2010/01/19 22:06:21 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.19 2011/11/20 15:38:00 tsutsui Exp $");
 
 #include "opt_inet.h"
 
@@ -137,7 +137,7 @@ le_match(device_t parent, cfdata_t cf, v
 	if (strcmp(ha->ha_name, "le"))
 		return 0;
 
-	addr = IIOV(ha->ha_address);
+	addr = (ha->ha_address);
 
 	if (badaddr((void *)addr, 1))
 		return 0;
@@ -154,10 +154,10 @@ le_attach(device_t parent, device_t self
 	const uint8_t *p;
 
 	sc->sc_dev = self;
-	lesc->sc_r1 = (void *)IIOV(ha->ha_address);
+	lesc->sc_r1 = (void *)(ha->ha_address);
 
 	if (ISIIOPA(ha->ha_address)) {
-		sc->sc_mem = (u_char *)IIOV(lance_mem_phys);
+		sc->sc_mem = (u_char *)(lance_mem_phys);
 		p = idrom_addr + 0x10;
 	} else {
 		sc->sc_mem = lesc->sc_r1 - 0x10000;

Index: src/sys/arch/news68k/dev/kb_hb.c
diff -u src/sys/arch/news68k/dev/kb_hb.c:1.12 src/sys/arch/news68k/dev/kb_hb.c:1.13
--- src/sys/arch/news68k/dev/kb_hb.c:1.12	Wed May 14 13:29:28 2008
+++ src/sys/arch/news68k/dev/kb_hb.c	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: kb_hb.c,v 1.12 2008/05/14 13:29:28 tsutsui Exp $	*/
+/*	$NetBSD: kb_hb.c,v 1.13 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 2001 Izumi Tsutsui.  All rights reserved.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kb_hb.c,v 1.12 2008/05/14 13:29:28 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kb_hb.c,v 1.13 2011/11/20 15:38:00 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -74,7 +74,7 @@ kb_hb_match(device_t parent, cfdata_t cf
 	if (ha->ha_address == (u_int)-1)
 		return 0;
 
-	addr = IIOV(ha->ha_address); /* XXX */
+	addr = (ha->ha_address); /* XXX */
 
 	if (badaddr((void *)addr, 1))
 		return 0;

Index: src/sys/arch/news68k/dev/si.c
diff -u src/sys/arch/news68k/dev/si.c:1.25 src/sys/arch/news68k/dev/si.c:1.26
--- src/sys/arch/news68k/dev/si.c:1.25	Tue Jun 17 18:24:21 2008
+++ src/sys/arch/news68k/dev/si.c	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: si.c,v 1.25 2008/06/17 18:24:21 tsutsui Exp $	*/
+/*	$NetBSD: si.c,v 1.26 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: si.c,v 1.25 2008/06/17 18:24:21 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: si.c,v 1.26 2011/11/20 15:38:00 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -107,7 +107,7 @@ si_match(device_t parent, cfdata_t cf, v
 	if (strcmp(ha->ha_name, "si"))
 		return 0;
 
-	addr = IIOV(ha->ha_address);
+	addr = (ha->ha_address);
 
 	if (badaddr((void *)addr, 1))
 		return 0;
@@ -182,7 +182,7 @@ si_attach(device_t parent, device_t self
 	ncr_sc->sc_channel.chan_id = 7;
 
 	/* soft reset DMAC */
-	sc->sc_regs = (void *)IIOV(DMAC_BASE);
+	sc->sc_regs = (void *)(DMAC_BASE);
 	sc->sc_regs->ctl = DC_CTL_RST;
 
 	ncr5380_attach(ncr_sc);

Index: src/sys/arch/news68k/dev/zs.c
diff -u src/sys/arch/news68k/dev/zs.c:1.30 src/sys/arch/news68k/dev/zs.c:1.31
--- src/sys/arch/news68k/dev/zs.c:1.30	Mon Apr 28 20:23:30 2008
+++ src/sys/arch/news68k/dev/zs.c	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs.c,v 1.30 2008/04/28 20:23:30 martin Exp $	*/
+/*	$NetBSD: zs.c,v 1.31 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.30 2008/04/28 20:23:30 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.31 2011/11/20 15:38:00 tsutsui Exp $");
 
 #include "opt_ddb.h"
 
@@ -166,7 +166,7 @@ zs_match(device_t parent, cfdata_t cf, v
 	if (ha->ha_address == (u_int)-1)
 		return 0;
 
-	addr = IIOV(ha->ha_address);
+	addr = (ha->ha_address);
 	/* This returns -1 on a fault (bus error). */
 	if (badaddr((void *)addr, 1))
 		return 0;
@@ -191,7 +191,7 @@ zs_attach(device_t parent, device_t self
 
 	zsc->zsc_dev = self;
 
-	zs = (void *)IIOV(ha->ha_address);
+	zs = (void *)(ha->ha_address);
 
 	clk = cf->cf_flags;
 	if (clk < 0 || clk >= NPCLK)

Index: src/sys/arch/news68k/include/cpu.h
diff -u src/sys/arch/news68k/include/cpu.h:1.39 src/sys/arch/news68k/include/cpu.h:1.40
--- src/sys/arch/news68k/include/cpu.h:1.39	Mon May 16 13:22:54 2011
+++ src/sys/arch/news68k/include/cpu.h	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.39 2011/05/16 13:22:54 tsutsui Exp $	*/
+/*	$NetBSD: cpu.h,v 1.40 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -162,6 +162,7 @@ extern u_int extiobase_phys, extiotop_ph
 extern u_int intrcnt[];
 
 extern void (*vectab[])(void);
+extern void *romcallvec;
 
 struct frame;
 

Index: src/sys/arch/news68k/include/vmparam.h
diff -u src/sys/arch/news68k/include/vmparam.h:1.18 src/sys/arch/news68k/include/vmparam.h:1.19
--- src/sys/arch/news68k/include/vmparam.h:1.18	Tue Feb  8 20:20:20 2011
+++ src/sys/arch/news68k/include/vmparam.h	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmparam.h,v 1.18 2011/02/08 20:20:20 rmind Exp $	*/
+/*	$NetBSD: vmparam.h,v 1.19 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -109,7 +109,7 @@
 #define VM_MAXUSER_ADDRESS	((vaddr_t)0xFFF00000)
 #define VM_MAX_ADDRESS		((vaddr_t)0xFFF00000)
 #define VM_MIN_KERNEL_ADDRESS	((vaddr_t)0)
-#define VM_MAX_KERNEL_ADDRESS	((vaddr_t)(0-PAGE_SIZE*NPTEPG))
+#define VM_MAX_KERNEL_ADDRESS	((vaddr_t)(0xC0000000-PAGE_SIZE*NPTEPG))
 
 /* virtual sizes (bytes) for various kernel submaps */
 #define VM_PHYS_SIZE		(USRIOSIZE*PAGE_SIZE)

Index: src/sys/arch/news68k/news68k/locore.s
diff -u src/sys/arch/news68k/news68k/locore.s:1.59 src/sys/arch/news68k/news68k/locore.s:1.60
--- src/sys/arch/news68k/news68k/locore.s:1.59	Tue Nov 15 10:57:03 2011
+++ src/sys/arch/news68k/news68k/locore.s	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.59 2011/11/15 10:57:03 tsutsui Exp $	*/
+/*	$NetBSD: locore.s,v 1.60 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -148,6 +148,7 @@ ASENTRY_NOPROFILE(start)
 
 	movc %vbr,%a0
 	movl %a0@(188),_ASM_LABEL(monitor)| save trap #15 to return PROM monitor
+	movl %a0@(128),_ASM_LABEL(romcallvec)| save trap #0 to use PROM calls
 
 	RELOC(esym, %a0)
 #if NKSYMS || defined(DDB) || defined(LKM)
@@ -395,11 +396,15 @@ Lstploaddone:
 	movc	%d0,%cacr		| turn on both caches
 	jmp	Lenab1
 Lmotommu2:
-#if 0 /* XXX use %tt0 register to map I/O space temporary */
+	/* Use %tt0 register to map I/O space */
 	RELOC(protott0, %a0)
-	movl	#0xe01f8550,%a0@	| use %tt0 (0xe0000000-0xffffffff)
+	movl	#0xe01f8543,%a0@	| use %tt0 (0xe0000000-0xffffffff)
 	.long	0xf0100800		| pmove %a0@,%tt0
-#endif
+	/* Use %tt1 register to map RAM  to use PROM calls */
+	RELOC(protott1, %a0)
+	movl	#0xc01f8143,%a0@	| use %tt1 (0xc0000000-0xdfffffff)
+	.long	0xf0100c00		| pmove %a0@,%tt1
+
 	RELOC(prototc, %a2)
 #if PGSHIFT == 13
 	movl	#0x82d08b00,%a2@	| value to load TC with
@@ -1221,6 +1226,9 @@ GLOBAL(cache_ctl)
 GLOBAL(cache_clr)
 	.long	0		| KVA of external cache clear port
 
+GLOBAL(romcallvec)
+	.long	0
+
 
 /* interrupt counters */
 GLOBAL(intrnames)

Index: src/sys/arch/news68k/news68k/machdep.c
diff -u src/sys/arch/news68k/news68k/machdep.c:1.95 src/sys/arch/news68k/news68k/machdep.c:1.96
--- src/sys/arch/news68k/news68k/machdep.c:1.95	Sun Jun 12 03:35:45 2011
+++ src/sys/arch/news68k/news68k/machdep.c	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.95 2011/06/12 03:35:45 rmind Exp $	*/
+/*	$NetBSD: machdep.c,v 1.96 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.95 2011/06/12 03:35:45 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.96 2011/11/20 15:38:00 tsutsui Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -99,6 +99,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 
 #include "ms.h"
 #include "si.h"
 #include "ksyms.h"
+#include "romcons.h"
 /* XXX etc. etc. */
 
 /* the following is used externally (sysctl_hw) */
@@ -795,15 +796,15 @@ news1700_init(void)
 	uint8_t *q;
 	u_int i;
 
-	dip_switch	= (uint8_t *)IIOV(0xe1c00100);
-	int_status	= (uint8_t *)IIOV(0xe1c00200);
+	dip_switch	= (uint8_t *)(0xe1c00100);
+	int_status	= (uint8_t *)(0xe1c00200);
 
-	idrom_addr	= (uint8_t *)IIOV(0xe1c00000);
-	ctrl_ast	= (uint8_t *)IIOV(0xe1280000);
-	ctrl_int2	= (uint8_t *)IIOV(0xe1180000);
-	ctrl_led	= (uint8_t *)IIOV(ctrl_led_phys);
+	idrom_addr	= (uint8_t *)(0xe1c00000);
+	ctrl_ast	= (uint8_t *)(0xe1280000);
+	ctrl_int2	= (uint8_t *)(0xe1180000);
+	ctrl_led	= (uint8_t *)(ctrl_led_phys);
 
-	sccport0a	= IIOV(0xe0d40002);
+	sccport0a	= (0xe0d40002);
 	lance_mem_phys	= 0xe0e00000;
 
 	p = idrom_addr;
@@ -824,9 +825,9 @@ news1700_init(void)
 	strcat(cpu_model, t);
 	news_machine_id = (idrom.id_serial[0] << 8) + idrom.id_serial[1];
 
-	ctrl_parity	= (uint8_t *)IIOV(0xe1080000);
-	ctrl_parity_clr	= (uint8_t *)IIOV(0xe1a00000);
-	parity_vector	= (uint8_t *)IIOV(0xe1c00200);
+	ctrl_parity	= (uint8_t *)(0xe1080000);
+	ctrl_parity_clr	= (uint8_t *)(0xe1a00000);
+	parity_vector	= (uint8_t *)(0xe1c00200);
 
 	parityenable();
 
@@ -981,20 +982,26 @@ intrhand_lev4(void)
 #define SW_AUTOSEL	0x07
 
 struct consdev *cn_tab = NULL;
-extern struct consdev consdev_bm, consdev_zs;
+extern struct consdev consdev_rom, consdev_zs;
 
 int tty00_is_console = 0;
 
 void
 consinit(void)
 {
+	uint8_t dipsw;
 
-	int dipsw = *dip_switch;
+	dipsw = *dip_switch;
 
-	dipsw &= ~SW_CONSOLE;
+	dipsw = ~dipsw;
 
 	switch (dipsw & SW_CONSOLE) {
-	default: /* XXX no fb support yet */
+	default: /* XXX no real fb support yet */
+#if NROMCONS > 0
+		cn_tab = &consdev_rom;
+		(*cn_tab->cn_init)(cn_tab);
+		break;
+#endif
 	case 0:
 		tty00_is_console = 1;
 		cn_tab = &consdev_zs;

Index: src/sys/arch/news68k/news68k/pmap_bootstrap.c
diff -u src/sys/arch/news68k/news68k/pmap_bootstrap.c:1.36 src/sys/arch/news68k/news68k/pmap_bootstrap.c:1.37
--- src/sys/arch/news68k/news68k/pmap_bootstrap.c:1.36	Sun Jan  2 18:48:06 2011
+++ src/sys/arch/news68k/news68k/pmap_bootstrap.c	Sun Nov 20 15:38:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_bootstrap.c,v 1.36 2011/01/02 18:48:06 tsutsui Exp $	*/
+/*	$NetBSD: pmap_bootstrap.c,v 1.37 2011/11/20 15:38:00 tsutsui Exp $	*/
 
 /* 
  * Copyright (c) 1991, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.36 2011/01/02 18:48:06 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.37 2011/11/20 15:38:00 tsutsui Exp $");
 
 #include "opt_m68k_arch.h"
 
@@ -162,8 +162,13 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f
 	 * each mapping 256kb.  Note that there may be additional "segment
 	 * table" pages depending on how large MAXKL2SIZE is.
 	 *
-	 * Portions of the last segment of KVA space (0xFFC00000 -
-	 * 0xFFFFFFFF) are mapped for the kernel page tables.
+	 * Portions of the last segment of KVA space (0xBFC00000 -
+	 * 0xBFFFFFFF) are mapped for the kernel page tables.
+	 *
+	 * The region 0xC0000000 - 0xCFFFFFFF is mapped via the %tt1 register
+	 * for RAM accesses for PROM.
+	 * The region 0xE0000000 - 0xFFFFFFFF is mapped via the %tt0 register
+	 * for I/O accesses.
 	 *
 	 * XXX cramming two levels of mapping into the single "segment"
 	 * table on the 68040 is intended as a temporary hack to get things
@@ -213,19 +218,20 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f
 			protoste += (SG4_LEV2SIZE * sizeof(st_entry_t));
 		}
 		/*
-		 * Initialize the final level 1 descriptor to map the next
-		 * block of level 2 descriptors for Sysptmap.
+		 * Initialize the level 1 descriptor correspond to
+		 * SYSMAP_VA to map the last block of level 2 descriptors
+		 * for Sysptmap.
 		 */
 		ste = (st_entry_t *)kstpa;
-		ste = &ste[SG4_LEV1SIZE - 1];
+		ste = &ste[SYSMAP_VA >> SG4_SHIFT1];
 		*ste = protoste;
 		/*
-		 * Now initialize the final portion of that block of
-		 * descriptors to map Sysmap.
+		 * Now initialize the portion of that block of
+		 * descriptors to map Sysptmap.
 		 */
 		i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE);
 		ste = (st_entry_t *)kstpa;
-		ste = &ste[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE)];
+		ste = &ste[i + ((SYSMAP_VA & SG4_MASK2) >> SG4_SHIFT2)];
 		este = &ste[NPTEPG / SG4_LEV3SIZE];
 		protoste = kptmpa | SG_U | SG_RW | SG_V;
 		while (ste < este) {
@@ -269,7 +275,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f
 			*pte++ = PG_NV;
 		}
 		/*
-		 * Initialize the last one to point to Sysptmap.
+		 * Initialize the one corresponding to SYSMAP_VA
+		 * to point to Sysptmap.
 		 */
 		pte = (pt_entry_t *)kptmpa;
 		pte = &pte[SYSMAP_VA >> SEGSHIFT];

Added files:

Index: src/sys/arch/news68k/news68k/romcalls.S
diff -u /dev/null src/sys/arch/news68k/news68k/romcalls.S:1.1
--- /dev/null	Sun Nov 20 15:38:01 2011
+++ src/sys/arch/news68k/news68k/romcalls.S	Sun Nov 20 15:38:00 2011
@@ -0,0 +1,86 @@
+/*	$NetBSD: romcalls.S,v 1.1 2011/11/20 15:38:00 tsutsui Exp $	*/
+
+/*-
+ * Copyright (c) 1999 Izumi Tsutsui.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <m68k/asm.h>
+#include <machine/romcall.h>
+
+	.text
+	.align	4
+
+#define SYSCALL	trap	#14	/* XXX */
+
+#if 0
+ENTRY_NOPROFILE(rom_halt)
+	moveq	#8, %d7		| RB_HALT
+	trap	#15
+#endif
+
+#if 0
+ENTRY_NOPROFILE(rom_open)
+	linkw	%a6, #0
+	moveml	%d2-%d7/%a2-%a5,%sp@-	| save %d2-%d7, %a2-%a5
+	moveq	#SYS_open, %d0
+	SYSCALL
+	moveml	%a6@(-40),%d2-%d7/%a2-%a5
+	unlk	%a6
+	rts
+
+ENTRY_NOPROFILE(rom_close)
+	linkw	%a6, #0
+	moveml	%d2-%d7/%a2-%a5,%sp@-	| save %d2-%d7, %a2-%a5
+	moveq	#SYS_close, %d0
+	SYSCALL
+	moveml	%a6@(-40),%d2-%d7/%a2-%a5
+	unlk	%a6
+	rts
+#endif
+
+ENTRY_NOPROFILE(rom_read)
+	linkw	%a6, #0
+	moveml	%d2-%d7/%a2-%a5,%sp@-	| save %d2-%d7, %a2-%a5
+	moveq	#SYS_read, %d0
+	SYSCALL
+	moveml	%a6@(-40),%d2-%d7/%a2-%a5
+	unlk	%a6
+	rts
+
+ENTRY_NOPROFILE(rom_write)
+	linkw	%a6, #0
+	moveml	%d2-%d7/%a2-%a5,%sp@-	| save %d2-%d7, %a2-%a5
+	moveq	#SYS_write, %d0
+	SYSCALL
+	moveml	%a6@(-40),%d2-%d7/%a2-%a5
+	unlk	%a6
+	rts
+
+ENTRY_NOPROFILE(rom_lseek)
+	linkw	%a6, #0
+	moveml	%d2-%d7/%a0-%a5,%sp@-	| save %d2-%d7, %a2-%a5
+	moveq	#SYS_lseek, %d0
+	SYSCALL
+	moveml	%a6@(-40),%d0-%d7/%a2-%a5
+	unlk	%a6
+	rts
Index: src/sys/arch/news68k/news68k/romcons.c
diff -u /dev/null src/sys/arch/news68k/news68k/romcons.c:1.1
--- /dev/null	Sun Nov 20 15:38:01 2011
+++ src/sys/arch/news68k/news68k/romcons.c	Sun Nov 20 15:38:00 2011
@@ -0,0 +1,354 @@
+/*	$NetBSD: romcons.c,v 1.1 2011/11/20 15:38:00 tsutsui Exp $	*/
+
+/*
+ * Copyright (C) 1995, 1996 Wolfgang Solfrank.
+ * Copyright (C) 1995, 1996 TooLs GmbH.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * romcons.c - from sys/dev/ofw/ofcons.c
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: romcons.c,v 1.1 2011/11/20 15:38:00 tsutsui Exp $");
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+#include <sys/systm.h>
+#include <sys/callout.h>
+#include <sys/tty.h>
+#include <sys/kauth.h>
+
+#include <dev/cons.h>
+
+#include <machine/autoconf.h>
+#include <machine/romcall.h>
+
+#include "ioconf.h"
+
+struct romcons_softc {
+	device_t sc_dev;
+	struct tty *sc_tty;
+	struct callout sc_poll_ch;
+	int sc_flags;
+#define	CONS_POLL	1
+};
+
+#define	BURSTLEN	128	/* max number of bytes to write in one chunk */
+
+cons_decl(romcons_);
+
+static int romcons_match(device_t, cfdata_t, void *);
+static void romcons_attach(device_t, device_t, void *);
+
+CFATTACH_DECL_NEW(romcons, sizeof(struct romcons_softc),
+    romcons_match, romcons_attach, NULL, NULL);
+
+dev_type_open(romcons_open);
+dev_type_close(romcons_close);
+dev_type_read(romcons_read);
+dev_type_write(romcons_write);
+dev_type_ioctl(romcons_ioctl);
+dev_type_tty(romcons_tty);
+dev_type_poll(romcons_poll);
+
+void romcons_kbdinput(int);
+
+const struct cdevsw romcons_cdevsw = {
+	romcons_open, romcons_close, romcons_read, romcons_write, romcons_ioctl,
+	nostop, romcons_tty, romcons_poll, nommap, ttykqfilter, D_TTY
+};
+
+struct consdev consdev_rom = cons_init(romcons_);
+
+bool romcons_is_console;
+
+static int
+romcons_match(device_t parent, cfdata_t match, void *aux)
+{
+	struct mainbus_attach_args *ma = aux;
+	static bool romcons_matched;
+
+	if (strcmp(ma->ma_name, "romcons"))
+		return 0;
+
+	if (!romcons_is_console)
+		return 0;
+
+	if (romcons_matched)
+		return 0;
+
+	romcons_matched = true;
+	return 1;
+}
+
+static void
+romcons_attach(device_t parent, device_t self, void *aux)
+{
+	struct romcons_softc *sc = device_private(self);
+
+	sc->sc_dev = self;
+	vectab[46] = romcallvec;	/* XXX */
+	aprint_normal("\n");
+
+	callout_init(&sc->sc_poll_ch, 0);
+}
+
+static void romcons_start(struct tty *);
+static int romcons_param(struct tty *, struct termios *);
+static void romcons_pollin(void *);
+
+int
+romcons_open(dev_t dev, int flag, int mode, struct lwp *l)
+{
+	struct romcons_softc *sc;
+	struct tty *tp;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+	if (sc == NULL)
+		return ENXIO;
+	if ((tp = sc->sc_tty) == 0)
+		sc->sc_tty = tp = tty_alloc();
+	tp->t_oproc = romcons_start;
+	tp->t_param = romcons_param;
+	tp->t_dev = dev;
+	if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp))
+		return EBUSY;
+	if ((tp->t_state & TS_ISOPEN) == 0) {
+		ttychars(tp);
+		tp->t_iflag = TTYDEF_IFLAG;
+		tp->t_oflag = TTYDEF_OFLAG;
+		tp->t_cflag = TTYDEF_CFLAG;
+		tp->t_lflag = TTYDEF_LFLAG;
+		tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
+		romcons_param(tp, &tp->t_termios);
+		ttsetwater(tp);
+	}
+	tp->t_state |= TS_CARR_ON;
+
+	if ((sc->sc_flags & CONS_POLL) == 0) {
+		sc->sc_flags |= CONS_POLL;
+		callout_reset(&sc->sc_poll_ch, 1, romcons_pollin, sc);
+	}
+
+	return (*tp->t_linesw->l_open)(dev, tp);
+}
+
+int
+romcons_close(dev_t dev, int flag, int mode, struct lwp *l)
+{
+	struct romcons_softc *sc;
+	struct tty *tp;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+	tp = sc->sc_tty;
+	callout_stop(&sc->sc_poll_ch);
+	sc->sc_flags &= ~CONS_POLL;
+	(*tp->t_linesw->l_close)(tp, flag);
+	ttyclose(tp);
+	return 0;
+}
+
+int
+romcons_read(dev_t dev, struct uio *uio, int flag)
+{
+	struct romcons_softc *sc;
+	struct tty *tp;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+	tp = sc->sc_tty;
+
+	return (*tp->t_linesw->l_read)(tp, uio, flag);
+}
+
+int
+romcons_write(dev_t dev, struct uio *uio, int flag)
+{
+	struct romcons_softc *sc;
+	struct tty *tp;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+	tp = sc->sc_tty;
+	return (*tp->t_linesw->l_write)(tp, uio, flag);
+}
+
+int
+romcons_poll(dev_t dev, int events, struct lwp *l)
+{
+	struct romcons_softc *sc;
+	struct tty *tp;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+	tp = sc->sc_tty;
+	return (*tp->t_linesw->l_poll)(tp, events, l);
+}
+int
+romcons_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
+{
+	struct romcons_softc *sc;
+	struct tty *tp;
+	int error;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+	tp = sc->sc_tty;
+	if ((error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l)) !=
+	    EPASSTHROUGH)
+		return error;
+	return ttioctl(tp, cmd, data, flag, l);
+}
+
+struct tty *
+romcons_tty(dev_t dev)
+{
+	struct romcons_softc *sc;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+	return sc->sc_tty;
+}
+
+static void
+romcons_start(struct tty *tp)
+{
+	int s, len;
+	uint8_t buf[BURSTLEN];
+
+	s = spltty();
+	if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) {
+		splx(s);
+		return;
+	}
+	tp->t_state |= TS_BUSY;
+	splx(s);
+	len = q_to_b(&tp->t_outq, buf, BURSTLEN);
+	s = splhigh();
+	rom_write(1, buf, len);
+	splx(s);
+	s = spltty();
+	tp->t_state &= ~TS_BUSY;
+	if (ttypull(tp)) {
+		tp->t_state |= TS_TIMEOUT;
+		callout_schedule(&tp->t_rstrt_ch, 1);
+	}
+	splx(s);
+}
+
+static int
+romcons_param(struct tty *tp, struct termios *t)
+{
+
+	tp->t_ispeed = t->c_ispeed;
+	tp->t_ospeed = t->c_ospeed;
+	tp->t_cflag = t->c_cflag;
+	return 0;
+}
+
+static void
+romcons_pollin(void *aux)
+{
+	struct romcons_softc *sc = aux;
+	struct tty *tp = sc->sc_tty;
+	char ch;
+	int rv;
+
+	while (0 && (rv = rom_read(1, &ch, 1)) > 0) {
+		if (tp && (tp->t_state & TS_ISOPEN))
+			(*tp->t_linesw->l_rint)(ch, tp);
+	}
+	callout_reset(&sc->sc_poll_ch, 1, romcons_pollin, sc);
+}
+
+void
+romcons_kbdinput(int ks)
+{
+	struct romcons_softc *sc;
+	struct tty *tp;
+
+	sc = device_lookup_private(&romcons_cd, 0);
+	tp = sc->sc_tty;
+	if (tp && (tp->t_state & TS_ISOPEN))
+		(*tp->t_linesw->l_rint)(ks, tp);
+}
+
+void
+romcons_cnprobe(struct consdev *cd)
+{
+}
+
+void
+romcons_cninit(struct consdev *cd)
+{
+	int maj;
+
+	maj = cdevsw_lookup_major(&romcons_cdevsw);
+	cd->cn_dev = makedev(maj, 0);
+	romcons_is_console = true;
+	vectab[46] = romcallvec;	/* XXX */
+}
+
+int
+romcons_cngetc(dev_t dev)
+{
+	unsigned char ch = '\0';
+	int l;
+
+	while ((l = rom_read(1, &ch, 1)) != 1)
+		if (l != -2 && l != 0)
+			return -1;
+	return ch;
+}
+
+void
+romcons_cnputc(dev_t dev, int c)
+{
+	char ch = c;
+
+	rom_write(1, &ch, 1);
+}
+
+void
+romcons_cnpollc(dev_t dev, int on)
+{
+	struct romcons_softc *sc;
+
+	sc = device_lookup_private(&romcons_cd, minor(dev));
+
+	if (sc == NULL)
+		return;
+	if (on) {
+		if (sc->sc_flags & CONS_POLL)
+			callout_stop(&sc->sc_poll_ch);
+		sc->sc_flags &= ~CONS_POLL;
+	} else {
+		if ((sc->sc_flags & CONS_POLL) == 0) {
+			sc->sc_flags |= CONS_POLL;
+			callout_reset(&sc->sc_poll_ch, 1, romcons_pollin, sc);
+		}
+	}
+}

Reply via email to