18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Returns 0 if exception before NUL or reaching the supplied limit (N), 48c2ecf20Sopenharmony_ci * a value greater than N if the string is longer than the limit, else 58c2ecf20Sopenharmony_ci * strlen. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Inputs: 88c2ecf20Sopenharmony_ci * in0: address of buffer 98c2ecf20Sopenharmony_ci * in1: string length limit N 108c2ecf20Sopenharmony_ci * Outputs: 118c2ecf20Sopenharmony_ci * r8: 0 in case of fault, strlen(buffer)+1 otherwise 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * Copyright (C) 1999, 2001 David Mosberger-Tang <davidm@hpl.hp.com> 148c2ecf20Sopenharmony_ci */ 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <asm/asmmacro.h> 178c2ecf20Sopenharmony_ci#include <asm/export.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciGLOBAL_ENTRY(__strnlen_user) 208c2ecf20Sopenharmony_ci .prologue 218c2ecf20Sopenharmony_ci alloc r2=ar.pfs,2,0,0,0 228c2ecf20Sopenharmony_ci .save ar.lc, r16 238c2ecf20Sopenharmony_ci mov r16=ar.lc // preserve ar.lc 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci .body 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci add r3=-1,in1 288c2ecf20Sopenharmony_ci ;; 298c2ecf20Sopenharmony_ci mov ar.lc=r3 308c2ecf20Sopenharmony_ci mov r9=0 318c2ecf20Sopenharmony_ci ;; 328c2ecf20Sopenharmony_ci // XXX braindead strlen loop---this needs to be optimized 338c2ecf20Sopenharmony_ci.Loop1: 348c2ecf20Sopenharmony_ci EXCLR(.Lexit, ld1 r8=[in0],1) 358c2ecf20Sopenharmony_ci add r9=1,r9 368c2ecf20Sopenharmony_ci ;; 378c2ecf20Sopenharmony_ci cmp.eq p6,p0=r8,r0 388c2ecf20Sopenharmony_ci(p6) br.cond.dpnt .Lexit 398c2ecf20Sopenharmony_ci br.cloop.dptk.few .Loop1 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci add r9=1,in1 // NUL not found---return N+1 428c2ecf20Sopenharmony_ci ;; 438c2ecf20Sopenharmony_ci.Lexit: 448c2ecf20Sopenharmony_ci mov r8=r9 458c2ecf20Sopenharmony_ci mov ar.lc=r16 // restore ar.lc 468c2ecf20Sopenharmony_ci br.ret.sptk.many rp 478c2ecf20Sopenharmony_ciEND(__strnlen_user) 488c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__strnlen_user) 49