public inbox for libc-help@sourceware.org
 help / color / mirror / Atom feed
* strlen-avx2.S
@ 2024-06-18  5:33 David Newall
  2024-06-18 18:38 ` strlen-avx2.S Adhemerval Zanella Netto
  0 siblings, 1 reply; 3+ messages in thread
From: David Newall @ 2024-06-18  5:33 UTC (permalink / raw)
  To: libc-help

[-- Attachment #1: Type: text/plain, Size: 2182 bytes --]

Hi All,

I recently upgraded my PC to one with Intel i9-14900HX, and installed 
Ubuntu22.04.  Since then, remmina (as RDP client) has been periodically 
crashing.  I've tracked it down to a debug statement, which uses the 
result of strlen():

REMMINA_PLUGIN_DEBUG("gp=%p returning %zu bytes of text in clipboard to 
requesting application", gp, strlen(clipboard->srv_data));

REMMINA_PLUGIN_DEBUG is defined as:

remmina_plugin_service->_remmina_debug(__func__, fmt, ##__VA_ARGS__)

The core file shows SIGSEG at __strlen_avx2 () at 
../sysdeps/x86_64/multiarch/strlen-avx2.S:74, called from 
remmina_rdp_cliprdr_request_data(), so the direct call of strlen (i.e. 
not called from _remmina_debug).

Clipboard has a reasonable value as does srv_data, which is a generic 
pointer.  Cast to char*, gdb shows the first value as '\0', so strlen() 
should be 0.

Libc6 is glibc-2.35 (with Canonical's patches), but 
sysdeps/x86_64/multiarch/strlen-avx2.S (as strlen) is unchanged up to 2.39.

Disassembling _strlen_avx2 shows this:

Dump of assembler code for function __strlen_avx2:
    0x0000758b5c19d7e0 <+0>:	endbr64
    0x0000758b5c19d7e4 <+4>:	mov    %edi,%eax
    0x0000758b5c19d7e6 <+6>:	mov    %rdi,%rdx
    0x0000758b5c19d7e9 <+9>:	vpxor  %xmm0,%xmm0,%xmm0
    0x0000758b5c19d7ed <+13>:	and    $0xfff,%eax
    0x0000758b5c19d7f2 <+18>:	cmp    $0xfe0,%eax
    0x0000758b5c19d7f7 <+23>:	ja     0x758b5c19d930 <__strlen_avx2+336>
=> 0x0000758b5c19d7fd <+29>:	vpcmpeqb (%rdi),%ymm0,%ymm1
    0x0000758b5c19d801 <+33>:	vpmovmskb %ymm1,%eax
    0x0000758b5c19d805 <+37>:	test   %eax,%eax
    0x0000758b5c19d807 <+39>:	je     0x758b5c19d860 <__strlen_avx2+128>
    0x0000758b5c19d809 <+41>:	tzcnt  %eax,%eax
    0x0000758b5c19d80d <+45>:	vzeroupper
    0x0000758b5c19d810 <+48>:	ret

I'm focusing on the instruction causing SIGSEG (marked with "=>"):

Do I understand it properly, as comparing memory addressed by RDI with 
YMM0, saving the result in YMM1?

YMM0 is 0.  I see where the lower 128-bits were zeroed (by zeroing 
XMM0), but not the upper 128-bits.  What clears them?

RDI is 0.  Is this expected?  Am I right that this is why I'm getting 
SIGSEG?

Regards,

David

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-06-18 20:23 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-18  5:33 strlen-avx2.S David Newall
2024-06-18 18:38 ` strlen-avx2.S Adhemerval Zanella Netto
2024-06-18 20:23   ` strlen-avx2.S H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).