root/arch/alpha/lib/clear_user.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * arch/alpha/lib/clear_user.S
   4  * Contributed by Richard Henderson <rth@tamu.edu>
   5  *
   6  * Zero user space, handling exceptions as we go.
   7  *
   8  * We have to make sure that $0 is always up-to-date and contains the
   9  * right "bytes left to zero" value (and that it is updated only _after_
  10  * a successful copy).  There is also some rather minor exception setup
  11  * stuff.
  12  */
  13 #include <asm/export.h>
  14 
  15 /* Allow an exception for an insn; exit if we get one.  */
  16 #define EX(x,y...)                      \
  17         99: x,##y;                      \
  18         .section __ex_table,"a";        \
  19         .long 99b - .;                  \
  20         lda $31, $exception-99b($31);   \
  21         .previous
  22 
  23         .set noat
  24         .set noreorder
  25         .align 4
  26 
  27         .globl __clear_user
  28         .ent __clear_user
  29         .frame  $30, 0, $26
  30         .prologue 0
  31 
  32 $loop:
  33         and     $1, 3, $4       # e0    :
  34         beq     $4, 1f          # .. e1 :
  35 
  36 0:      EX( stq_u $31, 0($16) ) # e0    : zero one word
  37         subq    $0, 8, $0       # .. e1 :
  38         subq    $4, 1, $4       # e0    :
  39         addq    $16, 8, $16     # .. e1 :
  40         bne     $4, 0b          # e1    :
  41         unop                    #       :
  42 
  43 1:      bic     $1, 3, $1       # e0    :
  44         beq     $1, $tail       # .. e1 :
  45 
  46 2:      EX( stq_u $31, 0($16) ) # e0    : zero four words
  47         subq    $0, 8, $0       # .. e1 :
  48         EX( stq_u $31, 8($16) ) # e0    :
  49         subq    $0, 8, $0       # .. e1 :
  50         EX( stq_u $31, 16($16) )        # e0    :
  51         subq    $0, 8, $0       # .. e1 :
  52         EX( stq_u $31, 24($16) )        # e0    :
  53         subq    $0, 8, $0       # .. e1 :
  54         subq    $1, 4, $1       # e0    :
  55         addq    $16, 32, $16    # .. e1 :
  56         bne     $1, 2b          # e1    :
  57 
  58 $tail:
  59         bne     $2, 1f          # e1    : is there a tail to do?
  60         ret     $31, ($26), 1   # .. e1 :
  61 
  62 1:      EX( ldq_u $5, 0($16) )  # e0    :
  63         clr     $0              # .. e1 :
  64         nop                     # e1    :
  65         mskqh   $5, $0, $5      # e0    :
  66         EX( stq_u $5, 0($16) )  # e0    :
  67         ret     $31, ($26), 1   # .. e1 :
  68 
  69 __clear_user:
  70         and     $17, $17, $0
  71         and     $16, 7, $4      # e0    : find dest misalignment
  72         beq     $0, $zerolength # .. e1 :
  73         addq    $0, $4, $1      # e0    : bias counter
  74         and     $1, 7, $2       # e1    : number of bytes in tail
  75         srl     $1, 3, $1       # e0    :
  76         beq     $4, $loop       # .. e1 :
  77 
  78         EX( ldq_u $5, 0($16) )  # e0    : load dst word to mask back in
  79         beq     $1, $oneword    # .. e1 : sub-word store?
  80 
  81         mskql   $5, $16, $5     # e0    : take care of misaligned head
  82         addq    $16, 8, $16     # .. e1 :
  83         EX( stq_u $5, -8($16) ) # e0    :
  84         addq    $0, $4, $0      # .. e1 : bytes left -= 8 - misalignment
  85         subq    $1, 1, $1       # e0    :
  86         subq    $0, 8, $0       # .. e1 :
  87         br      $loop           # e1    :
  88         unop                    #       :
  89 
  90 $oneword:
  91         mskql   $5, $16, $4     # e0    :
  92         mskqh   $5, $2, $5      # e0    :
  93         or      $5, $4, $5      # e1    :
  94         EX( stq_u $5, 0($16) )  # e0    :
  95         clr     $0              # .. e1 :
  96 
  97 $zerolength:
  98 $exception:
  99         ret     $31, ($26), 1   # .. e1 :
 100 
 101         .end __clear_user
 102         EXPORT_SYMBOL(__clear_user)

/* [<][>][^][v][top][bottom][index][help] */