From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32201 invoked by alias); 14 Mar 2018 14:59:41 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 31226 invoked by uid 89); 14 Mar 2018 14:59:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-oi0-f44.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=fz+QaVcwFSlKTCn8btL+b3Ha7CWbf4v1qC5R8b0ZGlA=; b=uYO8r2W7UA+rWc+7+Pg/g/4Q5ySN1sgr5cn5eTM/QWLCNmvvmf79BCc46VAGXzs9XJ w121DyrdbV88RhM5ZRSWCdBSIkpqEW6nlLGpKWwwGpVazatpnMNQOePaTQPLWWyGHla1 04zd97roRyYBHhTFAHgfHY0kTy1CQwtFb3XGo+ZNArjaB+eaJRL8Py5RUrrbQPg/sd3W txvp1fEY86hvSjliiWUq1acqvK2WDGGDwOdifLiHCtAYVzvRFhJEHczknkX3ePwdyHld U418NO9G7bmW+STV+MjbopED50Mn1dkITgcfsTVPyjz5ICGhjWemJ7RRI8pdE5HFeZou na2w== X-Gm-Message-State: AElRT7FMOk0GlxKNDiaxOLZdD34fpeWT3T03NdPxesngggUWM9WuPMBe wvGYCbhqWHI66a2Whqf5rgArGt5158WB2SjFcsk= X-Google-Smtp-Source: AG47ELtlCFn+Wj3KVC2wNTsspqdkB7t8w6WHLR7rjIaKIyQqZ5PcAYM4+MorOzlQ0AQvOiUute3ELs6E+TmXelyBw4o= X-Received: by 10.202.83.129 with SMTP id h123mr3066798oib.228.1521039577069; Wed, 14 Mar 2018 07:59:37 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: From: "H.J. Lu" Date: Wed, 14 Mar 2018 14:59:00 -0000 Message-ID: Subject: Re: [PATCH] Fix i386 memmove issue [BZ #22644] To: Andrew Senkevich Cc: Andreas Schwab , libc-alpha , Max Horn Content-Type: text/plain; charset="UTF-8" X-SW-Source: 2018-03/txt/msg00342.txt.bz2 On Wed, Mar 14, 2018 at 7:43 AM, Andrew Senkevich wrote: > 2018-02-19 11:13 GMT+01:00 Andreas Schwab : >> On Feb 19 2018, Andrew Senkevich wrote: >> >>> diff --git a/string/test-memmove.c b/string/test-memmove.c >>> index edc7a4c..8dc152b >>> --- a/string/test-memmove.c >>> +++ b/string/test-memmove.c >>> @@ -245,6 +245,49 @@ do_random_tests (void) >>> } >>> } >>> >>> +#if __SIZEOF_POINTER__ == 4 >>> +static void >>> +do_test2 (void) >>> +{ >>> + uint32_t i; >>> + uint32_t num = 0x20000000; >>> + uint32_t * large_buf = mmap (0, sizeof(uint32_t) * num, PROT_READ | >>> PROT_WRITE, >>> + MAP_PRIVATE | MAP_ANON, -1, 0); >>> + if (large_buf == MAP_FAILED) >>> + error (EXIT_FAILURE, errno, "large mmap failed"); >>> + >>> + if (!((uint32_t)(large_buf) < (0x80000000 - 128) && (0x80000000 + >>> 128) < (uint32_t)(&large_buf[num]))) >>> + { >>> + error (0, 0,"allocated large memory doesn't cross 0x80000000 boundary"); >>> + ret = 1; >>> + return; >> >> Please properly fold long lines, and remove the redundant parens. Also, >> there is no guarantee that the address range is unallocated. > > Thanks, updated patch below. Any comment or it is Ok for trunk? Please also test crossing 0x80000000 boundary on 64-bit systems. > diff --git a/string/test-memmove.c b/string/test-memmove.c > index edc7a4c..a8c4af4 100644 > --- a/string/test-memmove.c > +++ b/string/test-memmove.c > @@ -245,6 +245,57 @@ do_random_tests (void) > } > } > > +#if __SIZEOF_POINTER__ == 4 > +static void > +do_test2 (void) > +{ > + uint32_t i; > + uint32_t num = 0x20000000; > + uint32_t * large_buf = mmap (0, sizeof(uint32_t) * num, > + PROT_READ | PROT_WRITE, > + MAP_PRIVATE | MAP_ANON, -1, 0); > + if (large_buf == MAP_FAILED) > + error (EXIT_FAILURE, errno, "Large mmap failed"); > + > + if ((uint32_t)large_buf > 0x80000000 - 128 > + || (uint32_t)&large_buf[num] < 0x80000000 + 128) > + { > + error (0, 0,"Large mmap doesn't cross 0x80000000 boundary"); > + ret = EXIT_UNSUPPORTED; > + munmap((void *)large_buf, sizeof(uint32_t) * num); > + return; > + } > + > + int bytes_move = 0x80000000 - (uint32_t)large_buf; > + int arr_size = bytes_move / sizeof(uint32_t); > + > + FOR_EACH_IMPL (impl, 0) > + { > + for (i = 0; i < arr_size; i++) > + large_buf[i] = i; > + > + uint32_t * dst = &large_buf[33]; > + > + CALL (impl, (char *)dst, (char *)large_buf, bytes_move); > + > + for (i = 0; i < arr_size; i++) > + { > + if (dst[i] != i) > + { > + error (0, 0, > + "Wrong result in function %s dst \"%p\" src \"%p\" offset \"%d\"", > + impl->name, dst, large_buf, i); > + ret = 1; > + munmap((void *)large_buf, sizeof(uint32_t) * num); > + return; > + } > + } > + } > + > + munmap((void *)large_buf, sizeof(uint32_t) * num); > +} > +#endif > + > int > test_main (void) > { > @@ -284,6 +335,11 @@ test_main (void) > } > > do_random_tests (); > + > +#if __SIZEOF_POINTER__ == 4 > + do_test2 (); > +#endif > + > return ret; > } > > diff --git a/sysdeps/i386/i686/multiarch/memcpy-sse2-unaligned.S > b/sysdeps/i386/i686/multiarch/memcpy-sse2-unaligned.S > index 9c3bbe7..9aa17de 100644 > --- a/sysdeps/i386/i686/multiarch/memcpy-sse2-unaligned.S > +++ b/sysdeps/i386/i686/multiarch/memcpy-sse2-unaligned.S > @@ -72,7 +72,7 @@ ENTRY (MEMCPY) > cmp %edx, %eax > > # ifdef USE_AS_MEMMOVE > - jg L(check_forward) > + ja L(check_forward) > > L(mm_len_0_or_more_backward): > /* Now do checks for lengths. We do [0..16], [16..32], [32..64], [64..128] > @@ -81,7 +81,7 @@ L(mm_len_0_or_more_backward): > jbe L(mm_len_0_16_bytes_backward) > > cmpl $32, %ecx > - jg L(mm_len_32_or_more_backward) > + ja L(mm_len_32_or_more_backward) > > /* Copy [0..32] and return. */ > movdqu (%eax), %xmm0 > @@ -92,7 +92,7 @@ L(mm_len_0_or_more_backward): > > L(mm_len_32_or_more_backward): > cmpl $64, %ecx > - jg L(mm_len_64_or_more_backward) > + ja L(mm_len_64_or_more_backward) > > /* Copy [0..64] and return. */ > movdqu (%eax), %xmm0 > @@ -107,7 +107,7 @@ L(mm_len_32_or_more_backward): > > L(mm_len_64_or_more_backward): > cmpl $128, %ecx > - jg L(mm_len_128_or_more_backward) > + ja L(mm_len_128_or_more_backward) > > /* Copy [0..128] and return. */ > movdqu (%eax), %xmm0 > @@ -132,7 +132,7 @@ L(mm_len_128_or_more_backward): > add %ecx, %eax > cmp %edx, %eax > movl SRC(%esp), %eax > - jle L(forward) > + jbe L(forward) > PUSH (%esi) > PUSH (%edi) > PUSH (%ebx) > @@ -269,7 +269,7 @@ L(check_forward): > add %edx, %ecx > cmp %eax, %ecx > movl LEN(%esp), %ecx > - jle L(forward) > + jbe L(forward) > > /* Now do checks for lengths. We do [0..16], [0..32], [0..64], [0..128] > separately. */ > > > -- > WBR, > Andrew -- H.J.