Mercurial > pub > dyncall > dyncall
annotate dyncallback/dyncall_callback_x86.S @ 470:79e76734bb5c
"
author | Tassilo Philipp |
---|---|
date | Mon, 07 Feb 2022 22:41:32 +0100 |
parents | f5577f6bf97a |
children |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: dyncallback | |
5 File: dyncallback/dyncall_callback_x86.S | |
6 Description: Callback Thunk entry for x86 | |
7 License: | |
8 | |
281 | 9 Copyright (c) 2011-2018 Daniel Adler <dadler@uni-goettingen.de> |
0 | 10 |
11 Permission to use, copy, modify, and distribute this software for any | |
12 purpose with or without fee is hereby granted, provided that the above | |
13 copyright notice and this permission notice appear in all copies. | |
14 | |
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
22 | |
23 */ | |
24 | |
25 | |
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 | 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 | 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 | 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 | 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 | 53 |
54 GLOBAL(dcCallbackThunkEntry) | |
55 BEGIN_PROC(dcCallbackThunkEntry) | |
56 PUSH(EBP) | |
57 MOVL(ESP,EBP) | |
58 /* local variable frame_CTX) */ | |
59 PUSH(EAX) /* EAX = CTX* */ | |
60 /* initialize DCArgs */ | |
61 PUSH(LIT(0)) /* fast_count */ | |
62 PUSH(EDX) /* fast_data[1] */ | |
63 PUSH(ECX) /* fast_data[0] */ | |
64 LEA(DWORD(EBP,frame_arg0),ECX) /* compute arg stack address */ | |
65 PUSH(ECX) /* stack-ptr */ | |
66 PUSH(DWORD(EAX,CTX_pargsvt)) /* vtbl-ptr */ | |
67 MOVL(ESP,ECX) /* ECX = DCArgs* */ | |
68 /* initialize DCvalue */ | |
69 PUSH(LIT(0)) | |
70 PUSH(LIT(0)) | |
71 | |
72 MOVL(ESP,EDX) /* EDX = DCValue* */ | |
73 ANDL(LIT(-16),ESP) /* align stack to 16 bytes. */ | |
74 /* call handler(context) */ | |
75 PUSH(DWORD(EAX,CTX_userdata)) /* userdata */ | |
76 PUSH(EDX) /* DCValue* */ | |
77 PUSH(ECX) /* DCargs* */ | |
78 PUSH(EAX) /* DCCallback* */ | |
79 CALL_DWORD(EAX,CTX_phandler) | |
80 /* cleanup stack */ | |
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 | 83 POP(ECX) /* pop return address */ |
84 MOVL(DWORD(EBP,frame_CTX),EDX) | |
85 ADD(DWORD(EDX,CTX_stack_cleanup),ESP) /* cleanup stack */ | |
86 PUSH(ECX) /* push back return address */ | |
87 LEA(DWORD(EBP,frame_DCValue), EDX) | |
88 MOVL(DWORD(EBP,0), EBP) /* EBP = parent frame */ | |
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 | 92 CMP(LIT(ASCII_f),AL) |
93 JE(LOCAL(return_f32)) | |
94 CMP(LIT(ASCII_d),AL) | |
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 | 98 /* All int cases (+ pointer & string cases) fall in the return_i64 case, here */ |
0 | 99 LOCAL(return_i64): |
100 MOVL(DWORD(EDX,0),EAX) | |
101 MOVL(DWORD(EDX,4),EDX) | |
102 RET() | |
103 LOCAL(return_f32): | |
104 FLDS(DWORD(EDX,0)) | |
105 RET() | |
106 LOCAL(return_f64): | |
107 FLDL(QWORD(EDX,0)) | |
108 LOCAL(return_void): | |
109 RET() | |
110 END_PROC(dcCallbackThunkEntry) | |
111 END_ASM | |
112 |