Changeset fd85ae5 in mainline for kernel/arch/sparc64/src/asm.S
- Timestamp:
- 2006-09-04T19:11:23Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fadd381
- Parents:
- cfa70add
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/asm.S
rcfa70add rfd85ae5 27 27 # 28 28 29 #include <arch/arch.h> 29 30 #include <arch/stack.h> 30 31 #include <arch/regdef.h> … … 33 34 .text 34 35 36 .register %g2, #scratch 37 .register %g3, #scratch 38 39 /* 40 * This is the assembly language version of our _memcpy() generated by gcc. 41 */ 35 42 .global memcpy 36 .global memcpy_from_uspace37 .global memcpy_to_uspace38 .global memcpy_from_uspace_failover_address39 .global memcpy_to_uspace_failover_address40 .global memsetb41 42 43 43 memcpy: 44 memcpy_from_uspace:45 memcpy_to_uspace:46 .register %g2, #scratch47 .register %g3, #scratch48 44 add %o1, 7, %g1 49 45 and %g1, -8, %g1 … … 100 96 mov %o1, %o0 101 97 98 /* 99 * Almost the same as memcpy() except the loads are from userspace. 100 */ 101 .global memcpy_from_uspace 102 memcpy_from_uspace: 103 add %o1, 7, %g1 104 and %g1, -8, %g1 105 cmp %o1, %g1 106 be,pn %xcc, 3f 107 add %o0, 7, %g1 108 mov 0, %g3 109 0: 110 brz,pn %o2, 2f 111 mov 0, %g2 112 1: 113 lduba [%g3 + %o1] ASI_AIUS, %g1 114 add %g2, 1, %g2 115 cmp %o2, %g2 116 stb %g1, [%g3 + %o0] 117 bne,pt %xcc, 1b 118 mov %g2, %g3 119 2: 120 jmp %o7 + 8 ! exit point 121 mov %o1, %o0 122 3: 123 and %g1, -8, %g1 124 cmp %o0, %g1 125 bne,pt %xcc, 0b 126 mov 0, %g3 127 srlx %o2, 3, %g4 128 brz,pn %g4, 5f 129 mov 0, %g5 130 4: 131 sllx %g3, 3, %g2 132 add %g5, 1, %g3 133 ldxa [%o1 + %g2] ASI_AIUS, %g1 134 mov %g3, %g5 135 cmp %g4, %g3 136 bne,pt %xcc, 4b 137 stx %g1, [%o0 + %g2] 138 5: 139 and %o2, 7, %o2 140 brz,pn %o2, 2b 141 sllx %g4, 3, %g1 142 mov 0, %g2 143 add %g1, %o0, %o0 144 add %g1, %o1, %g4 145 mov 0, %g3 146 6: 147 lduba [%g2 + %g4] ASI_AIUS, %g1 148 stb %g1, [%g2 + %o0] 149 add %g3, 1, %g2 150 cmp %o2, %g2 151 bne,pt %xcc, 6b 152 mov %g2, %g3 153 154 jmp %o7 + 8 ! exit point 155 mov %o1, %o0 156 157 /* 158 * Almost the same as memcpy() except the stores are to userspace. 159 */ 160 .global memcpy_to_uspace 161 memcpy_to_uspace: 162 add %o1, 7, %g1 163 and %g1, -8, %g1 164 cmp %o1, %g1 165 be,pn %xcc, 3f 166 add %o0, 7, %g1 167 mov 0, %g3 168 0: 169 brz,pn %o2, 2f 170 mov 0, %g2 171 1: 172 ldub [%g3 + %o1], %g1 173 add %g2, 1, %g2 174 cmp %o2, %g2 175 stba %g1, [%g3 + %o0] ASI_AIUS 176 bne,pt %xcc, 1b 177 mov %g2, %g3 178 2: 179 jmp %o7 + 8 ! exit point 180 mov %o1, %o0 181 3: 182 and %g1, -8, %g1 183 cmp %o0, %g1 184 bne,pt %xcc, 0b 185 mov 0, %g3 186 srlx %o2, 3, %g4 187 brz,pn %g4, 5f 188 mov 0, %g5 189 4: 190 sllx %g3, 3, %g2 191 add %g5, 1, %g3 192 ldx [%o1 + %g2], %g1 193 mov %g3, %g5 194 cmp %g4, %g3 195 bne,pt %xcc, 4b 196 stxa %g1, [%o0 + %g2] ASI_AIUS 197 5: 198 and %o2, 7, %o2 199 brz,pn %o2, 2b 200 sllx %g4, 3, %g1 201 mov 0, %g2 202 add %g1, %o0, %o0 203 add %g1, %o1, %g4 204 mov 0, %g3 205 6: 206 ldub [%g2 + %g4], %g1 207 stba %g1, [%g2 + %o0] ASI_AIUS 208 add %g3, 1, %g2 209 cmp %o2, %g2 210 bne,pt %xcc, 6b 211 mov %g2, %g3 212 213 jmp %o7 + 8 ! exit point 214 mov %o1, %o0 215 216 .global memcpy_from_uspace_failover_address 217 .global memcpy_to_uspace_failover_address 102 218 memcpy_from_uspace_failover_address: 103 219 memcpy_to_uspace_failover_address: … … 105 221 mov %g0, %o0 ! return 0 on failure 106 222 223 .global memsetb 107 224 memsetb: 108 225 b _memsetb … … 155 272 .global switch_to_userspace 156 273 switch_to_userspace: 274 save %o1, -STACK_WINDOW_SAVE_AREA_SIZE, %sp 157 275 flushw 158 276 wrpr %g0, 0, %cleanwin ! avoid information leak 159 save %o1, -STACK_WINDOW_SAVE_AREA_SIZE, %sp160 277 161 278 mov %i3, %o0 ! uarg
Note:
See TracChangeset
for help on using the changeset viewer.