Changeset fd85ae5 in mainline for kernel/arch/sparc64/src/asm.S


Ignore:
Timestamp:
2006-09-04T19:11:23Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fadd381
Parents:
cfa70add
Message:

sparc64 kernel fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/asm.S

    rcfa70add rfd85ae5  
    2727#
    2828
     29#include <arch/arch.h>
    2930#include <arch/stack.h>
    3031#include <arch/regdef.h>
     
    3334.text
    3435
     36.register       %g2, #scratch
     37.register       %g3, #scratch
     38
     39/*
     40 * This is the assembly language version of our _memcpy() generated by gcc.
     41 */
    3542.global memcpy
    36 .global memcpy_from_uspace
    37 .global memcpy_to_uspace
    38 .global memcpy_from_uspace_failover_address
    39 .global memcpy_to_uspace_failover_address
    40 .global memsetb
    41 
    42 
    4343memcpy:
    44 memcpy_from_uspace:
    45 memcpy_to_uspace:
    46         .register       %g2, #scratch
    47         .register       %g3, #scratch
    4844        add     %o1, 7, %g1
    4945        and     %g1, -8, %g1
     
    10096        mov     %o1, %o0
    10197
     98/*
     99 * Almost the same as memcpy() except the loads are from userspace.
     100 */
     101.global memcpy_from_uspace
     102memcpy_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
     1090:
     110        brz,pn  %o2, 2f
     111        mov     0, %g2
     1121:
     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
     1192:
     120        jmp     %o7 + 8                 ! exit point
     121        mov     %o1, %o0
     1223:
     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
     1304:
     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]
     1385:
     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
     1466:
     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
     161memcpy_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
     1680:
     169        brz,pn  %o2, 2f
     170        mov     0, %g2
     1711:
     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
     1782:
     179        jmp     %o7 + 8                 ! exit point
     180        mov     %o1, %o0
     1813:
     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
     1894:
     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
     1975:
     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
     2056:
     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
    102218memcpy_from_uspace_failover_address:
    103219memcpy_to_uspace_failover_address:
     
    105221        mov     %g0, %o0                ! return 0 on failure
    106222
     223.global memsetb
    107224memsetb:
    108225        b _memsetb
     
    155272.global switch_to_userspace
    156273switch_to_userspace:
     274        save %o1, -STACK_WINDOW_SAVE_AREA_SIZE, %sp
    157275        flushw
    158276        wrpr %g0, 0, %cleanwin          ! avoid information leak
    159         save %o1, -STACK_WINDOW_SAVE_AREA_SIZE, %sp
    160277
    161278        mov %i3, %o0                    ! uarg
Note: See TracChangeset for help on using the changeset viewer.