1080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* 2080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * linux/arch/arm/lib/uaccess.S 3080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * 4080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Copyright (C) 1995, 1996,1997,1998 Russell King 5080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * 6080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * This program is free software; you can redistribute it and/or modify 7080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * it under the terms of the GNU General Public License version 2 as 8080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * published by the Free Software Foundation. 9080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * 10080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Routines to block copy data to/from user memory 11080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * These are highly optimised both for the 4k page size 12080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * and for various alignments. 13080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 14080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <linux/linkage.h> 15080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <asm/assembler.h> 16080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <asm/errno.h> 17080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <asm/domain.h> 18080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 19080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King .text 20080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 21080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#define PAGE_SHIFT 12 22080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 23080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* Prototype: int __copy_to_user(void *to, const char *from, size_t n) 24080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Purpose : copy a block to user memory from kernel memory 25080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Params : to - user memory 26080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * : from - kernel memory 27080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * : n - number of bytes to copy 28080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Returns : Number of bytes NOT copied. 29080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 30080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 31080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_dest_not_aligned: 32080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #4 33080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 34080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrb r3, [r1], #1 35080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strb) r3, [r0], #1) @ May fault 36080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrgeb r3, [r1], #1 37080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgeb) r3, [r0], #1) @ May fault 38080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrgtb r3, [r1], #1 39080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgtb) r3, [r0], #1) @ May fault 40080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 41080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lc2u_dest_aligned 42080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 43080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENTRY(__copy_to_user) 44080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmfd sp!, {r2, r4 - r7, lr} 45080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, #4 46080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lc2u_not_enough 47080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, r0, #3 48080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bne .Lc2u_dest_not_aligned 49080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_dest_aligned: 50080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 51080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, r1, #3 52080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bne .Lc2u_src_not_aligned 53080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* 54080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Seeing as there has to be at least 8 bytes to copy, we can 55080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * copy one word, and force a user-mode page fault... 56080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 57080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 58080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0fupi: subs r2, r2, #4 59080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 60080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lc2u_0nowords 61080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldr r3, [r1], #4 62080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( str) r3, [r0], #4) @ May fault 63080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction 64080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 65080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 66080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_0fupi 67080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* 68080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * ip = max no. of bytes to copy before needing another "strt" insn 69080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 70080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 71080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 72080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 73080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #32 74080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lc2u_0rem8lp 75080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 76080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0cpy8lp: ldmia r1!, {r3 - r6} 77080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} @ Shouldnt fault 78080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r3 - r6} 79080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #32 80080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} @ Shouldnt fault 81080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lc2u_0cpy8lp 82080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 83080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0rem8lp: cmn ip, #16 84080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmgeia r1!, {r3 - r6} 85080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmgeia r0!, {r3 - r6} @ Shouldnt fault 86080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #8 87080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r3 - r4} 88080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} @ Shouldnt fault 89080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 90080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrne r3, [r1], #4 91080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King TUSER( strne) r3, [r0], #4 @ Shouldnt fault 92080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 93080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_0fupi 94080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0nowords: teq ip, #0 95080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_finished 96080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_nowords: cmp ip, #2 97080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrb r3, [r1], #1 98080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strb) r3, [r0], #1) @ May fault 99080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrgeb r3, [r1], #1 100080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgeb) r3, [r0], #1) @ May fault 101080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrgtb r3, [r1], #1 102080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgtb) r3, [r0], #1) @ May fault 103080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lc2u_finished 104080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 105080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_not_enough: 106080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, r2 107080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bne .Lc2u_nowords 108080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_finished: mov r0, #0 109080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmfd sp!, {r2, r4 - r7, pc} 110080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 111080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_src_not_aligned: 112080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bic r1, r1, #3 113080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldr r7, [r1], #4 114080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 115080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bgt .Lc2u_3fupi 116080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_2fupi 117080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_1fupi: subs r2, r2, #4 118080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 119080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lc2u_1nowords 120d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r3, r7, lspull #8 121080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldr r7, [r1], #4 122d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r7, lspush #24 123080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( str) r3, [r0], #4) @ May fault 124080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r0, lsl #32 - PAGE_SHIFT 125080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 126080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 127080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_1fupi 128080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 129080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 130080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 131080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 132080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lc2u_1rem8lp 133080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 134d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lc2u_1cpy8lp: mov r3, r7, lspull #8 135080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r4 - r7} 136080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 137d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r4, lspush #24 138d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r4, r4, lspull #8 139d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r4, r4, r5, lspush #24 140d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r5, r5, lspull #8 141d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r5, r5, r6, lspush #24 142d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r6, r6, lspull #8 143d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r6, r6, r7, lspush #24 144080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} @ Shouldnt fault 145080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lc2u_1cpy8lp 146080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 147080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_1rem8lp: tst ip, #8 148d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #8 149080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r4, r7} 150d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r4, lspush #24 151d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r4, r4, lspull #8 152d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r4, r4, r7, lspush #24 153080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} @ Shouldnt fault 154080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 155d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #8 156080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrne r7, [r1], #4 157d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r7, lspush #24 158080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King TUSER( strne) r3, [r0], #4 @ Shouldnt fault 159080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 160080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_1fupi 161080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_1nowords: mov r3, r7, get_byte_1 162080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King teq ip, #0 163080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_finished 164080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 165080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strb) r3, [r0], #1) @ May fault 166080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movge r3, r7, get_byte_2 167080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgeb) r3, [r0], #1) @ May fault 168080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movgt r3, r7, get_byte_3 169080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgtb) r3, [r0], #1) @ May fault 170080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lc2u_finished 171080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 172080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_2fupi: subs r2, r2, #4 173080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 174080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lc2u_2nowords 175d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r3, r7, lspull #16 176080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldr r7, [r1], #4 177d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r7, lspush #16 178080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( str) r3, [r0], #4) @ May fault 179080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r0, lsl #32 - PAGE_SHIFT 180080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 181080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 182080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_2fupi 183080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 184080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 185080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 186080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 187080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lc2u_2rem8lp 188080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 189d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lc2u_2cpy8lp: mov r3, r7, lspull #16 190080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r4 - r7} 191080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 192d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r4, lspush #16 193d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r4, r4, lspull #16 194d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r4, r4, r5, lspush #16 195d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r5, r5, lspull #16 196d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r5, r5, r6, lspush #16 197d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r6, r6, lspull #16 198d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r6, r6, r7, lspush #16 199080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} @ Shouldnt fault 200080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lc2u_2cpy8lp 201080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 202080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_2rem8lp: tst ip, #8 203d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #16 204080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r4, r7} 205d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r4, lspush #16 206d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r4, r4, lspull #16 207d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r4, r4, r7, lspush #16 208080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} @ Shouldnt fault 209080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 210d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #16 211080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrne r7, [r1], #4 212d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r7, lspush #16 213080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King TUSER( strne) r3, [r0], #4 @ Shouldnt fault 214080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 215080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_2fupi 216080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_2nowords: mov r3, r7, get_byte_2 217080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King teq ip, #0 218080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_finished 219080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 220080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strb) r3, [r0], #1) @ May fault 221080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movge r3, r7, get_byte_3 222080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgeb) r3, [r0], #1) @ May fault 223080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrgtb r3, [r1], #0 224080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgtb) r3, [r0], #1) @ May fault 225080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lc2u_finished 226080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 227080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_3fupi: subs r2, r2, #4 228080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 229080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lc2u_3nowords 230d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r3, r7, lspull #24 231080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldr r7, [r1], #4 232d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r7, lspush #8 233080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( str) r3, [r0], #4) @ May fault 234080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r0, lsl #32 - PAGE_SHIFT 235080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 236080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 237080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_3fupi 238080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 239080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 240080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 241080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 242080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lc2u_3rem8lp 243080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 244d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lc2u_3cpy8lp: mov r3, r7, lspull #24 245080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r4 - r7} 246080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 247d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r4, lspush #8 248d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r4, r4, lspull #24 249d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r4, r4, r5, lspush #8 250d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r5, r5, lspull #24 251d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r5, r5, r6, lspush #8 252d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r6, r6, lspull #24 253d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r6, r6, r7, lspush #8 254080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} @ Shouldnt fault 255080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lc2u_3cpy8lp 256080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 257080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_3rem8lp: tst ip, #8 258d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #24 259080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r4, r7} 260d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r4, lspush #8 261d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r4, r4, lspull #24 262d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r4, r4, r7, lspush #8 263080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} @ Shouldnt fault 264080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 265d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #24 266080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrne r7, [r1], #4 267d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r7, lspush #8 268080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King TUSER( strne) r3, [r0], #4 @ Shouldnt fault 269080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 270080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_3fupi 271080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_3nowords: mov r3, r7, get_byte_3 272080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King teq ip, #0 273080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lc2u_finished 274080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 275080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strb) r3, [r0], #1) @ May fault 276080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrgeb r3, [r1], #1 277080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgeb) r3, [r0], #1) @ May fault 278080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldrgtb r3, [r1], #0 279080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( strgtb) r3, [r0], #1) @ May fault 280080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lc2u_finished 281080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENDPROC(__copy_to_user) 282080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 283080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King .pushsection .fixup,"ax" 284080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King .align 0 285080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King9001: ldmfd sp!, {r0, r4 - r7, pc} 286080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King .popsection 287080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 288080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* Prototype: unsigned long __copy_from_user(void *to,const void *from,unsigned long n); 289080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Purpose : copy a block from user memory to kernel memory 290080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Params : to - kernel memory 291080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * : from - user memory 292080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * : n - number of bytes to copy 293080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Returns : Number of bytes NOT copied. 294080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 295080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_dest_not_aligned: 296080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #4 297080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 298080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrb) r3, [r1], #1) @ May fault 299080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strb r3, [r0], #1 300080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrgeb) r3, [r1], #1) @ May fault 301080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgeb r3, [r0], #1 302080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrgtb) r3, [r1], #1) @ May fault 303080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgtb r3, [r0], #1 304080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 305080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lcfu_dest_aligned 306080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 307080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENTRY(__copy_from_user) 308080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmfd sp!, {r0, r2, r4 - r7, lr} 309080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, #4 310080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lcfu_not_enough 311080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, r0, #3 312080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bne .Lcfu_dest_not_aligned 313080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_dest_aligned: 314080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, r1, #3 315080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bne .Lcfu_src_not_aligned 316080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 317080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* 318080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Seeing as there has to be at least 8 bytes to copy, we can 319080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * copy one word, and force a user-mode page fault... 320080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 321080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 322080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0fupi: subs r2, r2, #4 323080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 324080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lcfu_0nowords 325080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldr) r3, [r1], #4) 326080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King str r3, [r0], #4 327080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction 328080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 329080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 330080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_0fupi 331080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* 332080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * ip = max no. of bytes to copy before needing another "strt" insn 333080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 334080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 335080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 336080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 337080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #32 338080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lcfu_0rem8lp 339080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 340080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault 341080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} 342080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r3 - r6} @ Shouldnt fault 343080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #32 344080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} 345080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lcfu_0cpy8lp 346080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 347080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0rem8lp: cmn ip, #16 348080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmgeia r1!, {r3 - r6} @ Shouldnt fault 349080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmgeia r0!, {r3 - r6} 350080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #8 351080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r3 - r4} @ Shouldnt fault 352080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} 353080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 354080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King TUSER( ldrne) r3, [r1], #4 @ Shouldnt fault 355080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strne r3, [r0], #4 356080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 357080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_0fupi 358080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0nowords: teq ip, #0 359080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_finished 360080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_nowords: cmp ip, #2 361080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrb) r3, [r1], #1) @ May fault 362080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strb r3, [r0], #1 363080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrgeb) r3, [r1], #1) @ May fault 364080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgeb r3, [r0], #1 365080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrgtb) r3, [r1], #1) @ May fault 366080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgtb r3, [r0], #1 367080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lcfu_finished 368080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 369080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_not_enough: 370080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, r2 371080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bne .Lcfu_nowords 372080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_finished: mov r0, #0 373080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King add sp, sp, #8 374080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmfd sp!, {r4 - r7, pc} 375080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 376080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_src_not_aligned: 377080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bic r1, r1, #3 378080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldr) r7, [r1], #4) @ May fault 379080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 380080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bgt .Lcfu_3fupi 381080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_2fupi 382080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_1fupi: subs r2, r2, #4 383080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 384080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lcfu_1nowords 385d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r3, r7, lspull #8 386080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldr) r7, [r1], #4) @ May fault 387d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r7, lspush #24 388080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King str r3, [r0], #4 389080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r1, lsl #32 - PAGE_SHIFT 390080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 391080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 392080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_1fupi 393080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 394080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 395080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 396080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 397080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lcfu_1rem8lp 398080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 399d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lcfu_1cpy8lp: mov r3, r7, lspull #8 400080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r4 - r7} @ Shouldnt fault 401080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 402d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r4, lspush #24 403d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r4, r4, lspull #8 404d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r4, r4, r5, lspush #24 405d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r5, r5, lspull #8 406d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r5, r5, r6, lspush #24 407d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r6, r6, lspull #8 408d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r6, r6, r7, lspush #24 409080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} 410080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lcfu_1cpy8lp 411080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 412080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_1rem8lp: tst ip, #8 413d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #8 414080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r4, r7} @ Shouldnt fault 415d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r4, lspush #24 416d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r4, r4, lspull #8 417d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r4, r4, r7, lspush #24 418080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} 419080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 420d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #8 421080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrne) r7, [r1], #4) @ May fault 422d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r7, lspush #24 423080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strne r3, [r0], #4 424080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 425080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_1fupi 426080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_1nowords: mov r3, r7, get_byte_1 427080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King teq ip, #0 428080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_finished 429080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 430080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strb r3, [r0], #1 431080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movge r3, r7, get_byte_2 432080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgeb r3, [r0], #1 433080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movgt r3, r7, get_byte_3 434080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgtb r3, [r0], #1 435080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lcfu_finished 436080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 437080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_2fupi: subs r2, r2, #4 438080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 439080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lcfu_2nowords 440d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r3, r7, lspull #16 441080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldr) r7, [r1], #4) @ May fault 442d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r7, lspush #16 443080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King str r3, [r0], #4 444080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r1, lsl #32 - PAGE_SHIFT 445080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 446080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 447080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_2fupi 448080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 449080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 450080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 451080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 452080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lcfu_2rem8lp 453080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 454080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 455d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lcfu_2cpy8lp: mov r3, r7, lspull #16 456080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r4 - r7} @ Shouldnt fault 457080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 458d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r4, lspush #16 459d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r4, r4, lspull #16 460d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r4, r4, r5, lspush #16 461d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r5, r5, lspull #16 462d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r5, r5, r6, lspush #16 463d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r6, r6, lspull #16 464d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r6, r6, r7, lspush #16 465080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} 466080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lcfu_2cpy8lp 467080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 468080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_2rem8lp: tst ip, #8 469d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #16 470080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r4, r7} @ Shouldnt fault 471d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r4, lspush #16 472d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r4, r4, lspull #16 473d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r4, r4, r7, lspush #16 474080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} 475080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 476d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #16 477080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrne) r7, [r1], #4) @ May fault 478d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r7, lspush #16 479080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strne r3, [r0], #4 480080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 481080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_2fupi 482080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_2nowords: mov r3, r7, get_byte_2 483080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King teq ip, #0 484080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_finished 485080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 486080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strb r3, [r0], #1 487080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movge r3, r7, get_byte_3 488080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgeb r3, [r0], #1 489080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrgtb) r3, [r1], #0) @ May fault 490080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgtb r3, [r0], #1 491080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lcfu_finished 492080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 493080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_3fupi: subs r2, r2, #4 494080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King addmi ip, r2, #4 495080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bmi .Lcfu_3nowords 496d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r3, r7, lspull #24 497080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldr) r7, [r1], #4) @ May fault 498d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r7, lspush #8 499080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King str r3, [r0], #4 500080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov ip, r1, lsl #32 - PAGE_SHIFT 501080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King rsb ip, ip, #0 502080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movs ip, ip, lsr #32 - PAGE_SHIFT 503080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_3fupi 504080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp r2, ip 505080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movlt ip, r2 506080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r2, ip 507080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 508080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blt .Lcfu_3rem8lp 509080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 510d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lcfu_3cpy8lp: mov r3, r7, lspull #24 511080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmia r1!, {r4 - r7} @ Shouldnt fault 512d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r3, r3, r4, lspush #8 513d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r4, r4, lspull #24 514d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r4, r4, r5, lspush #8 515d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r5, r5, lspull #24 516d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r5, r5, r6, lspush #8 517d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky mov r6, r6, lspull #24 518d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orr r6, r6, r7, lspush #8 519080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmia r0!, {r3 - r6} 520080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs ip, ip, #16 521080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King bpl .Lcfu_3cpy8lp 522080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 523080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_3rem8lp: tst ip, #8 524d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #24 525080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmneia r1!, {r4, r7} @ Shouldnt fault 526d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r4, lspush #8 527d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r4, r4, lspull #24 528d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r4, r4, r7, lspush #8 529080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King stmneia r0!, {r3 - r4} 530080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King tst ip, #4 531d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky movne r3, r7, lspull #24 532080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrne) r7, [r1], #4) @ May fault 533d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky orrne r3, r3, r7, lspush #8 534080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strne r3, [r0], #4 535080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ands ip, ip, #3 536080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_3fupi 537080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_3nowords: mov r3, r7, get_byte_3 538080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King teq ip, #0 539080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King beq .Lcfu_finished 540080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King cmp ip, #2 541080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strb r3, [r0], #1 542080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrgeb) r3, [r1], #1) @ May fault 543080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgeb r3, [r0], #1 544080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER( TUSER( ldrgtb) r3, [r1], #1) @ May fault 545080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King strgtb r3, [r0], #1 546080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King b .Lcfu_finished 547080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENDPROC(__copy_from_user) 548080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 549080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King .pushsection .fixup,"ax" 550080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King .align 0 551080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King /* 552080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * We took an exception. r0 contains a pointer to 553080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * the byte not copied. 554080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */ 555080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King9001: ldr r2, [sp], #4 @ void *to 556080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King sub r2, r0, r2 @ bytes copied 557080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldr r1, [sp], #4 @ unsigned long count 558080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King subs r4, r1, r2 @ bytes left to copy 559080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King movne r1, r4 560080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King blne __memzero 561080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King mov r0, r4 562080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King ldmfd sp!, {r4 - r7, pc} 563080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King .popsection 564080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King 565