--- openjdk.orig/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp +++ openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp @@ -73,7 +73,6 @@ # include # include # include -# include #ifdef AMD64 #define REG_SP REG_RSP @@ -532,6 +531,9 @@ ShouldNotReachHere(); } + +#define _FPU_GETCW(cw) __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw)) +#define _FPU_SETCW(cw) __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw)) void os::Linux::init_thread_fpu_state(void) { #ifndef AMD64 --- openjdk.orig/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp +++ openjdk/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp @@ -75,7 +75,7 @@ # include # include # include -# include +# include /* provides __u64 */ #ifdef BUILTIN_SIM #define REG_SP REG_RSP --- openjdk.orig/hotspot/src/jdk.hotspot.agent/linux/native/libsaproc/proc_service.h 2018-01-22 15:19:02.000000000 +0000 +++ openjdk/hostspot/src/jdk.hotspot.agent/linux/native/libsaproc/proc_service.h 2020-10-12 12:56:27.323706510 +0000 @@ -26,7 +26,7 @@ #define _PROC_SERVICE_H_ #include -#include +#include // Linux does not have the proc service library, though it does provide the // thread_db library which can be used to manipulate threads without having @@ -43,34 +43,4 @@ PS_NOFREGS /* FPU register set not available for given lwp */ } ps_err_e; -// ps_getpid() is only defined on Linux to return a thread's process ID -pid_t ps_getpid(struct ps_prochandle *ph); - -// ps_pglobal_lookup() looks up the symbol sym_name in the symbol table -// of the load object object_name in the target process identified by ph. -// It returns the symbol's value as an address in the target process in -// *sym_addr. - -ps_err_e ps_pglobal_lookup(struct ps_prochandle *ph, const char *object_name, - const char *sym_name, psaddr_t *sym_addr); - -// read "size" bytes of data from debuggee at address "addr" -ps_err_e ps_pdread(struct ps_prochandle *ph, psaddr_t addr, - void *buf, size_t size); - -// write "size" bytes of data to debuggee at address "addr" -ps_err_e ps_pdwrite(struct ps_prochandle *ph, psaddr_t addr, - const void *buf, size_t size); - -ps_err_e ps_lsetfpregs(struct ps_prochandle *ph, lwpid_t lid, const prfpregset_t *fpregs); - -ps_err_e ps_lsetregs(struct ps_prochandle *ph, lwpid_t lid, const prgregset_t gregset); - -ps_err_e ps_lgetfpregs(struct ps_prochandle *ph, lwpid_t lid, prfpregset_t *fpregs); - -ps_err_e ps_lgetregs(struct ps_prochandle *ph, lwpid_t lid, prgregset_t gregset); - -// new libthread_db of NPTL seem to require this symbol -ps_err_e ps_get_thread_area(); - #endif /* _PROC_SERVICE_H_ */ --- openjdk.orig/hotspot/src/jdk.hotspot.agent/linux/native/libsaproc/libproc_impl.c 2018-01-22 15:19:02.000000000 +0000 +++ openjdk/hotspot/src/jdk.hotspot.agent/linux/native/libsaproc/libproc_impl.c 2020-10-12 13:00:33.143035725 +0000 @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include "libproc_impl.h" #define SA_ALTROOT "SA_ALTROOT" @@ -116,11 +116,13 @@ // init debug mode _libsaproc_debug = debug; +#ifdef INCLUDE_SA_ATTACH // initialize the thread_db library if (td_init() != TD_OK) { print_debug("libthread_db's td_init failed\n"); return false; } +#endif return true; } @@ -273,6 +275,7 @@ } +#ifdef INCLUDE_SA_ATTACH // struct used for client data from thread_db callback struct thread_db_client_data { struct ps_prochandle* ph; @@ -299,9 +302,11 @@ return TD_OK; } +#endif // read thread_info using libthread_db bool read_thread_info(struct ps_prochandle* ph, thread_info_callback cb) { +#ifdef INCLUDE_SA_ATTACH struct thread_db_client_data mydata; td_thragent_t* thread_agent = NULL; if (td_ta_new(ph, &thread_agent) != TD_OK) { @@ -322,6 +327,30 @@ // delete thread agent td_ta_delete(thread_agent); +#else + DIR *dir = NULL; + struct dirent *ent = NULL; + char taskpath[80]; + pid_t pid = ph->pid; + + // Find the lwpids to attach to by traversing the /proc//task/ directory. + snprintf(taskpath, sizeof (taskpath), "/proc/%ld/task", (unsigned long)pid); + if ((dir = opendir(taskpath)) != NULL) { + while ((ent = readdir(dir)) != NULL) { + unsigned long lwp; + + if ((lwp = strtoul(ent->d_name, NULL, 10)) != 0) { + // Create and add the thread info. + (*cb)(ph, 0, lwp); + } + } + } else { + print_debug("Could not open /proc/%ld/task.\n", (unsigned long)pid); + return false; + } + + closedir(dir); +#endif return true; } diff -U3 -r openjdk-9.0.4_p12/work/hotspot-jdk-9.0.4+12/make/lib/Lib-jdk.hotspot.agent.gmk openjdk-9.0.4_p12.orig/work/hotspot-jdk-9.0.4+12/make/lib/Lib-jdk.hotspot.agent.gmk --- openjdk.orig/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk 2018-01-22 15:19:02.000000000 +0000 +++ openjdk/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk 2020-10-12 13:03:00.569605599 +0000 @@ -57,7 +57,10 @@ SA_CFLAGS := $(CFLAGS_JDKLIB) -D_FILE_OFFSET_BITS=64 \ $(SA_MACHINE_FLAG_linux) SA_LDFLAGS := $(LDFLAGS_JDKLIB) $(SA_MACHINE_FLAG_linux) - SA_LIBS := -lthread_db $(LIBDL) + SA_LIBS := $(LIBDL) + ifeq ($(INCLUDE_SA_ATTACH), true) + SA_LIBS += -lthread_db + endif else ifeq ($(OPENJDK_TARGET_OS), solaris) SA_TOOLCHAIN := TOOLCHAIN_LINK_CXX @@ -95,6 +98,13 @@ endif endif +ifeq ($(INCLUDE_SA_ATTACH), true) + SA_CFLAGS += -DINCLUDE_SA_ATTACH +endif + +SA_CFLAGS += -DLIBC=\"$(OPENJDK_TARGET_LIBC)\" + + ################################################################################ $(eval $(call SetupNativeCompilation, BUILD_LIBSA, \