changeset 607:9d0eefb0e0f0

- sparc64 callback crash fix (local register wasn't preserved) - manual typo fixed
author Tassilo Philipp
date Thu, 22 Sep 2022 23:15:51 +0200
parents 85b7a117b807
children b1f2b574d772
files ChangeLog doc/manual/callconvs/callconv_sparc64.tex dyncallback/dyncall_thunk_sparc64.c
diffstat 3 files changed, 18 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Sep 21 15:20:58 2022 +0200
+++ b/ChangeLog	Thu Sep 22 23:15:51 2022 +0200
@@ -20,6 +20,7 @@
   o new, portable aggregate-by-value callback argument interface
   o aggregate-by-value (struct, union) support for x64 (win and sysv; thanks Raphael Luba!)
   o x64/windows masm directives for frame unwinding information (as dbg help; thanks Raphael Luba!)
+  o sparc64 callback crash fix
 dynload:
   o build fix for ReactOS with RosBE/cmake/mingw-make environment
 general:
--- a/doc/manual/callconvs/callconv_sparc64.tex	Wed Sep 21 15:20:58 2022 +0200
+++ b/doc/manual/callconvs/callconv_sparc64.tex	Thu Sep 22 23:15:51 2022 +0200
@@ -34,7 +34,7 @@
 \subsubsection{SPARC (64-bit) Calling Convention}
 
 \begin{itemize}
-\item 32 double precision floating point registers (d0,d2,d4,...,d62, usable as 16 quad precision ones q0,q4,q8,...g60, and also first half of them are usable as 32 single precision registers f0-f31)
+\item 32 double precision floating point registers (d0,d2,d4,...,d62, usable as 16 quad precision ones q0,q4,q8,...q60, and also first half of them are usable as 32 single precision registers f0-f31)
 \item 32 64-bit integer/pointer registers out of a bigger (vendor/model dependent) number that are accessible at a time (8 are global ones (g*), whereas the remaining 24 form a register window with 8 input (i*), 8 output (o*) and 8 local (l*) ones)
 \item calling a function shifts the register window, the old output registers become the new input registers (old local and input ones are not accessible anymore)
 \item stack and frame pointer are offset by a BIAS of 2047 (see official doc for reasons)
--- a/dyncallback/dyncall_thunk_sparc64.c	Wed Sep 21 15:20:58 2022 +0200
+++ b/dyncallback/dyncall_thunk_sparc64.c	Thu Sep 22 23:15:51 2022 +0200
@@ -6,7 +6,7 @@
  Description: Thunk - Implementation for sparc64
  License:
 
-   Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
+   Copyright (c) 2007-2022 Daniel Adler <dadler@uni-goettingen.de>,
                            Tassilo Philipp <tphilipp@potion-studios.com>
 
    Permission to use, copy, modify, and distribute this software for any
@@ -33,21 +33,24 @@
    0:   03 00 00 00   sethi  %hi(0), %g1
    4:   82 10 60 00   or     %g1, 0, %g1
    8:   83 28 70 20   sllx   %g1, 0x20, %g1
-  12:   21 00 00 00   sethi  %hi(0), %l0
-  16:   a0 14 20 00   or     %l0, 0, %l0
-  20:   82 04 00 01   add    %l0, %g1, %g1
+
+  12:   21 00 00 00   sethi  %hi(0), %g3
+  16:   a0 14 20 00   or     %g3, 0, %g3
+  20:   82 04 00 01   add    %g3, %g1, %g1
                       ; use g2 for entry pointer and "call" it, b/c branch instructions can't handle 64bit addresses
   24:   05 00 00 00   sethi  %hi(0), %g2
   28:   84 10 a0 00   or     %g2, 0, %g2
   32:   85 28 b0 20   sllx   %g2, 0x20, %g2
-  36:   21 00 00 00   sethi  %hi(0), %l0
-  40:   a0 14 20 00   or     %l0, 0, %l0
-  44:   84 04 00 02   add    %l0, %g2, %g2
+
+  36:   21 00 00 00   sethi  %hi(0), %g3
+  40:   a0 14 20 00   or     %g3, 0, %g3
+  44:   84 04 00 02   add    %g3, %g2, %g2
                       ; jump - write link to %g0, effectively discarding it; also nop for delay slot
   48:   81 c0 80 00   jmpl   %g2, %g0
   52:   01 00 00 00   nop
   */
 
+
   union {
     unsigned int x[2];
     void* p;
@@ -58,15 +61,15 @@
   p->code[ 0] = 0x03000000 | (t.x[0] >> 10);      /* sethi %hi(p), %g1      -- hi 22 bits */
   p->code[ 1] = 0x82106000 | (t.x[0] & 0x3ff);    /* or %g1, <p&0x3ff>, %g1 -- lo 10 bits */
   p->code[ 2] = 0x83287020;                       /* sllx %g1, 0x20, %g1                  */
-  p->code[ 3] = 0x21000000 | (t.x[1] >> 10);      /* sethi %hi(p), %l0                    */
-  p->code[ 4] = 0xa0142000 | (t.x[1] & 0x3ff);    /* or %l0, <p&0x3ff>, %l0               */
-  p->code[ 5] = 0x82040001;                       /* add %l0, %g1, %g1                    */
+  p->code[ 3] = 0x07000000 | (t.x[1] >> 10);      /* sethi %hi(p), %g3                    */
+  p->code[ 4] = 0x8610e000 | (t.x[1] & 0x3ff);    /* or %g3, <p&0x3ff>, %g3               */
+  p->code[ 5] = 0x8200c001;                       /* add %g3, %g1, %g1                    */
   p->code[ 6] = 0x05000000 | (e.x[0] >> 10);      /* sethi %hi(entry), %g2                */
   p->code[ 7] = 0x8410a000 | (e.x[0] & 0x3ff);    /* or %g2, <entry&0x3ff>, %g2           */
   p->code[ 8] = 0x8528b020;                       /* sllx %g2, 0x20, %g2                  */
-  p->code[ 9] = 0x21000000 | (e.x[1] >> 10);      /* sethi %hi(entry), %l0                */
-  p->code[10] = 0xa0142000 | (e.x[1] & 0x3ff);    /* or %l0, <entry&0x3ff>, %l0           */
-  p->code[11] = 0x84040002;                       /* add %l0, %g2, %g2                    */
+  p->code[ 9] = 0x07000000 | (e.x[1] >> 10);      /* sethi %hi(entry), %g3                */
+  p->code[10] = 0x8610e000 | (e.x[1] & 0x3ff);    /* or %g3, <entry&0x3ff>, %g3           */
+  p->code[11] = 0x8400c002;                       /* add %g3, %g2, %g2                    */
   p->code[12] = 0x81c08000;                       /* jmpl %g2, %g0  -- discards link addr */
   p->code[13] = 0x01000000;                       /* nop                                  */
 }