Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/ia64/lib/strnlen_user.S
10817 views
1
/*
2
* Returns 0 if exception before NUL or reaching the supplied limit (N),
3
* a value greater than N if the string is longer than the limit, else
4
* strlen.
5
*
6
* Inputs:
7
* in0: address of buffer
8
* in1: string length limit N
9
* Outputs:
10
* r8: 0 in case of fault, strlen(buffer)+1 otherwise
11
*
12
* Copyright (C) 1999, 2001 David Mosberger-Tang <[email protected]>
13
*/
14
15
#include <asm/asmmacro.h>
16
17
GLOBAL_ENTRY(__strnlen_user)
18
.prologue
19
alloc r2=ar.pfs,2,0,0,0
20
.save ar.lc, r16
21
mov r16=ar.lc // preserve ar.lc
22
23
.body
24
25
add r3=-1,in1
26
;;
27
mov ar.lc=r3
28
mov r9=0
29
;;
30
// XXX braindead strlen loop---this needs to be optimized
31
.Loop1:
32
EXCLR(.Lexit, ld1 r8=[in0],1)
33
add r9=1,r9
34
;;
35
cmp.eq p6,p0=r8,r0
36
(p6) br.cond.dpnt .Lexit
37
br.cloop.dptk.few .Loop1
38
39
add r9=1,in1 // NUL not found---return N+1
40
;;
41
.Lexit:
42
mov r8=r9
43
mov ar.lc=r16 // restore ar.lc
44
br.ret.sptk.many rp
45
END(__strnlen_user)
46
47