Merge to trunk head (r46631)
[reactos.git] / boot / freeldr / freeldr / include / arch.h
1 /*
2 * FreeLoader
3 * Copyright (C) 1998-2003 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 #pragma once
21
22 #ifdef _M_AMD64
23 #include <arch/amd64/amd64.h>
24 #endif
25
26 #if defined (_M_IX86)
27 /* Defines needed for switching between real and protected mode */
28 #define NULL_DESC 0x00 /* NULL descriptor */
29 #define PMODE_CS 0x08 /* PMode code selector, base 0 limit 4g */
30 #define PMODE_DS 0x10 /* PMode data selector, base 0 limit 4g */
31 #define RMODE_CS 0x18 /* RMode code selector, base 0 limit 64k */
32 #define RMODE_DS 0x20 /* RMode data selector, base 0 limit 64k */
33 #endif
34
35 #define CR0_PE_SET 0x00000001 /* OR this value with CR0 to enable pmode */
36 #define CR0_PE_CLR 0xFFFFFFFE /* AND this value with CR0 to disable pmode */
37
38 #define STACK16ADDR 0x7000 /* The 16-bit stack top will be at 0000:7000 */
39 #define STACK32ADDR 0x78000 /* The 32-bit stack top will be at 7000:8000, or 0x78000 */
40
41 #if defined (_M_IX86) || defined (_M_AMD64)
42 #define BIOSCALLBUFFER 0x78000 /* Buffer to store temporary data for any Int386() call */
43 #define BIOSCALLBUFSEGMENT 0x7800 /* Buffer to store temporary data for any Int386() call */
44 #define BIOSCALLBUFOFFSET 0x0000 /* Buffer to store temporary data for any Int386() call */
45 #define FILESYSBUFFER 0x80000 /* Buffer to store file system data (e.g. cluster buffer for FAT) */
46 #define DISKREADBUFFER 0x90000 /* Buffer to store data read in from the disk via the BIOS */
47 #define DISKREADBUFFER_SIZE 512
48 #elif defined(_M_PPC) || defined(_M_MIPS)
49 #define DISKREADBUFFER 0x80000000
50 #define FILESYSBUFFER 0x80000000
51 #elif defined(_M_ARM)
52 extern ULONG gDiskReadBuffer, gFileSysBuffer;
53 #define DISKREADBUFFER gDiskReadBuffer
54 #define FILESYSBUFFER gFileSysBuffer
55 #endif
56
57 /* Makes "x" a global variable or label */
58 #define EXTERN(x) .global x; x:
59
60
61
62
63 #ifndef ASM
64
65 #include <pshpack1.h>
66 typedef struct
67 {
68 unsigned long eax;
69 unsigned long ebx;
70 unsigned long ecx;
71 unsigned long edx;
72
73 unsigned long esi;
74 unsigned long edi;
75
76 unsigned short ds;
77 unsigned short es;
78 unsigned short fs;
79 unsigned short gs;
80
81 unsigned long eflags;
82
83 } DWORDREGS;
84
85 typedef struct
86 {
87 unsigned short ax, _upper_ax;
88 unsigned short bx, _upper_bx;
89 unsigned short cx, _upper_cx;
90 unsigned short dx, _upper_dx;
91
92 unsigned short si, _upper_si;
93 unsigned short di, _upper_di;
94
95 unsigned short ds;
96 unsigned short es;
97 unsigned short fs;
98 unsigned short gs;
99
100 unsigned short flags, _upper_flags;
101
102 } WORDREGS;
103
104 typedef struct
105 {
106 unsigned char al;
107 unsigned char ah;
108 unsigned short _upper_ax;
109 unsigned char bl;
110 unsigned char bh;
111 unsigned short _upper_bx;
112 unsigned char cl;
113 unsigned char ch;
114 unsigned short _upper_cx;
115 unsigned char dl;
116 unsigned char dh;
117 unsigned short _upper_dx;
118
119 unsigned short si, _upper_si;
120 unsigned short di, _upper_di;
121
122 unsigned short ds;
123 unsigned short es;
124 unsigned short fs;
125 unsigned short gs;
126
127 unsigned short flags, _upper_flags;
128
129 } BYTEREGS;
130
131
132 typedef union
133 {
134 DWORDREGS x;
135 DWORDREGS d;
136 WORDREGS w;
137 BYTEREGS b;
138 } REGS;
139 #include <poppack.h>
140
141 // Int386()
142 //
143 // Real mode interrupt vector interface
144 //
145 // (E)FLAGS can *only* be returned by this function, not set.
146 // Make sure all memory pointers are in SEG:OFFS format and
147 // not linear addresses, unless the interrupt handler
148 // specifically handles linear addresses.
149 int Int386(int ivec, REGS* in, REGS* out);
150
151 // Flag Masks
152 #define I386FLAG_CF 0x0001 // Carry Flag
153 #define I386FLAG_RESV1 0x0002 // Reserved - Must be 1
154 #define I386FLAG_PF 0x0004 // Parity Flag
155 #define I386FLAG_RESV2 0x0008 // Reserved - Must be 0
156 #define I386FLAG_AF 0x0010 // Auxiliary Flag
157 #define I386FLAG_RESV3 0x0020 // Reserved - Must be 0
158 #define I386FLAG_ZF 0x0040 // Zero Flag
159 #define I386FLAG_SF 0x0080 // Sign Flag
160 #define I386FLAG_TF 0x0100 // Trap Flag (Single Step)
161 #define I386FLAG_IF 0x0200 // Interrupt Flag
162 #define I386FLAG_DF 0x0400 // Direction Flag
163 #define I386FLAG_OF 0x0800 // Overflow Flag
164
165 // This macro tests the Carry Flag
166 // If CF is set then the call failed (usually)
167 #define INT386_SUCCESS(regs) ((regs.x.eflags & I386FLAG_CF) == 0)
168
169 void EnableA20(void);
170
171 VOID ChainLoadBiosBootSectorCode(VOID); // Implemented in boot.S
172 VOID SoftReboot(VOID); // Implemented in boot.S
173
174 VOID DetectHardware(VOID); // Implemented in hardware.c
175
176 #endif /* ! ASM */