usb: getting string descriptors, minor improvements
[quarnos.git] / manes / ods / vcall.S
blobf6e5797785b924201f403b64c62b51d955ab8213
1 /* Quarn OS / Manes
2  *
3  * Execution Flow Controller
4  * Hacked Vtable entry for GCC 4.x
5  * Code for x86 machines
6  *
7  * Copyright (C) 2008-2009 Pawel Dziepak
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  *
23  */
25 /* EFC procedures */
26 .extern call_function
27 .extern efc_incomplete
29 /* Symbols required by injector */
30 .global vcall
31 .global vmth
32 .global end_vcall
34 .global rcall
35 .global rmth
36 .global end_rcall
38 /* Injected code */
39 vcall:
40         movl    %esp, %eax
41         pushl   %eax            /* pass stack content */
42 vmth:   pushl   $wrong_call     /* dynamically replaced by method address */
43         pushl   $retv
45         /* Jump to call_function */
46         pushl   $call_function  /* oblige gas/ld to use absolute address here */
47         ret
48 end_vcall:
50 /* Remote calls code */
51 rcall:
52         movl    %esp, %eax
53         pushl   %eax
54 rmth:   pushl   $wrong_call
55         pushl   $retv
56         pushl   $call_system
57         ret
58 end_rcall:      
60 retv:   /* Return to the caller */
61         addl    $8, %esp        /* popl two values */
62         ret
64 wrong_call:
65         call    efc_incomplete
66         cli
67         hlt                     /* further execution is impossible */