summaryrefslogtreecommitdiff
path: root/rts/Libdw.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/Libdw.c')
-rw-r--r--rts/Libdw.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/rts/Libdw.c b/rts/Libdw.c
index 33a40a1f37..d45d9d0e5d 100644
--- a/rts/Libdw.c
+++ b/rts/Libdw.c
@@ -330,6 +330,35 @@ static bool set_initial_registers(Dwfl_Thread *thread,
);
return dwfl_thread_state_registers(thread, 0, 9, regs);
}
+#elif defined(s390x_HOST_ARCH)
+static bool set_initial_registers(Dwfl_Thread *thread,
+ void *arg STG_UNUSED) {
+ Dwarf_Word regs[32];
+ __asm__ ("stmg %%r0,%%r15,0(%0)\n\t"
+ "std %%f0, 128(0,%0)\n\t"
+ "std %%f2, 136(0,%0)\n\t"
+ "std %%f4, 144(0,%0)\n\t"
+ "std %%f6, 152(0,%0)\n\t"
+ "std %%f1, 160(0,%0)\n\t"
+ "std %%f3, 168(0,%0)\n\t"
+ "std %%f5, 176(0,%0)\n\t"
+ "std %%f7, 184(0,%0)\n\t"
+ "std %%f8, 192(0,%0)\n\t"
+ "std %%f10, 200(0,%0)\n\t"
+ "std %%f12, 208(0,%0)\n\t"
+ "std %%f14, 216(0,%0)\n\t"
+ "std %%f9, 224(0,%0)\n\t"
+ "std %%f11, 232(0,%0)\n\t"
+ "std %%f13, 240(0,%0)\n\t"
+ "std %%f15, 248(0,%0)\n\t"
+ "larl %%r0,0\n\t"
+ "stg %%r0, 112(0,%0)\n\t"
+ : /* no output */
+ :"r" (&regs[0]) /* input */
+ :"%r0" /* clobbered */
+ );
+ return dwfl_thread_state_registers(thread, 0, 32, regs);
+}
#else
# error "Please implement set_initial_registers() for your arch"
#endif