RFR: 8266749: AArch64: Backtracing broken on PAC enabled systems

Alan Hayward github.com+4146708+a74nh at openjdk.java.net
Fri May 14 11:31:26 UTC 2021


On PAC systems, native code may sign return addresses before saving
them to the stack. We must ensure we strip the any signed bits in
order to walk the stack.
Add extra asserts in places where we do not expect saved return
addresses to be signed.

On non-PAC systems, all PAC instructions are treated as NOPs.

On Apple, use the provided ptrauth interface instead of asm
as the compiler may optimise further.

Fedora 33 compiles all distro packages using PAC. Running the distro
provided OpenJDK-latest in GDB on a PAC system:

Thread 2 "java" hit Breakpoint 1, 0x0000fffff68d7fe4 in init_globals() ()
   from /usr/lib/jvm/java-16-openjdk-16.0.1.0.9-1.rolling.fc33.aarch64-fastdebug/lib/server/libjvm.so
(gdb) call (int)pns($sp, $fp, $pc)

"Executing pns"
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0xe26fe4]  init_globals()+0x10
C  0x006ffffff74750c4
C  0x0042fffff6a7f84c
C  0x0037fffff7fa0954
C  0x0030fffff7fa4540
C  0x0078fffff7d980c8

OpenJDK with this patch at the same breakpoint:

(gdb) call (int)pns($sp, $fp, $pc)
"Executing pns"
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x189c47c]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x27c
V  [libjvm.so+0xf527a0]  JNI_CreateJavaVM+0xc0
C  [libjli.so+0x3860]  JavaMain+0x7c
C  [libjli.so+0x732c]  ThreadJavaMain+0xc
C  [libpthread.so.0+0x80c8]  start_thread+0xd8

OpenJDK with this patch breakpointed at pd_hotspot_signal_handler:

"Executing pns"
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x148a730]  PosixSignals::pd_hotspot_signal_handler(int, siginfo_t*, ucontext_t*, JavaThread*)+0x0
C  [linux-vdso.so.1+0x80c]  __kernel_rt_sigreturn+0x0
J 53 c1 jdk.internal.org.objectweb.asm.SymbolTable.addConstantUtf8(Ljava/lang/String;)I java.base (98 bytes) @ 0x0000ffffe159cc3c [0x0000ffffe159cb40+0x00000000000000fc]
j  jdk.internal.org.objectweb.asm.SymbolTable.setMajorVersionAndClassName(ILjava/lang/String;)I+12 java.base
j  jdk.internal.org.objectweb.asm.ClassWriter.visit(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V+20 java.base
j  java.lang.invoke.InvokerBytecodeGenerator.classFilePrologue()Ljdk/internal/org/objectweb/asm/ClassWriter;+30 java.base
j  java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCodeBytes()[B+1 java.base
j  java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCode(Ljava/lang/invoke/LambdaForm;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MemberName;+27 java.base
j  java.lang.invoke.LambdaForm.compileToBytecode()V+69 java.base
j  java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/LambdaForm;+792 java.base
j  java.lang.invoke.DirectMethodHandle.preparedLambdaForm(Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/LambdaForm;+17 java.base
j  java.lang.invoke.DirectMethodHandle.preparedLambdaForm(Ljava/lang/invoke/MemberName;Z)Ljava/lang/invoke/LambdaForm;+163 java.base
j  java.lang.invoke.DirectMethodHandle.preparedLambdaForm(Ljava/lang/invoke/MemberName;)Ljava/lang/invoke/LambdaForm;+2 java.base
j  java.lang.invoke.DirectMethodHandle.make(BLjava/lang/Class;Ljava/lang/invoke/MemberName;Ljava/lang/Class;)Ljava/lang/invoke/DirectMethodHandle;+159 java.base
j  java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(BLjava/lang/Class;Ljava/lang/invoke/MemberName;ZZLjava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandle;+210 java.base
j  java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(BLjava/lang/Class;Ljava/lang/invoke/MemberName;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandle;+14 java.base
j  java.lang.invoke.MethodHandles$Lookup.getDirectMethodForConstant(BLjava/lang/Class;Ljava/lang/invoke/MemberName;)Ljava/lang/invoke/MethodHandle;+31 java.base
j  java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(BLjava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;+153 java.base
j  java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(Ljava/lang/Class;ILjava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;+38 java.base
v  ~StubRoutines::call_stub
V  [libjvm.so+0xe20118]  JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, Thread*)+0x5c8
V  [libjvm.so+0xe20f64]  JavaCalls::call_static(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, Thread*)+0x284
V  [libjvm.so+0x184b778]  SystemDictionary::link_method_handle_constant(Klass*, int, Klass*, Symbol*, Symbol*, Thread*)+0x398
V  [libjvm.so+0xa1f104]  ConstantPool::resolve_constant_at_impl(constantPoolHandle const&, int, int, bool*, Thread*)+0xca0
V  [libjvm.so+0xa1fb6c]  ConstantPool::copy_bootstrap_arguments_at_impl(constantPoolHandle const&, int, int, int, objArrayHandle, int, bool, Handle, Thread*)+0x3fc
V  [libjvm.so+0x6bef6c]  BootstrapInfo::resolve_args(Thread*)+0xcbc
V  [libjvm.so+0x6c1538]  BootstrapInfo::resolve_bsm(Thread*)+0x1194
V  [libjvm.so+0x184d300]  SystemDictionary::invoke_bootstrap_method(BootstrapInfo&, Thread*)+0x30
V  [libjvm.so+0x120450c]  LinkResolver::resolve_dynamic_call(CallInfo&, BootstrapInfo&, Thread*)+0x2c
V  [libjvm.so+0x1204b1c]  LinkResolver::resolve_invokedynamic(CallInfo&, constantPoolHandle const&, int, Thread*)+0x1bc
V  [libjvm.so+0xe0ecc4]  InterpreterRuntime::resolve_invokedynamic(JavaThread*)+0x190
V  [libjvm.so+0xe123a0]  InterpreterRuntime::resolve_from_cache(JavaThread*, Bytecodes::Code)+0x160
j  jdk.internal.module.ModulePath.explodedPackages(Ljava/nio/file/Path;)Ljava/util/Set;+5 java.base
j  jdk.internal.module.ModulePath.lambda$readExplodedModule$9(Ljava/nio/file/Path;)Ljava/util/Set;+2 java.base
j  jdk.internal.module.ModulePath$$Lambda$2+0x000000010003bbe0.get()Ljava/lang/Object;+8 java.base
j  jdk.internal.module.ModuleInfo.doRead(Ljava/io/DataInput;)Ljdk/internal/module/ModuleInfo$Attributes;+762 java.base
j  jdk.internal.module.ModuleInfo.read(Ljava/io/InputStream;Ljava/util/function/Supplier;)Ljdk/internal/module/ModuleInfo$Attributes;+16 java.base
j  jdk.internal.module.ModulePath.readExplodedModule(Ljava/nio/file/Path;)Ljava/lang/module/ModuleReference;+35 java.base
j  jdk.internal.module.ModulePath.readModule(Ljava/nio/file/Path;Ljava/nio/file/attribute/BasicFileAttributes;)Ljava/lang/module/ModuleReference;+11 java.base
j  jdk.internal.module.ModulePath.scanDirectory(Ljava/nio/file/Path;)Ljava/util/Map;+69 java.base
j  jdk.internal.module.ModulePath.scan(Ljava/nio/file/Path;)Ljava/util/Map;+60 java.base
j  jdk.internal.module.ModulePath.scanNextEntry()V+23 java.base
j  jdk.internal.module.ModulePath.find(Ljava/lang/String;)Ljava/util/Optional;+36 java.base
j  jdk.internal.module.SystemModuleFinders$1.lambda$find$0(Ljava/lang/module/ModuleFinder;Ljava/lang/String;)Ljava/util/Optional;+2 java.base
j  jdk.internal.module.SystemModuleFinders$1$$Lambda$1+0x0000000100033b00.run()Ljava/lang/Object;+8 java.base
j  java.security.AccessController.executePrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;Ljava/lang/Class;)Ljava/lang/Object;+29 java.base
j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;+5 java.base
j  jdk.internal.module.SystemModuleFinders$1.find(Ljava/lang/String;)Ljava/util/Optional;+12 java.base
j  jdk.internal.module.ModuleBootstrap.boot2()Ljava/lang/ModuleLayer;+304 java.base
j  jdk.internal.module.ModuleBootstrap.boot()Ljava/lang/ModuleLayer;+64 java.base
j  java.lang.System.initPhase2(ZZ)I+0 java.base
v  ~StubRoutines::call_stub
V  [libjvm.so+0xe20118]  JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, Thread*)+0x5c8
V  [libjvm.so+0xe20f64]  JavaCalls::call_static(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, Thread*)+0x284
V  [libjvm.so+0x189c7bc]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x5bc
V  [libjvm.so+0xf527a0]  JNI_CreateJavaVM+0xc0
C  [libjli.so+0x3860]  JavaMain+0x7c
C  [libjli.so+0x732c]  ThreadJavaMain+0xc
C  [libpthread.so.0+0x80c8]  start_thread+0xd8

-------------

Commit messages:
 - 8266749: AArch64: Fix backtracing on PAC enabled systems

Changes: https://git.openjdk.java.net/jdk/pull/4029/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4029&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8266749
  Stats: 78 lines in 3 files changed: 76 ins; 0 del; 2 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4029.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4029/head:pull/4029

PR: https://git.openjdk.java.net/jdk/pull/4029


More information about the hotspot-dev mailing list