uaccess.s
来自「Linux Kernel 2.6.9 for OMAP1710」· S 代码 · 共 698 行 · 第 1/2 页
S
698 行
USER( ldrgtbt r3, [r1], #1) @ May fault strgtb r3, [r0], #1 sub r2, r2, ip b .cfu_dest_alignedENTRY(__arch_copy_from_user) stmfd sp!, {r0, r2, r4 - r7, lr} cmp r2, #4 blt .cfu_not_enough PLD( pld [r1, #0] ) PLD( pld [r0, #0] ) ands ip, r0, #3 bne .cfu_dest_not_aligned.cfu_dest_aligned: ands ip, r1, #3 bne .cfu_src_not_aligned/* * Seeing as there has to be at least 8 bytes to copy, we can * copy one word, and force a user-mode page fault... */.cfu_0fupi: subs r2, r2, #4 addmi ip, r2, #4 bmi .cfu_0nowordsUSER( ldrt r3, [r1], #4) str r3, [r0], #4 mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction rsb ip, ip, #0 movs ip, ip, lsr #32 - PAGE_SHIFT beq .cfu_0fupi/* * ip = max no. of bytes to copy before needing another "strt" insn */ cmp r2, ip movlt ip, r2 sub r2, r2, ip subs ip, ip, #32 blt .cfu_0rem8lp PLD( pld [r1, #28] ) PLD( pld [r0, #28] ) PLD( subs ip, ip, #64 ) PLD( blt .cfu_0cpynopld ) PLD( pld [r1, #60] ) PLD( pld [r0, #60] ).cfu_0cpy8lp: PLD( pld [r1, #92] ) PLD( pld [r0, #92] ).cfu_0cpynopld: ldmia r1!, {r3 - r6} @ Shouldnt fault stmia r0!, {r3 - r6} ldmia r1!, {r3 - r6} @ Shouldnt fault subs ip, ip, #32 stmia r0!, {r3 - r6} bpl .cfu_0cpy8lp PLD( cmn ip, #64 ) PLD( bge .cfu_0cpynopld ) PLD( add ip, ip, #64 ).cfu_0rem8lp: cmn ip, #16 ldmgeia r1!, {r3 - r6} @ Shouldnt fault stmgeia r0!, {r3 - r6} tst ip, #8 ldmneia r1!, {r3 - r4} @ Shouldnt fault stmneia r0!, {r3 - r4} tst ip, #4 ldrnet r3, [r1], #4 @ Shouldnt fault strne r3, [r0], #4 ands ip, ip, #3 beq .cfu_0fupi.cfu_0nowords: teq ip, #0 beq .cfu_finished.cfu_nowords: cmp ip, #2USER( ldrbt r3, [r1], #1) @ May fault strb r3, [r0], #1USER( ldrgebt r3, [r1], #1) @ May fault strgeb r3, [r0], #1USER( ldrgtbt r3, [r1], #1) @ May fault strgtb r3, [r0], #1 b .cfu_finished.cfu_not_enough: movs ip, r2 bne .cfu_nowords.cfu_finished: mov r0, #0 add sp, sp, #8 LOADREGS(fd,sp!,{r4 - r7, pc}).cfu_src_not_aligned: bic r1, r1, #3USER( ldrt r7, [r1], #4) @ May fault cmp ip, #2 bgt .cfu_3fupi beq .cfu_2fupi.cfu_1fupi: subs r2, r2, #4 addmi ip, r2, #4 bmi .cfu_1nowords mov r3, r7, pull #8USER( ldrt r7, [r1], #4) @ May fault orr r3, r3, r7, push #24 str r3, [r0], #4 mov ip, r1, lsl #32 - PAGE_SHIFT rsb ip, ip, #0 movs ip, ip, lsr #32 - PAGE_SHIFT beq .cfu_1fupi cmp r2, ip movlt ip, r2 sub r2, r2, ip subs ip, ip, #16 blt .cfu_1rem8lp PLD( pld [r1, #12] ) PLD( pld [r0, #12] ) PLD( subs ip, ip, #32 ) PLD( blt .cfu_1cpynopld ) PLD( pld [r1, #28] ) PLD( pld [r0, #28] ).cfu_1cpy8lp: PLD( pld [r1, #44] ) PLD( pld [r0, #44] ).cfu_1cpynopld: mov r3, r7, pull #8 ldmia r1!, {r4 - r7} @ Shouldnt fault subs ip, ip, #16 orr r3, r3, r4, push #24 mov r4, r4, pull #8 orr r4, r4, r5, push #24 mov r5, r5, pull #8 orr r5, r5, r6, push #24 mov r6, r6, pull #8 orr r6, r6, r7, push #24 stmia r0!, {r3 - r6} bpl .cfu_1cpy8lp PLD( cmn ip, #32 ) PLD( bge .cfu_1cpynopld ) PLD( add ip, ip, #32 ).cfu_1rem8lp: tst ip, #8 movne r3, r7, pull #8 ldmneia r1!, {r4, r7} @ Shouldnt fault orrne r3, r3, r4, push #24 movne r4, r4, pull #8 orrne r4, r4, r7, push #24 stmneia r0!, {r3 - r4} tst ip, #4 movne r3, r7, pull #8USER( ldrnet r7, [r1], #4) @ May fault orrne r3, r3, r7, push #24 strne r3, [r0], #4 ands ip, ip, #3 beq .cfu_1fupi.cfu_1nowords: mov r3, r7, get_byte_1 teq ip, #0 beq .cfu_finished cmp ip, #2 strb r3, [r0], #1 movge r3, r7, get_byte_2 strgeb r3, [r0], #1 movgt r3, r7, get_byte_3 strgtb r3, [r0], #1 b .cfu_finished.cfu_2fupi: subs r2, r2, #4 addmi ip, r2, #4 bmi .cfu_2nowords mov r3, r7, pull #16USER( ldrt r7, [r1], #4) @ May fault orr r3, r3, r7, push #16 str r3, [r0], #4 mov ip, r1, lsl #32 - PAGE_SHIFT rsb ip, ip, #0 movs ip, ip, lsr #32 - PAGE_SHIFT beq .cfu_2fupi cmp r2, ip movlt ip, r2 sub r2, r2, ip subs ip, ip, #16 blt .cfu_2rem8lp PLD( pld [r1, #12] ) PLD( pld [r0, #12] ) PLD( subs ip, ip, #32 ) PLD( blt .cfu_2cpynopld ) PLD( pld [r1, #28] ) PLD( pld [r0, #28] ).cfu_2cpy8lp: PLD( pld [r1, #44] ) PLD( pld [r0, #44] ).cfu_2cpynopld: mov r3, r7, pull #16 ldmia r1!, {r4 - r7} @ Shouldnt fault subs ip, ip, #16 orr r3, r3, r4, push #16 mov r4, r4, pull #16 orr r4, r4, r5, push #16 mov r5, r5, pull #16 orr r5, r5, r6, push #16 mov r6, r6, pull #16 orr r6, r6, r7, push #16 stmia r0!, {r3 - r6} bpl .cfu_2cpy8lp PLD( cmn ip, #32 ) PLD( bge .cfu_2cpynopld ) PLD( add ip, ip, #32 ).cfu_2rem8lp: tst ip, #8 movne r3, r7, pull #16 ldmneia r1!, {r4, r7} @ Shouldnt fault orrne r3, r3, r4, push #16 movne r4, r4, pull #16 orrne r4, r4, r7, push #16 stmneia r0!, {r3 - r4} tst ip, #4 movne r3, r7, pull #16USER( ldrnet r7, [r1], #4) @ May fault orrne r3, r3, r7, push #16 strne r3, [r0], #4 ands ip, ip, #3 beq .cfu_2fupi.cfu_2nowords: mov r3, r7, get_byte_2 teq ip, #0 beq .cfu_finished cmp ip, #2 strb r3, [r0], #1 movge r3, r7, get_byte_3 strgeb r3, [r0], #1USER( ldrgtbt r3, [r1], #0) @ May fault strgtb r3, [r0], #1 b .cfu_finished.cfu_3fupi: subs r2, r2, #4 addmi ip, r2, #4 bmi .cfu_3nowords mov r3, r7, pull #24USER( ldrt r7, [r1], #4) @ May fault orr r3, r3, r7, push #8 str r3, [r0], #4 mov ip, r1, lsl #32 - PAGE_SHIFT rsb ip, ip, #0 movs ip, ip, lsr #32 - PAGE_SHIFT beq .cfu_3fupi cmp r2, ip movlt ip, r2 sub r2, r2, ip subs ip, ip, #16 blt .cfu_3rem8lp PLD( pld [r1, #12] ) PLD( pld [r0, #12] ) PLD( subs ip, ip, #32 ) PLD( blt .cfu_3cpynopld ) PLD( pld [r1, #28] ) PLD( pld [r0, #28] ).cfu_3cpy8lp: PLD( pld [r1, #44] ) PLD( pld [r0, #44] ).cfu_3cpynopld: mov r3, r7, pull #24 ldmia r1!, {r4 - r7} @ Shouldnt fault orr r3, r3, r4, push #8 mov r4, r4, pull #24 orr r4, r4, r5, push #8 mov r5, r5, pull #24 orr r5, r5, r6, push #8 mov r6, r6, pull #24 orr r6, r6, r7, push #8 stmia r0!, {r3 - r6} subs ip, ip, #16 bpl .cfu_3cpy8lp PLD( cmn ip, #32 ) PLD( bge .cfu_3cpynopld ) PLD( add ip, ip, #32 ).cfu_3rem8lp: tst ip, #8 movne r3, r7, pull #24 ldmneia r1!, {r4, r7} @ Shouldnt fault orrne r3, r3, r4, push #8 movne r4, r4, pull #24 orrne r4, r4, r7, push #8 stmneia r0!, {r3 - r4} tst ip, #4 movne r3, r7, pull #24USER( ldrnet r7, [r1], #4) @ May fault orrne r3, r3, r7, push #8 strne r3, [r0], #4 ands ip, ip, #3 beq .cfu_3fupi.cfu_3nowords: mov r3, r7, get_byte_3 teq ip, #0 beq .cfu_finished cmp ip, #2 strb r3, [r0], #1USER( ldrgebt r3, [r1], #1) @ May fault strgeb r3, [r0], #1USER( ldrgtbt r3, [r1], #1) @ May fault strgtb r3, [r0], #1 b .cfu_finished .section .fixup,"ax" .align 0 /* * We took an exception. r0 contains a pointer to * the byte not copied. */9001: ldr r2, [sp], #4 @ void *to sub r2, r0, r2 @ bytes copied ldr r1, [sp], #4 @ unsigned long count subs r4, r1, r2 @ bytes left to copy movne r1, r4 blne __memzero mov r0, r4 LOADREGS(fd,sp!, {r4 - r7, pc}) .previous/* Prototype: int __arch_clear_user(void *addr, size_t sz) * Purpose : clear some user memory * Params : addr - user memory address to clear * : sz - number of bytes to clear * Returns : number of bytes NOT cleared */ENTRY(__arch_clear_user) stmfd sp!, {r1, lr} mov r2, #0 cmp r1, #4 blt 2f ands ip, r0, #3 beq 1f cmp ip, #2USER( strbt r2, [r0], #1)USER( strlebt r2, [r0], #1)USER( strltbt r2, [r0], #1) rsb ip, ip, #4 sub r1, r1, ip @ 7 6 5 4 3 2 11: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7USER( strplt r2, [r0], #4)USER( strplt r2, [r0], #4) bpl 1b adds r1, r1, #4 @ 3 2 1 0 -1 -2 -3USER( strplt r2, [r0], #4)2: tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0xUSER( strnebt r2, [r0], #1)USER( strnebt r2, [r0], #1) tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1USER( strnebt r2, [r0], #1) mov r0, #0 LOADREGS(fd,sp!, {r1, pc}) .section .fixup,"ax" .align 09001: LOADREGS(fd,sp!, {r0, pc}) .previous
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?