1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Returns 0 if exception before NUL or reaching the supplied limit (N), 4*4882a593Smuzhiyun * a value greater than N if the string is longer than the limit, else 5*4882a593Smuzhiyun * strlen. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Inputs: 8*4882a593Smuzhiyun * in0: address of buffer 9*4882a593Smuzhiyun * in1: string length limit N 10*4882a593Smuzhiyun * Outputs: 11*4882a593Smuzhiyun * r8: 0 in case of fault, strlen(buffer)+1 otherwise 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * Copyright (C) 1999, 2001 David Mosberger-Tang <davidm@hpl.hp.com> 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun#include <asm/asmmacro.h> 17*4882a593Smuzhiyun#include <asm/export.h> 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunGLOBAL_ENTRY(__strnlen_user) 20*4882a593Smuzhiyun .prologue 21*4882a593Smuzhiyun alloc r2=ar.pfs,2,0,0,0 22*4882a593Smuzhiyun .save ar.lc, r16 23*4882a593Smuzhiyun mov r16=ar.lc // preserve ar.lc 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun .body 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun add r3=-1,in1 28*4882a593Smuzhiyun ;; 29*4882a593Smuzhiyun mov ar.lc=r3 30*4882a593Smuzhiyun mov r9=0 31*4882a593Smuzhiyun ;; 32*4882a593Smuzhiyun // XXX braindead strlen loop---this needs to be optimized 33*4882a593Smuzhiyun.Loop1: 34*4882a593Smuzhiyun EXCLR(.Lexit, ld1 r8=[in0],1) 35*4882a593Smuzhiyun add r9=1,r9 36*4882a593Smuzhiyun ;; 37*4882a593Smuzhiyun cmp.eq p6,p0=r8,r0 38*4882a593Smuzhiyun(p6) br.cond.dpnt .Lexit 39*4882a593Smuzhiyun br.cloop.dptk.few .Loop1 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun add r9=1,in1 // NUL not found---return N+1 42*4882a593Smuzhiyun ;; 43*4882a593Smuzhiyun.Lexit: 44*4882a593Smuzhiyun mov r8=r9 45*4882a593Smuzhiyun mov ar.lc=r16 // restore ar.lc 46*4882a593Smuzhiyun br.ret.sptk.many rp 47*4882a593SmuzhiyunEND(__strnlen_user) 48*4882a593SmuzhiyunEXPORT_SYMBOL(__strnlen_user) 49