small patches for atari kernel

Izumi Tsutsui <[email protected]> Wed, 21 Jan 2009 21:53:19 +0900
Newsgroups gmane.os.netbsd.ports.atari
Message-ID <[email protected]>
Could anyone try the following small changes?

1) use pmap_kenter_pa(9) rather than pmap_enter(9) to map msgbuf
   as other ports (msgbuf pages are not managed by pmap)

2) replace multi-statement macro using GCC extension `({})' in atari5380.c
   with static inline functions to avoid possible side effects or confusion

http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-atari-BOOT-5.0_BETA-20090121.gz

Comments? (these are other concerns ;-)

---

Index: atari/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/machdep.c,v
retrieving revision 1.150.6.1
diff -u -r1.150.6.1 machdep.c
--- atari/machdep.c	8 Jan 2009 22:19:14 -0000	1.150.6.1
+++ atari/machdep.c	21 Jan 2009 12:28:54 -0000
@@ -181,9 +181,8 @@
 	 * and initialize it now.
 	 */
 	for (i = 0; i < btoc(MSGBUFSIZE); i++)
-		pmap_enter(pmap_kernel(), (vaddr_t)msgbufaddr + i * PAGE_SIZE,
-		    msgbufpa + i * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE,
-		    VM_PROT_READ|VM_PROT_WRITE|PMAP_WIRED);
+		pmap_kenter_pa((vaddr_t)msgbufaddr + i * PAGE_SIZE,
+		    msgbufpa + i * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE);
 	pmap_update(pmap_kernel());
 	initmsgbuf(msgbufaddr, m68k_round_page(MSGBUFSIZE));
 
Index: dev/atari5380.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/dev/atari5380.c,v
retrieving revision 1.46
diff -u -r1.46 atari5380.c
--- dev/atari5380.c	29 Oct 2008 14:31:01 -0000	1.46
+++ dev/atari5380.c	21 Jan 2009 12:28:54 -0000
@@ -136,20 +136,29 @@
 	volatile u_char		s_hdma_ctrl;	/* Hades control register */
 };
 
-#define	set_scsi_dma(addr, val)	(void)(					\
-	{								\
-	volatile u_char	*address = (volatile u_char *)addr+1;		\
-	u_long	nval	 = (u_long)val;					\
-	__asm("movepl	%0, %1@(0)": :"d" (nval), "a" (address));	\
-	})
-
-#define	get_scsi_dma(addr, res)	(					\
-	{								\
-	volatile u_char	*address = (volatile u_char *)addr+1;		\
-	u_long	nval;							\
-	__asm("movepl	%1@(0), %0": "=d" (nval) : "a" (address));	\
-	res = (u_long)nval;						\
-	})
+static inline void set_scsi_dma(volatile u_char *, u_long);
+static inline u_long get_scsi_dma(volatile u_char *);
+
+static inline void
+set_scsi_dma(volatile u_char *addr, u_long val)
+{
+	volatile u_char *address;
+
+	address = addr + 1;
+	__asm("movepl	%0, %1@(0)": :"d" (val), "a" (address));
+}
+
+static inline u_long
+get_scsi_dma(volatile u_char *addr)
+{
+	volatile u_char	*address;
+	u_long	nval;
+
+	address = addr + 1;
+	__asm("movepl	%1@(0), %0": "=d" (nval) : "a" (address));
+
+	return nval;
+}
 
 /*
  * Defines for TT-DMA control register
@@ -432,13 +441,12 @@
 {
 	int	dmastat, dmstat;
 	u_char	*byte_p;
-	u_long	leftover, ptr;
+	u_long	leftover;
 
 	dmastat = SCSI_DMA->s_dma_ctrl;
 	dmstat  = GET_TT_REG(NCR5380_DMSTAT);
-	get_scsi_dma(SCSI_DMA->s_dma_cnt, leftover);
-	get_scsi_dma(SCSI_DMA->s_dma_ptr, ptr);
-	byte_p = (u_char *)ptr;
+	leftover = get_scsi_dma(SCSI_DMA->s_dma_cnt);
+	byte_p = (u_char *)get_scsi_dma(SCSI_DMA->s_dma_ptr);
 
 	if (dmastat & SD_BUSERR) {
 		/*
@@ -495,7 +503,7 @@
 extern	int			*nofault;
 	label_t			faultbuf;
 	int			write;
-	u_long	 		count, t;
+	u_long	 		count;
 	volatile u_char		*data_p = (volatile u_char *)(stio_addr+0x741);
 
 	/*
@@ -512,7 +520,6 @@
 	nofault = (int *) &faultbuf;
 
 	if (setjmp((label_t *) nofault)) {
-		u_char	*ptr;
 		u_long	cnt, tmp;
 
 		PID("drq berr");
@@ -521,16 +528,14 @@
 		/*
 		 * Determine number of bytes transferred
 		 */
-		get_scsi_dma(SCSI_DMA->s_dma_ptr, tmp);
-		ptr = (u_char *)tmp;
-		cnt = dma_ptr - ptr;
+		cnt = (u_long)dma_ptr - get_scsi_dma(SCSI_DMA->s_dma_ptr);
 
 		if (cnt != 0) {
 			/*
 			 * Update the DMA pointer/count fields
 			 */
-			set_scsi_dma(SCSI_DMA->s_dma_ptr, dma_ptr);
-			get_scsi_dma(SCSI_DMA->s_dma_cnt, tmp);
+			set_scsi_dma(SCSI_DMA->s_dma_ptr, (u_long)dma_ptr);
+			tmp = get_scsi_dma(SCSI_DMA->s_dma_cnt);
 			set_scsi_dma(SCSI_DMA->s_dma_cnt, tmp - cnt);
 
 			if (tmp > cnt) {
@@ -590,9 +595,8 @@
 	}
 #endif
 
-	get_scsi_dma(SCSI_DMA->s_dma_cnt, count);
-	get_scsi_dma(SCSI_DMA->s_dma_ptr, t);
-	dma_ptr = (u_char *)t;
+	count = get_scsi_dma(SCSI_DMA->s_dma_cnt);
+	dma_ptr = (u_char *)get_scsi_dma(SCSI_DMA->s_dma_ptr);
 
 	/*
 	 * Keep pushing bytes until we're done or a bus-error

---
Izumi Tsutsui