dc486ee7b18408f500f306dac12fb10d4fd9004c
[reactos.git] / boot / freeldr / freeldr / arch / amd64 / int386.S
1 /*
2 * FreeLoader
3 * Copyright (C) 1998-2002 Brian Palmer <brianp@sginet.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include <asm.inc>
21 #include <arch/pc/x86common.h>
22 #include <arch/pc/pcbios.h>
23 .code64
24
25 EXTERN CallRealMode:PROC
26
27 /* int Int386(int ivec<ecx>, REGS* in<rdx>, REGS* out<r8>); */
28 PUBLIC Int386
29 Int386:
30
31 /* Save home registers */
32 mov r11, rsp
33 mov qword ptr [r11 + 8], rcx
34 mov qword ptr [r11 + 16], rdx
35 mov qword ptr [r11 + 24], r8
36
37 /* Save non-volatile registers */
38 push rbx
39 push rbp
40 push rsi
41 push rdi
42
43 /* Alloc stack space for home registers */
44 sub rsp, 40
45 //.ENDPROLOG
46
47 int386_2:
48 /* Copy the int vector to shared memory */
49 mov dword ptr [BSS_IntVector], ecx
50
51 /* Copy input registers */
52 mov rsi, rdx
53 mov rdi, BSS_RegisterSet
54 mov rcx, REGS_SIZE / 4
55 rep movsd
56
57 xor rax, rax
58 xor rbx, rbx
59 xor rcx, rcx
60 xor rdx, rdx
61 xor rbp, rbp
62 xor rsi, rsi
63 xor rdi, rdi
64
65 /* Set the function ID and call real mode */
66 mov bx, FNID_Int386
67 call CallRealMode
68
69 /* Copy output registers */
70 mov rsi, BSS_RegisterSet
71 mov rdi, [r11 + 24]
72 mov rcx, REGS_SIZE / 4
73 rep movsd
74
75 /* cleanup and return */
76 add rsp, 40
77 pop rdi
78 pop rsi
79 pop rbp
80 pop rbx
81 ret
82
83 END