[FREELDR]
[reactos.git] / boot / freeldr / freeldr / include / arch.h
index ada4624..9888601 100644 (file)
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifndef __ASM__
+#pragma once
+#endif
+
+#ifndef HEX
+#define HEX(y) 0x##y
+#endif
 
-#ifndef __ARCH_H
-#define __ARCH_H
+#ifdef _M_AMD64
+#include <arch/amd64/amd64.h>
+#endif
 
+#if defined (_M_IX86)
 /* Defines needed for switching between real and protected mode */
-#define NULL_DESC      0x00    /* NULL descriptor */
-#define PMODE_CS       0x08    /* PMode code selector, base 0 limit 4g */
-#define PMODE_DS       0x10    /* PMode data selector, base 0 limit 4g */
-#define RMODE_CS       0x18    /* RMode code selector, base 0 limit 64k */
-#define RMODE_DS       0x20    /* RMode data selector, base 0 limit 64k */
+#define NULL_DESC      HEX(00) /* NULL descriptor */
+#define PMODE_CS       HEX(08) /* PMode code selector, base 0 limit 4g */
+#define PMODE_DS       HEX(10) /* PMode data selector, base 0 limit 4g */
+#define RMODE_CS       HEX(18) /* RMode code selector, base 0 limit 64k */
+#define RMODE_DS       HEX(20) /* RMode data selector, base 0 limit 64k */
+#endif
 
-#define CR0_PE_SET     0x00000001      /* OR this value with CR0 to enable pmode */
-#define CR0_PE_CLR     0xFFFFFFFE      /* AND this value with CR0 to disable pmode */
+#define CR0_PE_SET     HEX(00000001)   /* OR this value with CR0 to enable pmode */
+#define CR0_PE_CLR     HEX(FFFFFFFE)   /* AND this value with CR0 to disable pmode */
 
-#define STACK16ADDR    0x7000  /* The 16-bit stack top will be at 0000:7000 */
-#define STACK32ADDR    0x78000 /* The 32-bit stack top will be at 7000:8000, or 0x78000 */
+#define STACK16ADDR    HEX(7000)       /* The 16-bit stack top will be at 0000:7000 */
+#define STACK32ADDR    HEX(78000)      /* The 32-bit stack top will be at 7000:8000, or 0x78000 */
 
-#ifdef _M_IX86
+#if defined (_M_IX86) || defined (_M_AMD64)
 #define BIOSCALLBUFFER         0x78000 /* Buffer to store temporary data for any Int386() call */
 #define BIOSCALLBUFSEGMENT     0x7800  /* Buffer to store temporary data for any Int386() call */
 #define BIOSCALLBUFOFFSET      0x0000  /* Buffer to store temporary data for any Int386() call */
 #define FILESYSBUFFER          0x80000 /* Buffer to store file system data (e.g. cluster buffer for FAT) */
 #define DISKREADBUFFER         0x90000 /* Buffer to store data read in from the disk via the BIOS */
-#elif defined(_M_PPC) || defined(_M_MIPS) || defined(_M_ARM)
-extern PVOID FsStaticBufferDisk, FsStaticBufferData;
-#define DISKREADBUFFER         FsStaticBufferDisk
-#define FILESYSBUFFER           FsStaticBufferData
+#define DISKREADBUFFER_SIZE 512
+#elif defined(_M_PPC) || defined(_M_MIPS)
+#define DISKREADBUFFER             0x80000000
+#define FILESYSBUFFER           0x80000000
+#elif defined(_M_ARM)
+extern ULONG gDiskReadBuffer, gFileSysBuffer;
+#define DISKREADBUFFER gDiskReadBuffer
+#define FILESYSBUFFER  gFileSysBuffer
 #endif
 
 /* Makes "x" a global variable or label */
 #define EXTERN(x)      .global x; x:
 
 
-
-
-#ifndef ASM
+// Flag Masks
+#define I386FLAG_CF            HEX(0001)               // Carry Flag
+#define I386FLAG_RESV1 HEX(0002)               // Reserved - Must be 1
+#define I386FLAG_PF            HEX(0004)               // Parity Flag
+#define I386FLAG_RESV2 HEX(0008)               // Reserved - Must be 0
+#define I386FLAG_AF            HEX(0010)               // Auxiliary Flag
+#define I386FLAG_RESV3 HEX(0020)               // Reserved - Must be 0
+#define I386FLAG_ZF            HEX(0040)               // Zero Flag
+#define I386FLAG_SF            HEX(0080)               // Sign Flag
+#define I386FLAG_TF            HEX(0100)               // Trap Flag (Single Step)
+#define I386FLAG_IF            HEX(0200)               // Interrupt Flag
+#define I386FLAG_DF            HEX(0400)               // Direction Flag
+#define I386FLAG_OF            HEX(0800)               // Overflow Flag
+
+
+#ifndef __ASM__
 
 #include <pshpack1.h>
 typedef struct
@@ -140,20 +167,6 @@ typedef union
 // specifically handles linear addresses.
 int            Int386(int ivec, REGS* in, REGS* out);
 
-// Flag Masks
-#define I386FLAG_CF            0x0001          // Carry Flag
-#define I386FLAG_RESV1 0x0002          // Reserved - Must be 1
-#define I386FLAG_PF            0x0004          // Parity Flag
-#define I386FLAG_RESV2 0x0008          // Reserved - Must be 0
-#define I386FLAG_AF            0x0010          // Auxiliary Flag
-#define I386FLAG_RESV3 0x0020          // Reserved - Must be 0
-#define I386FLAG_ZF            0x0040          // Zero Flag
-#define I386FLAG_SF            0x0080          // Sign Flag
-#define I386FLAG_TF            0x0100          // Trap Flag (Single Step)
-#define I386FLAG_IF            0x0200          // Interrupt Flag
-#define I386FLAG_DF            0x0400          // Direction Flag
-#define I386FLAG_OF            0x0800          // Overflow Flag
-
 // This macro tests the Carry Flag
 // If CF is set then the call failed (usually)
 #define INT386_SUCCESS(regs)   ((regs.x.eflags & I386FLAG_CF) == 0)
@@ -165,7 +178,4 @@ VOID        SoftReboot(VOID);                                       // Implemented in boot.S
 
 VOID   DetectHardware(VOID);           // Implemented in hardware.c
 
-#endif /* ! ASM */
-
-
-#endif // #defined __ARCH_H
+#endif /* ! __ASM__ */