[PATCH 03/23] winecrt0: Implement setjmp for PPC64
André Hentschel
nerv at dawncrow.de
Sun Jan 31 11:34:13 CST 2021
Signed-off-by: André Hentschel <nerv at dawncrow.de>
---
dlls/winecrt0/setjmp.c | 95 ++++++++++++++++++++++++++++++++++++++++
include/wine/exception.h | 2 +
2 files changed, 97 insertions(+)
diff --git a/dlls/winecrt0/setjmp.c b/dlls/winecrt0/setjmp.c
index 642e78e355e..6c493020b59 100644
--- a/dlls/winecrt0/setjmp.c
+++ b/dlls/winecrt0/setjmp.c
@@ -201,6 +201,101 @@ __ASM_GLOBAL_FUNC( __wine_longjmp,
"mov x0, x1\n\t" /* retval */
"ret" )
+#elif defined(__powerpc64__)
+
+__ASM_GLOBAL_FUNC( __wine_setjmpex,
+ "std 4, 0(3)\n\t" /* Frame */
+ "std 14, 8(3)\n\t" /* GPR14 */
+ "std 15, 16(3)\n\t" /* GPR15 */
+ "std 16, 24(3)\n\t" /* GPR16 */
+ "std 17, 32(3)\n\t" /* GPR17 */
+ "std 18, 40(3)\n\t" /* GPR18 */
+ "std 19, 48(3)\n\t" /* GPR19 */
+ "std 20, 56(3)\n\t" /* GPR20 */
+ "std 21, 64(3)\n\t" /* GPR21 */
+ "std 22, 72(3)\n\t" /* GPR22 */
+ "std 23, 80(3)\n\t" /* GPR23 */
+ "std 24, 88(3)\n\t" /* GPR24 */
+ "std 25, 96(3)\n\t" /* GPR25 */
+ "std 26, 104(3)\n\t" /* GPR26 */
+ "std 27, 112(3)\n\t" /* GPR27 */
+ "std 28, 120(3)\n\t" /* GPR28 */
+ "std 29, 128(3)\n\t" /* GPR29 */
+ "std 30, 136(3)\n\t" /* GPR30 */
+ "std 31, 144(3)\n\t" /* GPR31 */
+ "std 1, 152(3)\n\t" /* SP */
+ "std 2, 160(3)\n\t" /* TOC */
+ "mfcr 0\n\t"
+ "stw 0, 168(3)\n\t" /* CR (32-Bit) */
+ "mflr 0\n\t"
+ "std 0, 176(3)\n\t" /* LR */
+ "stfd 14, 184(3)\n\t" /* FP14 */
+ "stfd 15, 192(3)\n\t" /* FP15 */
+ "stfd 16, 200(3)\n\t" /* FP16 */
+ "stfd 17, 208(3)\n\t" /* FP17 */
+ "stfd 18, 216(3)\n\t" /* FP18 */
+ "stfd 19, 224(3)\n\t" /* FP19 */
+ "stfd 20, 232(3)\n\t" /* FP20 */
+ "stfd 21, 240(3)\n\t" /* FP21 */
+ "stfd 22, 248(3)\n\t" /* FP22 */
+ "stfd 23, 256(3)\n\t" /* FP23 */
+ "stfd 24, 264(3)\n\t" /* FP24 */
+ "stfd 25, 272(3)\n\t" /* FP25 */
+ "stfd 26, 280(3)\n\t" /* FP26 */
+ "stfd 27, 288(3)\n\t" /* FP27 */
+ "stfd 28, 296(3)\n\t" /* FP28 */
+ "stfd 29, 304(3)\n\t" /* FP29 */
+ "stfd 30, 312(3)\n\t" /* FP30 */
+ "stfd 31, 320(3)\n\t" /* FP31 */
+ "li 3, 0\n\t" /* return 0 */
+ "blr" )
+
+__ASM_GLOBAL_FUNC( __wine_longjmp,
+ "ld 14, 8(3)\n\t" /* GPR14 */
+ "ld 15, 16(3)\n\t" /* GPR15 */
+ "ld 16, 24(3)\n\t" /* GPR16 */
+ "ld 17, 32(3)\n\t" /* GPR17 */
+ "ld 18, 40(3)\n\t" /* GPR18 */
+ "ld 19, 48(3)\n\t" /* GPR19 */
+ "ld 20, 56(3)\n\t" /* GPR20 */
+ "ld 21, 64(3)\n\t" /* GPR21 */
+ "ld 22, 72(3)\n\t" /* GPR22 */
+ "ld 23, 80(3)\n\t" /* GPR23 */
+ "ld 24, 88(3)\n\t" /* GPR24 */
+ "ld 25, 96(3)\n\t" /* GPR25 */
+ "ld 26, 104(3)\n\t" /* GPR26 */
+ "ld 27, 112(3)\n\t" /* GPR27 */
+ "ld 28, 120(3)\n\t" /* GPR28 */
+ "ld 29, 128(3)\n\t" /* GPR29 */
+ "ld 30, 136(3)\n\t" /* GPR30 */
+ "ld 31, 144(3)\n\t" /* GPR31 */
+ "ld 1, 152(3)\n\t" /* SP */
+ "ld 2, 160(3)\n\t" /* TOC */
+ "lwz 0, 168(3)\n\t" /* CR (32-Bit) */
+ "mtcr 0\n\t"
+ "ld 0, 176(3)\n\t" /* LR */
+ "mtlr 0\n\t"
+ "lfd 14, 184(3)\n\t" /* FP14 */
+ "lfd 15, 192(3)\n\t" /* FP15 */
+ "lfd 16, 200(3)\n\t" /* FP16 */
+ "lfd 17, 208(3)\n\t" /* FP17 */
+ "lfd 18, 216(3)\n\t" /* FP18 */
+ "lfd 19, 224(3)\n\t" /* FP19 */
+ "lfd 20, 232(3)\n\t" /* FP20 */
+ "lfd 21, 240(3)\n\t" /* FP21 */
+ "lfd 22, 248(3)\n\t" /* FP22 */
+ "lfd 23, 256(3)\n\t" /* FP23 */
+ "lfd 24, 264(3)\n\t" /* FP24 */
+ "lfd 25, 272(3)\n\t" /* FP25 */
+ "lfd 26, 280(3)\n\t" /* FP26 */
+ "lfd 27, 288(3)\n\t" /* FP27 */
+ "lfd 28, 296(3)\n\t" /* FP28 */
+ "lfd 29, 304(3)\n\t" /* FP29 */
+ "lfd 30, 312(3)\n\t" /* FP30 */
+ "lfd 31, 320(3)\n\t" /* FP31 */
+ "mr 3, 4\n\t" /* return retval */
+ "blr" )
+
#else
int __cdecl __wine_setjmpex( __wine_jmp_buf *buf, EXCEPTION_REGISTRATION_RECORD *frame )
diff --git a/include/wine/exception.h b/include/wine/exception.h
index a2b0bb08dc3..fe5252ea70f 100644
--- a/include/wine/exception.h
+++ b/include/wine/exception.h
@@ -99,6 +99,8 @@ typedef struct { DECLSPEC_ALIGN(16) struct { unsigned __int64 Part[2]; } reg[16]
typedef struct { int reg[28]; } __wine_jmp_buf;
#elif defined(__aarch64__)
typedef struct { __int64 reg[24]; } __wine_jmp_buf;
+#elif defined(__powerpc64__)
+typedef struct { __int64 reg[48]; } __wine_jmp_buf;
#else
typedef struct { int reg; } __wine_jmp_buf;
#endif
--
2.25.1
More information about the wine-devel
mailing list