In-Reply-To: <[email protected]>
On Tue, 30 May 2006 20:42:12 -0700, H. Peter Anvin wrote:
> I was thinking some more about that, and I suspect the "right" way to do
> this looks something like the attached code. Note that it assymetric,
> and that it's probably too long to inline.
>
> I haven't tested this yet, and I probably won't have time to do so this
> evening.
There were some small problems, but I think I fixed them:
/*
* arch/i386/lib/memcpy_io.S
*
* The most general form of memory copy to/from I/O space, used for
* devices which can handle arbitrary transactions with appropriate
* handling of byte enables. The goal is to produce the minimum
* number of naturally aligned transactions on the bus.
*/
#include <linux/config.h>
#include <linux/linkage.h>
.macro build_memcpy_io_fn fn_name,align_reg
.globl \fn_name
.type \fn_name, @function
ALIGN
\fn_name:
ebp_space=0
#ifdef CONFIG_FRAME_POINTER
pushl %ebp
movl %esp,%ebp
ebp_space=4
#endif
pushl %edi
pushl %esi
#ifdef CONFIG_REGPARM
movl %eax, %edi
movl %edx, %esi
#else
movl 12+ebp_space(%esp), %edi
movl 20+ebp_space(%esp), %ecx
movl 16+ebp_space(%esp), %esi
#endif
jecxz 1f
testl $1, \align_reg
jz 2f
movsb
decl %ecx
2:
cmpl $2, %ecx
jb 3f
testl $2, \align_reg
jz 4f
movsw
decl %ecx
decl %ecx
4:
movl %ecx, %edx
shrl $2, %ecx
jz 5f
rep ; movsl
5:
movl %edx, %ecx
testb $2, %cl
jz 3f
movsw
3:
testb $1, %cl
jz 1f
movsb
1:
pop %esi
pop %edi
#ifdef CONFIG_FRAME_POINTER
leave
#endif
ret
.size \fn_name, .-\fn_name
.endm
build_memcpy_io_fn fn_name=memcpy_fromio,align_reg=%esi
build_memcpy_io_fn fn_name=memcpy_toio,align_reg=%edi
--
Chuck
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]