The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/arm/copystr.S

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: copystr.S,v 1.8 2002/10/13 14:54:48 bjh21 Exp $        */
    2 
    3 /*-
    4  * Copyright (c) 1995 Mark Brinicombe.
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Mark Brinicombe.
   18  * 4. The name of the company nor the name of the author may be used to
   19  *    endorse or promote products derived from this software without specific
   20  *    prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
   23  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   24  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   25  * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
   26  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   32  * SUCH DAMAGE.
   33  *
   34  * copystr.S
   35  *
   36  * optimised and fault protected copystr functions
   37  *
   38  * Created      : 16/05/95
   39  */
   40 
   41         
   42 #include "assym.s"
   43 #include <machine/asm.h>
   44 #include <machine/armreg.h>
   45 __FBSDID("$FreeBSD: releng/10.2/sys/arm/arm/copystr.S 278652 2015-02-13 00:49:47Z ian $");
   46 
   47 #include <sys/errno.h>
   48 
   49         .text
   50         .align  2
   51 
   52 #ifdef _ARM_ARCH_6
   53 #define GET_PCB(tmp) \
   54         mrc p15, 0, tmp, c13, c0, 4; \
   55         add     tmp, tmp, #(TD_PCB)
   56 #else
   57 .Lpcb:
   58         .word   _C_LABEL(__pcpu) + PC_CURPCB
   59 
   60 #define GET_PCB(tmp) \
   61         ldr     tmp, .Lpcb
   62 #endif
   63 
   64 /*
   65  * r0 - from
   66  * r1 - to
   67  * r2 - maxlens
   68  * r3 - lencopied
   69  *
   70  * Copy string from r0 to r1
   71  */
   72 ENTRY(copystr)
   73         stmfd   sp!, {r4-r5}                    /* stack is 8 byte aligned */
   74         teq     r2, #0x00000000
   75         mov     r5, #0x00000000
   76         moveq   r0, #ENAMETOOLONG
   77         beq     2f
   78 
   79 1:      ldrb    r4, [r0], #0x0001
   80         add     r5, r5, #0x00000001
   81         teq     r4, #0x00000000
   82         strb    r4, [r1], #0x0001
   83         teqne   r5, r2
   84         bne     1b
   85 
   86         teq     r4, #0x00000000
   87         moveq   r0, #0x00000000
   88         movne   r0, #ENAMETOOLONG
   89 
   90 2:      teq     r3, #0x00000000
   91         strne   r5, [r3]
   92 
   93         ldmfd   sp!, {r4-r5}                    /* stack is 8 byte aligned */
   94         RET
   95 END(copystr)
   96 
   97 #define SAVE_REGS       stmfd   sp!, {r4-r6}
   98 #define RESTORE_REGS    ldmfd   sp!, {r4-r6}
   99 
  100 /*
  101  * r0 - user space address
  102  * r1 - kernel space address
  103  * r2 - maxlens
  104  * r3 - lencopied
  105  *
  106  * Copy string from user space to kernel space
  107  */
  108 ENTRY(copyinstr)
  109         SAVE_REGS
  110 
  111         teq     r2, #0x00000000
  112         mov     r6, #0x00000000
  113         moveq   r0, #ENAMETOOLONG
  114         beq     2f
  115 
  116         GET_PCB(r4)
  117         ldr     r4, [r4]
  118 
  119 #ifdef DIAGNOSTIC
  120         teq     r4, #0x00000000
  121         beq     .Lcopystrpcbfault
  122 #endif
  123 
  124         adr     r5, .Lcopystrfault
  125         str     r5, [r4, #PCB_ONFAULT]
  126 
  127 1:      ldrbt   r5, [r0], #0x0001
  128         add     r6, r6, #0x00000001
  129         teq     r5, #0x00000000
  130         strb    r5, [r1], #0x0001
  131         teqne   r6, r2
  132         bne     1b
  133 
  134         mov     r0, #0x00000000
  135         str     r0, [r4, #PCB_ONFAULT]
  136 
  137         teq     r5, #0x00000000
  138         moveq   r0, #0x00000000
  139         movne   r0, #ENAMETOOLONG
  140 
  141 2:      teq     r3, #0x00000000
  142         strne   r6, [r3]
  143 
  144         RESTORE_REGS
  145         RET
  146 END(copyinstr)
  147 
  148 /*
  149  * r0 - kernel space address
  150  * r1 - user space address
  151  * r2 - maxlens
  152  * r3 - lencopied
  153  *
  154  * Copy string from kernel space to user space
  155  */
  156 ENTRY(copyoutstr)
  157         SAVE_REGS
  158 
  159         teq     r2, #0x00000000
  160         mov     r6, #0x00000000
  161         moveq   r0, #ENAMETOOLONG
  162         beq     2f
  163 
  164         GET_PCB(r4)
  165         ldr     r4, [r4]
  166 
  167 #ifdef DIAGNOSTIC
  168         teq     r4, #0x00000000
  169         beq     .Lcopystrpcbfault
  170 #endif
  171 
  172         adr     r5, .Lcopystrfault
  173         str     r5, [r4, #PCB_ONFAULT]
  174 
  175 1:      ldrb    r5, [r0], #0x0001
  176         add     r6, r6, #0x00000001
  177         teq     r5, #0x00000000
  178         strbt   r5, [r1], #0x0001
  179         teqne   r6, r2
  180         bne     1b
  181 
  182         mov     r0, #0x00000000
  183         str     r0, [r4, #PCB_ONFAULT]
  184 
  185         teq     r5, #0x00000000
  186         moveq   r0, #0x00000000
  187         movne   r0, #ENAMETOOLONG
  188 
  189 2:      teq     r3, #0x00000000
  190         strne   r6, [r3]
  191 
  192         RESTORE_REGS
  193         RET
  194 END(copyoutstr)
  195 
  196 /* A fault occurred during the copy */
  197 .Lcopystrfault:
  198         mov     r1, #0x00000000
  199         str     r1, [r4, #PCB_ONFAULT]
  200         RESTORE_REGS
  201         RET
  202 
  203 #ifdef DIAGNOSTIC
  204 .Lcopystrpcbfault:
  205         mov     r2, r1
  206         mov     r1, r0
  207         adr     r0, Lcopystrpcbfaulttext
  208         bic     sp, sp, #7                      /* align stack to 8 bytes */
  209         b       _C_LABEL(panic)
  210 
  211 Lcopystrpcbfaulttext:
  212         .asciz  "No valid PCB during copyinoutstr() addr1=%08x addr2=%08x\n"
  213         .align  2
  214 #endif

Cache object: c1976665e4237796ca4026d616675a27


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.