URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [or32/] [lib/] [string.S] - Rev 1275
Go to most recent revision | Compare with Previous | Blame | View Log
/** linux/arch/or32/lib/string.S** or32 version* author(s): Matjaz Breskvar (phoenix@opencores.org)** changes:* 18. 11. 2003: Matjaz Breskvar (phoenix@opencores.org)* initial port to or32 architecture**/#include <linux/linkage.h>#include <linux/config.h>#include <asm/processor.h>#include <asm/cache.h>#include <asm/errno.h>#include <asm/or32_asm.h>/** this can be optimized by doing gcc inline assemlby with* proper constraints (no need to save args registers...)**//*** int __copy_tofrom_user(void *to, const void *from, unsigned long size);** NOTE: it returns number of bytes NOT copied !!!**/.global ___copy_tofrom_user___copy_tofrom_user:l.addi r1,r1,-12l.sw 0(r1),r6l.sw 4(r1),r4l.sw 8(r1),r3l.addi r11,r5,02: l.sfeq r11,r0l.bf 1fl.addi r11,r11,-18: l.lbz r6,0(r4)9: l.sb 0(r3),r6l.addi r3,r3,1l.j 2bl.addi r4,r4,11:l.addi r11,r11,1 // r11 holds the return valuel.lwz r6,0(r1)l.lwz r4,4(r1)l.lwz r3,8(r1)l.jr r9l.addi r1,r1,12.section .fixup, "ax"99:l.j 1bl.nop.previous.section __ex_table, "a".long 8b, 99b // read fault.long 9b, 99b // write fault.previous/** unsigned long clear_user(void *addr, unsigned long size) ;** NOTE: it returns number of bytes NOT cleared !!!*/.global ___clear_user___clear_user:l.addi r1,r1,-8l.sw 0(r1),r4l.sw 4(r1),r32: l.sfeq r4,r0l.bf 1fl.addi r4,r4,-19: l.sb 0(r3),r0l.j 2bl.addi r3,r3,11:l.addi r11,r4,1l.lwz r4,0(r1)l.lwz r3,4(r1)l.jr r9l.addi r1,r1,8.section .fixup, "ax"99:l.j 1bl.nop.previous.section __ex_table, "a".long 9b, 99b // write fault.previous/** long strncpy_from_user(char *dst, const char *src, long count)***/.global ___strncpy_from_user___strncpy_from_user:l.addi r1,r1,-16l.sw 0(r1),r6l.sw 4(r1),r5l.sw 8(r1),r4l.sw 12(r1),r3l.addi r11,r5,02: l.sfeq r5,r0l.bf 1fl.addi r5,r5,-18: l.lbz r6,0(r4)l.sfeq r6,r0l.bf 1f9: l.sb 0(r3),r6l.addi r3,r3,1l.j 2bl.addi r4,r4,11:l.lwz r6,0(r1)l.addi r5,r5,1l.sub r11,r11,r5 // r11 holds the return valuel.lwz r6,0(r1)l.lwz r5,4(r1)l.lwz r4,8(r1)l.lwz r3,12(r1)l.jr r9l.addi r1,r1,16.section .fixup, "ax"99:l.movhi r11,hi(-EFAULT)l.ori r11,r11,lo(-EFAULT)l.lwz r6,0(r1)l.lwz r5,4(r1)l.lwz r4,8(r1)l.lwz r3,12(r1)l.jr r9l.addi r1,r1,16.previous.section __ex_table, "a".long 8b, 99b // read fault.previous/** extern int __strnlen_user(const char *str, long len, unsigned long top);*** RTRN: - length of a string including NUL termination character* - on page fault 0*/.global ___strnlen_user___strnlen_user:l.addi r1,r1,-8l.sw 0(r1),r6l.sw 4(r1),r3l.addi r11,r0,02: l.sfeq r11,r4l.bf 1fl.addi r11,r11,18: l.lbz r6,0(r3)l.sfeq r6,r0l.bf 1fl.sfgeu r3,r5 // are we over the top ?l.bf 99fl.j 2bl.addi r3,r3,11:l.lwz r6,0(r1)l.lwz r3,4(r1)l.jr r9l.addi r1,r1,8.section .fixup, "ax"99:l.addi r11,r0,0l.lwz r6,0(r1)l.lwz r3,4(r1)l.jr r9l.addi r1,r1,8.previous.section __ex_table, "a".long 8b, 99b // read fault.previous
Go to most recent revision | Compare with Previous | Blame | View Log
