Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package glibc for openSUSE:Factory checked in at 2023-05-31 21:54:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/glibc (Old) and /work/SRC/openSUSE:Factory/.glibc.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "glibc" Wed May 31 21:54:04 2023 rev:275 rq:1089001 version:2.37 Changes: -------- --- /work/SRC/openSUSE:Factory/glibc/glibc.changes 2023-04-06 15:55:19.284085595 +0200 +++ /work/SRC/openSUSE:Factory/.glibc.new.1533/glibc.changes 2023-05-31 21:54:05.796863251 +0200 @@ -1,0 +2,6 @@ +Fri Apr 28 23:42:47 UTC 2023 - Giuliano Belinassi <giuliano.belina...@suse.com> + +- ulp-prologue-into-asm-functions.patch: Add support for livepatches in + ASM written functions (bsc#1210777) + +------------------------------------------------------------------- New: ---- ulp-prologue-into-asm-functions.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ glibc.spec ++++++ --- /var/tmp/diff_new_pack.rWcqyA/_old 2023-05-31 21:54:07.268871952 +0200 +++ /var/tmp/diff_new_pack.rWcqyA/_new 2023-05-31 21:54:07.272871975 +0200 @@ -260,6 +260,8 @@ Patch19: nscd-server-user.patch # PATCH-FEATURE-SLE read nsswich.conf from /usr Patch20: glibc-nsswitch-usr.diff +# PATCH-FEATURE-SLE Add ULP prologue into ASM functions +Patch21: ulp-prologue-into-asm-functions.patch ### Locale related patches # PATCH-FIX-OPENSUSE Add additional locales @@ -500,6 +502,7 @@ %patch15 -p1 %patch19 -p1 %patch20 -p1 +%patch21 -p1 %patch100 -p1 %patch102 -p1 @@ -676,6 +679,9 @@ --with-bugurl=http://bugs.opensuse.org \ --enable-bind-now \ --disable-timezone-tools \ +%if %{with livepatching} + --enable-userspace-livepatch \ +%endif --disable-crypt || \ { rc=$?; @@ -688,7 +694,7 @@ %if %{build_main} && %{with livepatching} # Append necessary flags for livepatch support, if enabled. Only objects # included in shared libraries should be prepared for live patching. -echo 'CFLAGS-.os += -fpatchable-function-entry=16,14 -fdump-ipa-clones' \ +echo 'CFLAGS-.os += -fdump-ipa-clones' \ >> Makeconfig %endif ++++++ ulp-prologue-into-asm-functions.patch ++++++ >From 17a5177cbb228f22ef3e00d4bb66af71724a6d07 Mon Sep 17 00:00:00 2001 From: Giuliano Belinassi <gbelina...@suse.de> Date: Wed, 24 May 2023 18:03:15 -0300 Subject: [PATCH] Add Userspace Livepatch prologue into ASM functions Userspace Live Patching (ULP) refers to the process of applying patches to the libraries used by a running process, without interrupting it. In order to archive this, functions must have the NOP prologue. This prologue is included automatically when compiled with -fpatchable-function-entry, but for ASM functions this have to be included manually. This patch does this. Signed-off-by: Giuliano Belinassi <gbelina...@suse.de> --- Makeconfig | 5 +++++ config.h.in | 3 +++ config.make.in | 1 + configure | 20 ++++++++++++++++++++ configure.ac | 13 +++++++++++++ sysdeps/x86/sysdep.h | 22 ++++++++++++++++++---- sysdeps/x86_64/multiarch/strcmp-avx2.S | 5 +---- sysdeps/x86_64/multiarch/strcmp-evex.S | 5 +---- sysdeps/x86_64/multiarch/strcmp-sse4_2.S | 5 +---- sysdeps/x86_64/sysdep.h | 13 +++++++++++++ 10 files changed, 76 insertions(+), 16 deletions(-) diff --git a/Makeconfig b/Makeconfig index 2fda4af5f7..52a79bc0c0 100644 --- a/Makeconfig +++ b/Makeconfig @@ -961,6 +961,11 @@ endif # $(+cflags) == "" $(+stack-protector) -fno-common +gcc-nowarn := -w +# Add flags for Userspace Livepatching support. +ifeq (yes,$(enable-userspace-livepatch)) ++cflags += -fpatchable-function-entry=16,14 +endif + # Each sysdeps directory can contain header files that both will be # used to compile and will be installed. Each can also contain an # include/ subdirectory, whose header files will be used to compile diff --git a/config.h.in b/config.h.in index 43d32518ab..32fc79a357 100644 --- a/config.h.in +++ b/config.h.in @@ -199,6 +199,9 @@ /* Define to 1 if libpthread actually resides in libc. */ #define PTHREAD_IN_LIBC 0 +/* Define to 1 if support for userspace livepatching is enabled. */ +#define ENABLE_USERSPACE_LIVEPATCH 0 + /* An integer used to scale the timeout of test programs. */ #define TIMEOUTFACTOR 1 diff --git a/config.make.in b/config.make.in index d7c416cbea..c6f6909d68 100644 --- a/config.make.in +++ b/config.make.in @@ -86,6 +86,7 @@ nss-crypt = @libc_cv_nss_crypt@ static-nss-crypt = @libc_cv_static_nss_crypt@ # Configuration options. +enable-userspace-livepatch = @enable_userspace_livepatch@ build-shared = @shared@ build-profile = @profile@ build-static-nss = @static_nss@ diff --git a/configure b/configure index efb891456a..4030ccf701 100755 --- a/configure +++ b/configure @@ -591,6 +591,7 @@ LIBOBJS pthread_in_libc RELEASE VERSION +enable_userspace_livepatch mach_interface_list DEFINES static_nss @@ -789,6 +790,7 @@ enable_mathvec enable_cet enable_scv with_cpu +enable_userspace_livepatch ' ac_precious_vars='build_alias host_alias @@ -1462,6 +1464,8 @@ Optional Features: (CET), x86 only --disable-scv syscalls will not use scv instruction, even if the kernel supports it, powerpc only + --enable-userspace-livepatch + build with userspace livepatch support [default=no] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -6751,6 +6755,22 @@ libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` +# Check whether --enable-userspace-livepatch was given. +if test "${enable_userspace_livepatch+set}" = set; then : + enableval=$enable_userspace_livepatch; enable_userspace_livepatch=$enableval +else + enable_userspace_livepatch=no +fi + + +# Libpulp uses -fpatchable-function-entry to add padding NOPS to the +# prologue of all functions. +if test "x$enable_userspace_livepatch" = xyes; then + $as_echo "#define ENABLE_USERSPACE_LIVEPATCH 1" >>confdefs.h + +fi + + VERSION=`sed -n -e 's/^#define VERSION "\([^"]*\)"/\1/p' < $srcdir/version.h` RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h` diff --git a/configure.ac b/configure.ac index 011844a3d4..26c1a78009 100644 --- a/configure.ac +++ b/configure.ac @@ -1827,6 +1827,19 @@ AC_SUBST(DEFINES) dnl See sysdeps/mach/configure.ac for this variable. AC_SUBST(mach_interface_list) +AC_ARG_ENABLE([userspace-livepatch], + AS_HELP_STRING([--enable-userspace-livepatch], + [build with userspace livepatch support @<:@default=no@:>@]), + [enable_userspace_livepatch=$enableval], + [enable_userspace_livepatch=no]) + +# Libpulp uses -fpatchable-function-entry to add padding NOPS to the +# prologue of all functions. +if test "x$enable_userspace_livepatch" = xyes; then + AC_DEFINE(ENABLE_USERSPACE_LIVEPATCH) +fi +AC_SUBST(enable_userspace_livepatch) + VERSION=`sed -n -e 's/^#define VERSION "\([^"]*\)"/\1/p' < $srcdir/version.h` RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h` AC_SUBST(VERSION) diff --git a/sysdeps/x86/sysdep.h b/sysdeps/x86/sysdep.h index 0b3483a77a..329c16306e 100644 --- a/sysdeps/x86/sysdep.h +++ b/sysdeps/x86/sysdep.h @@ -77,15 +77,29 @@ enum cf_protection_level #define ALIGNARG(log2) 1<<log2 #define ASM_SIZE_DIRECTIVE(name) .size name,.-name; +/* For 32-bit glibc then define those macros as empty. */ +#ifndef ULP_PRE_PROLOGUE +# define ULP_PRE_PROLOGUE +#endif +#ifndef ULP_POST_PROLOGUE +# define ULP_POST_PROLOGUE +#endif + +/* Define the first instructions of a function. */ +#define FUNCTION_START(name) \ + ULP_PRE_PROLOGUE; \ + C_LABEL(name); \ + cfi_startproc; \ + _CET_ENDBR; \ + ULP_POST_PROLOGUE; \ + CALL_MCOUNT; + /* Define an entry point visible from C. */ #define ENTRY_P2ALIGN(name, alignment) \ .globl C_SYMBOL_NAME(name); \ .type C_SYMBOL_NAME(name),@function; \ .align ALIGNARG(alignment); \ - C_LABEL(name) \ - cfi_startproc; \ - _CET_ENDBR; \ - CALL_MCOUNT + FUNCTION_START(name) /* Common entry 16 byte aligns. */ #define ENTRY(name) ENTRY_P2ALIGN (name, 4) diff --git a/sysdeps/x86_64/multiarch/strcmp-avx2.S b/sysdeps/x86_64/multiarch/strcmp-avx2.S index 07f8ec54c6..b22d59b5cf 100644 --- a/sysdeps/x86_64/multiarch/strcmp-avx2.S +++ b/sysdeps/x86_64/multiarch/strcmp-avx2.S @@ -201,10 +201,7 @@ END (STRCASECMP) # endif .p2align 4 -STRCMP: - cfi_startproc - _CET_ENDBR - CALL_MCOUNT +FUNCTION_START(STRCMP) # if defined USE_AS_STRCASECMP_L /* We have to fall back on the C implementation for locales with diff --git a/sysdeps/x86_64/multiarch/strcmp-evex.S b/sysdeps/x86_64/multiarch/strcmp-evex.S index a8bd5cd786..809ba10447 100644 --- a/sysdeps/x86_64/multiarch/strcmp-evex.S +++ b/sysdeps/x86_64/multiarch/strcmp-evex.S @@ -224,10 +224,7 @@ END (STRCASECMP) # endif .p2align 4 -STRCMP: - cfi_startproc - _CET_ENDBR - CALL_MCOUNT +FUNCTION_START(STRCMP) # if defined USE_AS_STRCASECMP_L /* We have to fall back on the C implementation for locales with diff --git a/sysdeps/x86_64/multiarch/strcmp-sse4_2.S b/sysdeps/x86_64/multiarch/strcmp-sse4_2.S index f93c34465e..f96f66d54c 100644 --- a/sysdeps/x86_64/multiarch/strcmp-sse4_2.S +++ b/sysdeps/x86_64/multiarch/strcmp-sse4_2.S @@ -103,10 +103,7 @@ END (STRCASECMP) # define arg arg -STRCMP: - cfi_startproc - _CET_ENDBR - CALL_MCOUNT +FUNCTION_START(STRCMP) /* * This implementation uses SSE to compare up to 16 bytes at a time. diff --git a/sysdeps/x86_64/sysdep.h b/sysdeps/x86_64/sysdep.h index 6ca169573d..c18f0ef914 100644 --- a/sysdeps/x86_64/sysdep.h +++ b/sysdeps/x86_64/sysdep.h @@ -24,6 +24,19 @@ #ifdef __ASSEMBLER__ +/* Libpulp uses -fpatchable-function-entry to add padding NOPS to the + prologue of all functions. This works for C functions. For functions + written in ASM, the way we do this is by adding this prologue manually. */ + +#if ENABLE_USERSPACE_LIVEPATCH +# undef ULP_PRE_PROLOGUE +# undef ULP_POST_PROLOGUE +# define ULP_PRE_PROLOGUE \ + .rept 14; nop; .endr +# define ULP_POST_PROLOGUE \ + xchg %ax, %ax +#endif + /* Syntactic details of assembler. */ /* This macro is for setting proper CFI with DW_CFA_expression describing -- 2.40.1