dslinux/linux-2.6.x/arch/arm/mm alignment.c

amadeus dslinux_amadeus at user.in-berlin.de
Fri Aug 18 12:48:38 CEST 2006


Update of /cvsroot/dslinux/dslinux/linux-2.6.x/arch/arm/mm
In directory antilope:/tmp/cvs-serv13903/linux-2.6.x/arch/arm/mm

Modified Files:
	alignment.c 
Log Message:
8bit write cleanup

Index: alignment.c
===================================================================
RCS file: /cvsroot/dslinux/dslinux/linux-2.6.x/arch/arm/mm/alignment.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- alignment.c	20 Feb 2006 16:38:38 -0000	1.2
+++ alignment.c	18 Aug 2006 10:48:36 -0000	1.3
@@ -202,6 +202,40 @@
 #define get32t_unaligned_check(val,addr) \
 	__get32_unaligned_check("ldrbt",val,addr)
 
+#ifdef CONFIG_NDS_ROM8BIT
+#define __put16_unaligned_check(ins,val,addr)			\
+	do {							\
+		unsigned int err, v = val, a = addr;		\
+		__asm__( FIRST_BYTE_16				\
+		"1:	"ins"	%0, %1, [%2]\n"			\
+		"       add	%2, %2, #1\n"                   \
+		"	mov	%1, %1, "NEXT_BYTE"\n"		\
+		"2:	"ins"	%0, %1, [%2]\n"			\
+		"	mov	%0, #0\n"			\
+		"3:\n"						\
+		"	.section .fixup,\"ax\"\n"		\
+		"	.align	2\n"				\
+		"4:	mov	%0, #1\n"			\
+		"	b	3b\n"				\
+		"	.previous\n"				\
+		"	.section __ex_table,\"a\"\n"		\
+		"	.align	3\n"				\
+		"	.long	1b, 4b\n"			\
+		"	.long	2b, 4b\n"			\
+		"	.previous\n"				\
+		: "=r" (err), "=&r" (v), "=&r" (a)		\
+		: "0" (err), "1" (v), "2" (a));			\
+		if (err)					\
+			goto fault;				\
+	} while (0)
+
+#define put16_unaligned_check(val,addr)  \
+	__put16_unaligned_check("swpb",val,addr)
+
+#define put16t_unaligned_check(val,addr) \
+	__put16_unaligned_check("swpb",val,addr)
+
+#else
 #define __put16_unaligned_check(ins,val,addr)			\
 	do {							\
 		unsigned int err = 0, v = val, a = addr;	\
@@ -231,7 +265,49 @@
 
 #define put16t_unaligned_check(val,addr) \
 	__put16_unaligned_check("strbt",val,addr)
+#endif
 
+#ifdef CONFIG_NDS_ROM8BIT
+#define __put32_unaligned_check(ins,val,addr)			\
+	do {							\
+		unsigned int err, v = val, a = addr;		\
+		__asm__( FIRST_BYTE_32				\
+		"1:	"ins"	%0, %1, [%2]\n"			\
+		"       add	%2, %2, #1\n"                   \
+		"	mov	%1, %1, "NEXT_BYTE"\n"		\
+		"2:	"ins"	%0, %1, [%2]\n"			\
+		"       add	%2, %2, #1\n"                   \
+		"	mov	%1, %1, "NEXT_BYTE"\n"		\
+		"3:	"ins"	%0, %1, [%2]\n"			\
+		"       add	%2, %2, #1\n"                   \
+		"	mov	%1, %1, "NEXT_BYTE"\n"		\
+		"4:	"ins"	%0, %1, [%2]\n"			\
+		"	mov	%0, #0\n"			\
+		"5:\n"						\
+		"	.section .fixup,\"ax\"\n"		\
+		"	.align	2\n"				\
+		"6:	mov	%0, #1\n"			\
+		"	b	5b\n"				\
+		"	.previous\n"				\
+		"	.section __ex_table,\"a\"\n"		\
+		"	.align	3\n"				\
+		"	.long	1b, 6b\n"			\
+		"	.long	2b, 6b\n"			\
+		"	.long	3b, 6b\n"			\
+		"	.long	4b, 6b\n"			\
+		"	.previous\n"				\
+		: "=r" (err), "=&r" (v), "=&r" (a)		\
+		: "0" (err), "1" (v), "2" (a));			\
+		if (err)					\
+			goto fault;				\
+	} while (0)
+
+#define put32_unaligned_check(val,addr) \
+	__put32_unaligned_check("swpb", val, addr)
+
+#define put32t_unaligned_check(val,addr) \
+ 	__put32_unaligned_check("swpb", val, addr)
+#else
 #define __put32_unaligned_check(ins,val,addr)			\
 	do {							\
 		unsigned int err = 0, v = val, a = addr;	\
@@ -267,6 +343,7 @@
 
 #define put32t_unaligned_check(val,addr) \
 	__put32_unaligned_check("strbt", val, addr)
+#endif
 
 static void
 do_alignment_finish_ldst(unsigned long addr, unsigned long instr, struct pt_regs *regs, union offset_union offset)




More information about the dslinux-commit mailing list