annotate dyncallback/dyncall_callback_x86.S @ 256:7520e2260097

- added to configure some detection on how to compile .s/.S with --noexecstack (or similar), as compilers' defaults are often insane - since no-execstack handling is now in build, remove .note.GNU-stack section markers (were of limites use, anyways, b/c unportable or implemented inconsistently across platforms) - some ToDo, etc. updates
author Tassilo Philipp
date Sat, 20 May 2017 00:02:59 +0200
parents d5705f226298
children f5577f6bf97a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dyncallback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncallback/dyncall_callback_x86.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Callback Thunk entry for x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 #include "../portasm/portasm-x86.S"
145
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
27 #include "../dyncall/dyncall_macros.h"
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
28
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 BEGIN_ASM
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
30 DCThunk_size = 16
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
31 DCArgs_size = 20
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
32 DCValue_size = 8
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
34 CTX_thunk = 0
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
35 CTX_phandler = 16
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
36 CTX_pargsvt = 20
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
37 CTX_stack_cleanup = 24
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
38 CTX_userdata = 28
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
40 frame_arg0 = 8
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
41 frame_ret = 4
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
42 frame_parent = 0
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
43 frame_CTX = -4
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
44 frame_DCArgs = -24
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
45 frame_DCValue = -32
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
47 #define ASCII_L 76
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
48 #define ASCII_l 108
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
49 #define ASCII_d 100
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
50 #define ASCII_f 102
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
51 #define ASCII_i 105
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
52 #define ASCII_v 118
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 GLOBAL(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 BEGIN_PROC(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 PUSH(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 MOVL(ESP,EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 /* local variable frame_CTX) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 PUSH(EAX) /* EAX = CTX* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 /* initialize DCArgs */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 PUSH(LIT(0)) /* fast_count */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 PUSH(EDX) /* fast_data[1] */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 PUSH(ECX) /* fast_data[0] */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 LEA(DWORD(EBP,frame_arg0),ECX) /* compute arg stack address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 PUSH(ECX) /* stack-ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 PUSH(DWORD(EAX,CTX_pargsvt)) /* vtbl-ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 MOVL(ESP,ECX) /* ECX = DCArgs* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 /* initialize DCvalue */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 PUSH(LIT(0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 PUSH(LIT(0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 MOVL(ESP,EDX) /* EDX = DCValue* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 ANDL(LIT(-16),ESP) /* align stack to 16 bytes. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 /* call handler(context) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 PUSH(DWORD(EAX,CTX_userdata)) /* userdata */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 PUSH(EDX) /* DCValue* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 PUSH(ECX) /* DCargs* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 PUSH(EAX) /* DCCallback* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 CALL_DWORD(EAX,CTX_phandler)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 /* cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 MOVL(EBP,ESP) /* reset esp to frame */
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
82 POP(ECX) /* skip parent frame */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 POP(ECX) /* pop return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 MOVL(DWORD(EBP,frame_CTX),EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 ADD(DWORD(EDX,CTX_stack_cleanup),ESP) /* cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 PUSH(ECX) /* push back return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 LEA(DWORD(EBP,frame_DCValue), EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 MOVL(DWORD(EBP,0), EBP) /* EBP = parent frame */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 /* handle return value */
145
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
90
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
91 #if !defined(DC__OS_Minix)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 CMP(LIT(ASCII_f),AL)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 JE(LOCAL(return_f32))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 CMP(LIT(ASCII_d),AL)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 JE(LOCAL(return_f64))
145
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
96 #endif
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
97
97
d0787f3b81fb - internal linkage for some helper functions
cslag
parents: 0
diff changeset
98 /* All int cases (+ pointer & string cases) fall in the return_i64 case, here */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 LOCAL(return_i64):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 MOVL(DWORD(EDX,0),EAX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 MOVL(DWORD(EDX,4),EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 LOCAL(return_f32):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 FLDS(DWORD(EDX,0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 LOCAL(return_f64):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 FLDL(QWORD(EDX,0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 LOCAL(return_void):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 END_PROC(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112