[FREELDR] Add support for loading Linux in x64 FreeLdr. Part 1/2: ASM code.
[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
24 .code64
25
26 EXTERN CallRealMode:PROC
27
28 /* int Int386(int ivec<ecx>, REGS* in<rdx>, REGS* out<r8>); */
29 PUBLIC Int386
30 Int386:
31
32 /* Save home registers */
33 mov r11, rsp
34 mov qword ptr [r11 + 8], rcx
35 mov qword ptr [r11 + 16], rdx
36 mov qword ptr [r11 + 24], r8
37
38 /* Save non-volatile registers */
39 push rbx
40 push rbp
41 push rsi
42 push rdi
43
44 /* Alloc stack space for home registers (+ alignment) */
45 sub rsp, 40
46 //.ENDPROLOG
47
48 int386_2:
49 /* Copy the int vector to shared memory */
50 mov dword ptr [BSS_IntVector], ecx
51
52 /* Copy input registers */
53 mov rsi, rdx
54 mov rdi, BSS_RegisterSet
55 mov rcx, REGS_SIZE / 4
56 rep movsd
57
58 xor rax, rax
59 xor rbx, rbx
60 xor rcx, rcx
61 xor rdx, rdx
62 xor rbp, rbp
63 xor rsi, rsi
64 xor rdi, rdi
65
66 /* Set the function ID and call real mode */
67 mov bx, FNID_Int386
68 call CallRealMode
69
70 /* Copy output registers */
71 mov rsi, BSS_RegisterSet
72 mov rdi, qword ptr [r11 + 24]
73 mov rcx, REGS_SIZE / 4
74 rep movsd
75
76 /* Cleanup and return */
77 add rsp, 40
78 pop rdi
79 pop rsi
80 pop rbp
81 pop rbx
82 ret
83
84 END