]> Zhao Yanbai Git Server - minix.git/commitdiff
cdecl calling convention expects the callee to pop the hidden pointer on
authorLorenzo Cavallaro <lorenzo@minix3.org>
Wed, 24 Mar 2010 17:25:17 +0000 (17:25 +0000)
committerLorenzo Cavallaro <lorenzo@minix3.org>
Wed, 24 Mar 2010 17:25:17 +0000 (17:25 +0000)
struct return. For example, GCC and LLVM comply with this (tested on IA32).

ACK doesn't seem to follow this convention and expects the caller to clean up
the stack. Compiling hand-written ACK-compliant assembly code (returning a
struct) with GCC or LLVM used to break things (4-bytes misaligned stack).

The patch fixes this problem.

include/Makefile
include/minix/compiler-ack.h [new file with mode: 0644]
include/minix/compiler.h [new file with mode: 0644]
lib/libc/arch/i386/int64/add64.S
lib/libc/arch/i386/int64/add64u.S
lib/libc/arch/i386/int64/cvu64.S
lib/libc/arch/i386/int64/make64.S
lib/libc/arch/i386/int64/mul64u.S
lib/libc/arch/i386/int64/sub64.S
lib/libc/arch/i386/int64/sub64u.S

index b33a8b9f176d486a596e4e760c9bb194b3e446c3..a50426d6c95aa32f1eab60a0e84cb942447f6cba 100644 (file)
@@ -21,7 +21,8 @@ INCS+=        minix/a.out.h minix/bitmap.h minix/callnr.h minix/cdrom.h \
        minix/rs.h minix/safecopies.h minix/sef.h minix/sound.h \
        minix/sys_config.h minix/sysinfo.h minix/syslib.h \
        minix/sysutil.h minix/tty.h minix/type.h minix/types.h \
-       minix/u64.h minix/vfsif.h minix/vm.h
+       minix/u64.h minix/vfsif.h minix/vm.h \
+       minix/compiler.h minix/compiler-ack.h
 INCS+= net/hton.h net/if.h net/ioctl.h net/netlib.h
 INCS+= net/gen/arp_io.h net/gen/dhcp.h net/gen/ether.h \
        net/gen/eth_hdr.h net/gen/eth_io.h net/gen/icmp.h \
diff --git a/include/minix/compiler-ack.h b/include/minix/compiler-ack.h
new file mode 100644 (file)
index 0000000..a5ab4db
--- /dev/null
@@ -0,0 +1,9 @@
+/* Definitions for ACK-specific features. */
+
+#ifndef _MINIX_COMPILER_ACK_H
+#define _MINIX_COMPILER_ACK_H
+
+/* ACK expects the caller to pop the hidden pointer on struct return. */
+#define BYTES_TO_POP_ON_STRUCT_RETURN
+
+#endif /* _MINIX_COMPILER_ACK_H */
diff --git a/include/minix/compiler.h b/include/minix/compiler.h
new file mode 100644 (file)
index 0000000..25732d1
--- /dev/null
@@ -0,0 +1,25 @@
+/* Definitions for compiler-specific features. */
+
+#ifndef _MINIX_COMPILER_H
+#define _MINIX_COMPILER_H
+
+/*===========================================================================*
+ *                           Compiler overrides                             *
+ *===========================================================================*/
+/* ACK */
+#ifdef __ACK__
+#include <minix/compiler-ack.h>
+#endif
+
+/*===========================================================================*
+ *                             Default values                               *
+ *===========================================================================*/
+/*
+ * cdecl calling convention expects the callee to pop the hidden pointer on
+ * struct return. For example, GCC and LLVM comply with this (tested on IA32).
+ */
+#ifndef BYTES_TO_POP_ON_STRUCT_RETURN
+#define BYTES_TO_POP_ON_STRUCT_RETURN $4
+#endif
+
+#endif /* _MINIX_COMPILER_H */
index 0518b8d436c8cba0e7476464d71f77b778ce5b69..573bd7ff887cdef4bcffd2d14e93d17934b38ddc 100644 (file)
@@ -1,5 +1,7 @@
 /*     add64() - 64 bit addition                       Author: Kees J. Bot */
 /*                                                             7 Dec 1995 */
+#include <minix/compiler.h>
+
 .text
 .globl _add64
 
@@ -12,7 +14,7 @@ _add64:
        movl    12(%esp), %edx
        adcl    20(%esp), %edx
        movl    %edx, 4(%eax)
-       ret
+       ret BYTES_TO_POP_ON_STRUCT_RETURN
 
 /* */
 /* $PchId: add64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */
index 5a63df8fd73d2eefc462f5689a69a66baa2ac9ff..41a0a93a695c30a3d0cf04033766d3fed62a01be 100644 (file)
@@ -1,5 +1,7 @@
 /*     add64u() - unsigned to 64 bit addition          Author: Kees J. Bot */
 /*                                                             7 Dec 1995 */
+#include <minix/compiler.h>
+
 .text
 .globl _add64u, _add64ul
 
@@ -14,7 +16,7 @@ _add64ul:
        movl    12(%esp), %edx
        adcl    $0, %edx
        movl    %edx, 4(%eax)
-       ret
+       ret BYTES_TO_POP_ON_STRUCT_RETURN
 
 /* */
 /* $PchId: add64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */
index 13fa832c1c5917cd744bf3fb8cbf3a04d2bf8d5e..8513f9d0e833b217dd12f7876d6855ab2bb421f8 100644 (file)
@@ -1,5 +1,7 @@
 /*     cvu64() - unsigned converted to 64 bit          Author: Kees J. Bot */
 /*                                                             7 Dec 1995 */
+#include <minix/compiler.h>
+
 .text
 .globl _cvu64, _cvul64
 
@@ -11,7 +13,7 @@ _cvul64:
        movl    8(%esp), %edx
        movl    %edx, (%eax)
        movl    $0, 4(%eax)
-       ret
+       ret BYTES_TO_POP_ON_STRUCT_RETURN
 
 /* */
 /* $PchId: cvu64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */
index c53474bb1ba8a1a068f04992f24898c3c2cf561e..27b5a1d9892f19ed1e475bf7b3af90b30d65cea6 100644 (file)
@@ -1,6 +1,8 @@
 /*     make64() - make a 64 bit number from two 32 bit halves */
 /*                                                     Author: Kees J. Bot */
 /*                                                             7 Dec 1995 */
+#include <minix/compiler.h>
+
 .text
 .globl _make64
 
@@ -11,7 +13,7 @@ _make64:
        movl    %edx, (%eax)
        movl    12(%esp), %edx
        movl    %edx, 4(%eax)
-       ret
+       ret BYTES_TO_POP_ON_STRUCT_RETURN
 
 /* */
 /* $PchId: make64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */
index 60e8c487cdc5108c8ba10802d5bdc6e445932c93..fd693a62e5bbf2cf4b6877eddbf3d2527a73e4b8 100644 (file)
@@ -1,6 +1,8 @@
 /*     mul64u() - unsigned long by unsigned multiply giving 64 bit result */
 /*                                                     Author: Kees J. Bot */
 /*                                                             7 Dec 1995 */
+#include <minix/compiler.h>
+
 .text
 .globl _mul64u
 
@@ -12,7 +14,7 @@ _mul64u:
        movl    %eax, (%ecx)
        movl    %edx, 4(%ecx)
        movl    %ecx, %eax
-       ret
+       ret BYTES_TO_POP_ON_STRUCT_RETURN
 
 /* */
 /* $PchId: mul64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */
index 5100311be29dfa4b01cf179bc50bac74f2942581..fc1d80ad7283141f5cb9863086e72b9d1634d323 100644 (file)
@@ -1,5 +1,7 @@
 /*     sub64() - 64 bit subtraction                    Author: Kees J. Bot */
 /*                                                             7 Dec 1995 */
+#include <minix/compiler.h>
+
 .text
 .globl _sub64
 
@@ -12,7 +14,7 @@ _sub64:
        movl    12(%esp), %edx
        sbbl    20(%esp), %edx
        movl    %edx, 4(%eax)
-       ret
+       ret BYTES_TO_POP_ON_STRUCT_RETURN
 
 /* */
 /* $PchId: sub64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */
index 84314f275d61b4c8d31e0c2e34f4b9d1f9ad38b0..2f5c2d45ffb5c18c37d634b2288d366523b7a0b8 100644 (file)
@@ -1,5 +1,7 @@
 /*     sub64() - unsigned from 64 bit subtraction      Author: Kees J. Bot */
 /*                                                             7 Dec 1995 */
+#include <minix/compiler.h>
+
 .text
 .globl _sub64u, _sub64ul
 
@@ -14,7 +16,7 @@ _sub64ul:
        movl    12(%esp), %edx
        sbbl    $0, %edx
        movl    %edx, 4(%eax)
-       ret
+       ret BYTES_TO_POP_ON_STRUCT_RETURN
 
 /* */
 /* $PchId: sub64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */