summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/arch/xtensa/lib
diff options
context:
space:
mode:
Diffstat (limited to 'ANDROID_3.4.5/arch/xtensa/lib')
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/Makefile7
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/checksum.S409
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/memcopy.S315
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/memset.S160
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/pci-auto.c352
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/strncpy_user.S225
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/strnlen_user.S148
-rw-r--r--ANDROID_3.4.5/arch/xtensa/lib/usercopy.S321
8 files changed, 0 insertions, 1937 deletions
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/Makefile b/ANDROID_3.4.5/arch/xtensa/lib/Makefile
deleted file mode 100644
index 6c4fdd86..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-#
-# Makefile for Xtensa-specific library files.
-#
-
-lib-y += memcopy.o memset.o checksum.o \
- usercopy.o strncpy_user.o strnlen_user.o
-lib-$(CONFIG_PCI) += pci-auto.o
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/checksum.S b/ANDROID_3.4.5/arch/xtensa/lib/checksum.S
deleted file mode 100644
index df397f93..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/checksum.S
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- * INET An implementation of the TCP/IP protocol suite for the LINUX
- * operating system. INET is implemented using the BSD Socket
- * interface as the means of communication with the user level.
- *
- * IP/TCP/UDP checksumming routines
- *
- * Xtensa version: Copyright (C) 2001 Tensilica, Inc. by Kevin Chea
- * Optimized by Joe Taylor
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <asm/errno.h>
-#include <linux/linkage.h>
-#include <variant/core.h>
-
-/*
- * computes a partial checksum, e.g. for TCP/UDP fragments
- */
-
-/*
- * unsigned int csum_partial(const unsigned char *buf, int len,
- * unsigned int sum);
- * a2 = buf
- * a3 = len
- * a4 = sum
- *
- * This function assumes 2- or 4-byte alignment. Other alignments will fail!
- */
-
-/* ONES_ADD converts twos-complement math to ones-complement. */
-#define ONES_ADD(sum, val) \
- add sum, sum, val ; \
- bgeu sum, val, 99f ; \
- addi sum, sum, 1 ; \
-99: ;
-
-.text
-ENTRY(csum_partial)
- /*
- * Experiments with Ethernet and SLIP connections show that buf
- * is aligned on either a 2-byte or 4-byte boundary.
- */
- entry sp, 32
- extui a5, a2, 0, 2
- bnez a5, 8f /* branch if 2-byte aligned */
- /* Fall-through on common case, 4-byte alignment */
-1:
- srli a5, a3, 5 /* 32-byte chunks */
-#if XCHAL_HAVE_LOOPS
- loopgtz a5, 2f
-#else
- beqz a5, 2f
- slli a5, a5, 5
- add a5, a5, a2 /* a5 = end of last 32-byte chunk */
-.Loop1:
-#endif
- l32i a6, a2, 0
- l32i a7, a2, 4
- ONES_ADD(a4, a6)
- ONES_ADD(a4, a7)
- l32i a6, a2, 8
- l32i a7, a2, 12
- ONES_ADD(a4, a6)
- ONES_ADD(a4, a7)
- l32i a6, a2, 16
- l32i a7, a2, 20
- ONES_ADD(a4, a6)
- ONES_ADD(a4, a7)
- l32i a6, a2, 24
- l32i a7, a2, 28
- ONES_ADD(a4, a6)
- ONES_ADD(a4, a7)
- addi a2, a2, 4*8
-#if !XCHAL_HAVE_LOOPS
- blt a2, a5, .Loop1
-#endif
-2:
- extui a5, a3, 2, 3 /* remaining 4-byte chunks */
-#if XCHAL_HAVE_LOOPS
- loopgtz a5, 3f
-#else
- beqz a5, 3f
- slli a5, a5, 2
- add a5, a5, a2 /* a5 = end of last 4-byte chunk */
-.Loop2:
-#endif
- l32i a6, a2, 0
- ONES_ADD(a4, a6)
- addi a2, a2, 4
-#if !XCHAL_HAVE_LOOPS
- blt a2, a5, .Loop2
-#endif
-3:
- _bbci.l a3, 1, 5f /* remaining 2-byte chunk */
- l16ui a6, a2, 0
- ONES_ADD(a4, a6)
- addi a2, a2, 2
-5:
- _bbci.l a3, 0, 7f /* remaining 1-byte chunk */
-6: l8ui a6, a2, 0
-#ifdef __XTENSA_EB__
- slli a6, a6, 8 /* load byte into bits 8..15 */
-#endif
- ONES_ADD(a4, a6)
-7:
- mov a2, a4
- retw
-
- /* uncommon case, buf is 2-byte aligned */
-8:
- beqz a3, 7b /* branch if len == 0 */
- beqi a3, 1, 6b /* branch if len == 1 */
-
- extui a5, a2, 0, 1
- bnez a5, 8f /* branch if 1-byte aligned */
-
- l16ui a6, a2, 0 /* common case, len >= 2 */
- ONES_ADD(a4, a6)
- addi a2, a2, 2 /* adjust buf */
- addi a3, a3, -2 /* adjust len */
- j 1b /* now buf is 4-byte aligned */
-
- /* case: odd-byte aligned, len > 1
- * This case is dog slow, so don't give us an odd address.
- * (I don't think this ever happens, but just in case.)
- */
-8:
- srli a5, a3, 2 /* 4-byte chunks */
-#if XCHAL_HAVE_LOOPS
- loopgtz a5, 2f
-#else
- beqz a5, 2f
- slli a5, a5, 2
- add a5, a5, a2 /* a5 = end of last 4-byte chunk */
-.Loop3:
-#endif
- l8ui a6, a2, 0 /* bits 24..31 */
- l16ui a7, a2, 1 /* bits 8..23 */
- l8ui a8, a2, 3 /* bits 0.. 8 */
-#ifdef __XTENSA_EB__
- slli a6, a6, 24
-#else
- slli a8, a8, 24
-#endif
- slli a7, a7, 8
- or a7, a7, a6
- or a7, a7, a8
- ONES_ADD(a4, a7)
- addi a2, a2, 4
-#if !XCHAL_HAVE_LOOPS
- blt a2, a5, .Loop3
-#endif
-2:
- _bbci.l a3, 1, 3f /* remaining 2-byte chunk, still odd addr */
- l8ui a6, a2, 0
- l8ui a7, a2, 1
-#ifdef __XTENSA_EB__
- slli a6, a6, 8
-#else
- slli a7, a7, 8
-#endif
- or a7, a7, a6
- ONES_ADD(a4, a7)
- addi a2, a2, 2
-3:
- j 5b /* branch to handle the remaining byte */
-
-
-
-/*
- * Copy from ds while checksumming, otherwise like csum_partial
- *
- * The macros SRC and DST specify the type of access for the instruction.
- * thus we can call a custom exception handler for each access type.
- */
-
-#define SRC(y...) \
- 9999: y; \
- .section __ex_table, "a"; \
- .long 9999b, 6001f ; \
- .previous
-
-#define DST(y...) \
- 9999: y; \
- .section __ex_table, "a"; \
- .long 9999b, 6002f ; \
- .previous
-
-/*
-unsigned int csum_partial_copy_generic (const char *src, char *dst, int len,
- int sum, int *src_err_ptr, int *dst_err_ptr)
- a2 = src
- a3 = dst
- a4 = len
- a5 = sum
- a6 = src_err_ptr
- a7 = dst_err_ptr
- a8 = temp
- a9 = temp
- a10 = temp
- a11 = original len for exception handling
- a12 = original dst for exception handling
-
- This function is optimized for 4-byte aligned addresses. Other
- alignments work, but not nearly as efficiently.
- */
-
-ENTRY(csum_partial_copy_generic)
- entry sp, 32
- mov a12, a3
- mov a11, a4
- or a10, a2, a3
-
- /* We optimize the following alignment tests for the 4-byte
- aligned case. Two bbsi.l instructions might seem more optimal
- (commented out below). However, both labels 5: and 3: are out
- of the imm8 range, so the assembler relaxes them into
- equivalent bbci.l, j combinations, which is actually
- slower. */
-
- extui a9, a10, 0, 2
- beqz a9, 1f /* branch if both are 4-byte aligned */
- bbsi.l a10, 0, 5f /* branch if one address is odd */
- j 3f /* one address is 2-byte aligned */
-
-/* _bbsi.l a10, 0, 5f */ /* branch if odd address */
-/* _bbsi.l a10, 1, 3f */ /* branch if 2-byte-aligned address */
-
-1:
- /* src and dst are both 4-byte aligned */
- srli a10, a4, 5 /* 32-byte chunks */
-#if XCHAL_HAVE_LOOPS
- loopgtz a10, 2f
-#else
- beqz a10, 2f
- slli a10, a10, 5
- add a10, a10, a2 /* a10 = end of last 32-byte src chunk */
-.Loop5:
-#endif
-SRC( l32i a9, a2, 0 )
-SRC( l32i a8, a2, 4 )
-DST( s32i a9, a3, 0 )
-DST( s32i a8, a3, 4 )
- ONES_ADD(a5, a9)
- ONES_ADD(a5, a8)
-SRC( l32i a9, a2, 8 )
-SRC( l32i a8, a2, 12 )
-DST( s32i a9, a3, 8 )
-DST( s32i a8, a3, 12 )
- ONES_ADD(a5, a9)
- ONES_ADD(a5, a8)
-SRC( l32i a9, a2, 16 )
-SRC( l32i a8, a2, 20 )
-DST( s32i a9, a3, 16 )
-DST( s32i a8, a3, 20 )
- ONES_ADD(a5, a9)
- ONES_ADD(a5, a8)
-SRC( l32i a9, a2, 24 )
-SRC( l32i a8, a2, 28 )
-DST( s32i a9, a3, 24 )
-DST( s32i a8, a3, 28 )
- ONES_ADD(a5, a9)
- ONES_ADD(a5, a8)
- addi a2, a2, 32
- addi a3, a3, 32
-#if !XCHAL_HAVE_LOOPS
- blt a2, a10, .Loop5
-#endif
-2:
- extui a10, a4, 2, 3 /* remaining 4-byte chunks */
- extui a4, a4, 0, 2 /* reset len for general-case, 2-byte chunks */
-#if XCHAL_HAVE_LOOPS
- loopgtz a10, 3f
-#else
- beqz a10, 3f
- slli a10, a10, 2
- add a10, a10, a2 /* a10 = end of last 4-byte src chunk */
-.Loop6:
-#endif
-SRC( l32i a9, a2, 0 )
-DST( s32i a9, a3, 0 )
- ONES_ADD(a5, a9)
- addi a2, a2, 4
- addi a3, a3, 4
-#if !XCHAL_HAVE_LOOPS
- blt a2, a10, .Loop6
-#endif
-3:
- /*
- Control comes to here in two cases: (1) It may fall through
- to here from the 4-byte alignment case to process, at most,
- one 2-byte chunk. (2) It branches to here from above if
- either src or dst is 2-byte aligned, and we process all bytes
- here, except for perhaps a trailing odd byte. It's
- inefficient, so align your addresses to 4-byte boundaries.
-
- a2 = src
- a3 = dst
- a4 = len
- a5 = sum
- */
- srli a10, a4, 1 /* 2-byte chunks */
-#if XCHAL_HAVE_LOOPS
- loopgtz a10, 4f
-#else
- beqz a10, 4f
- slli a10, a10, 1
- add a10, a10, a2 /* a10 = end of last 2-byte src chunk */
-.Loop7:
-#endif
-SRC( l16ui a9, a2, 0 )
-DST( s16i a9, a3, 0 )
- ONES_ADD(a5, a9)
- addi a2, a2, 2
- addi a3, a3, 2
-#if !XCHAL_HAVE_LOOPS
- blt a2, a10, .Loop7
-#endif
-4:
- /* This section processes a possible trailing odd byte. */
- _bbci.l a4, 0, 8f /* 1-byte chunk */
-SRC( l8ui a9, a2, 0 )
-DST( s8i a9, a3, 0 )
-#ifdef __XTENSA_EB__
- slli a9, a9, 8 /* shift byte to bits 8..15 */
-#endif
- ONES_ADD(a5, a9)
-8:
- mov a2, a5
- retw
-
-5:
- /* Control branch to here when either src or dst is odd. We
- process all bytes using 8-bit accesses. Grossly inefficient,
- so don't feed us an odd address. */
-
- srli a10, a4, 1 /* handle in pairs for 16-bit csum */
-#if XCHAL_HAVE_LOOPS
- loopgtz a10, 6f
-#else
- beqz a10, 6f
- slli a10, a10, 1
- add a10, a10, a2 /* a10 = end of last odd-aligned, 2-byte src chunk */
-.Loop8:
-#endif
-SRC( l8ui a9, a2, 0 )
-SRC( l8ui a8, a2, 1 )
-DST( s8i a9, a3, 0 )
-DST( s8i a8, a3, 1 )
-#ifdef __XTENSA_EB__
- slli a9, a9, 8 /* combine into a single 16-bit value */
-#else /* for checksum computation */
- slli a8, a8, 8
-#endif
- or a9, a9, a8
- ONES_ADD(a5, a9)
- addi a2, a2, 2
- addi a3, a3, 2
-#if !XCHAL_HAVE_LOOPS
- blt a2, a10, .Loop8
-#endif
-6:
- j 4b /* process the possible trailing odd byte */
-
-
-# Exception handler:
-.section .fixup, "ax"
-/*
- a6 = src_err_ptr
- a7 = dst_err_ptr
- a11 = original len for exception handling
- a12 = original dst for exception handling
-*/
-
-6001:
- _movi a2, -EFAULT
- s32i a2, a6, 0 /* src_err_ptr */
-
- # clear the complete destination - computing the rest
- # is too much work
- movi a2, 0
-#if XCHAL_HAVE_LOOPS
- loopgtz a11, 2f
-#else
- beqz a11, 2f
- add a11, a11, a12 /* a11 = ending address */
-.Leloop:
-#endif
- s8i a2, a12, 0
- addi a12, a12, 1
-#if !XCHAL_HAVE_LOOPS
- blt a12, a11, .Leloop
-#endif
-2:
- retw
-
-6002:
- movi a2, -EFAULT
- s32i a2, a7, 0 /* dst_err_ptr */
- movi a2, 0
- retw
-
-.previous
-
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/memcopy.S b/ANDROID_3.4.5/arch/xtensa/lib/memcopy.S
deleted file mode 100644
index ea59dcd0..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/memcopy.S
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * arch/xtensa/lib/hal/memcopy.S -- Core HAL library functions
- * xthal_memcpy and xthal_bcopy
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2002 - 2005 Tensilica Inc.
- */
-
-#include <variant/core.h>
-
- .macro src_b r, w0, w1
-#ifdef __XTENSA_EB__
- src \r, \w0, \w1
-#else
- src \r, \w1, \w0
-#endif
- .endm
-
- .macro ssa8 r
-#ifdef __XTENSA_EB__
- ssa8b \r
-#else
- ssa8l \r
-#endif
- .endm
-
-
-/*
- * void *memcpy(void *dst, const void *src, size_t len);
- * void *memmove(void *dst, const void *src, size_t len);
- * void *bcopy(const void *src, void *dst, size_t len);
- *
- * This function is intended to do the same thing as the standard
- * library function memcpy() (or bcopy()) for most cases.
- * However, where the source and/or destination references
- * an instruction RAM or ROM or a data RAM or ROM, that
- * source and/or destination will always be accessed with
- * 32-bit load and store instructions (as required for these
- * types of devices).
- *
- * !!!!!!! XTFIXME:
- * !!!!!!! Handling of IRAM/IROM has not yet
- * !!!!!!! been implemented.
- *
- * The bcopy version is provided here to avoid the overhead
- * of an extra call, for callers that require this convention.
- *
- * The (general case) algorithm is as follows:
- * If destination is unaligned, align it by conditionally
- * copying 1 and 2 bytes.
- * If source is aligned,
- * do 16 bytes with a loop, and then finish up with
- * 8, 4, 2, and 1 byte copies conditional on the length;
- * else (if source is unaligned),
- * do the same, but use SRC to align the source data.
- * This code tries to use fall-through branches for the common
- * case of aligned source and destination and multiple
- * of 4 (or 8) length.
- *
- * Register use:
- * a0/ return address
- * a1/ stack pointer
- * a2/ return value
- * a3/ src
- * a4/ length
- * a5/ dst
- * a6/ tmp
- * a7/ tmp
- * a8/ tmp
- * a9/ tmp
- * a10/ tmp
- * a11/ tmp
- */
-
- .text
- .align 4
- .global bcopy
- .type bcopy,@function
-bcopy:
- entry sp, 16 # minimal stack frame
- # a2=src, a3=dst, a4=len
- mov a5, a3 # copy dst so that a2 is return value
- mov a3, a2
- mov a2, a5
- j .Lcommon # go to common code for memcpy+bcopy
-
-
-/*
- * Byte by byte copy
- */
- .align 4
- .byte 0 # 1 mod 4 alignment for LOOPNEZ
- # (0 mod 4 alignment for LBEG)
-.Lbytecopy:
-#if XCHAL_HAVE_LOOPS
- loopnez a4, .Lbytecopydone
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a4, .Lbytecopydone
- add a7, a3, a4 # a7 = end address for source
-#endif /* !XCHAL_HAVE_LOOPS */
-.Lnextbyte:
- l8ui a6, a3, 0
- addi a3, a3, 1
- s8i a6, a5, 0
- addi a5, a5, 1
-#if !XCHAL_HAVE_LOOPS
- blt a3, a7, .Lnextbyte
-#endif /* !XCHAL_HAVE_LOOPS */
-.Lbytecopydone:
- retw
-
-/*
- * Destination is unaligned
- */
-
- .align 4
-.Ldst1mod2: # dst is only byte aligned
- _bltui a4, 7, .Lbytecopy # do short copies byte by byte
-
- # copy 1 byte
- l8ui a6, a3, 0
- addi a3, a3, 1
- addi a4, a4, -1
- s8i a6, a5, 0
- addi a5, a5, 1
- _bbci.l a5, 1, .Ldstaligned # if dst is now aligned, then
- # return to main algorithm
-.Ldst2mod4: # dst 16-bit aligned
- # copy 2 bytes
- _bltui a4, 6, .Lbytecopy # do short copies byte by byte
- l8ui a6, a3, 0
- l8ui a7, a3, 1
- addi a3, a3, 2
- addi a4, a4, -2
- s8i a6, a5, 0
- s8i a7, a5, 1
- addi a5, a5, 2
- j .Ldstaligned # dst is now aligned, return to main algorithm
-
- .align 4
- .global memcpy
- .type memcpy,@function
-memcpy:
- .global memmove
- .type memmove,@function
-memmove:
-
- entry sp, 16 # minimal stack frame
- # a2/ dst, a3/ src, a4/ len
- mov a5, a2 # copy dst so that a2 is return value
-.Lcommon:
- _bbsi.l a2, 0, .Ldst1mod2 # if dst is 1 mod 2
- _bbsi.l a2, 1, .Ldst2mod4 # if dst is 2 mod 4
-.Ldstaligned: # return here from .Ldst?mod? once dst is aligned
- srli a7, a4, 4 # number of loop iterations with 16B
- # per iteration
- movi a8, 3 # if source is not aligned,
- _bany a3, a8, .Lsrcunaligned # then use shifting copy
- /*
- * Destination and source are word-aligned, use word copy.
- */
- # copy 16 bytes per iteration for word-aligned dst and word-aligned src
-#if XCHAL_HAVE_LOOPS
- loopnez a7, .Loop1done
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a7, .Loop1done
- slli a8, a7, 4
- add a8, a8, a3 # a8 = end of last 16B source chunk
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop1:
- l32i a6, a3, 0
- l32i a7, a3, 4
- s32i a6, a5, 0
- l32i a6, a3, 8
- s32i a7, a5, 4
- l32i a7, a3, 12
- s32i a6, a5, 8
- addi a3, a3, 16
- s32i a7, a5, 12
- addi a5, a5, 16
-#if !XCHAL_HAVE_LOOPS
- blt a3, a8, .Loop1
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop1done:
- bbci.l a4, 3, .L2
- # copy 8 bytes
- l32i a6, a3, 0
- l32i a7, a3, 4
- addi a3, a3, 8
- s32i a6, a5, 0
- s32i a7, a5, 4
- addi a5, a5, 8
-.L2:
- bbsi.l a4, 2, .L3
- bbsi.l a4, 1, .L4
- bbsi.l a4, 0, .L5
- retw
-.L3:
- # copy 4 bytes
- l32i a6, a3, 0
- addi a3, a3, 4
- s32i a6, a5, 0
- addi a5, a5, 4
- bbsi.l a4, 1, .L4
- bbsi.l a4, 0, .L5
- retw
-.L4:
- # copy 2 bytes
- l16ui a6, a3, 0
- addi a3, a3, 2
- s16i a6, a5, 0
- addi a5, a5, 2
- bbsi.l a4, 0, .L5
- retw
-.L5:
- # copy 1 byte
- l8ui a6, a3, 0
- s8i a6, a5, 0
- retw
-
-/*
- * Destination is aligned, Source is unaligned
- */
-
- .align 4
-.Lsrcunaligned:
- _beqz a4, .Ldone # avoid loading anything for zero-length copies
- # copy 16 bytes per iteration for word-aligned dst and unaligned src
- ssa8 a3 # set shift amount from byte offset
-#define SIM_CHECKS_ALIGNMENT 1 /* set to 1 when running on ISS (simulator) with the
- lint or ferret client, or 0 to save a few cycles */
-#if XCHAL_UNALIGNED_LOAD_EXCEPTION || SIM_CHECKS_ALIGNMENT
- and a11, a3, a8 # save unalignment offset for below
- sub a3, a3, a11 # align a3
-#endif
- l32i a6, a3, 0 # load first word
-#if XCHAL_HAVE_LOOPS
- loopnez a7, .Loop2done
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a7, .Loop2done
- slli a10, a7, 4
- add a10, a10, a3 # a10 = end of last 16B source chunk
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop2:
- l32i a7, a3, 4
- l32i a8, a3, 8
- src_b a6, a6, a7
- s32i a6, a5, 0
- l32i a9, a3, 12
- src_b a7, a7, a8
- s32i a7, a5, 4
- l32i a6, a3, 16
- src_b a8, a8, a9
- s32i a8, a5, 8
- addi a3, a3, 16
- src_b a9, a9, a6
- s32i a9, a5, 12
- addi a5, a5, 16
-#if !XCHAL_HAVE_LOOPS
- blt a3, a10, .Loop2
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop2done:
- bbci.l a4, 3, .L12
- # copy 8 bytes
- l32i a7, a3, 4
- l32i a8, a3, 8
- src_b a6, a6, a7
- s32i a6, a5, 0
- addi a3, a3, 8
- src_b a7, a7, a8
- s32i a7, a5, 4
- addi a5, a5, 8
- mov a6, a8
-.L12:
- bbci.l a4, 2, .L13
- # copy 4 bytes
- l32i a7, a3, 4
- addi a3, a3, 4
- src_b a6, a6, a7
- s32i a6, a5, 0
- addi a5, a5, 4
- mov a6, a7
-.L13:
-#if XCHAL_UNALIGNED_LOAD_EXCEPTION || SIM_CHECKS_ALIGNMENT
- add a3, a3, a11 # readjust a3 with correct misalignment
-#endif
- bbsi.l a4, 1, .L14
- bbsi.l a4, 0, .L15
-.Ldone: retw
-.L14:
- # copy 2 bytes
- l8ui a6, a3, 0
- l8ui a7, a3, 1
- addi a3, a3, 2
- s8i a6, a5, 0
- s8i a7, a5, 1
- addi a5, a5, 2
- bbsi.l a4, 0, .L15
- retw
-.L15:
- # copy 1 byte
- l8ui a6, a3, 0
- s8i a6, a5, 0
- retw
-
-/*
- * Local Variables:
- * mode:fundamental
- * comment-start: "# "
- * comment-start-skip: "# *"
- * End:
- */
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/memset.S b/ANDROID_3.4.5/arch/xtensa/lib/memset.S
deleted file mode 100644
index 10b8c400..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/memset.S
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * arch/xtensa/lib/memset.S
- *
- * ANSI C standard library function memset
- * (Well, almost. .fixup code might return zero.)
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file "COPYING" in the main directory of
- * this archive for more details.
- *
- * Copyright (C) 2002 Tensilica Inc.
- */
-
-#include <variant/core.h>
-
-/*
- * void *memset(void *dst, int c, size_t length)
- *
- * The algorithm is as follows:
- * Create a word with c in all byte positions
- * If the destination is aligned,
- * do 16B chucks with a loop, and then finish up with
- * 8B, 4B, 2B, and 1B stores conditional on the length.
- * If destination is unaligned, align it by conditionally
- * setting 1B and 2B and then go to aligned case.
- * This code tries to use fall-through branches for the common
- * case of an aligned destination (except for the branches to
- * the alignment labels).
- */
-
-/* Load or store instructions that may cause exceptions use the EX macro. */
-
-#define EX(insn,reg1,reg2,offset,handler) \
-9: insn reg1, reg2, offset; \
- .section __ex_table, "a"; \
- .word 9b, handler; \
- .previous
-
-
-.text
-.align 4
-.global memset
-.type memset,@function
-memset:
- entry sp, 16 # minimal stack frame
- # a2/ dst, a3/ c, a4/ length
- extui a3, a3, 0, 8 # mask to just 8 bits
- slli a7, a3, 8 # duplicate character in all bytes of word
- or a3, a3, a7 # ...
- slli a7, a3, 16 # ...
- or a3, a3, a7 # ...
- mov a5, a2 # copy dst so that a2 is return value
- movi a6, 3 # for alignment tests
- bany a2, a6, .Ldstunaligned # if dst is unaligned
-.L0: # return here from .Ldstunaligned when dst is aligned
- srli a7, a4, 4 # number of loop iterations with 16B
- # per iteration
- bnez a4, .Laligned
- retw
-
-/*
- * Destination is word-aligned.
- */
- # set 16 bytes per iteration for word-aligned dst
- .align 4 # 1 mod 4 alignment for LOOPNEZ
- .byte 0 # (0 mod 4 alignment for LBEG)
-.Laligned:
-#if XCHAL_HAVE_LOOPS
- loopnez a7, .Loop1done
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a7, .Loop1done
- slli a6, a7, 4
- add a6, a6, a5 # a6 = end of last 16B chunk
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop1:
- EX(s32i, a3, a5, 0, memset_fixup)
- EX(s32i, a3, a5, 4, memset_fixup)
- EX(s32i, a3, a5, 8, memset_fixup)
- EX(s32i, a3, a5, 12, memset_fixup)
- addi a5, a5, 16
-#if !XCHAL_HAVE_LOOPS
- blt a5, a6, .Loop1
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop1done:
- bbci.l a4, 3, .L2
- # set 8 bytes
- EX(s32i, a3, a5, 0, memset_fixup)
- EX(s32i, a3, a5, 4, memset_fixup)
- addi a5, a5, 8
-.L2:
- bbci.l a4, 2, .L3
- # set 4 bytes
- EX(s32i, a3, a5, 0, memset_fixup)
- addi a5, a5, 4
-.L3:
- bbci.l a4, 1, .L4
- # set 2 bytes
- EX(s16i, a3, a5, 0, memset_fixup)
- addi a5, a5, 2
-.L4:
- bbci.l a4, 0, .L5
- # set 1 byte
- EX(s8i, a3, a5, 0, memset_fixup)
-.L5:
-.Lret1:
- retw
-
-/*
- * Destination is unaligned
- */
-
-.Ldstunaligned:
- bltui a4, 8, .Lbyteset # do short copies byte by byte
- bbci.l a5, 0, .L20 # branch if dst alignment half-aligned
- # dst is only byte aligned
- # set 1 byte
- EX(s8i, a3, a5, 0, memset_fixup)
- addi a5, a5, 1
- addi a4, a4, -1
- # now retest if dst aligned
- bbci.l a5, 1, .L0 # if now aligned, return to main algorithm
-.L20:
- # dst half-aligned
- # set 2 bytes
- EX(s16i, a3, a5, 0, memset_fixup)
- addi a5, a5, 2
- addi a4, a4, -2
- j .L0 # dst is now aligned, return to main algorithm
-
-/*
- * Byte by byte set
- */
- .align 4
- .byte 0 # 1 mod 4 alignment for LOOPNEZ
- # (0 mod 4 alignment for LBEG)
-.Lbyteset:
-#if XCHAL_HAVE_LOOPS
- loopnez a4, .Lbytesetdone
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a4, .Lbytesetdone
- add a6, a5, a4 # a6 = ending address
-#endif /* !XCHAL_HAVE_LOOPS */
-.Lbyteloop:
- EX(s8i, a3, a5, 0, memset_fixup)
- addi a5, a5, 1
-#if !XCHAL_HAVE_LOOPS
- blt a5, a6, .Lbyteloop
-#endif /* !XCHAL_HAVE_LOOPS */
-.Lbytesetdone:
- retw
-
-
- .section .fixup, "ax"
- .align 4
-
-/* We return zero if a failure occurred. */
-
-memset_fixup:
- movi a2, 0
- retw
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/pci-auto.c b/ANDROID_3.4.5/arch/xtensa/lib/pci-auto.c
deleted file mode 100644
index a71733ae..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/pci-auto.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * arch/xtensa/lib/pci-auto.c
- *
- * PCI autoconfiguration library
- *
- * Copyright (C) 2001 - 2005 Tensilica Inc.
- *
- * Chris Zankel <zankel@tensilica.com, cez@zankel.net>
- *
- * Based on work from Matt Porter <mporter@mvista.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-
-#include <asm/pci-bridge.h>
-
-
-/*
- *
- * Setting up a PCI
- *
- * pci_ctrl->first_busno = <first bus number (0)>
- * pci_ctrl->last_busno = <last bus number (0xff)>
- * pci_ctrl->ops = <PCI config operations>
- * pci_ctrl->map_irq = <function to return the interrupt number for a device>
- *
- * pci_ctrl->io_space.start = <IO space start address (PCI view)>
- * pci_ctrl->io_space.end = <IO space end address (PCI view)>
- * pci_ctrl->io_space.base = <IO space offset: address 0 from CPU space>
- * pci_ctrl->mem_space.start = <MEM space start address (PCI view)>
- * pci_ctrl->mem_space.end = <MEM space end address (PCI view)>
- * pci_ctrl->mem_space.base = <MEM space offset: address 0 from CPU space>
- *
- * pcibios_init_resource(&pci_ctrl->io_resource, <IO space start>,
- * <IO space end>, IORESOURCE_IO, "PCI host bridge");
- * pcibios_init_resource(&pci_ctrl->mem_resources[0], <MEM space start>,
- * <MEM space end>, IORESOURCE_MEM, "PCI host bridge");
- *
- * pci_ctrl->last_busno = pciauto_bus_scan(pci_ctrl,pci_ctrl->first_busno);
- *
- * int __init pciauto_bus_scan(struct pci_controller *pci_ctrl, int current_bus)
- *
- */
-
-
-/* define DEBUG to print some debugging messages. */
-
-#undef DEBUG
-
-#ifdef DEBUG
-# define DBG(x...) printk(x)
-#else
-# define DBG(x...)
-#endif
-
-static int pciauto_upper_iospc;
-static int pciauto_upper_memspc;
-
-static struct pci_dev pciauto_dev;
-static struct pci_bus pciauto_bus;
-
-/*
- * Helper functions
- */
-
-/* Initialize the bars of a PCI device. */
-
-static void __init
-pciauto_setup_bars(struct pci_dev *dev, int bar_limit)
-{
- int bar_size;
- int bar, bar_nr;
- int *upper_limit;
- int found_mem64 = 0;
-
- for (bar = PCI_BASE_ADDRESS_0, bar_nr = 0;
- bar <= bar_limit;
- bar+=4, bar_nr++)
- {
- /* Tickle the BAR and get the size */
- pci_write_config_dword(dev, bar, 0xffffffff);
- pci_read_config_dword(dev, bar, &bar_size);
-
- /* If BAR is not implemented go to the next BAR */
- if (!bar_size)
- continue;
-
- /* Check the BAR type and set our address mask */
- if (bar_size & PCI_BASE_ADDRESS_SPACE_IO)
- {
- bar_size &= PCI_BASE_ADDRESS_IO_MASK;
- upper_limit = &pciauto_upper_iospc;
- DBG("PCI Autoconfig: BAR %d, I/O, ", bar_nr);
- }
- else
- {
- if ((bar_size & PCI_BASE_ADDRESS_MEM_TYPE_MASK) ==
- PCI_BASE_ADDRESS_MEM_TYPE_64)
- found_mem64 = 1;
-
- bar_size &= PCI_BASE_ADDRESS_MEM_MASK;
- upper_limit = &pciauto_upper_memspc;
- DBG("PCI Autoconfig: BAR %d, Mem, ", bar_nr);
- }
-
- /* Allocate a base address (bar_size is negative!) */
- *upper_limit = (*upper_limit + bar_size) & bar_size;
-
- /* Write it out and update our limit */
- pci_write_config_dword(dev, bar, *upper_limit);
-
- /*
- * If we are a 64-bit decoder then increment to the
- * upper 32 bits of the bar and force it to locate
- * in the lower 4GB of memory.
- */
-
- if (found_mem64)
- pci_write_config_dword(dev, (bar+=4), 0x00000000);
-
- DBG("size=0x%x, address=0x%x\n", ~bar_size + 1, *upper_limit);
- }
-}
-
-/* Initialize the interrupt number. */
-
-static void __init
-pciauto_setup_irq(struct pci_controller* pci_ctrl,struct pci_dev *dev,int devfn)
-{
- u8 pin;
- int irq = 0;
-
- pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-
- /* Fix illegal pin numbers. */
-
- if (pin == 0 || pin > 4)
- pin = 1;
-
- if (pci_ctrl->map_irq)
- irq = pci_ctrl->map_irq(dev, PCI_SLOT(devfn), pin);
-
- if (irq == -1)
- irq = 0;
-
- DBG("PCI Autoconfig: Interrupt %d, pin %d\n", irq, pin);
-
- pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
-}
-
-
-static void __init
-pciauto_prescan_setup_bridge(struct pci_dev *dev, int current_bus,
- int sub_bus, int *iosave, int *memsave)
-{
- /* Configure bus number registers */
- pci_write_config_byte(dev, PCI_PRIMARY_BUS, current_bus);
- pci_write_config_byte(dev, PCI_SECONDARY_BUS, sub_bus + 1);
- pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, 0xff);
-
- /* Round memory allocator to 1MB boundary */
- pciauto_upper_memspc &= ~(0x100000 - 1);
- *memsave = pciauto_upper_memspc;
-
- /* Round I/O allocator to 4KB boundary */
- pciauto_upper_iospc &= ~(0x1000 - 1);
- *iosave = pciauto_upper_iospc;
-
- /* Set up memory and I/O filter limits, assume 32-bit I/O space */
- pci_write_config_word(dev, PCI_MEMORY_LIMIT,
- ((pciauto_upper_memspc - 1) & 0xfff00000) >> 16);
- pci_write_config_byte(dev, PCI_IO_LIMIT,
- ((pciauto_upper_iospc - 1) & 0x0000f000) >> 8);
- pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16,
- ((pciauto_upper_iospc - 1) & 0xffff0000) >> 16);
-}
-
-static void __init
-pciauto_postscan_setup_bridge(struct pci_dev *dev, int current_bus, int sub_bus,
- int *iosave, int *memsave)
-{
- int cmdstat;
-
- /* Configure bus number registers */
- pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, sub_bus);
-
- /*
- * Round memory allocator to 1MB boundary.
- * If no space used, allocate minimum.
- */
- pciauto_upper_memspc &= ~(0x100000 - 1);
- if (*memsave == pciauto_upper_memspc)
- pciauto_upper_memspc -= 0x00100000;
-
- pci_write_config_word(dev, PCI_MEMORY_BASE, pciauto_upper_memspc >> 16);
-
- /* Allocate 1MB for pre-fretch */
- pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT,
- ((pciauto_upper_memspc - 1) & 0xfff00000) >> 16);
-
- pciauto_upper_memspc -= 0x100000;
-
- pci_write_config_word(dev, PCI_PREF_MEMORY_BASE,
- pciauto_upper_memspc >> 16);
-
- /* Round I/O allocator to 4KB boundary */
- pciauto_upper_iospc &= ~(0x1000 - 1);
- if (*iosave == pciauto_upper_iospc)
- pciauto_upper_iospc -= 0x1000;
-
- pci_write_config_byte(dev, PCI_IO_BASE,
- (pciauto_upper_iospc & 0x0000f000) >> 8);
- pci_write_config_word(dev, PCI_IO_BASE_UPPER16,
- pciauto_upper_iospc >> 16);
-
- /* Enable memory and I/O accesses, enable bus master */
- pci_read_config_dword(dev, PCI_COMMAND, &cmdstat);
- pci_write_config_dword(dev, PCI_COMMAND,
- cmdstat |
- PCI_COMMAND_IO |
- PCI_COMMAND_MEMORY |
- PCI_COMMAND_MASTER);
-}
-
-/*
- * Scan the current PCI bus.
- */
-
-
-int __init pciauto_bus_scan(struct pci_controller *pci_ctrl, int current_bus)
-{
- int sub_bus, pci_devfn, pci_class, cmdstat, found_multi=0;
- unsigned short vid;
- unsigned char header_type;
- struct pci_dev *dev = &pciauto_dev;
-
- pciauto_dev.bus = &pciauto_bus;
- pciauto_dev.sysdata = pci_ctrl;
- pciauto_bus.ops = pci_ctrl->ops;
-
- /*
- * Fetch our I/O and memory space upper boundaries used
- * to allocated base addresses on this pci_controller.
- */
-
- if (current_bus == pci_ctrl->first_busno)
- {
- pciauto_upper_iospc = pci_ctrl->io_resource.end + 1;
- pciauto_upper_memspc = pci_ctrl->mem_resources[0].end + 1;
- }
-
- sub_bus = current_bus;
-
- for (pci_devfn = 0; pci_devfn < 0xff; pci_devfn++)
- {
- /* Skip our host bridge */
- if ((current_bus == pci_ctrl->first_busno) && (pci_devfn == 0))
- continue;
-
- if (PCI_FUNC(pci_devfn) && !found_multi)
- continue;
-
- pciauto_bus.number = current_bus;
- pciauto_dev.devfn = pci_devfn;
-
- /* If config space read fails from this device, move on */
- if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type))
- continue;
-
- if (!PCI_FUNC(pci_devfn))
- found_multi = header_type & 0x80;
- pci_read_config_word(dev, PCI_VENDOR_ID, &vid);
-
- if (vid == 0xffff || vid == 0x0000) {
- found_multi = 0;
- continue;
- }
-
- pci_read_config_dword(dev, PCI_CLASS_REVISION, &pci_class);
-
- if ((pci_class >> 16) == PCI_CLASS_BRIDGE_PCI) {
-
- int iosave, memsave;
-
- DBG("PCI Autoconfig: Found P2P bridge, device %d\n",
- PCI_SLOT(pci_devfn));
-
- /* Allocate PCI I/O and/or memory space */
- pciauto_setup_bars(dev, PCI_BASE_ADDRESS_1);
-
- pciauto_prescan_setup_bridge(dev, current_bus, sub_bus,
- &iosave, &memsave);
- sub_bus = pciauto_bus_scan(pci_ctrl, sub_bus+1);
- pciauto_postscan_setup_bridge(dev, current_bus, sub_bus,
- &iosave, &memsave);
- pciauto_bus.number = current_bus;
-
- continue;
-
- }
-
-
-#if 0
- /* Skip legacy mode IDE controller */
-
- if ((pci_class >> 16) == PCI_CLASS_STORAGE_IDE) {
-
- unsigned char prg_iface;
- pci_read_config_byte(dev, PCI_CLASS_PROG, &prg_iface);
-
- if (!(prg_iface & PCIAUTO_IDE_MODE_MASK)) {
- DBG("PCI Autoconfig: Skipping legacy mode "
- "IDE controller\n");
- continue;
- }
- }
-#endif
-
- /*
- * Found a peripheral, enable some standard
- * settings
- */
-
- pci_read_config_dword(dev, PCI_COMMAND, &cmdstat);
- pci_write_config_dword(dev, PCI_COMMAND,
- cmdstat |
- PCI_COMMAND_IO |
- PCI_COMMAND_MEMORY |
- PCI_COMMAND_MASTER);
- pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x80);
-
- /* Allocate PCI I/O and/or memory space */
- DBG("PCI Autoconfig: Found Bus %d, Device %d, Function %d\n",
- current_bus, PCI_SLOT(pci_devfn), PCI_FUNC(pci_devfn) );
-
- pciauto_setup_bars(dev, PCI_BASE_ADDRESS_5);
- pciauto_setup_irq(pci_ctrl, dev, pci_devfn);
- }
- return sub_bus;
-}
-
-
-
-
-
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/strncpy_user.S b/ANDROID_3.4.5/arch/xtensa/lib/strncpy_user.S
deleted file mode 100644
index 9f603cda..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/strncpy_user.S
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * arch/xtensa/lib/strncpy_user.S
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file "COPYING" in the main directory of
- * this archive for more details.
- *
- * Returns: -EFAULT if exception before terminator, N if the entire
- * buffer filled, else strlen.
- *
- * Copyright (C) 2002 Tensilica Inc.
- */
-
-#include <variant/core.h>
-#include <linux/errno.h>
-
-/* Load or store instructions that may cause exceptions use the EX macro. */
-
-#define EX(insn,reg1,reg2,offset,handler) \
-9: insn reg1, reg2, offset; \
- .section __ex_table, "a"; \
- .word 9b, handler; \
- .previous
-
-/*
- * char *__strncpy_user(char *dst, const char *src, size_t len)
- */
-
-#ifdef __XTENSA_EB__
-# define MASK0 0xff000000
-# define MASK1 0x00ff0000
-# define MASK2 0x0000ff00
-# define MASK3 0x000000ff
-#else
-# define MASK0 0x000000ff
-# define MASK1 0x0000ff00
-# define MASK2 0x00ff0000
-# define MASK3 0xff000000
-#endif
-
-# Register use
-# a0/ return address
-# a1/ stack pointer
-# a2/ return value
-# a3/ src
-# a4/ len
-# a5/ mask0
-# a6/ mask1
-# a7/ mask2
-# a8/ mask3
-# a9/ tmp
-# a10/ tmp
-# a11/ dst
-# a12/ tmp
-
-.text
-.align 4
-.global __strncpy_user
-.type __strncpy_user,@function
-__strncpy_user:
- entry sp, 16 # minimal stack frame
- # a2/ dst, a3/ src, a4/ len
- mov a11, a2 # leave dst in return value register
- beqz a4, .Lret # if len is zero
- movi a5, MASK0 # mask for byte 0
- movi a6, MASK1 # mask for byte 1
- movi a7, MASK2 # mask for byte 2
- movi a8, MASK3 # mask for byte 3
- bbsi.l a3, 0, .Lsrc1mod2 # if only 8-bit aligned
- bbsi.l a3, 1, .Lsrc2mod4 # if only 16-bit aligned
-.Lsrcaligned: # return here when src is word-aligned
- srli a12, a4, 2 # number of loop iterations with 4B per loop
- movi a9, 3
- bnone a11, a9, .Laligned
- j .Ldstunaligned
-
-.Lsrc1mod2: # src address is odd
- EX(l8ui, a9, a3, 0, fixup_l) # get byte 0
- addi a3, a3, 1 # advance src pointer
- EX(s8i, a9, a11, 0, fixup_s) # store byte 0
- beqz a9, .Lret # if byte 0 is zero
- addi a11, a11, 1 # advance dst pointer
- addi a4, a4, -1 # decrement len
- beqz a4, .Lret # if len is zero
- bbci.l a3, 1, .Lsrcaligned # if src is now word-aligned
-
-.Lsrc2mod4: # src address is 2 mod 4
- EX(l8ui, a9, a3, 0, fixup_l) # get byte 0
- /* 1-cycle interlock */
- EX(s8i, a9, a11, 0, fixup_s) # store byte 0
- beqz a9, .Lret # if byte 0 is zero
- addi a11, a11, 1 # advance dst pointer
- addi a4, a4, -1 # decrement len
- beqz a4, .Lret # if len is zero
- EX(l8ui, a9, a3, 1, fixup_l) # get byte 0
- addi a3, a3, 2 # advance src pointer
- EX(s8i, a9, a11, 0, fixup_s) # store byte 0
- beqz a9, .Lret # if byte 0 is zero
- addi a11, a11, 1 # advance dst pointer
- addi a4, a4, -1 # decrement len
- bnez a4, .Lsrcaligned # if len is nonzero
-.Lret:
- sub a2, a11, a2 # compute strlen
- retw
-
-/*
- * dst is word-aligned, src is word-aligned
- */
- .align 4 # 1 mod 4 alignment for LOOPNEZ
- .byte 0 # (0 mod 4 alignment for LBEG)
-.Laligned:
-#if XCHAL_HAVE_LOOPS
- loopnez a12, .Loop1done
-#else
- beqz a12, .Loop1done
- slli a12, a12, 2
- add a12, a12, a11 # a12 = end of last 4B chunck
-#endif
-.Loop1:
- EX(l32i, a9, a3, 0, fixup_l) # get word from src
- addi a3, a3, 4 # advance src pointer
- bnone a9, a5, .Lz0 # if byte 0 is zero
- bnone a9, a6, .Lz1 # if byte 1 is zero
- bnone a9, a7, .Lz2 # if byte 2 is zero
- EX(s32i, a9, a11, 0, fixup_s) # store word to dst
- bnone a9, a8, .Lz3 # if byte 3 is zero
- addi a11, a11, 4 # advance dst pointer
-#if !XCHAL_HAVE_LOOPS
- blt a11, a12, .Loop1
-#endif
-
-.Loop1done:
- bbci.l a4, 1, .L100
- # copy 2 bytes
- EX(l16ui, a9, a3, 0, fixup_l)
- addi a3, a3, 2 # advance src pointer
-#ifdef __XTENSA_EB__
- bnone a9, a7, .Lz0 # if byte 2 is zero
- bnone a9, a8, .Lz1 # if byte 3 is zero
-#else
- bnone a9, a5, .Lz0 # if byte 0 is zero
- bnone a9, a6, .Lz1 # if byte 1 is zero
-#endif
- EX(s16i, a9, a11, 0, fixup_s)
- addi a11, a11, 2 # advance dst pointer
-.L100:
- bbci.l a4, 0, .Lret
- EX(l8ui, a9, a3, 0, fixup_l)
- /* slot */
- EX(s8i, a9, a11, 0, fixup_s)
- beqz a9, .Lret # if byte is zero
- addi a11, a11, 1-3 # advance dst ptr 1, but also cancel
- # the effect of adding 3 in .Lz3 code
- /* fall thru to .Lz3 and "retw" */
-
-.Lz3: # byte 3 is zero
- addi a11, a11, 3 # advance dst pointer
- sub a2, a11, a2 # compute strlen
- retw
-.Lz0: # byte 0 is zero
-#ifdef __XTENSA_EB__
- movi a9, 0
-#endif /* __XTENSA_EB__ */
- EX(s8i, a9, a11, 0, fixup_s)
- sub a2, a11, a2 # compute strlen
- retw
-.Lz1: # byte 1 is zero
-#ifdef __XTENSA_EB__
- extui a9, a9, 16, 16
-#endif /* __XTENSA_EB__ */
- EX(s16i, a9, a11, 0, fixup_s)
- addi a11, a11, 1 # advance dst pointer
- sub a2, a11, a2 # compute strlen
- retw
-.Lz2: # byte 2 is zero
-#ifdef __XTENSA_EB__
- extui a9, a9, 16, 16
-#endif /* __XTENSA_EB__ */
- EX(s16i, a9, a11, 0, fixup_s)
- movi a9, 0
- EX(s8i, a9, a11, 2, fixup_s)
- addi a11, a11, 2 # advance dst pointer
- sub a2, a11, a2 # compute strlen
- retw
-
- .align 4 # 1 mod 4 alignment for LOOPNEZ
- .byte 0 # (0 mod 4 alignment for LBEG)
-.Ldstunaligned:
-/*
- * for now just use byte copy loop
- */
-#if XCHAL_HAVE_LOOPS
- loopnez a4, .Lunalignedend
-#else
- beqz a4, .Lunalignedend
- add a12, a11, a4 # a12 = ending address
-#endif /* XCHAL_HAVE_LOOPS */
-.Lnextbyte:
- EX(l8ui, a9, a3, 0, fixup_l)
- addi a3, a3, 1
- EX(s8i, a9, a11, 0, fixup_s)
- beqz a9, .Lunalignedend
- addi a11, a11, 1
-#if !XCHAL_HAVE_LOOPS
- blt a11, a12, .Lnextbyte
-#endif
-
-.Lunalignedend:
- sub a2, a11, a2 # compute strlen
- retw
-
-
- .section .fixup, "ax"
- .align 4
-
- /* For now, just return -EFAULT. Future implementations might
- * like to clear remaining kernel space, like the fixup
- * implementation in memset(). Thus, we differentiate between
- * load/store fixups. */
-
-fixup_s:
-fixup_l:
- movi a2, -EFAULT
- retw
-
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/strnlen_user.S b/ANDROID_3.4.5/arch/xtensa/lib/strnlen_user.S
deleted file mode 100644
index 23f2a898..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/strnlen_user.S
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * arch/xtensa/lib/strnlen_user.S
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file "COPYING" in the main directory of
- * this archive for more details.
- *
- * Returns strnlen, including trailing zero terminator.
- * Zero indicates error.
- *
- * Copyright (C) 2002 Tensilica Inc.
- */
-
-#include <variant/core.h>
-
-/* Load or store instructions that may cause exceptions use the EX macro. */
-
-#define EX(insn,reg1,reg2,offset,handler) \
-9: insn reg1, reg2, offset; \
- .section __ex_table, "a"; \
- .word 9b, handler; \
- .previous
-
-/*
- * size_t __strnlen_user(const char *s, size_t len)
- */
-
-#ifdef __XTENSA_EB__
-# define MASK0 0xff000000
-# define MASK1 0x00ff0000
-# define MASK2 0x0000ff00
-# define MASK3 0x000000ff
-#else
-# define MASK0 0x000000ff
-# define MASK1 0x0000ff00
-# define MASK2 0x00ff0000
-# define MASK3 0xff000000
-#endif
-
-# Register use:
-# a2/ src
-# a3/ len
-# a4/ tmp
-# a5/ mask0
-# a6/ mask1
-# a7/ mask2
-# a8/ mask3
-# a9/ tmp
-# a10/ tmp
-
-.text
-.align 4
-.global __strnlen_user
-.type __strnlen_user,@function
-__strnlen_user:
- entry sp, 16 # minimal stack frame
- # a2/ s, a3/ len
- addi a4, a2, -4 # because we overincrement at the end;
- # we compensate with load offsets of 4
- movi a5, MASK0 # mask for byte 0
- movi a6, MASK1 # mask for byte 1
- movi a7, MASK2 # mask for byte 2
- movi a8, MASK3 # mask for byte 3
- bbsi.l a2, 0, .L1mod2 # if only 8-bit aligned
- bbsi.l a2, 1, .L2mod4 # if only 16-bit aligned
-
-/*
- * String is word-aligned.
- */
-.Laligned:
- srli a10, a3, 2 # number of loop iterations with 4B per loop
-#if XCHAL_HAVE_LOOPS
- loopnez a10, .Ldone
-#else
- beqz a10, .Ldone
- slli a10, a10, 2
- add a10, a10, a4 # a10 = end of last 4B chunk
-#endif /* XCHAL_HAVE_LOOPS */
-.Loop:
- EX(l32i, a9, a4, 4, lenfixup) # get next word of string
- addi a4, a4, 4 # advance string pointer
- bnone a9, a5, .Lz0 # if byte 0 is zero
- bnone a9, a6, .Lz1 # if byte 1 is zero
- bnone a9, a7, .Lz2 # if byte 2 is zero
- bnone a9, a8, .Lz3 # if byte 3 is zero
-#if !XCHAL_HAVE_LOOPS
- blt a4, a10, .Loop
-#endif
-
-.Ldone:
- EX(l32i, a9, a4, 4, lenfixup) # load 4 bytes for remaining checks
-
- bbci.l a3, 1, .L100
- # check two more bytes (bytes 0, 1 of word)
- addi a4, a4, 2 # advance string pointer
- bnone a9, a5, .Lz0 # if byte 0 is zero
- bnone a9, a6, .Lz1 # if byte 1 is zero
-.L100:
- bbci.l a3, 0, .L101
- # check one more byte (byte 2 of word)
- # Actually, we don't need to check. Zero or nonzero, we'll add one.
- # Do not add an extra one for the NULL terminator since we have
- # exhausted the original len parameter.
- addi a4, a4, 1 # advance string pointer
-.L101:
- sub a2, a4, a2 # compute length
- retw
-
-# NOTE that in several places below, we point to the byte just after
-# the zero byte in order to include the NULL terminator in the count.
-
-.Lz3: # byte 3 is zero
- addi a4, a4, 3 # point to zero byte
-.Lz0: # byte 0 is zero
- addi a4, a4, 1 # point just beyond zero byte
- sub a2, a4, a2 # subtract to get length
- retw
-.Lz1: # byte 1 is zero
- addi a4, a4, 1+1 # point just beyond zero byte
- sub a2, a4, a2 # subtract to get length
- retw
-.Lz2: # byte 2 is zero
- addi a4, a4, 2+1 # point just beyond zero byte
- sub a2, a4, a2 # subtract to get length
- retw
-
-.L1mod2: # address is odd
- EX(l8ui, a9, a4, 4, lenfixup) # get byte 0
- addi a4, a4, 1 # advance string pointer
- beqz a9, .Lz3 # if byte 0 is zero
- bbci.l a4, 1, .Laligned # if string pointer is now word-aligned
-
-.L2mod4: # address is 2 mod 4
- addi a4, a4, 2 # advance ptr for aligned access
- EX(l32i, a9, a4, 0, lenfixup) # get word with first two bytes of string
- bnone a9, a7, .Lz2 # if byte 2 (of word, not string) is zero
- bany a9, a8, .Laligned # if byte 3 (of word, not string) is nonzero
- # byte 3 is zero
- addi a4, a4, 3+1 # point just beyond zero byte
- sub a2, a4, a2 # subtract to get length
- retw
-
- .section .fixup, "ax"
- .align 4
-lenfixup:
- movi a2, 0
- retw
-
diff --git a/ANDROID_3.4.5/arch/xtensa/lib/usercopy.S b/ANDROID_3.4.5/arch/xtensa/lib/usercopy.S
deleted file mode 100644
index 46d60314..00000000
--- a/ANDROID_3.4.5/arch/xtensa/lib/usercopy.S
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * arch/xtensa/lib/usercopy.S
- *
- * Copy to/from user space (derived from arch/xtensa/lib/hal/memcopy.S)
- *
- * DO NOT COMBINE this function with <arch/xtensa/lib/hal/memcopy.S>.
- * It needs to remain separate and distinct. The hal files are part
- * of the Xtensa link-time HAL, and those files may differ per
- * processor configuration. Patching the kernel for another
- * processor configuration includes replacing the hal files, and we
- * could lose the special functionality for accessing user-space
- * memory during such a patch. We sacrifice a little code space here
- * in favor to simplify code maintenance.
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file "COPYING" in the main directory of
- * this archive for more details.
- *
- * Copyright (C) 2002 Tensilica Inc.
- */
-
-
-/*
- * size_t __xtensa_copy_user (void *dst, const void *src, size_t len);
- *
- * The returned value is the number of bytes not copied. Implies zero
- * is success.
- *
- * The general case algorithm is as follows:
- * If the destination and source are both aligned,
- * do 16B chunks with a loop, and then finish up with
- * 8B, 4B, 2B, and 1B copies conditional on the length.
- * If destination is aligned and source unaligned,
- * do the same, but use SRC to align the source data.
- * If destination is unaligned, align it by conditionally
- * copying 1B and 2B and then retest.
- * This code tries to use fall-through braches for the common
- * case of aligned destinations (except for the branches to
- * the alignment label).
- *
- * Register use:
- * a0/ return address
- * a1/ stack pointer
- * a2/ return value
- * a3/ src
- * a4/ length
- * a5/ dst
- * a6/ tmp
- * a7/ tmp
- * a8/ tmp
- * a9/ tmp
- * a10/ tmp
- * a11/ original length
- */
-
-#include <variant/core.h>
-
-#ifdef __XTENSA_EB__
-#define ALIGN(R, W0, W1) src R, W0, W1
-#define SSA8(R) ssa8b R
-#else
-#define ALIGN(R, W0, W1) src R, W1, W0
-#define SSA8(R) ssa8l R
-#endif
-
-/* Load or store instructions that may cause exceptions use the EX macro. */
-
-#define EX(insn,reg1,reg2,offset,handler) \
-9: insn reg1, reg2, offset; \
- .section __ex_table, "a"; \
- .word 9b, handler; \
- .previous
-
-
- .text
- .align 4
- .global __xtensa_copy_user
- .type __xtensa_copy_user,@function
-__xtensa_copy_user:
- entry sp, 16 # minimal stack frame
- # a2/ dst, a3/ src, a4/ len
- mov a5, a2 # copy dst so that a2 is return value
- mov a11, a4 # preserve original len for error case
-.Lcommon:
- bbsi.l a2, 0, .Ldst1mod2 # if dst is 1 mod 2
- bbsi.l a2, 1, .Ldst2mod4 # if dst is 2 mod 4
-.Ldstaligned: # return here from .Ldstunaligned when dst is aligned
- srli a7, a4, 4 # number of loop iterations with 16B
- # per iteration
- movi a8, 3 # if source is also aligned,
- bnone a3, a8, .Laligned # then use word copy
- SSA8( a3) # set shift amount from byte offset
- bnez a4, .Lsrcunaligned
- movi a2, 0 # return success for len==0
- retw
-
-/*
- * Destination is unaligned
- */
-
-.Ldst1mod2: # dst is only byte aligned
- bltui a4, 7, .Lbytecopy # do short copies byte by byte
-
- # copy 1 byte
- EX(l8ui, a6, a3, 0, l_fixup)
- addi a3, a3, 1
- EX(s8i, a6, a5, 0, s_fixup)
- addi a5, a5, 1
- addi a4, a4, -1
- bbci.l a5, 1, .Ldstaligned # if dst is now aligned, then
- # return to main algorithm
-.Ldst2mod4: # dst 16-bit aligned
- # copy 2 bytes
- bltui a4, 6, .Lbytecopy # do short copies byte by byte
- EX(l8ui, a6, a3, 0, l_fixup)
- EX(l8ui, a7, a3, 1, l_fixup)
- addi a3, a3, 2
- EX(s8i, a6, a5, 0, s_fixup)
- EX(s8i, a7, a5, 1, s_fixup)
- addi a5, a5, 2
- addi a4, a4, -2
- j .Ldstaligned # dst is now aligned, return to main algorithm
-
-/*
- * Byte by byte copy
- */
- .align 4
- .byte 0 # 1 mod 4 alignment for LOOPNEZ
- # (0 mod 4 alignment for LBEG)
-.Lbytecopy:
-#if XCHAL_HAVE_LOOPS
- loopnez a4, .Lbytecopydone
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a4, .Lbytecopydone
- add a7, a3, a4 # a7 = end address for source
-#endif /* !XCHAL_HAVE_LOOPS */
-.Lnextbyte:
- EX(l8ui, a6, a3, 0, l_fixup)
- addi a3, a3, 1
- EX(s8i, a6, a5, 0, s_fixup)
- addi a5, a5, 1
-#if !XCHAL_HAVE_LOOPS
- blt a3, a7, .Lnextbyte
-#endif /* !XCHAL_HAVE_LOOPS */
-.Lbytecopydone:
- movi a2, 0 # return success for len bytes copied
- retw
-
-/*
- * Destination and source are word-aligned.
- */
- # copy 16 bytes per iteration for word-aligned dst and word-aligned src
- .align 4 # 1 mod 4 alignment for LOOPNEZ
- .byte 0 # (0 mod 4 alignment for LBEG)
-.Laligned:
-#if XCHAL_HAVE_LOOPS
- loopnez a7, .Loop1done
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a7, .Loop1done
- slli a8, a7, 4
- add a8, a8, a3 # a8 = end of last 16B source chunk
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop1:
- EX(l32i, a6, a3, 0, l_fixup)
- EX(l32i, a7, a3, 4, l_fixup)
- EX(s32i, a6, a5, 0, s_fixup)
- EX(l32i, a6, a3, 8, l_fixup)
- EX(s32i, a7, a5, 4, s_fixup)
- EX(l32i, a7, a3, 12, l_fixup)
- EX(s32i, a6, a5, 8, s_fixup)
- addi a3, a3, 16
- EX(s32i, a7, a5, 12, s_fixup)
- addi a5, a5, 16
-#if !XCHAL_HAVE_LOOPS
- blt a3, a8, .Loop1
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop1done:
- bbci.l a4, 3, .L2
- # copy 8 bytes
- EX(l32i, a6, a3, 0, l_fixup)
- EX(l32i, a7, a3, 4, l_fixup)
- addi a3, a3, 8
- EX(s32i, a6, a5, 0, s_fixup)
- EX(s32i, a7, a5, 4, s_fixup)
- addi a5, a5, 8
-.L2:
- bbci.l a4, 2, .L3
- # copy 4 bytes
- EX(l32i, a6, a3, 0, l_fixup)
- addi a3, a3, 4
- EX(s32i, a6, a5, 0, s_fixup)
- addi a5, a5, 4
-.L3:
- bbci.l a4, 1, .L4
- # copy 2 bytes
- EX(l16ui, a6, a3, 0, l_fixup)
- addi a3, a3, 2
- EX(s16i, a6, a5, 0, s_fixup)
- addi a5, a5, 2
-.L4:
- bbci.l a4, 0, .L5
- # copy 1 byte
- EX(l8ui, a6, a3, 0, l_fixup)
- EX(s8i, a6, a5, 0, s_fixup)
-.L5:
- movi a2, 0 # return success for len bytes copied
- retw
-
-/*
- * Destination is aligned, Source is unaligned
- */
-
- .align 4
- .byte 0 # 1 mod 4 alignement for LOOPNEZ
- # (0 mod 4 alignment for LBEG)
-.Lsrcunaligned:
- # copy 16 bytes per iteration for word-aligned dst and unaligned src
- and a10, a3, a8 # save unalignment offset for below
- sub a3, a3, a10 # align a3 (to avoid sim warnings only; not needed for hardware)
- EX(l32i, a6, a3, 0, l_fixup) # load first word
-#if XCHAL_HAVE_LOOPS
- loopnez a7, .Loop2done
-#else /* !XCHAL_HAVE_LOOPS */
- beqz a7, .Loop2done
- slli a10, a7, 4
- add a10, a10, a3 # a10 = end of last 16B source chunk
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop2:
- EX(l32i, a7, a3, 4, l_fixup)
- EX(l32i, a8, a3, 8, l_fixup)
- ALIGN( a6, a6, a7)
- EX(s32i, a6, a5, 0, s_fixup)
- EX(l32i, a9, a3, 12, l_fixup)
- ALIGN( a7, a7, a8)
- EX(s32i, a7, a5, 4, s_fixup)
- EX(l32i, a6, a3, 16, l_fixup)
- ALIGN( a8, a8, a9)
- EX(s32i, a8, a5, 8, s_fixup)
- addi a3, a3, 16
- ALIGN( a9, a9, a6)
- EX(s32i, a9, a5, 12, s_fixup)
- addi a5, a5, 16
-#if !XCHAL_HAVE_LOOPS
- blt a3, a10, .Loop2
-#endif /* !XCHAL_HAVE_LOOPS */
-.Loop2done:
- bbci.l a4, 3, .L12
- # copy 8 bytes
- EX(l32i, a7, a3, 4, l_fixup)
- EX(l32i, a8, a3, 8, l_fixup)
- ALIGN( a6, a6, a7)
- EX(s32i, a6, a5, 0, s_fixup)
- addi a3, a3, 8
- ALIGN( a7, a7, a8)
- EX(s32i, a7, a5, 4, s_fixup)
- addi a5, a5, 8
- mov a6, a8
-.L12:
- bbci.l a4, 2, .L13
- # copy 4 bytes
- EX(l32i, a7, a3, 4, l_fixup)
- addi a3, a3, 4
- ALIGN( a6, a6, a7)
- EX(s32i, a6, a5, 0, s_fixup)
- addi a5, a5, 4
- mov a6, a7
-.L13:
- add a3, a3, a10 # readjust a3 with correct misalignment
- bbci.l a4, 1, .L14
- # copy 2 bytes
- EX(l8ui, a6, a3, 0, l_fixup)
- EX(l8ui, a7, a3, 1, l_fixup)
- addi a3, a3, 2
- EX(s8i, a6, a5, 0, s_fixup)
- EX(s8i, a7, a5, 1, s_fixup)
- addi a5, a5, 2
-.L14:
- bbci.l a4, 0, .L15
- # copy 1 byte
- EX(l8ui, a6, a3, 0, l_fixup)
- EX(s8i, a6, a5, 0, s_fixup)
-.L15:
- movi a2, 0 # return success for len bytes copied
- retw
-
-
- .section .fixup, "ax"
- .align 4
-
-/* a2 = original dst; a5 = current dst; a11= original len
- * bytes_copied = a5 - a2
- * retval = bytes_not_copied = original len - bytes_copied
- * retval = a11 - (a5 - a2)
- *
- * Clearing the remaining pieces of kernel memory plugs security
- * holes. This functionality is the equivalent of the *_zeroing
- * functions that some architectures provide.
- */
-
-.Lmemset:
- .word memset
-
-s_fixup:
- sub a2, a5, a2 /* a2 <-- bytes copied */
- sub a2, a11, a2 /* a2 <-- bytes not copied */
- retw
-
-l_fixup:
- sub a2, a5, a2 /* a2 <-- bytes copied */
- sub a2, a11, a2 /* a2 <-- bytes not copied == return value */
-
- /* void *memset(void *s, int c, size_t n); */
- mov a6, a5 /* s */
- movi a7, 0 /* c */
- mov a8, a2 /* n */
- l32r a4, .Lmemset
- callx4 a4
- /* Ignore memset return value in a6. */
- /* a2 still contains bytes not copied. */
- retw
-