Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/alpha/lib/strncpy.S
26424 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* arch/alpha/lib/strncpy.S
4
* Contributed by Richard Henderson ([email protected])
5
*
6
* Copy no more than COUNT bytes of the null-terminated string from
7
* SRC to DST. If SRC does not cover all of COUNT, the balance is
8
* zeroed.
9
*
10
* Or, rather, if the kernel cared about that weird ANSI quirk. This
11
* version has cropped that bit o' nastiness as well as assuming that
12
* __stxncpy is in range of a branch.
13
*/
14
#include <linux/export.h>
15
.set noat
16
.set noreorder
17
18
.text
19
20
.align 4
21
.globl strncpy
22
.ent strncpy
23
strncpy:
24
.frame $30, 0, $26
25
.prologue 0
26
27
mov $16, $0 # set return value now
28
beq $18, $zerolen
29
unop
30
bsr $23, __stxncpy # do the work of the copy
31
32
unop
33
bne $18, $multiword # do we have full words left?
34
subq $24, 1, $3 # nope
35
subq $27, 1, $4
36
37
or $3, $24, $3 # clear the bits between the last
38
or $4, $27, $4 # written byte and the last byte in COUNT
39
andnot $3, $4, $4
40
zap $1, $4, $1
41
42
stq_u $1, 0($16)
43
ret
44
45
.align 4
46
$multiword:
47
subq $27, 1, $2 # clear the final bits in the prev word
48
or $2, $27, $2
49
zapnot $1, $2, $1
50
subq $18, 1, $18
51
52
stq_u $1, 0($16)
53
addq $16, 8, $16
54
unop
55
beq $18, 1f
56
57
nop
58
unop
59
nop
60
blbc $18, 0f
61
62
stq_u $31, 0($16) # zero one word
63
subq $18, 1, $18
64
addq $16, 8, $16
65
beq $18, 1f
66
67
0: stq_u $31, 0($16) # zero two words
68
subq $18, 2, $18
69
stq_u $31, 8($16)
70
addq $16, 16, $16
71
bne $18, 0b
72
73
1: ldq_u $1, 0($16) # clear the leading bits in the final word
74
subq $24, 1, $2
75
or $2, $24, $2
76
77
zap $1, $2, $1
78
stq_u $1, 0($16)
79
$zerolen:
80
ret
81
82
.end strncpy
83
EXPORT_SYMBOL(strncpy)
84
85