mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
196 lines
3.3 KiB
ArmAsm
196 lines
3.3 KiB
ArmAsm
![]() |
/* -*- mode: asm -*-
|
||
|
* Due to problems while transferring data I've put these routines as assembly
|
||
|
* code.
|
||
|
* Since I'm no PPC assembler guru, the code is just the assembler version of
|
||
|
|
||
|
int oktag_to_io(long *paddr,long *addr,long len)
|
||
|
{
|
||
|
long *addr2 = addr;
|
||
|
for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
|
||
|
*paddr = *addr2++;
|
||
|
return addr2 - addr;
|
||
|
}
|
||
|
|
||
|
int oktag_from_io(long *addr,long *paddr,long len)
|
||
|
{
|
||
|
long *addr2 = addr;
|
||
|
for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
|
||
|
*addr2++ = *paddr;
|
||
|
return addr2 - addr;
|
||
|
}
|
||
|
|
||
|
* assembled using gcc -O2 -S, with two exception catch points where data
|
||
|
* is moved to/from the IO register.
|
||
|
*/
|
||
|
|
||
|
#include <linux/config.h>
|
||
|
|
||
|
#ifdef CONFIG_APUS
|
||
|
|
||
|
.file "oktagon_io.c"
|
||
|
|
||
|
gcc2_compiled.:
|
||
|
/*
|
||
|
.section ".text"
|
||
|
*/
|
||
|
.align 2
|
||
|
.globl oktag_to_io
|
||
|
.type oktag_to_io,@function
|
||
|
oktag_to_io:
|
||
|
addi 5,5,3
|
||
|
srwi 5,5,2
|
||
|
cmpwi 1,5,0
|
||
|
mr 9,3
|
||
|
mr 3,4
|
||
|
addi 5,5,-1
|
||
|
bc 12,6,.L3
|
||
|
.L5:
|
||
|
cmpwi 1,5,0
|
||
|
lwz 0,0(3)
|
||
|
addi 3,3,4
|
||
|
addi 5,5,-1
|
||
|
exp1: stw 0,0(9)
|
||
|
bc 4,6,.L5
|
||
|
.L3:
|
||
|
ret1: subf 3,4,3
|
||
|
srawi 3,3,2
|
||
|
blr
|
||
|
.Lfe1:
|
||
|
.size oktag_to_io,.Lfe1-oktag_to_io
|
||
|
.align 2
|
||
|
.globl oktag_from_io
|
||
|
.type oktag_from_io,@function
|
||
|
oktag_from_io:
|
||
|
addi 5,5,3
|
||
|
srwi 5,5,2
|
||
|
cmpwi 1,5,0
|
||
|
mr 9,3
|
||
|
addi 5,5,-1
|
||
|
bc 12,6,.L9
|
||
|
.L11:
|
||
|
cmpwi 1,5,0
|
||
|
exp2: lwz 0,0(4)
|
||
|
addi 5,5,-1
|
||
|
stw 0,0(3)
|
||
|
addi 3,3,4
|
||
|
bc 4,6,.L11
|
||
|
.L9:
|
||
|
ret2: subf 3,9,3
|
||
|
srawi 3,3,2
|
||
|
blr
|
||
|
.Lfe2:
|
||
|
.size oktag_from_io,.Lfe2-oktag_from_io
|
||
|
.ident "GCC: (GNU) egcs-2.90.29 980515 (egcs-1.0.3 release)"
|
||
|
|
||
|
/*
|
||
|
* Exception table.
|
||
|
* Second longword shows where to jump when an exception at the addr the first
|
||
|
* longword is pointing to is caught.
|
||
|
*/
|
||
|
|
||
|
.section __ex_table,"a"
|
||
|
.align 2
|
||
|
oktagon_except:
|
||
|
.long exp1,ret1
|
||
|
.long exp2,ret2
|
||
|
|
||
|
#else
|
||
|
|
||
|
/*
|
||
|
The code which follows is for 680x0 based assembler and is meant for
|
||
|
Linux/m68k. It was created by cross compiling the code using the
|
||
|
instructions given above. I then added the four labels used in the
|
||
|
exception handler table at the bottom of this file.
|
||
|
- Kevin <kcozens@interlog.com>
|
||
|
*/
|
||
|
|
||
|
#ifdef CONFIG_AMIGA
|
||
|
|
||
|
.file "oktagon_io.c"
|
||
|
.version "01.01"
|
||
|
gcc2_compiled.:
|
||
|
.text
|
||
|
.align 2
|
||
|
.globl oktag_to_io
|
||
|
.type oktag_to_io,@function
|
||
|
oktag_to_io:
|
||
|
link.w %a6,#0
|
||
|
move.l %d2,-(%sp)
|
||
|
move.l 8(%a6),%a1
|
||
|
move.l 12(%a6),%d1
|
||
|
move.l %d1,%a0
|
||
|
move.l 16(%a6),%d0
|
||
|
addq.l #3,%d0
|
||
|
lsr.l #2,%d0
|
||
|
subq.l #1,%d0
|
||
|
moveq.l #-1,%d2
|
||
|
cmp.l %d0,%d2
|
||
|
jbeq .L3
|
||
|
.L5:
|
||
|
exp1:
|
||
|
move.l (%a0)+,(%a1)
|
||
|
dbra %d0,.L5
|
||
|
clr.w %d0
|
||
|
subq.l #1,%d0
|
||
|
jbcc .L5
|
||
|
.L3:
|
||
|
ret1:
|
||
|
move.l %a0,%d0
|
||
|
sub.l %d1,%d0
|
||
|
asr.l #2,%d0
|
||
|
move.l -4(%a6),%d2
|
||
|
unlk %a6
|
||
|
rts
|
||
|
|
||
|
.Lfe1:
|
||
|
.size oktag_to_io,.Lfe1-oktag_to_io
|
||
|
.align 2
|
||
|
.globl oktag_from_io
|
||
|
.type oktag_from_io,@function
|
||
|
oktag_from_io:
|
||
|
link.w %a6,#0
|
||
|
move.l %d2,-(%sp)
|
||
|
move.l 8(%a6),%d1
|
||
|
move.l 12(%a6),%a1
|
||
|
move.l %d1,%a0
|
||
|
move.l 16(%a6),%d0
|
||
|
addq.l #3,%d0
|
||
|
lsr.l #2,%d0
|
||
|
subq.l #1,%d0
|
||
|
moveq.l #-1,%d2
|
||
|
cmp.l %d0,%d2
|
||
|
jbeq .L9
|
||
|
.L11:
|
||
|
exp2:
|
||
|
move.l (%a1),(%a0)+
|
||
|
dbra %d0,.L11
|
||
|
clr.w %d0
|
||
|
subq.l #1,%d0
|
||
|
jbcc .L11
|
||
|
.L9:
|
||
|
ret2:
|
||
|
move.l %a0,%d0
|
||
|
sub.l %d1,%d0
|
||
|
asr.l #2,%d0
|
||
|
move.l -4(%a6),%d2
|
||
|
unlk %a6
|
||
|
rts
|
||
|
.Lfe2:
|
||
|
.size oktag_from_io,.Lfe2-oktag_from_io
|
||
|
.ident "GCC: (GNU) 2.7.2.1"
|
||
|
|
||
|
/*
|
||
|
* Exception table.
|
||
|
* Second longword shows where to jump when an exception at the addr the first
|
||
|
* longword is pointing to is caught.
|
||
|
*/
|
||
|
|
||
|
.section __ex_table,"a"
|
||
|
.align 2
|
||
|
oktagon_except:
|
||
|
.long exp1,ret1
|
||
|
.long exp2,ret2
|
||
|
|
||
|
#endif
|
||
|
#endif
|