annotate dyncallback/dyncall_callback_x86_8a.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 3e629dc19168
children
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: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_callback_x86_8a.s
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: x86 abi callback kernel implementation for Plan9's 8a
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) 2013 Tassilo Philipp <tphilipp@potion-studios.com>
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 TEXT dcCallbackThunkEntry(SB), $0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 /* input:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 AX -> thunk
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 AX+16 -> cb handler
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 AX+20 -> dcargsvt
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 AX+24 -> stack cleanup <-- not used for stack cleaning as caller cleans up,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 AX+28 -> userdata however reused as flag to indicate 64bit return value)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 /* prolog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 MOVL SP, BP
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 /* copy of DCargs passed to cb handler */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 PUSHL $0 /* fast_count (unused on plan9, but using shared x86 dcargs struct) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 SUBL $8, SP /* skip fast_data[] ( " ) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 LEAL 8(BP), CX /* ptr to args on stack, depending if return val is 64bit ... */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 CMPL 24(AX), $1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 JEQ is_ll_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 LEAL 4(BP), CX /* ... or not */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 is_ll_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 PUSHL CX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 PUSHL 20(AX) /* args vtable ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 MOVL SP, CX /* DCArgs-ptr (data pushed above) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 /* space for return value (long long) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 PUSHL $0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 PUSHL $0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 MOVL SP, DX /* retval ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 /* call the handler */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 PUSHL 28(AX) /* userdata for handler */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 PUSHL DX /* results */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 PUSHL CX /* args */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 PUSHL AX /* callback obj */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 MOVL 16(AX), AX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 CALL AX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 /* copy retval from ptr on stack to AX or stack space if 64bit */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 MOVL 8(SP), BX /* ptr to retval */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 CMPL AX, $0x6c /* 'l' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 JEQ ll_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 CMPL AX, $0x4c /* 'L' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 JEQ ll_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 CMPL AX, $0x66 /* 'f' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 JEQ f_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 CMPL AX, $0x64 /* 'd' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 JEQ d_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 JMP other_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 ll_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 MOVL 48(SP), DX /* ptr to ret address space; 48 = stack size + caller's ret address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 MOVL (BX), CX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 MOVL CX, (DX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 MOVL 4(BX), CX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 MOVL CX, 4(DX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 JMP cont_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 f_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 FMOVF (BX), F0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 JMP cont_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 d_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 FMOVD (BX), F0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 JMP cont_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 other_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 MOVL (BX), AX /* 32bit non-fp are returned in AX */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 /* epilog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 cont_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 ADDL $44, SP /* Cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 POPL CX /* hack to emulate RET without getting overly strict */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 JMP CX /* 'unbalanced PUSH/POP' warning/error from 8l */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100