Hello community, here is the log from the commit of package glibc for openSUSE:Factory checked in at 2018-03-26 11:50:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/glibc (Old) and /work/SRC/openSUSE:Factory/.glibc.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "glibc" Mon Mar 26 11:50:11 2018 rev:221 rq:590322 version:2.27 Changes: -------- --- /work/SRC/openSUSE:Factory/glibc/glibc.changes 2018-03-12 12:04:19.367365349 +0100 +++ /work/SRC/openSUSE:Factory/.glibc.new/glibc.changes 2018-03-26 11:50:27.494101354 +0200 @@ -1,0 +2,18 @@ +Thu Mar 22 09:48:53 UTC 2018 - [email protected] + +- pkey-get-reserved-name.patch: Linux: use reserved name __key in pkey_get + (BZ #22797) +- aarch64-sys-ptrace-update.patch: linux/aarch64: sync sys/ptrace.h with + Linux 4.15 (BZ #22433) +- powerpc-sys-ptrace-undefine-macros.patch: powerpc: Undefine Linux ptrace + macros that conflict with __ptrace_request +- powerpc-sys-ptrace-update.patch: linux/powerpc: sync sys/ptrace.h with + Linux 4.15 (BZ #22433, BZ #22807) +- netgroup-cache-keys.patch: Fix netgroup cache keys (BZ #22342) +- i386-sigaction-sa-restorer.patch: i386: Fix i386 sigaction sa_restorer + initialization (BZ #21269) +- riscv-tls-init.patch: RISC-V: Do not initialize $gp in TLS macros +- riscv-fmax-fmin-nan.patch: RISC-V: fmax/fmin: Handle signalling NaNs + correctly (BZ #22884) + +------------------------------------------------------------------- New: ---- aarch64-sys-ptrace-update.patch i386-sigaction-sa-restorer.patch netgroup-cache-keys.patch pkey-get-reserved-name.patch powerpc-sys-ptrace-undefine-macros.patch powerpc-sys-ptrace-update.patch riscv-fmax-fmin-nan.patch riscv-tls-init.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ glibc.spec ++++++ --- /var/tmp/diff_new_pack.KQogOB/_old 2018-03-26 11:50:46.149428336 +0200 +++ /var/tmp/diff_new_pack.KQogOB/_new 2018-03-26 11:50:46.153428192 +0200 @@ -284,6 +284,22 @@ Patch1000: riscv-readelflib.patch # PATCH-FIX-UPSTREAM Fix multiple definitions of __nss_*_database (BZ #22918) Patch1001: nss-database-multiple-dfn.patch +# PATCH-FIX-UPSTREAM Linux: use reserved name __key in pkey_get (BZ #22797) +Patch1002: pkey-get-reserved-name.patch +# PATCH-FIX-UPSTREAM linux/aarch64: sync sys/ptrace.h with Linux 4.15 (BZ #22433) +Patch1003: aarch64-sys-ptrace-update.patch +# PATCH-FIX-UPSTREAM powerpc: Undefine Linux ptrace macros that conflict with __ptrace_request +Patch1004: powerpc-sys-ptrace-undefine-macros.patch +# PATCH-FIX-UPSTREAM linux/powerpc: sync sys/ptrace.h with Linux 4.15 (BZ #22433, BZ #22807) +Patch1005: powerpc-sys-ptrace-update.patch +# PATCH-FIX-UPSTREAM Fix netgroup cache keys (BZ #22342) +Patch1006: netgroup-cache-keys.patch +# PATCH-FIX-UPSTREAM i386: Fix i386 sigaction sa_restorer initialization (BZ #21269) +Patch1007: i386-sigaction-sa-restorer.patch +# PATCH-FIX-UPSTREAM RISC-V: Do not initialize $gp in TLS macros +Patch1008: riscv-tls-init.patch +# PATCH-FIX-UPSTREAM RISC-V: fmax/fmin: Handle signalling NaNs correctly (BZ #22884) +Patch1009: riscv-fmax-fmin-nan.patch ### # Patches awaiting upstream approval @@ -495,6 +511,14 @@ %patch1000 -p1 %patch1001 -p1 +%patch1002 -p1 +%patch1003 -p1 +%patch1004 -p1 +%patch1005 -p1 +%patch1006 -p1 +%patch1007 -p1 +%patch1008 -p1 +%patch1009 -p1 %patch2000 -p1 %patch2004 -p1 ++++++ aarch64-sys-ptrace-update.patch ++++++ 2018-02-10 Dmitry V. Levin <[email protected]> [BZ #22433] * sysdeps/unix/sysv/linux/aarch64/sys/ptrace.h (__ptrace_request): Remove arm-specific PTRACE_GET_THREAD_AREA, PTRACE_GETHBPREGS, and PTRACE_SETHBPREGS. Index: glibc-2.27/sysdeps/unix/sysv/linux/aarch64/sys/ptrace.h =================================================================== --- glibc-2.27.orig/sysdeps/unix/sysv/linux/aarch64/sys/ptrace.h +++ glibc-2.27/sysdeps/unix/sysv/linux/aarch64/sys/ptrace.h @@ -78,18 +78,10 @@ enum __ptrace_request PTRACE_DETACH = 17, #define PT_DETACH PTRACE_DETACH - PTRACE_GET_THREAD_AREA = 22, - /* Continue and stop at the next entry to or return from syscall. */ PTRACE_SYSCALL = 24, #define PT_SYSCALL PTRACE_SYSCALL - /* Get all hardware breakpoint registers. */ - PTRACE_GETHBPREGS = 29, - - /* Set all hardware breakpoint registers. */ - PTRACE_SETHBPREGS = 30, - /* Set ptrace filter options. */ PTRACE_SETOPTIONS = 0x4200, #define PT_SETOPTIONS PTRACE_SETOPTIONS ++++++ i386-sigaction-sa-restorer.patch ++++++ 2018-03-03 Adhemerval Zanella <[email protected]> [BZ #21269] * sysdeps/unix/sysv/linux/i386/Makefile (tests): Add tst-bz21269. * sysdeps/unix/sysv/linux/i386/sigaction.c (SET_SA_RESTORER): Clear sa_restorer for vDSO case. * sysdeps/unix/sysv/linux/i386/tst-bz21269.c: New file. Index: glibc-2.27/sysdeps/unix/sysv/linux/i386/Makefile =================================================================== --- glibc-2.27.orig/sysdeps/unix/sysv/linux/i386/Makefile +++ glibc-2.27/sysdeps/unix/sysv/linux/i386/Makefile @@ -3,6 +3,9 @@ default-abi := 32 ifeq ($(subdir),misc) sysdep_routines += ioperm iopl vm86 + +tests += tst-bz21269 +$(objpfx)tst-bz21269: $(shared-thread-library) endif ifeq ($(subdir),elf) Index: glibc-2.27/sysdeps/unix/sysv/linux/i386/sigaction.c =================================================================== --- glibc-2.27.orig/sysdeps/unix/sysv/linux/i386/sigaction.c +++ glibc-2.27/sysdeps/unix/sysv/linux/i386/sigaction.c @@ -42,7 +42,6 @@ extern void restore_rt (void) asm ("__re #endif extern void restore (void) asm ("__restore") attribute_hidden; - /* If ACT is not NULL, change the action for SIG to *ACT. If OACT is not NULL, put the old action for SIG in *OACT. */ int @@ -65,6 +64,8 @@ __libc_sigaction (int sig, const struct kact.sa_restorer = ((act->sa_flags & SA_SIGINFO) ? &restore_rt : &restore); } + else + kact.sa_restorer = NULL; } /* XXX The size argument hopefully will have to be changed to the Index: glibc-2.27/sysdeps/unix/sysv/linux/i386/tst-bz21269.c =================================================================== --- /dev/null +++ glibc-2.27/sysdeps/unix/sysv/linux/i386/tst-bz21269.c @@ -0,0 +1,233 @@ +/* Test for i386 sigaction sa_restorer handling (BZ#21269) + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* This is based on Linux test tools/testing/selftests/x86/ldt_gdt.c, + more specifically in do_multicpu_tests function. The main changes + are: + + - C11 atomics instead of plain access. + - Remove x86_64 support which simplifies the syscall handling + and fallbacks. + - Replicate only the test required to trigger the issue for the + BZ#21269. */ + +#include <stdatomic.h> + +#include <asm/ldt.h> +#include <linux/futex.h> + +#include <setjmp.h> +#include <signal.h> +#include <errno.h> +#include <sys/syscall.h> +#include <sys/mman.h> + +#include <support/xunistd.h> +#include <support/check.h> +#include <support/xthread.h> + +static int +xset_thread_area (struct user_desc *u_info) +{ + long ret = syscall (SYS_set_thread_area, u_info); + TEST_VERIFY_EXIT (ret == 0); + return ret; +} + +static void +xmodify_ldt (int func, const void *ptr, unsigned long bytecount) +{ + TEST_VERIFY_EXIT (syscall (SYS_modify_ldt, 1, ptr, bytecount) == 0); +} + +static int +futex (int *uaddr, int futex_op, int val, void *timeout, int *uaddr2, + int val3) +{ + return syscall (SYS_futex, uaddr, futex_op, val, timeout, uaddr2, val3); +} + +static void +xsethandler (int sig, void (*handler)(int, siginfo_t *, void *), int flags) +{ + struct sigaction sa = { 0 }; + sa.sa_sigaction = handler; + sa.sa_flags = SA_SIGINFO | flags; + TEST_VERIFY_EXIT (sigemptyset (&sa.sa_mask) == 0); + TEST_VERIFY_EXIT (sigaction (sig, &sa, 0) == 0); +} + +static jmp_buf jmpbuf; + +static void +sigsegv_handler (int sig, siginfo_t *info, void *ctx_void) +{ + siglongjmp (jmpbuf, 1); +} + +/* Points to an array of 1024 ints, each holding its own index. */ +static const unsigned int *counter_page; +static struct user_desc *low_user_desc; +static struct user_desc *low_user_desc_clear; /* Used to delete GDT entry. */ +static int gdt_entry_num; + +static void +setup_counter_page (void) +{ + long page_size = sysconf (_SC_PAGE_SIZE); + TEST_VERIFY_EXIT (page_size > 0); + unsigned int *page = xmmap (NULL, page_size, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | MAP_32BIT, -1); + for (int i = 0; i < (page_size / sizeof (unsigned int)); i++) + page[i] = i; + counter_page = page; +} + +static void +setup_low_user_desc (void) +{ + low_user_desc = xmmap (NULL, 2 * sizeof (struct user_desc), + PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | MAP_32BIT, -1); + + low_user_desc->entry_number = -1; + low_user_desc->base_addr = (unsigned long) &counter_page[1]; + low_user_desc->limit = 0xffff; + low_user_desc->seg_32bit = 1; + low_user_desc->contents = 0; + low_user_desc->read_exec_only = 0; + low_user_desc->limit_in_pages = 1; + low_user_desc->seg_not_present = 0; + low_user_desc->useable = 0; + + xset_thread_area (low_user_desc); + + low_user_desc_clear = low_user_desc + 1; + low_user_desc_clear->entry_number = gdt_entry_num; + low_user_desc_clear->read_exec_only = 1; + low_user_desc_clear->seg_not_present = 1; +} + +/* Possible values of futex: + 0: thread is idle. + 1: thread armed. + 2: thread should clear LDT entry 0. + 3: thread should exit. */ +static atomic_uint ftx; + +static void * +threadproc (void *ctx) +{ + while (1) + { + futex ((int *) &ftx, FUTEX_WAIT, 1, NULL, NULL, 0); + while (atomic_load (&ftx) != 2) + { + if (atomic_load (&ftx) >= 3) + return NULL; + } + + /* clear LDT entry 0. */ + const struct user_desc desc = { 0 }; + xmodify_ldt (1, &desc, sizeof (desc)); + + /* If ftx == 2, set it to zero, If ftx == 100, quit. */ + if (atomic_fetch_add (&ftx, -2) != 2) + return NULL; + } +} + + +/* As described in testcase, for historical reasons x86_32 Linux (and compat + on x86_64) interprets SA_RESTORER clear with nonzero sa_restorer as a + request for stack switching if the SS segment is 'funny' (this is default + scenario for vDSO system). This means that anything that tries to mix + signal handling with segmentation should explicit clear the sa_restorer. + + This testcase check if sigaction in fact does it by changing the local + descriptor table (LDT) through the modify_ldt syscall and triggering + a synchronous segfault on iret fault by trying to install an invalid + segment. With a correct zeroed sa_restorer it should not trigger an + 'real' SEGSEGV and allows the siglongjmp in signal handler. */ + +static int +do_test (void) +{ + setup_counter_page (); + setup_low_user_desc (); + + pthread_t thread; + unsigned short orig_ss; + + xsethandler (SIGSEGV, sigsegv_handler, 0); + /* 32-bit kernels send SIGILL instead of SIGSEGV on IRET faults. */ + xsethandler (SIGILL, sigsegv_handler, 0); + + thread = xpthread_create (0, threadproc, 0); + + asm volatile ("mov %%ss, %0" : "=rm" (orig_ss)); + + for (int i = 0; i < 5; i++) + { + if (sigsetjmp (jmpbuf, 1) != 0) + continue; + + /* Make sure the thread is ready after the last test. */ + while (atomic_load (&ftx) != 0) + ; + + struct user_desc desc = { + .entry_number = 0, + .base_addr = 0, + .limit = 0xffff, + .seg_32bit = 1, + .contents = 0, + .read_exec_only = 0, + .limit_in_pages = 1, + .seg_not_present = 0, + .useable = 0 + }; + + xmodify_ldt (0x11, &desc, sizeof (desc)); + + /* Arm the thread. */ + ftx = 1; + futex ((int*) &ftx, FUTEX_WAKE, 0, NULL, NULL, 0); + + asm volatile ("mov %0, %%ss" : : "r" (0x7)); + + /* Fire up thread modify_ldt call. */ + atomic_store (&ftx, 2); + + while (atomic_load (&ftx) != 0) + ; + + /* On success, modify_ldt will segfault us synchronously and we will + escape via siglongjmp. */ + support_record_failure (); + } + + atomic_store (&ftx, 100); + futex ((int*) &ftx, FUTEX_WAKE, 0, NULL, NULL, 0); + + xpthread_join (thread); + + return 0; +} + +#include <support/test-driver.c> ++++++ netgroup-cache-keys.patch ++++++ 2018-03-01 DJ Delorie <[email protected]> [BZ #22342] * nscd/netgroupcache.c (addinnetgrX): Include trailing NUL in key value. Index: glibc-2.27/nscd/netgroupcache.c =================================================================== --- glibc-2.27.orig/nscd/netgroupcache.c +++ glibc-2.27/nscd/netgroupcache.c @@ -480,7 +480,7 @@ addinnetgrX (struct database_dyn *db, in { const char *group = key; key = (char *) rawmemchr (key, '\0') + 1; - size_t group_len = key - group - 1; + size_t group_len = key - group; const char *host = *key++ ? key : NULL; if (host != NULL) key = (char *) rawmemchr (key, '\0') + 1; ++++++ pkey-get-reserved-name.patch ++++++ 2018-02-07 Igor Gnatenko <[email protected]> [BZ #22797] * sysdeps/unix/sysv/linux/bits/mman-shared.h (pkey_get): Add missing second underscore to parameter name. Index: glibc-2.27/sysdeps/unix/sysv/linux/bits/mman-shared.h =================================================================== --- glibc-2.27.orig/sysdeps/unix/sysv/linux/bits/mman-shared.h +++ glibc-2.27/sysdeps/unix/sysv/linux/bits/mman-shared.h @@ -61,7 +61,7 @@ int pkey_set (int __key, unsigned int __ /* Return the access rights for the current thread for KEY, which must have been allocated using pkey_alloc. */ -int pkey_get (int _key) __THROW; +int pkey_get (int __key) __THROW; /* Free an allocated protection key, which must have been allocated using pkey_alloc. */ ++++++ powerpc-sys-ptrace-undefine-macros.patch ++++++ 2018-02-26 Tulio Magno Quites Machado Filho <[email protected]> * sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h: Undefine Linux macros used in __ptrace_request. Index: glibc-2.27/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h =================================================================== --- glibc-2.27.orig/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h +++ glibc-2.27/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h @@ -24,6 +24,49 @@ __BEGIN_DECLS +#if defined _LINUX_PTRACE_H || defined _ASM_POWERPC_PTRACE_H +/* Do not let Linux headers macros interfere with enum __ptrace_request. */ +# undef PTRACE_ATTACH +# undef PTRACE_CONT +# undef PTRACE_DETACH +# undef PTRACE_GET_DEBUGREG +# undef PTRACE_GETEVENTMSG +# undef PTRACE_GETEVRREGS +# undef PTRACE_GETFPREGS +# undef PTRACE_GETREGS +# undef PTRACE_GETREGS64 +# undef PTRACE_GETREGSET +# undef PTRACE_GETSIGINFO +# undef PTRACE_GETSIGMASK +# undef PTRACE_GETVRREGS +# undef PTRACE_GETVSRREGS +# undef PTRACE_INTERRUPT +# undef PTRACE_KILL +# undef PTRACE_LISTEN +# undef PTRACE_PEEKDATA +# undef PTRACE_PEEKSIGINFO +# undef PTRACE_PEEKTEXT +# undef PTRACE_POKEDATA +# undef PTRACE_POKETEXT +# undef PTRACE_SECCOMP_GET_FILTER +# undef PTRACE_SEIZE +# undef PTRACE_SET_DEBUGREG +# undef PTRACE_SETEVRREGS +# undef PTRACE_SETFPREGS +# undef PTRACE_SETOPTIONS +# undef PTRACE_SETREGS +# undef PTRACE_SETREGS64 +# undef PTRACE_SETREGSET +# undef PTRACE_SETSIGINFO +# undef PTRACE_SETSIGMASK +# undef PTRACE_SETVRREGS +# undef PTRACE_SETVSRREGS +# undef PTRACE_SINGLEBLOCK +# undef PTRACE_SINGLESTEP +# undef PTRACE_SYSCALL +# undef PTRACE_TRACEME +#endif + /* Type of the REQUEST argument to `ptrace.' */ enum __ptrace_request { ++++++ powerpc-sys-ptrace-update.patch ++++++ 2018-02-26 Dmitry V. Levin <[email protected]> [BZ #22433] [BZ #22807] * sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h (__ptrace_request): Add PTRACE_GETREGS, PTRACE_SETREGS, PTRACE_GETFPREGS, PTRACE_SETFPREGS, PTRACE_GETVRREGS, PTRACE_SETVRREGS, PTRACE_GETEVRREGS, PTRACE_SETEVRREGS, PTRACE_GETREGS64, PTRACE_SETREGS64, PTRACE_GET_DEBUGREG, PTRACE_SET_DEBUGREG, PTRACE_GETVSRREGS, PTRACE_SETVSRREGS, and PTRACE_SINGLEBLOCK. Index: glibc-2.27/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h =================================================================== --- glibc-2.27.orig/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h +++ glibc-2.27/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h @@ -112,6 +112,22 @@ enum __ptrace_request PTRACE_SINGLESTEP = 9, #define PT_STEP PTRACE_SINGLESTEP + /* Get all general purpose registers used by a process. */ + PTRACE_GETREGS = 12, +#define PT_GETREGS PTRACE_GETREGS + + /* Set all general purpose registers used by a process. */ + PTRACE_SETREGS = 13, +#define PT_SETREGS PTRACE_SETREGS + + /* Get all floating point registers used by a process. */ + PTRACE_GETFPREGS = 14, +#define PT_GETFPREGS PTRACE_GETFPREGS + + /* Set all floating point registers used by a process. */ + PTRACE_SETFPREGS = 15, +#define PT_SETFPREGS PTRACE_SETFPREGS + /* Attach to a process that is already running. */ PTRACE_ATTACH = 16, #define PT_ATTACH PTRACE_ATTACH @@ -120,10 +136,56 @@ enum __ptrace_request PTRACE_DETACH = 17, #define PT_DETACH PTRACE_DETACH + /* Get all altivec registers used by a process. */ + PTRACE_GETVRREGS = 18, +#define PT_GETVRREGS PTRACE_GETVRREGS + + /* Set all altivec registers used by a process. */ + PTRACE_SETVRREGS = 19, +#define PT_SETVRREGS PTRACE_SETVRREGS + + /* Get all SPE registers used by a process. */ + PTRACE_GETEVRREGS = 20, +#define PT_GETEVRREGS PTRACE_GETEVRREGS + + /* Set all SPE registers used by a process. */ + PTRACE_SETEVRREGS = 21, +#define PT_SETEVRREGS PTRACE_SETEVRREGS + + /* Same as PTRACE_GETREGS except a 32-bit process will obtain + the full 64-bit registers. Implemented by 64-bit kernels only. */ + PTRACE_GETREGS64 = 22, +#define PT_GETREGS64 PTRACE_GETREGS64 + + /* Same as PTRACE_SETREGS except a 32-bit process will set + the full 64-bit registers. Implemented by 64-bit kernels only. */ + PTRACE_SETREGS64 = 23, +#define PT_SETREGS64 PTRACE_SETREGS64 + /* Continue and stop at the next entry to or return from syscall. */ PTRACE_SYSCALL = 24, #define PT_SYSCALL PTRACE_SYSCALL + /* Get a debug register of a process. */ + PTRACE_GET_DEBUGREG = 25, +#define PT_GET_DEBUGREG PTRACE_GET_DEBUGREG + + /* Set a debug register of a process. */ + PTRACE_SET_DEBUGREG = 26, +#define PT_SET_DEBUGREG PTRACE_SET_DEBUGREG + + /* Get the first 32 VSX registers of a process. */ + PTRACE_GETVSRREGS = 27, +#define PT_GETVSRREGS PTRACE_GETVSRREGS + + /* Set the first 32 VSX registers of a process. */ + PTRACE_SETVSRREGS = 28, +#define PT_SETVSRREGS PTRACE_SETVSRREGS + + /* Execute process until next taken branch. */ + PTRACE_SINGLEBLOCK = 256, +#define PT_STEPBLOCK PTRACE_SINGLEBLOCK + /* Set ptrace filter options. */ PTRACE_SETOPTIONS = 0x4200, #define PT_SETOPTIONS PTRACE_SETOPTIONS ++++++ riscv-fmax-fmin-nan.patch ++++++ 2018-02-22 Andrew Waterman <[email protected]> [BZ # 22884] * sysdeps/riscv/rvd/s_fmax.c (__fmax): Handle sNaNs correctly. * sysdeps/riscv/rvd/s_fmin.c (__fmin): Likewise. * sysdeps/riscv/rvf/s_fmaxf.c (__fmaxf): Likewise. * sysdeps/riscv/rvf/s_fminf.c (__fminf): Likewise. Index: glibc-2.27/sysdeps/riscv/rvd/s_fmax.c =================================================================== --- glibc-2.27.orig/sysdeps/riscv/rvd/s_fmax.c +++ glibc-2.27/sysdeps/riscv/rvd/s_fmax.c @@ -17,12 +17,19 @@ <http://www.gnu.org/licenses/>. */ #include <math.h> +#include <math_private.h> #include <libm-alias-double.h> double __fmax (double x, double y) { - asm ("fmax.d %0, %1, %2" : "=f" (x) : "f" (x), "f" (y)); - return x; + double res; + + if (__glibc_unlikely ((_FCLASS (x) | _FCLASS (y)) & _FCLASS_SNAN)) + return x + y; + else + asm ("fmax.d %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); + + return res; } libm_alias_double (__fmax, fmax) Index: glibc-2.27/sysdeps/riscv/rvd/s_fmin.c =================================================================== --- glibc-2.27.orig/sysdeps/riscv/rvd/s_fmin.c +++ glibc-2.27/sysdeps/riscv/rvd/s_fmin.c @@ -17,12 +17,19 @@ <http://www.gnu.org/licenses/>. */ #include <math.h> +#include <math_private.h> #include <libm-alias-double.h> double __fmin (double x, double y) { - asm ("fmin.d %0, %1, %2" : "=f" (x) : "f" (x), "f" (y)); - return x; + double res; + + if (__glibc_unlikely ((_FCLASS (x) | _FCLASS (y)) & _FCLASS_SNAN)) + return x + y; + else + asm ("fmin.d %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); + + return res; } libm_alias_double (__fmin, fmin) Index: glibc-2.27/sysdeps/riscv/rvf/s_fmaxf.c =================================================================== --- glibc-2.27.orig/sysdeps/riscv/rvf/s_fmaxf.c +++ glibc-2.27/sysdeps/riscv/rvf/s_fmaxf.c @@ -17,12 +17,19 @@ <http://www.gnu.org/licenses/>. */ #include <math.h> +#include <math_private.h> #include <libm-alias-float.h> float __fmaxf (float x, float y) { - asm ("fmax.s %0, %1, %2" : "=f" (x) : "f" (x), "f" (y)); - return x; + float res; + + if (__glibc_unlikely ((_FCLASS (x) | _FCLASS (y)) & _FCLASS_SNAN)) + return x + y; + else + asm ("fmax.s %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); + + return res; } libm_alias_float (__fmax, fmax) Index: glibc-2.27/sysdeps/riscv/rvf/s_fminf.c =================================================================== --- glibc-2.27.orig/sysdeps/riscv/rvf/s_fminf.c +++ glibc-2.27/sysdeps/riscv/rvf/s_fminf.c @@ -17,12 +17,19 @@ <http://www.gnu.org/licenses/>. */ #include <math.h> +#include <math_private.h> #include <libm-alias-float.h> float __fminf (float x, float y) { - asm ("fmin.s %0, %1, %2" : "=f" (x) : "f" (x), "f" (y)); - return x; + float res; + + if (__glibc_unlikely ((_FCLASS (x) | _FCLASS (y)) & _FCLASS_SNAN)) + return x + y; + else + asm ("fmin.s %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); + + return res; } libm_alias_float (__fmin, fmin) ++++++ riscv-tls-init.patch ++++++ 2018-02-22 DJ Delorie <[email protected]> * sysdeps/riscv/tls-macros.h: Do not initialize $gp. Index: glibc-2.27/sysdeps/riscv/tls-macros.h =================================================================== --- glibc-2.27.orig/sysdeps/riscv/tls-macros.h +++ glibc-2.27/sysdeps/riscv/tls-macros.h @@ -23,19 +23,9 @@ #include <sysdep.h> #include "dl-tls.h" -#define LOAD_GP \ - ".option push\n\t" \ - ".option norelax\n\t" \ - "la gp, __global_pointer$\n\t" \ - ".option pop\n\t" - -#define UNLOAD_GP - #define TLS_GD(x) \ ({ void *__result; \ - asm (LOAD_GP \ - "la.tls.gd %0, " #x "\n\t" \ - UNLOAD_GP \ + asm ("la.tls.gd %0, " #x "\n\t" \ : "=r" (__result)); \ __tls_get_addr (__result); }) @@ -43,19 +33,15 @@ #define TLS_IE(x) \ ({ void *__result; \ - asm (LOAD_GP \ - "la.tls.ie %0, " #x "\n\t" \ + asm ("la.tls.ie %0, " #x "\n\t" \ "add %0, %0, tp\n\t" \ - UNLOAD_GP \ : "=r" (__result)); \ __result; }) #define TLS_LE(x) \ ({ void *__result; \ - asm (LOAD_GP \ - "lui %0, %%tprel_hi(" #x ")\n\t" \ + asm ("lui %0, %%tprel_hi(" #x ")\n\t" \ "add %0, %0, tp, %%tprel_add(" #x ")\n\t" \ "addi %0, %0, %%tprel_lo(" #x ")\n\t" \ - UNLOAD_GP \ : "=r" (__result)); \ __result; })
