revert-mm-fix-blkdev-size-calculation-in-generic_write_checks
[linux-2.6/linux-trees-mm.git] / drivers / scsi / oktagon_io.S
blobd2946255f495bf2094926644480be54ecd428eba
1 /* -*- mode: asm -*-
2  * Due to problems while transferring data I've put these routines as assembly
3  * code.
4  * Since I'm no PPC assembler guru, the code is just the assembler version of
6 int oktag_to_io(long *paddr,long *addr,long len)
8   long *addr2 = addr;
9   for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
10     *paddr = *addr2++;
11   return addr2 - addr;
14 int oktag_from_io(long *addr,long *paddr,long len)
16   long *addr2 = addr;
17   for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
18     *addr2++ = *paddr;
19   return addr2 - addr;
22  * assembled using gcc -O2 -S, with two exception catch points where data
23  * is moved to/from the IO register.
24  */
28 The code which follows is for 680x0 based assembler and is meant for
29 Linux/m68k. It was created by cross compiling the code using the
30 instructions given above. I then added the four labels used in the
31 exception handler table at the bottom of this file.
32 - Kevin <kcozens@interlog.com>
35 #ifdef CONFIG_AMIGA
37         .file   "oktagon_io.c"
38         .version        "01.01"
39 gcc2_compiled.:
40 .text
41         .align  2
42 .globl oktag_to_io
43         .type    oktag_to_io,@function
44 oktag_to_io:
45         link.w %a6,#0
46         move.l %d2,-(%sp)
47         move.l 8(%a6),%a1
48         move.l 12(%a6),%d1
49         move.l %d1,%a0
50         move.l 16(%a6),%d0
51         addq.l #3,%d0
52         lsr.l #2,%d0
53         subq.l #1,%d0
54         moveq.l #-1,%d2
55         cmp.l %d0,%d2
56         jbeq .L3
57 .L5:
58 exp1:
59         move.l (%a0)+,(%a1)
60         dbra %d0,.L5
61         clr.w %d0
62         subq.l #1,%d0
63         jbcc .L5
64 .L3:
65 ret1:
66         move.l %a0,%d0
67         sub.l %d1,%d0
68         asr.l #2,%d0
69         move.l -4(%a6),%d2
70         unlk %a6
71         rts
73 .Lfe1:
74         .size    oktag_to_io,.Lfe1-oktag_to_io
75         .align  2
76 .globl oktag_from_io
77         .type    oktag_from_io,@function
78 oktag_from_io:
79         link.w %a6,#0
80         move.l %d2,-(%sp)
81         move.l 8(%a6),%d1
82         move.l 12(%a6),%a1
83         move.l %d1,%a0
84         move.l 16(%a6),%d0
85         addq.l #3,%d0
86         lsr.l #2,%d0
87         subq.l #1,%d0
88         moveq.l #-1,%d2
89         cmp.l %d0,%d2
90         jbeq .L9
91 .L11:
92 exp2:
93         move.l (%a1),(%a0)+
94         dbra %d0,.L11
95         clr.w %d0
96         subq.l #1,%d0
97         jbcc .L11
98 .L9:
99 ret2:
100         move.l %a0,%d0
101         sub.l %d1,%d0
102         asr.l #2,%d0
103         move.l -4(%a6),%d2
104         unlk %a6
105         rts
106 .Lfe2:
107         .size    oktag_from_io,.Lfe2-oktag_from_io
108         .ident  "GCC: (GNU) 2.7.2.1"
111  * Exception table.
112  * Second longword shows where to jump when an exception at the addr the first
113  * longword is pointing to is caught.
114  */
116 .section __ex_table,"a"
117         .align  2
118 oktagon_except:
119         .long   exp1,ret1
120         .long   exp2,ret2
122 #endif