diff --git a/Jenkinsfiles/Linux b/Jenkinsfiles/Linux index 878e85a5..8ed7d7f9 100644 --- a/Jenkinsfiles/Linux +++ b/Jenkinsfiles/Linux @@ -19,8 +19,8 @@ pipeline { make -j 8 glibc-build/Build.success GLIBC_VERSION=2.23 rm -r glibc-build cd .. - make -j 8 WERROR=1 - make -j 8 WERROR=1 test + make -j 8 WERROR=1 GLIBC_VERSION=2.27 + make -j 8 WERROR=1 GLIBC_VERSION=2.27 test make -C Pal/src -j 8 PAL_HOST=Skeleton WERROR=1 ''' } @@ -132,7 +132,7 @@ pipeline { sh ''' cd "$(./Scripts/clean-check-test-copy)" - make distclean + make GLIBC_VERSION=2.27 distclean rm -r LibOS/glibc-2.23 rm LibOS/glibc-2.23.tar.gz make -C LibOS/shim/test/regression clean diff --git a/Jenkinsfiles/Linux-18.04 b/Jenkinsfiles/Linux-18.04 index 86cc5660..dda43a00 100644 --- a/Jenkinsfiles/Linux-18.04 +++ b/Jenkinsfiles/Linux-18.04 @@ -18,6 +18,10 @@ pipeline { steps { sh ''' ./Scripts/clean-check-prepare + cd LibOS + make -j 8 glibc-build/Build.success GLIBC_VERSION=2.27 + rm -r glibc-build + cd .. make -j 8 WERROR=1 make -j 8 WERROR=1 test ''' @@ -131,6 +135,8 @@ pipeline { cd "$(./Scripts/clean-check-test-copy)" make distclean + rm -r LibOS/glibc-2.27 + rm LibOS/glibc-2.27.tar.gz make -C LibOS/shim/test/regression clean make -C LibOS/shim/test/apps/ltp clean diff --git a/Jenkinsfiles/Linux-Debug b/Jenkinsfiles/Linux-Debug index 866c6a8d..e12f81f6 100644 --- a/Jenkinsfiles/Linux-Debug +++ b/Jenkinsfiles/Linux-Debug @@ -15,8 +15,8 @@ pipeline { steps { sh ''' ./Scripts/clean-check-prepare - make -j 8 DEBUG=1 WERROR=1 - make -j 8 DEBUG=1 WERROR=1 test + make -j 8 DEBUG=1 WERROR=1 GLIBC_VERSION=2.27 + make -j 8 DEBUG=1 WERROR=1 GLIBC_VERSION=2.27 test ''' sh ''' cd Pal/src @@ -131,7 +131,7 @@ pipeline { sh ''' cd "$(./Scripts/clean-check-test-copy)" - make distclean + make GLIBC_VERSION=2.27 distclean make -C LibOS/shim/test/regression clean make -C LibOS/shim/test/apps/ltp clean diff --git a/Jenkinsfiles/Linux-SGX b/Jenkinsfiles/Linux-SGX index dec4eae5..b6544c2c 100644 --- a/Jenkinsfiles/Linux-SGX +++ b/Jenkinsfiles/Linux-SGX @@ -34,8 +34,8 @@ pipeline { ISGX_DRIVER_PATH=/opt/intel/linux-sgx-driver ISGX_DRIVER_VERSION=1.9 make ''' sh ''' - make -j 8 SGX=1 WERROR=1 - make -j 8 SGX=1 WERROR=1 test + make -j 8 SGX=1 WERROR=1 GLIBC_VERSION=2.27 + make -j 8 SGX=1 WERROR=1 GLIBC_VERSION=2.27 test ''' sh ''' make SGX=1 sgx-tokens @@ -91,7 +91,7 @@ pipeline { cd "$(./Scripts/clean-check-test-copy)" rm Pal/src/host/Linux-SGX/signer/enclave-key.pem - make SGX=1 distclean + make SGX=1 GLIBC_VERSION=2.27 distclean make -C LibOS/shim/test/regression SGX=1 clean make -C LibOS/shim/test/apps/ltp clean # LTP's make clean is broken, see https://github.com/linux-test-project/ltp/issues/559 diff --git a/Jenkinsfiles/Linux-SGX-apps b/Jenkinsfiles/Linux-SGX-apps index 6d875de1..23e36e11 100644 --- a/Jenkinsfiles/Linux-SGX-apps +++ b/Jenkinsfiles/Linux-SGX-apps @@ -34,7 +34,7 @@ pipeline { ISGX_DRIVER_PATH=/opt/intel/linux-sgx-driver ISGX_DRIVER_VERSION=1.9 make ''' sh ''' - make -j 8 SGX=1 WERROR=1 + make -j 8 SGX=1 WERROR=1 GLIBC_VERSION=2.27 ''' } } @@ -133,7 +133,7 @@ pipeline { cd "$(./Scripts/clean-check-test-copy)" rm Pal/src/host/Linux-SGX/signer/enclave-key.pem - make SGX=1 distclean + make SGX=1 GLIBC_VERSION=2.27 distclean make -C LibOS/shim/test/apps/python-simple SGX=1 clean make -C LibOS/shim/test/apps/python-scipy-insecure SGX=1 clean diff --git a/LibOS/Makefile b/LibOS/Makefile index a341c495..bfffe54c 100644 --- a/LibOS/Makefile +++ b/LibOS/Makefile @@ -1,7 +1,7 @@ include ../Scripts/Makefile.configs include ../Scripts/Makefile.rules -GLIBC_VERSION ?= 2.27 +GLIBC_VERSION ?= 2.31 GLIBC_SRC = glibc-$(GLIBC_VERSION) GLIBC_CHECKSUM = $(firstword $(shell grep $(GLIBC_SRC).tar.gz glibc-checksums)) SHIM_DIR = shim @@ -87,6 +87,9 @@ GLIBC_PATCHES_2.23 = \ GLIBC_PATCHES_2.27 = \ glibc-patches/hp-timing-2.23+.patch +GLIBC_PATCHES_2.31 = \ + glibc-patches/hp-timing-2.31.patch + ifneq ($(filter %.gold,$(shell readlink -f /usr/bin/ld)),) GLIBC_PATCHES += glibc-patches/ld-gold.patch endif diff --git a/LibOS/glibc-checksums b/LibOS/glibc-checksums index 96d677a9..67f09944 100644 --- a/LibOS/glibc-checksums +++ b/LibOS/glibc-checksums @@ -1,3 +1,4 @@ 18ad6db70724699d264add80b1f813630d0141cf3a3558b4e1a7c15f6beac796 glibc-2.19.tar.gz 2bd08abb24811cda62e17e61e9972f091f02a697df550e2e44ddcfb2255269d2 glibc-2.23.tar.gz 881ca905e6b5eec724de7948f14d66a07d97bdee8013e1b2a7d021ff5d540522 glibc-2.27.tar.gz +cb2d64fb808affff30d8a99a85de9d2aa67dc2cbac4ae99af4500d6cfea2bda7 glibc-2.31.tar.gz diff --git a/LibOS/glibc-patches/glibc-2.31.patch b/LibOS/glibc-patches/glibc-2.31.patch new file mode 100644 index 00000000..5ee4d061 --- /dev/null +++ b/LibOS/glibc-patches/glibc-2.31.patch @@ -0,0 +1,449 @@ +diff --git a/Makeconfig b/Makeconfig +index f252842979..4e22deb595 100644 +--- a/Makeconfig ++++ b/Makeconfig +@@ -930,7 +930,8 @@ endif # $(+cflags) == "" + # current directory. + +includes = -I$(..)include $(if $(subdir),$(objpfx:%/=-I%)) \ + $(+sysdep-includes) $(includes) \ +- $(patsubst %/,-I%,$(..)) $(libio-include) -I. $(sysincludes) ++ $(patsubst %/,-I%,$(..)) $(libio-include) -I. $(sysincludes) \ ++ -I$(common-objpfx)../shim/include + + # Since libio has several internal header files, we use a -I instead + # of many little headers in the include directory. +@@ -1274,6 +1275,9 @@ all-subdirs = csu assert ctype locale intl catgets math setjmp signal \ + localedata timezone rt conform debug mathvec support \ + dlfcn elf + ++# Add libos for Graphene ++all-subdirs += libos ++ + ifeq ($(build-crypt),yes) + all-subdirs += crypt + rpath-dirs += crypt +diff --git a/Makefile b/Makefile +index 8f0a93aceb..37c6356629 100644 +--- a/Makefile ++++ b/Makefile +@@ -434,6 +434,8 @@ $(inst_includedir)/gnu/stubs.h: $(+force) + install-others-nosubdir: $(installed-stubs) + endif + ++# For Graphene ++CFLAGS-syscalldb.c = -fPIC + + # Since stubs.h is never needed when building the library, we simplify the + # hairy installation process by producing it in place only as the last part +diff --git a/elf/Makefile b/elf/Makefile +index 632a4d8b0f..d9def31d16 100644 +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -21,7 +21,7 @@ subdir := elf + + include ../Makeconfig + +-headers = elf.h bits/elfclass.h link.h bits/link.h ++headers = elf.h bits/elfclass.h link.h bits/link.h syscalldb.h + routines = $(all-dl-routines) dl-support dl-iteratephdr \ + dl-addr dl-addr-obj enbl-secure dl-profstub \ + dl-origin dl-libc dl-sym dl-sysdep dl-error \ +@@ -33,7 +33,8 @@ dl-routines = $(addprefix dl-,load lookup object reloc deps hwcaps \ + runtime init fini debug misc \ + version profile tls origin scope \ + execstack open close trampoline \ +- exception sort-maps) ++ exception sort-maps) \ ++ syscalldb syscallas + ifeq (yes,$(use-ldconfig)) + dl-routines += dl-cache + endif +diff --git a/elf/Versions b/elf/Versions +index 3b09901f6c..7b5c35a55b 100644 +--- a/elf/Versions ++++ b/elf/Versions +@@ -79,4 +79,7 @@ ld { + # Set value of a tunable. + __tunable_get_val; + } ++ SHIM { ++ syscalldb; glibc_version; register_library; ++ } + } +diff --git a/elf/dl-load.c b/elf/dl-load.c +index a6b80f9395..92ac9703f7 100644 +--- a/elf/dl-load.c ++++ b/elf/dl-load.c +@@ -73,6 +73,8 @@ struct filebuf + #include + #include + ++#include ++ + #include + #if BYTE_ORDER == BIG_ENDIAN + # define byteorder ELFDATA2MSB +@@ -1390,6 +1392,9 @@ cannot enable executable stack as shared object requires"); + DL_AFTER_LOAD (l); + #endif + ++ /* register the library to SHIM */ ++ register_library(l->l_name, l->l_addr); ++ + /* Now that the object is fully initialized add it to the object list. */ + _dl_add_to_namespace_list (l, nsid); + +diff --git a/elf/rtld.c b/elf/rtld.c +index 553cfbd1b7..11fac22f32 100644 +--- a/elf/rtld.c ++++ b/elf/rtld.c +@@ -458,6 +458,23 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) + return start_addr; + } + ++/* For Graphene, check if Glibc version matches the compatible SHIM ++ * library. If not, tell the user to update Glibc. */ ++#include "glibc-version.h" ++ ++const unsigned int glibc_version __attribute__((weak)) = GLIBC_VERSION; ++ ++static void ++check_glibc_version (void) ++{ ++ if (glibc_version != GLIBC_VERSION) ++ { ++ _dl_fatal_printf ("Warning from Graphene: " ++ "Glibc version is incorrect. Please rebuild Glibc.\n"); ++ _exit (1); ++ } ++} ++ + static ElfW(Addr) __attribute_used__ + _dl_start (void *arg) + { +@@ -528,6 +545,9 @@ _dl_start (void *arg) + therefore need not test whether we have to allocate the array + for the relocation results (as done in dl-reloc.c). */ + ++ /* For Graphene, check if the glibc version is correct. */ ++ check_glibc_version(); ++ + /* Now life is sane; we can call functions and access global data. + Set up to use the operating system facilities, and find out from + the operating system's program loader where to find the program +diff --git a/shlib-versions b/shlib-versions +index b9cb99d2fb..2d91a6c7f7 100644 +--- a/shlib-versions ++++ b/shlib-versions +@@ -29,6 +29,9 @@ ld=ld.so.1 + # The -ldl interface (see ) is the same on all platforms. + libdl=2 + ++# Interface for Graphene ++liblibos=1 ++ + # So far the -lutil interface is the same on all platforms, except for the + # `struct utmp' format, which depends on libc. + libutil=1 +diff --git a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S +index cbce00832c..ac5d209ccf 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S ++++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S +@@ -89,7 +89,7 @@ ENTRY(____longjmp_chk) + xorl %edi, %edi + lea -sizeSS(%rsp), %RSI_LP + movl $__NR_sigaltstack, %eax +- syscall ++ SYSCALLDB + /* Without working sigaltstack we cannot perform the test. */ + testl %eax, %eax + jne .Lok2 +diff --git a/sysdeps/unix/sysv/linux/x86_64/__start_context.S b/sysdeps/unix/sysv/linux/x86_64/__start_context.S +index 9f7b00afbe..c3679598b2 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/__start_context.S ++++ b/sysdeps/unix/sysv/linux/x86_64/__start_context.S +@@ -52,7 +52,7 @@ ENTRY(__push___start_context) + movl $ARCH_CET_ALLOC_SHSTK, %edi + movl $__NR_arch_prctl, %eax + /* The new shadow stack base is returned in __ssp[1]. */ +- syscall ++ SYSCALLDB + testq %rax, %rax + jne L(hlt) /* This should never happen. */ + +diff --git a/sysdeps/unix/sysv/linux/x86_64/cancellation.S b/sysdeps/unix/sysv/linux/x86_64/cancellation.S +index 256529c9f6..5170ab579e 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/cancellation.S ++++ b/sysdeps/unix/sysv/linux/x86_64/cancellation.S +@@ -98,7 +98,7 @@ ENTRY(__pthread_disable_asynccancel) + xorq %r10, %r10 + addq $CANCELHANDLING, %rdi + LOAD_PRIVATE_FUTEX_WAIT (%esi) +- syscall ++ SYSCALLDB + movl %fs:CANCELHANDLING, %eax + jmp 3b + END(__pthread_disable_asynccancel) +diff --git a/sysdeps/unix/sysv/linux/x86_64/clone.S b/sysdeps/unix/sysv/linux/x86_64/clone.S +index 5ae90f06d3..200b96b0a9 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/clone.S ++++ b/sysdeps/unix/sysv/linux/x86_64/clone.S +@@ -73,7 +73,7 @@ ENTRY (__clone) + /* End FDE now, because in the child the unwind info will be + wrong. */ + cfi_endproc; +- syscall ++ SYSCALLDB + + testq %rax,%rax + jl SYSCALL_ERROR_LABEL +@@ -96,7 +96,7 @@ L(thread_start): + /* Call exit with return value from function call. */ + movq %rax, %rdi + movl $SYS_ify(exit), %eax +- syscall ++ SYSCALLDB + cfi_endproc; + + cfi_startproc; +diff --git a/sysdeps/unix/sysv/linux/x86_64/getcontext.S b/sysdeps/unix/sysv/linux/x86_64/getcontext.S +index debdd891ab..fcb1307cbf 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/getcontext.S ++++ b/sysdeps/unix/sysv/linux/x86_64/getcontext.S +@@ -73,7 +73,7 @@ ENTRY(__getcontext) + mov %RSP_LP, %RSI_LP + movl $ARCH_CET_STATUS, %edi + movl $__NR_arch_prctl, %eax +- syscall ++ SYSCALLDB + testq %rax, %rax + jz L(continue_no_err) + +@@ -125,7 +125,7 @@ L(no_shstk): + #endif + movl $_NSIG8,%r10d + movl $__NR_rt_sigprocmask, %eax +- syscall ++ SYSCALLDB + cmpq $-4095, %rax /* Check %rax for error. */ + jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ + +diff --git a/sysdeps/unix/sysv/linux/x86_64/setcontext.S b/sysdeps/unix/sysv/linux/x86_64/setcontext.S +index 31bbc9dbe4..e1bfe2f13e 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/setcontext.S ++++ b/sysdeps/unix/sysv/linux/x86_64/setcontext.S +@@ -44,7 +44,7 @@ ENTRY(__setcontext) + movl $SIG_SETMASK, %edi + movl $_NSIG8,%r10d + movl $__NR_rt_sigprocmask, %eax +- syscall ++ SYSCALLDB + /* Pop the pointer into RDX. The choice is arbitrary, but + leaving RDI and RSI available for use later can avoid + shuffling values. */ +diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c +index c58a77c5c6..f1b413ea73 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c ++++ b/sysdeps/unix/sysv/linux/x86_64/sigaction.c +@@ -78,7 +78,7 @@ asm \ + " .type __" #name ",@function\n" \ + "__" #name ":\n" \ + " movq $" #syscall ", %rax\n" \ +- " syscall\n" \ ++ SYSCALLDB_ASM \ + ".LEND_" #name ":\n" \ + ".section .eh_frame,\"a\",@progbits\n" \ + ".LSTARTFRAME_" #name ":\n" \ +diff --git a/sysdeps/unix/sysv/linux/x86_64/swapcontext.S b/sysdeps/unix/sysv/linux/x86_64/swapcontext.S +index e071ef6347..4f09c105f8 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/swapcontext.S ++++ b/sysdeps/unix/sysv/linux/x86_64/swapcontext.S +@@ -77,7 +77,7 @@ ENTRY(__swapcontext) + movl $SIG_SETMASK, %edi + movl $_NSIG8,%r10d + movl $__NR_rt_sigprocmask, %eax +- syscall ++ SYSCALLDB + cmpq $-4095, %rax /* Check %rax for error. */ + jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ + +@@ -117,7 +117,7 @@ ENTRY(__swapcontext) + mov %RSP_LP, %RSI_LP + movl $ARCH_CET_STATUS, %edi + movl $__NR_arch_prctl, %eax +- syscall ++ SYSCALLDB + testq %rax, %rax + jz L(continue_no_err) + +diff --git a/sysdeps/unix/sysv/linux/x86_64/syscall.S b/sysdeps/unix/sysv/linux/x86_64/syscall.S +index 6c93fc6304..e390f0dcc1 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/syscall.S ++++ b/sysdeps/unix/sysv/linux/x86_64/syscall.S +@@ -34,7 +34,7 @@ ENTRY (syscall) + movq %r8, %r10 + movq %r9, %r8 + movq 8(%rsp),%r9 /* arg6 is on the stack. */ +- syscall /* Do the system call. */ ++ SYSCALLDB /* Do the system call. */ + cmpq $-4095, %rax /* Check %rax for error. */ + jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ + ret /* Return to caller. */ +diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h +index c2eb37e575..c8910d8330 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h ++++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include "syscalldb.h" + + /* Defines RTLD_PRIVATE_ERRNO. */ + #include +@@ -166,7 +167,7 @@ + # define DO_CALL(syscall_name, args) \ + DOARGS_##args \ + movl $SYS_ify (syscall_name), %eax; \ +- syscall; ++ SYSCALLDB; + + # define DOARGS_0 /* nothing */ + # define DOARGS_1 /* nothing */ +@@ -230,7 +231,7 @@ + ({ \ + unsigned long int resultvar; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB \ + : "=a" (resultvar) \ + : "0" (number) \ + : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \ +@@ -244,7 +245,7 @@ + TYPEFY (arg1, __arg1) = ARGIFY (arg1); \ + register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB \ + : "=a" (resultvar) \ + : "0" (number), "r" (_a1) \ + : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \ +@@ -260,7 +261,7 @@ + register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \ + register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB \ + : "=a" (resultvar) \ + : "0" (number), "r" (_a1), "r" (_a2) \ + : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \ +@@ -278,7 +279,7 @@ + register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \ + register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB \ + : "=a" (resultvar) \ + : "0" (number), "r" (_a1), "r" (_a2), "r" (_a3) \ + : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \ +@@ -298,7 +299,7 @@ + register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \ + register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB \ + : "=a" (resultvar) \ + : "0" (number), "r" (_a1), "r" (_a2), "r" (_a3), "r" (_a4) \ + : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \ +@@ -320,7 +321,7 @@ + register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \ + register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB \ + : "=a" (resultvar) \ + : "0" (number), "r" (_a1), "r" (_a2), "r" (_a3), "r" (_a4), \ + "r" (_a5) \ +@@ -345,7 +346,7 @@ + register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \ + register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB \ + : "=a" (resultvar) \ + : "0" (number), "r" (_a1), "r" (_a2), "r" (_a3), "r" (_a4), \ + "r" (_a5), "r" (_a6) \ +diff --git a/sysdeps/unix/sysv/linux/x86_64/vfork.S b/sysdeps/unix/sysv/linux/x86_64/vfork.S +index 776d2fc610..9fc94470d6 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/vfork.S ++++ b/sysdeps/unix/sysv/linux/x86_64/vfork.S +@@ -51,7 +51,7 @@ ENTRY (__vfork) + + /* Stuff the syscall number in RAX and enter into the kernel. */ + movl $SYS_ify (vfork), %eax +- syscall ++ SYSCALLDB + + #if !SHSTK_ENABLED + /* Push back the return PC. */ +diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/times.c b/sysdeps/unix/sysv/linux/x86_64/x32/times.c +index fb93cb609c..c36fd5264e 100644 +--- a/sysdeps/unix/sysv/linux/x86_64/x32/times.c ++++ b/sysdeps/unix/sysv/linux/x86_64/x32/times.c +@@ -26,7 +26,7 @@ + TYPEFY (arg1, __arg1) = ARGIFY (arg1); \ + register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \ + asm volatile ( \ +- "syscall\n\t" \ ++ SYSCALLDB_ASM \ + : "=a" (resultvar) \ + : "0" (number), "r" (_a1) \ + : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \ +diff --git a/sysdeps/unix/x86_64/sysdep.h b/sysdeps/unix/x86_64/sysdep.h +index c549dce4db..eb12d98b18 100644 +--- a/sysdeps/unix/x86_64/sysdep.h ++++ b/sysdeps/unix/x86_64/sysdep.h +@@ -25,7 +25,7 @@ + + #define DO_CALL(syscall_name, args) \ + lea SYS_ify (syscall_name), %rax; \ +- syscall ++ SYSCALLDB + + #define r0 %rax /* Normal return-value register. */ + #define r1 %rbx /* Secondary return-value register. */ +diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h +index 8e9baffeb4..04f2ee64aa 100644 +--- a/sysdeps/x86_64/dl-machine.h ++++ b/sysdeps/x86_64/dl-machine.h +@@ -579,7 +579,8 @@ elf_machine_lazy_rel (struct link_map *map, + value = ((ElfW(Addr) (*) (void)) value) (); + *reloc_addr = value; + } +- else ++ /* for Graphene, get around R_X86_64_NONE */ ++ else if (__builtin_expect (r_type != R_X86_64_NONE, 1)) + _dl_reloc_bad_type (map, r_type, 1); + } + +diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h +index e7c1416eec..0d3b7babb0 100644 +--- a/sysdeps/x86_64/nptl/tls.h ++++ b/sysdeps/x86_64/nptl/tls.h +@@ -29,6 +29,7 @@ + # include /* For cast_to_integer. */ + # include + # include ++# include + + /* Replacement type for __m128 since this file is included by ld.so, + which is compiled with -mno-sse. It must not change the alignment +@@ -161,7 +162,7 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80, + _head->self = _thrdescr; \ + \ + /* It is a simple syscall to set the %fs value for the thread. */ \ +- asm volatile ("syscall" \ ++ asm volatile (SYSCALLDB \ + : "=a" (_result) \ + : "0" ((unsigned long int) __NR_arch_prctl), \ + "D" ((unsigned long int) ARCH_SET_FS), \ diff --git a/LibOS/glibc-patches/hp-timing-2.31.patch b/LibOS/glibc-patches/hp-timing-2.31.patch new file mode 100644 index 00000000..a8f3dbfa --- /dev/null +++ b/LibOS/glibc-patches/hp-timing-2.31.patch @@ -0,0 +1,50 @@ +diff --git a/sysdeps/x86/hp-timing.h b/sysdeps/x86/hp-timing.h +index 84940ad4d4..54f767dc9d 100644 +--- a/sysdeps/x86/hp-timing.h ++++ b/sysdeps/x86/hp-timing.h +@@ -17,45 +17,7 @@ + . */ + + #ifndef _HP_TIMING_H +-#define _HP_TIMING_H 1 + +-#include +- +-#if MINIMUM_ISA == 686 || MINIMUM_ISA == 8664 +-/* We indeed have inlined functions. */ +-# define HP_TIMING_INLINE (1) +- +-/* We use 64bit values for the times. */ +-typedef unsigned long long int hp_timing_t; +- +-/* That's quite simple. Use the `rdtsc' instruction. Note that the value +- might not be 100% accurate since there might be some more instructions +- running in this moment. This could be changed by using a barrier like +- 'cpuid' right before the `rdtsc' instruciton. But we are not interested +- in accurate clock cycles here so we don't do this. +- +- NB: Use __builtin_ia32_rdtsc directly since including +- makes building glibc very slow. */ +-# ifdef USE_RDTSCP +-/* RDTSCP waits until all previous instructions have executed and all +- previous loads are globally visible before reading the counter. +- RDTSC doesn't wait until all previous instructions have been executed +- before reading the counter. */ +-# define HP_TIMING_NOW(Var) \ +- (__extension__ ({ \ +- unsigned int __aux; \ +- (Var) = __builtin_ia32_rdtscp (&__aux); \ +- })) +-# else +-# define HP_TIMING_NOW(Var) ((Var) = __builtin_ia32_rdtsc ()) +-# endif +- +-# include +-#else +-/* NB: Undefine _HP_TIMING_H so that will +- be included. */ +-# undef _HP_TIMING_H + # include +-#endif + + #endif /* hp-timing.h */ diff --git a/LibOS/shim/test/apps b/LibOS/shim/test/apps index aa2a35a1..8e519b8e 160000 --- a/LibOS/shim/test/apps +++ b/LibOS/shim/test/apps @@ -1 +1 @@ -Subproject commit aa2a35a11bf4e32aeddb31e7bf248bc186ba7aaa +Subproject commit 8e519b8e70ff5cd280b8b9e4373e212e81633008