public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] H8/300 support update (2/4)
@ 2003-05-02  6:18 Yoshinori Sato
  0 siblings, 0 replies; only message in thread
From: Yoshinori Sato @ 2003-05-02  6:18 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel Mailinglist

[-- Attachment #1: Type: text/plain, Size: 141 bytes --]

include

o fixed exception stack handling.
o fixed context switch problem.
o syscall6 add.

-- 
Yoshinori Sato
<ysato@users.sourceforge.jp>


[-- Attachment #2: linux-2.5.68-h8300-include.diff --]
[-- Type: application/octet-stream, Size: 10852 bytes --]

Index: include/asm-h8300/atomic.h
===================================================================
RCS file: /var/lib/cvs/linux-2.5/include/asm-h8300/atomic.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- include/asm-h8300/atomic.h	21 Apr 2003 02:22:47 -0000	1.1.1.1
+++ include/asm-h8300/atomic.h	1 May 2003 13:43:46 -0000	1.2
@@ -101,7 +101,4 @@
 #define smp_mb__before_atomic_inc()    barrier()
 #define smp_mb__after_atomic_inc() barrier()
 
-#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
-#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
-
 #endif /* __ARCH_H8300_ATOMIC __ */
Index: include/asm-h8300/bitops.h
===================================================================
RCS file: /var/lib/cvs/linux-2.5/include/asm-h8300/bitops.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- include/asm-h8300/bitops.h	21 Apr 2003 02:22:47 -0000	1.1.1.1
+++ include/asm-h8300/bitops.h	25 Apr 2003 17:36:37 -0000	1.2
@@ -10,6 +10,7 @@
 #include <linux/config.h>
 #include <linux/compiler.h>
 #include <asm/byteorder.h>	/* swab32 */
+#include <asm/system.h>
 
 #ifdef __KERNEL__
 /*
@@ -352,57 +353,45 @@
 #define hweight16(x) generic_hweight16(x)
 #define hweight8(x) generic_hweight8(x)
 
-extern __inline__ int ext2_set_bit(int nr, volatile void *addr)
+extern __inline__ int ext2_set_bit(int nr, volatile void * addr)
 {
-	unsigned char *a = (unsigned char *) addr;
-	register unsigned short r __asm__("er0");
-	a += nr >> 3;
-	__asm__("mov.l %1,er0\n\t"
-		"sub.w e0,e0\n\t"
-		"btst r0l,@%2\n\t"
-		"bset r0l,@%2\n\t"
-		"beq 1f\n\t"
-		"inc.w #1,e0\n"
-		"1:\n\t"
-		"mov.w e0,r0\n\t"
-		"sub.w e0,e0"
-		:"=r"(r):"r"(nr & 7),"r"(a));
-	return r;
+	int		mask, retval;
+	unsigned long	flags;
+	volatile unsigned char	*ADDR = (unsigned char *) addr;
+
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
+	local_irq_save(flags);
+	retval = (mask & *ADDR) != 0;
+	*ADDR |= mask;
+	local_irq_restore(flags);
+	return retval;
 }
 
-extern __inline__ int ext2_clear_bit(int nr, volatile void *addr)
+extern __inline__ int ext2_clear_bit(int nr, volatile void * addr)
 {
-	unsigned char *a = (unsigned char *) addr;
-	register unsigned short r __asm__("er0");
-	a += nr >> 3;
-	__asm__("mov.l %1,er0\n\t"
-		"sub.w e0,e0\n\t"
-		"btst r0l,@%2\n\t"
-		"bclr r0l,@%2\n\t"
-		"beq 1f\n\t"
-		"inc.w #1,e0\n"
-		"1:\n\t"
-		"mov.w e0,r0\n\t"
-		"sub.w e0,e0"
-		:"=r"(r):"r"(nr & 7),"r"(a));
-	return r;
+	int		mask, retval;
+	unsigned long	flags;
+	volatile unsigned char	*ADDR = (unsigned char *) addr;
+
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
+	local_irq_save(flags);
+	retval = (mask & *ADDR) != 0;
+	*ADDR &= ~mask;
+	local_irq_restore(flags);
+	return retval;
 }
 
-extern __inline__ int ext2_test_bit(int nr, volatile void *addr)
+extern __inline__ int ext2_test_bit(int nr, const volatile void * addr)
 {
-	unsigned char *a = (unsigned char *) addr;
-	int ret;
-	a += nr >> 3;
-	__asm__("mov.l %1,er0\n\t"
-		"sub.l %0,%0\n\t"
-		"btst r0l,@%2\n\t"
-		"beq 1f\n\t"
-		"inc.l #1,%0\n"
-		"1:"
-		: "=r"(ret) :"r"(nr & 7),"r"(a):"er0","er1");
-	return ret;
-}
+	int			mask;
+	const volatile unsigned char	*ADDR = (const unsigned char *) addr;
 
+	ADDR += nr >> 3;
+	mask = 1 << (nr & 0x07);
+	return ((mask & *ADDR) != 0);
+}
 
 #define ext2_find_first_zero_bit(addr, size) \
         ext2_find_next_zero_bit((addr), (size), 0)
Index: include/asm-h8300/pgtable.h
===================================================================
RCS file: /var/lib/cvs/linux-2.5/include/asm-h8300/pgtable.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- include/asm-h8300/pgtable.h	21 Apr 2003 02:22:47 -0000	1.1.1.1
+++ include/asm-h8300/pgtable.h	25 Apr 2003 17:36:37 -0000	1.2
@@ -49,4 +49,11 @@
 #define pgtable_cache_init()   do { } while (0)
 #define io_remap_page_range	remap_page_range
 
+/*
+ * All 32bit addresses are effectively valid for vmalloc...
+ * Sort of meaningless for non-VM targets.
+ */
+#define	VMALLOC_START	0
+#define	VMALLOC_END	0xffffffff
+
 #endif /* _H8300_PGTABLE_H */
Index: include/asm-h8300/processor.h
===================================================================
RCS file: /var/lib/cvs/linux-2.5/include/asm-h8300/processor.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- include/asm-h8300/processor.h	21 Apr 2003 02:22:47 -0000	1.1.1.1
+++ include/asm-h8300/processor.h	25 Apr 2003 17:36:37 -0000	1.2
@@ -52,17 +52,16 @@
 #define MCA_bus 0
 
 struct thread_struct {
-	unsigned long  ksp;		/* kernel stack pointer */
-	unsigned long  usp;		/* user stack pointer */
-	unsigned short ccr;		/* saved status register */
-	unsigned long  esp0;            /* points to SR of stack frame */
-	unsigned long  vfork_ret;
-	unsigned long  debugreg[8];     /* debug info */
-} __attribute__((aligned(2),packed));
+	unsigned long ksp;		/* kernel stack pointer */
+	unsigned long usp;		/* user stack pointer */
+	unsigned long ccr;		/* saved status register */
+	unsigned long esp0;             /* points to SR of stack frame */
+	unsigned long debugreg[8];      /* debug info */
+};
 
 #define INIT_THREAD  { \
 	sizeof(init_stack) + (unsigned long) init_stack, 0, \
-	PS_S,  0, 0, \
+	PS_S, \
 }
 
 /*
@@ -73,9 +72,9 @@
  */
 #define start_thread(_regs, _pc, _usp)			        \
 do {							        \
+	set_fs(USER_DS);           /* reads from user space */  \
 	(_regs)->pc = (_pc);				        \
 	(_regs)->ccr &= ~0x10;				        \
-        *((unsigned long *)(_usp)-1) = _pc;                     \
 	wrusp((unsigned long)(_usp) - sizeof(unsigned long)*3);	\
 } while(0)
 
Index: include/asm-h8300/ptrace.h
===================================================================
RCS file: /var/lib/cvs/linux-2.5/include/asm-h8300/ptrace.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- include/asm-h8300/ptrace.h	21 Apr 2003 02:22:47 -0000	1.1.1.1
+++ include/asm-h8300/ptrace.h	25 Apr 2003 17:36:37 -0000	1.2
@@ -19,6 +19,10 @@
    stack during a system call. */
 
 struct pt_regs {
+	long     retpc;
+	long     er4;
+	long     er5;
+	long     er6;
 	long     er3;
 	long     er2;
 	long     er1;
@@ -26,19 +30,11 @@
 	unsigned short ccr;
 	long     er0;
 	long     vector;
+#if defined(CONFIG_CPU_H8S)
+	unsigned short exr;
+#endif
 	unsigned long  pc;
 } __attribute__((aligned(2),packed));
-
-/*
- * This is the extended stack used by signal handlers and the context
- * switcher: it's pushed after the normal "struct pt_regs".
- */
-struct switch_stack {
-	unsigned long  er6;
-	unsigned long  er5;
-	unsigned long  er4;
-	unsigned long  retpc;
-};
 
 #define PTRACE_GETREGS            12
 #define PTRACE_SETREGS            13
Index: include/asm-h8300/system.h
===================================================================
RCS file: /var/lib/cvs/linux-2.5/include/asm-h8300/system.h,v
retrieving revision 1.1.1.1
retrieving revision 1.3
diff -u -r1.1.1.1 -r1.3
--- include/asm-h8300/system.h	21 Apr 2003 02:22:47 -0000	1.1.1.1
+++ include/asm-h8300/system.h	25 Apr 2003 17:36:37 -0000	1.3
@@ -36,17 +36,20 @@
  * H8/300 Porting 2002/09/04 Yoshinori Sato
  */
 asmlinkage void resume(void);
-#define switch_to(prev,next,last) { \
-  void *_last;								        \
-  __asm__ __volatile__(								\
-  			"mov.l	%1, er0\n\t"					\
-			"mov.l	%2, er1\n\t"					\
-			"jsr @_resume"                                          \
-		       : "=r" (_last)						\
-		       : "r" (&(prev->thread)),				        \
-			 "r" (&(next->thread))				        \
-		       : "cc", "er0", "er1", "er2", "er3");	                \
-  (last) = _last; 								\
+#define switch_to(prev,next,last) {                         \
+  void *_last;						    \
+  __asm__ __volatile__(					    \
+  			"mov.l	%1, er0\n\t"		    \
+			"mov.l	%2, er1\n\t"		    \
+                        "mov.l  %3, er2\n\t"                \
+			"jsr @_resume\n\t"                  \
+                        "mov.l  er2,%0\n\t"                 \
+		       : "=r" (_last)			    \
+		       : "r" (&(prev->thread)),		    \
+			 "r" (&(next->thread)),		    \
+                         "g" (prev)                         \
+		       : "cc", "er0", "er1", "er2", "er3"); \
+  (last) = _last; 					    \
 }
 
 #if defined(__H8300H__)
@@ -80,15 +83,15 @@
 #define iret() __asm__ __volatile__ ("rte": : :"memory", "sp", "cc")
 
 /* For spinlocks etc */
-#define local_irq_disable()	asm volatile ("orc  #0x80,ccr")
-#define local_irq_enable()      asm volatile ("andc #0x7f,ccr")
+#define local_irq_disable()	__cli()
+#define local_irq_enable()      __sti()
 #define local_irq_save(x)	({ __save_flags(x); local_irq_disable(); })
 #define local_irq_restore(x)	__restore_flags(x)
 #define local_save_flags(x)     __save_flags(x)
 
 /*
  * Force strict CPU ordering.
- * Not really required on m68k...
+ * Not really required on H8...
  */
 #define nop()  asm volatile ("nop"::)
 #define mb()   asm volatile (""   : : :"memory")
Index: include/asm-h8300/unistd.h
===================================================================
RCS file: /var/lib/cvs/linux-2.5/include/asm-h8300/unistd.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- include/asm-h8300/unistd.h	21 Apr 2003 02:22:47 -0000	1.1.1.1
+++ include/asm-h8300/unistd.h	1 May 2003 14:34:17 -0000	1.2
@@ -405,8 +405,39 @@
 			  "g" ((long)b),					\
 			  "g" ((long)c),					\
 			  "g" ((long)d),					\
-			  "g" ((long)e)						\
-			: "cc", "er1", "er2", "er3", "er4");			\
+			  "m" ((long)e)						\
+			: "cc", "er1", "er2", "er3", "er4", "er5");		\
+  if ((unsigned long)(__res) >= (unsigned long)(-125)) {		       	\
+    errno = -__res;								\
+    __res = -1;									\
+  }										\
+  return (type)__res;								\
+}
+		
+#define _syscall6(type, name, atype, a, btype, b, ctype, c, dtype, d,           \
+                              etype, e, ftype, f)	                        \
+type name(atype a, btype b, ctype c, dtype d, etype e, ftype f)			\
+{										\
+  register long __res __asm__("er0");						\
+  __asm__ __volatile__ ("mov.l	er6,@-sp\n\t"					\
+                        "mov.l	%7, er6\n\t"					\
+                        "mov.l	%6, er5\n\t"					\
+			"mov.l	%5, er4\n\t"					\
+			"mov.l	%4, er3\n\t"					\
+			"mov.l	%3, er2\n\t"					\
+  			"mov.l	%2, er1\n\t"					\
+			"mov.l	%1, er0\n\t"					\
+  			"trapa	#0\n\t"						\
+  			"mov.l	@sp+,er6"					\
+			: "=r" (__res)						\
+			: "ir" (__NR_##name),					\
+			  "g" ((long)a),					\
+			  "g" ((long)b),					\
+			  "g" ((long)c),					\
+			  "g" ((long)d),					\
+			  "m" ((long)e),					\
+			  "m" ((long)e)						\
+			: "cc", "er1", "er2", "er3", "er4", "er5");		\
   if ((unsigned long)(__res) >= (unsigned long)(-125)) {		       	\
     errno = -__res;								\
     __res = -1;									\

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-05-02  6:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-05-02  6:18 [PATCH] H8/300 support update (2/4) Yoshinori Sato

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox