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 5 6int oktag_to_io(long *paddr,long *addr,long len) 7{ 8 long *addr2 = addr; 9 for(len=(len+sizeof(long)-1)/sizeof(long);len--;) 10 *paddr = *addr2++; 11 return addr2 - addr; 12} 13 14int oktag_from_io(long *addr,long *paddr,long len) 15{ 16 long *addr2 = addr; 17 for(len=(len+sizeof(long)-1)/sizeof(long);len--;) 18 *addr2++ = *paddr; 19 return addr2 - addr; 20} 21 22 * assembled using gcc -O2 -S, with two exception catch points where data 23 * is moved to/from the IO register. 24 */ 25 26 27#ifdef CONFIG_APUS 28 29 .file "oktagon_io.c" 30 31gcc2_compiled.: 32/* 33 .section ".text" 34*/ 35 .align 2 36 .globl oktag_to_io 37 .type oktag_to_io,@function 38oktag_to_io: 39 addi 5,5,3 40 srwi 5,5,2 41 cmpwi 1,5,0 42 mr 9,3 43 mr 3,4 44 addi 5,5,-1 45 bc 12,6,.L3 46.L5: 47 cmpwi 1,5,0 48 lwz 0,0(3) 49 addi 3,3,4 50 addi 5,5,-1 51exp1: stw 0,0(9) 52 bc 4,6,.L5 53.L3: 54ret1: subf 3,4,3 55 srawi 3,3,2 56 blr 57.Lfe1: 58 .size oktag_to_io,.Lfe1-oktag_to_io 59 .align 2 60 .globl oktag_from_io 61 .type oktag_from_io,@function 62oktag_from_io: 63 addi 5,5,3 64 srwi 5,5,2 65 cmpwi 1,5,0 66 mr 9,3 67 addi 5,5,-1 68 bc 12,6,.L9 69.L11: 70 cmpwi 1,5,0 71exp2: lwz 0,0(4) 72 addi 5,5,-1 73 stw 0,0(3) 74 addi 3,3,4 75 bc 4,6,.L11 76.L9: 77ret2: subf 3,9,3 78 srawi 3,3,2 79 blr 80.Lfe2: 81 .size oktag_from_io,.Lfe2-oktag_from_io 82 .ident "GCC: (GNU) egcs-2.90.29 980515 (egcs-1.0.3 release)" 83 84/* 85 * Exception table. 86 * Second longword shows where to jump when an exception at the addr the first 87 * longword is pointing to is caught. 88 */ 89 90.section __ex_table,"a" 91 .align 2 92oktagon_except: 93 .long exp1,ret1 94 .long exp2,ret2 95 96#else 97 98/* 99The code which follows is for 680x0 based assembler and is meant for 100Linux/m68k. It was created by cross compiling the code using the 101instructions given above. I then added the four labels used in the 102exception handler table at the bottom of this file. 103- Kevin <kcozens@interlog.com> 104*/ 105 106#ifdef CONFIG_AMIGA 107 108 .file "oktagon_io.c" 109 .version "01.01" 110gcc2_compiled.: 111.text 112 .align 2 113.globl oktag_to_io 114 .type oktag_to_io,@function 115oktag_to_io: 116 link.w %a6,#0 117 move.l %d2,-(%sp) 118 move.l 8(%a6),%a1 119 move.l 12(%a6),%d1 120 move.l %d1,%a0 121 move.l 16(%a6),%d0 122 addq.l #3,%d0 123 lsr.l #2,%d0 124 subq.l #1,%d0 125 moveq.l #-1,%d2 126 cmp.l %d0,%d2 127 jbeq .L3 128.L5: 129exp1: 130 move.l (%a0)+,(%a1) 131 dbra %d0,.L5 132 clr.w %d0 133 subq.l #1,%d0 134 jbcc .L5 135.L3: 136ret1: 137 move.l %a0,%d0 138 sub.l %d1,%d0 139 asr.l #2,%d0 140 move.l -4(%a6),%d2 141 unlk %a6 142 rts 143 144.Lfe1: 145 .size oktag_to_io,.Lfe1-oktag_to_io 146 .align 2 147.globl oktag_from_io 148 .type oktag_from_io,@function 149oktag_from_io: 150 link.w %a6,#0 151 move.l %d2,-(%sp) 152 move.l 8(%a6),%d1 153 move.l 12(%a6),%a1 154 move.l %d1,%a0 155 move.l 16(%a6),%d0 156 addq.l #3,%d0 157 lsr.l #2,%d0 158 subq.l #1,%d0 159 moveq.l #-1,%d2 160 cmp.l %d0,%d2 161 jbeq .L9 162.L11: 163exp2: 164 move.l (%a1),(%a0)+ 165 dbra %d0,.L11 166 clr.w %d0 167 subq.l #1,%d0 168 jbcc .L11 169.L9: 170ret2: 171 move.l %a0,%d0 172 sub.l %d1,%d0 173 asr.l #2,%d0 174 move.l -4(%a6),%d2 175 unlk %a6 176 rts 177.Lfe2: 178 .size oktag_from_io,.Lfe2-oktag_from_io 179 .ident "GCC: (GNU) 2.7.2.1" 180 181/* 182 * Exception table. 183 * Second longword shows where to jump when an exception at the addr the first 184 * longword is pointing to is caught. 185 */ 186 187.section __ex_table,"a" 188 .align 2 189oktagon_except: 190 .long exp1,ret1 191 .long exp2,ret2 192 193#endif 194#endif 195