Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * AArch32 user helpers.
0004  * Based on the kuser helpers in arch/arm/kernel/entry-armv.S.
0005  *
0006  * Copyright (C) 2005-2011 Nicolas Pitre <nico@fluxnic.net>
0007  * Copyright (C) 2012-2018 ARM Ltd.
0008  *
0009  * The kuser helpers below are mapped at a fixed address by
0010  * aarch32_setup_additional_pages() and are provided for compatibility
0011  * reasons with 32 bit (aarch32) applications that need them.
0012  *
0013  * See Documentation/arm/kernel_user_helpers.rst for formal definitions.
0014  */
0015 
0016 #include <asm/unistd.h>
0017 
0018     .section .rodata
0019     .align  5
0020     .globl  __kuser_helper_start
0021 __kuser_helper_start:
0022 
0023 __kuser_cmpxchg64:          // 0xffff0f60
0024     .inst   0xe92d00f0      //  push        {r4, r5, r6, r7}
0025     .inst   0xe1c040d0      //  ldrd        r4, r5, [r0]
0026     .inst   0xe1c160d0      //  ldrd        r6, r7, [r1]
0027     .inst   0xe1b20f9f      // 1:   ldrexd      r0, r1, [r2]
0028     .inst   0xe0303004      //  eors        r3, r0, r4
0029     .inst   0x00313005      //  eoreqs      r3, r1, r5
0030     .inst   0x01a23e96      //  stlexdeq    r3, r6, [r2]
0031     .inst   0x03330001      //  teqeq       r3, #1
0032     .inst   0x0afffff9      //  beq     1b
0033     .inst   0xf57ff05b      //  dmb     ish
0034     .inst   0xe2730000      //  rsbs        r0, r3, #0
0035     .inst   0xe8bd00f0      //  pop     {r4, r5, r6, r7}
0036     .inst   0xe12fff1e      //  bx      lr
0037 
0038     .align  5
0039 __kuser_memory_barrier:         // 0xffff0fa0
0040     .inst   0xf57ff05b      //  dmb     ish
0041     .inst   0xe12fff1e      //  bx      lr
0042 
0043     .align  5
0044 __kuser_cmpxchg:            // 0xffff0fc0
0045     .inst   0xe1923f9f      // 1:   ldrex       r3, [r2]
0046     .inst   0xe0533000      //  subs        r3, r3, r0
0047     .inst   0x01823e91      //  stlexeq     r3, r1, [r2]
0048     .inst   0x03330001      //  teqeq       r3, #1
0049     .inst   0x0afffffa      //  beq     1b
0050     .inst   0xf57ff05b      //  dmb     ish
0051     .inst   0xe2730000      //  rsbs        r0, r3, #0
0052     .inst   0xe12fff1e      //  bx      lr
0053 
0054     .align  5
0055 __kuser_get_tls:            // 0xffff0fe0
0056     .inst   0xee1d0f70      //  mrc     p15, 0, r0, c13, c0, 3
0057     .inst   0xe12fff1e      //  bx      lr
0058     .rep    5
0059     .word   0
0060     .endr
0061 
0062 __kuser_helper_version:         // 0xffff0ffc
0063     .word   ((__kuser_helper_end - __kuser_helper_start) >> 5)
0064     .globl  __kuser_helper_end
0065 __kuser_helper_end: