changeset 2688:dc89882c06da

PR3830: jstack.stp should support ppc64[le,be] 2019-02-10 Andrew John Hughes <gnu_andrew@member.fsf.org> PR3830: jstack.stp should support ppc64[le,be] * NEWS: Updated. 2019-01-28 Mark Wielaard <mjw@redhat.com> PR3830: jstack.stp should support ppc64[le,be] * tapset/jstack.stp.in: Add ppc64 support.
author Andrew John Hughes <gnu_andrew@member.fsf.org>
date Mon, 22 Feb 2021 00:50:07 +0000
parents dad45f85e3a3
children 522ba74de6a3
files ChangeLog NEWS tapset/jstack.stp.in
diffstat 3 files changed, 38 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Feb 22 00:35:57 2021 +0000
+++ b/ChangeLog	Mon Feb 22 00:50:07 2021 +0000
@@ -1,3 +1,13 @@
+2019-02-10  Andrew John Hughes  <gnu_andrew@member.fsf.org>
+
+	PR3830: jstack.stp should support ppc64[le,be]
+	* NEWS: Updated.
+
+2019-01-28  Mark Wielaard  <mjw@redhat.com>
+
+	PR3830: jstack.stp should support ppc64[le,be]
+	* tapset/jstack.stp.in: Add ppc64 support.
+
 2018-11-20  Andrew John Hughes  <gnu_andrew@member.fsf.org>
 
 	PR3829: arc_priority representation creates an
--- a/NEWS	Mon Feb 22 00:35:57 2021 +0000
+++ b/NEWS	Mon Feb 22 00:50:07 2021 +0000
@@ -14,6 +14,7 @@
 
 * New features
   - PR3827: jstack.stp should support AArch64
+  - PR3830: jstack.stp should support ppc64[le,be]
 * SystemTap
   - PR3825: SystemTap is heavily confused by multiple JDKs
   - PR3828: Architectures unsupported by SystemTap tapsets throw a parse error
--- a/tapset/jstack.stp.in	Mon Feb 22 00:35:57 2021 +0000
+++ b/tapset/jstack.stp.in	Mon Feb 22 00:50:07 2021 +0000
@@ -55,7 +55,12 @@
 @_private global CodeCache_heap;
 
 @_private global sp_register;
+/* On PowerPC there is a link register, but no frame pointer register.  */
+%(arch == "powerpc" %?
+@_private global link_register;
+%:
 @_private global fp_register;
+%)
 @_private global pc_register;
 @_private global ptr_size;
 @_private global ptr_mask;
@@ -108,6 +113,12 @@
      pc_register = "pc";
      ptr_size = 8; // XXX - might be probing 32-on-64 jvm.
      ptr_mask = 0xFFFFFFFFFFFFFFFF;
+  %: %(arch == "powerpc" %?
+     sp_register = "r1";
+     link_register = "link";
+     pc_register = "nip";
+     ptr_size = 8; // XXX - might be probing 32-on-64 jvm.
+     ptr_mask = 0xFFFFFFFFFFFFFFFF;
   %:
      sp_register = "";
      fp_register = "";
@@ -115,7 +126,7 @@
      ptr_size = 8;
      ptr_mask = 0xFFFFFFFFFFFFFFFF;
      error("unknown architecture")
-  %) %) %)
+  %) %) %) %)
 
   // Pretend we have an array at address zero and take address of second
   // element and we have the size.
@@ -280,9 +291,16 @@
   // to "recover" the previous fp in case we hit a code blob that didn't
   // preserve it.
   frames = "";
+%(arch == "powerpc" %?
+  sp = register(sp_register);
+  fp = sp + 72; /* fp + (-3 * ptr_size) = 48, parameter save area offset */
+  link = register(link_register);
+  pc = register(pc_register);
+%:
   sp = register(sp_register);
   fp = register(fp_register);
   pc = register(pc_register);
+%)
   depth = 0;
   while (pc != 0 && depth < max_depth)
     {
@@ -441,9 +459,17 @@
         old_fp = fp;
         old_sp = sp
 
+%(arch == "powerpc" %?
+        sp = user_long(sp);
+        fp = sp + 72; /* fp + (-3 * ptr_size) = 48, parameter save area offset */
+        pc = link;
+        link = user_long(sp + 16);
+        trust_fp = 1; /* We don't need to recover the frame pointer.  */
+%:
         sp = fp;
         fp = user_long(sp);
         pc = user_long(fp + ptr_size);
+%)
 
         // Do we need to double check? We do not want to do this
         // unless necessary. We have to assume most code is "sane"