- implement _alloca (untested), ChainLoadBiosBootSectorCode, SoftReboot
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 24 Jul 2008 02:18:44 +0000 (02:18 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 24 Jul 2008 02:18:44 +0000 (02:18 +0000)
- copy drvmap.S, i386cpu.S, i386idt.S, i386pnp.S, i386trap.S, mb.S

svn path=/branches/ros-amd64-bringup/; revision=34726

reactos/boot/freeldr/freeldr/arch/amd64/_alloca.S [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/amd64/boot.S [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/amd64/i386idt.S [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/amd64/mb.S [new file with mode: 0644]

diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/_alloca.S b/reactos/boot/freeldr/freeldr/arch/amd64/_alloca.S
new file mode 100644 (file)
index 0000000..58bc8f3
--- /dev/null
@@ -0,0 +1,36 @@
+/* stuff needed for libgcc on win32.  */
+.intel_syntax noprefix
+
+/*#ifdef L_chkstk*/
+#ifdef WIN32
+
+       .global ___chkstk
+       .global __alloca
+___chkstk:
+__alloca:
+       push  rcx               /* save temp */
+       mov   rcx, rsp  /* get sp */
+       add   rcx, 8    /* and point to return addr */
+
+probe:
+       cmp  rax, 0x1000        /* > 4k ?*/
+       jb   done               
+
+       sub   rcx, 0x1000               /* yes, move pointer down 4k*/
+       or    qword ptr [rcx], 0x0      /* probe there */
+       sub   rax, 0x1000               /* decrement count */
+       jmp   probe             /* and do it again */
+
+done:
+       sub   rcx, rax
+       or    qword ptr [rcx], 0x0      /* less that 4k, just peek here */
+
+       mov   rax, rsp
+       mov   rsp, rcx  /* decrement stack */
+
+       mov   rcx, [rax]        /* recover saved temp */
+       mov   rax, [rax + 8]/* get return address */
+       jmp   [rax]
+
+
+#endif
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/boot.S b/reactos/boot/freeldr/freeldr/arch/amd64/boot.S
new file mode 100644 (file)
index 0000000..082b90f
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+
+       .text
+       .code16
+
+#define ASM
+#include <arch.h>
+
+
+EXTERN(_ChainLoadBiosBootSectorCode)
+       .code64
+
+       call x86_64_SwitchToReal
+       .code16
+
+       /* Set the boot drive */
+       mov dl, _BootDrive
+
+       /* Load segment registers */
+       cli
+       mov bx, 0x0000
+       mov ds, bx
+       mov es, bx
+       mov fs, bx
+       mov gs, bx
+       mov ss, bx
+       mov sp, 0x7C00
+
+//     ljmpl   $0x0000,$0x7C00
+       jmp 0x7c00:0x0000
+
+EXTERN(_SoftReboot)
+       .code64
+
+       call    x86_64_SwitchToReal
+       .code16
+
+       mov ax, 0x40
+       mov ds, ax
+       mov si, 0x72
+
+       // Set the word at location 40:72 to 1234h
+       mov word ptr [si], 0x1234
+
+       // and jump to location FFFF:0 in ROM
+//     ljmpl   $0xFFFF,$0x0000
+       jmp 0xffff: 0x0000
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S b/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S
new file mode 100644 (file)
index 0000000..514ab9a
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+
+       .text
+       .code16
+
+#define ASM
+#include <arch.h>
+
+
+EXTERN(_DriveMapInt13HandlerStart)
+Int13Handler:
+
+       pushw   %bp
+       movw    %sp,%bp
+       pushw   %ax
+       pushw   %cx
+       pushw   %si
+
+       cld
+
+       /* Get callers flags from stack */
+       movw    0x06(%bp),%ax
+       movw    %ax,%cs:(CallersFlags - Int13Handler)
+
+       /* Save the drive number they passed in */
+       movb    %dl,%cs:(PassedInDriveNumber - Int13Handler)
+
+       /* Now we need to perform the mapping */
+       xorw    %cx,%cx
+       movw    $(Int13HandlerMapCount - Int13Handler),%si
+       /* Get the count of drives in the map list */
+       movb    %cs:(%si),%cl
+       incw    %si
+
+       /* If the map list is empty then just call the old int 13h handler */
+       cmpb    $0,%cl
+       jz              CallOldInt13Handler
+
+GetMappedDriveNumberLoop:
+
+       /* Get the next drive number in the list */
+       lodsw   %cs:(%si),%ax
+       /* Check to see if it's the one they are calling int 13h for */
+       cmpb    %al,%dl
+       /* If not get the next one */
+       jne             GetMappedDriveNumberLoopNext
+
+       /* If we get here then we have found a mapped drive */
+       /* Send new drive number on to the old int 13h handler */
+       movb    %ah,%dl
+       /* Call BIOS Int 13 Handler */
+       jmp             CallOldInt13Handler
+
+GetMappedDriveNumberLoopNext:
+       loop    GetMappedDriveNumberLoop
+
+CallOldInt13Handler:
+       /* Restore the registers we changed off the stack */
+       popw    %si
+       popw    %cx
+       popw    %ax
+
+       /* Put flags onto stack */
+       pushw   %cs:(CallersFlags - Int13Handler)
+
+       /* Call old int 13h handler with new drive number */
+       .byte   0x9a /* lcall */
+EXTERN(_DriveMapOldInt13HandlerAddress)
+       .word   0
+       .word   0
+
+       /* Update the callers flags with the values the BIOS returned */
+       pushw   %ax
+       pushf
+       popw    %ax
+       movw    %ax,0x06(%bp)
+       popw    %ax
+       /* Restore the callers drive number */
+       movb    %cs:(PassedInDriveNumber - Int13Handler),%dl
+
+       popw    %bp
+
+       iret
+
+CallersFlags:
+       .word   0
+
+PassedInDriveNumber:
+       .byte   0
+
+EXTERN(_DriveMapInt13HandlerMapList)
+Int13HandlerMapCount:
+       .byte   0
+
+Int13HandlerDrive1:
+       .byte   0
+Int13HandlerDriveNew1:
+       .byte   0
+
+Int13HandlerDrive2:
+       .byte   0
+Int13HandlerDriveNew2:
+       .byte   0
+
+Int13HandlerDrive3:
+       .byte   0
+Int13HandlerDriveNew3:
+       .byte   0
+
+Int13HandlerDrive4:
+       .byte   0
+Int13HandlerDriveNew4:
+       .byte   0
+
+EXTERN(_DriveMapInt13HandlerEnd)
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S
new file mode 100644 (file)
index 0000000..f0e01bb
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 2003  Eric Kohl
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+
+       .text
+       .code16
+
+#define ASM
+
+#include <arch.h>
+
+/*
+ * U32 CpuidSupported(VOID);
+ *
+ * RETURNS:
+ *    0x00000001: CPU supports the CPUID instruction
+ *    0x00000300: Found 80386 CPU
+ *    0x00000400: Found 80486 CPU without CPUID support
+ */
+
+EXTERN(_CpuidSupported)
+       .code32
+
+       pushl   %ecx                    /* save ECX */
+
+       pushfl                          /* push original EFLAGS */
+       popl    %eax                    /* get original EFLAGS */
+       movl    %eax,%ecx               /* save original EFLAGS */
+       xorl    $0x40000,%eax           /* flip AC bit in EFLAGS */
+       pushl   %eax                    /* save new EFLAGS value on stack */
+       popfl                           /* replace current EFLAGS value */
+
+       pushfl                          /* get new EFLAGS */
+       popl    %eax                    /* store new EFLAGS in EAX */
+       xorl    %ecx, %eax              /* can't toggle AC bit, processor=80386 */
+
+       movl    $0x300,%eax             /* return processor id */
+       jz      NoCpuid                 /* jump if 80386 processor */
+
+       pushl   %ecx
+       popfl                           /* restore AC bit in EFLAGS first */
+
+       movl    %ecx,%eax               /* get original EFLAGS */
+       xorl    $0x200000,%eax          /* flip ID bit in EFLAGS */
+       pushl   %eax                    /* save new EFLAGS value on stack */
+       popfl                           /* replace current EFLAGS value */
+       pushfl                          /* get new EFLAGS */
+       popl    %eax                    /* store new EFLAGS in EAX */
+       xorl    %ecx,%eax               /* can't toggle ID bit, */
+
+       movl    $0x400,%eax             /* return processor id */
+       je      NoCpuid                 /* processor=80486 */
+
+       movl    $1,%eax                 /* CPUID supported */
+
+NoCpuid:
+       pushl   %ecx
+       popfl                           /* restore EFLAGS */
+       popl    %ecx                    /* retore ECX */
+
+       ret
+
+
+/*
+ * VOID GetCpuid(U32 Level, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx);
+ */
+
+EXTERN(_GetCpuid)
+       .code32
+
+       pushl   %ebp
+       movl    %esp,%ebp
+
+       pushl   %eax
+       pushl   %ebx
+       pushl   %ecx
+       pushl   %edx
+       pushl   %esi
+
+       movl    0x08(%ebp),%eax
+
+       cpuid
+
+       movl    0x0C(%ebp),%esi
+       movl    %eax,(%esi)
+
+       movl    0x10(%ebp),%esi
+       movl    %ebx,(%esi)
+
+       movl    0x14(%ebp),%esi
+       movl    %ecx,(%esi)
+
+       movl    0x18(%ebp),%esi
+       movl    %edx,(%esi)
+
+       popl    %esi
+       popl    %edx
+       popl    %ecx
+       popl    %ebx
+       popl    %eax
+
+       movl    %ebp,%esp
+       popl    %ebp
+       ret
+
+
+/*
+ * U64 RDTSC(VOID);
+ */
+
+EXTERN(_RDTSC)
+       .code32
+       rdtsc
+       ret
+
+/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386idt.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386idt.S
new file mode 100644 (file)
index 0000000..7fc46fa
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+
+       .text
+       .code16
+
+#define ASM
+#include <arch.h>
+
+
+       .p2align        2       /* force 4-byte alignment */
+EXTERN(i386idt)
+       /* Exception 0 - Divide By Zero */
+       .word   i386DivideByZero                        /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Flags, Zero Byte */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 1 - Debug Exception */
+       .word   i386DebugException                      /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 2 - NMI */
+       .word   i386NMIException                        /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 3 - Breakpoint (INT 3) */
+       .word   i386Breakpoint                          /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 4 - Overflow (INTO with EFLAGS[OF] set) */
+       .word   i386Overflow                            /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 5 - Bound Exception */
+       .word   i386BoundException                      /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 6 - Invalid Opcode */
+       .word   i386InvalidOpcode                       /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 7 - FPU Not Available */
+       .word   i386FPUNotAvailable                     /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 8 - Double Fault */
+       .word   i386DoubleFault                         /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 9 - Coprocessor Segment Overrun */
+       .word   i386CoprocessorSegment          /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 10 (0x0A) - Invalid TSS */
+       .word   i386InvalidTSS                          /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 11 (0x0B) - Segment Not Present */
+       .word   i386SegmentNotPresent           /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 12 (0x0C) - Stack Exception */
+       .word   i386StackException                      /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 13 (0x0D) - General Protection Fault */
+       .word   i386GeneralProtectionFault      /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 14 (0x0E) - Page Fault */
+       .word   i386PageFault                           /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 15 (0x0F) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 16 (0x10) - Coprocessor Error */
+       .word   i386CoprocessorError            /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 17 (0x11) - Alignment Check */
+       .word   i386AlignmentCheck                      /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 18 (0x12) - Machine Check */
+       .word   i386MachineCheck                        /* Offset 0 - 15 */
+       .word   0x0008                                          /* Selector */
+       .word   0x8e00                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 19 (0x13) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 20 (0x14) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 21 (0x15) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 22 (0x16) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 23 (0x17) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 24 (0x18) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 25 (0x19) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 26 (0x1A) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 27 (0x1B) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 28 (0x1C) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 29 (0x1D) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 30 (0x1E) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+       /* Exception 31 (0x1F) - Reserved */
+       .word   0x0000                                          /* Offset 0 - 15 */
+       .word   0x0000                                          /* Selector */
+       .word   0x0000                                          /* Zero byte, flags */
+       .word   0x0000                                          /* Offset 16 - 31 */
+
+/* IDT table pointer */
+EXTERN(i386idtptr)
+       .word   (i386idtptr-i386idt)            /* Limit */
+       .long   i386idt                                         /* Base Address */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S
new file mode 100644 (file)
index 0000000..2b5848a
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 2003  Eric Kohl
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+
+       .text
+       .code16
+
+#define ASM
+
+#include <arch.h>
+
+
+/*
+ * U32 PnpBiosSupported(VOID);
+ *
+ * RETURNS:
+ */
+_pnp_bios_entry_point:
+       .long   0
+_pnp_bios_data_segment:
+       .word   0
+
+EXTERN(_PnpBiosSupported)
+       .code64
+
+       push rdi
+       push rsi
+       push rcx
+       push rdx
+
+       xor edi, edi
+
+       /* init esi */
+       mov esi, 0xF0000
+
+pnp_again:
+       mov eax, [%esi]
+       cmp eax, 0x506E5024                     /* "$PnP" */
+       je pnp_found
+
+       cmp esi, 0xFFFF0
+       je pnp_not_found
+
+pnp_add:
+       add esi, 0x10
+       jmp pnp_again
+
+pnp_found:
+       /* first calculate the checksum */
+       push rsi
+
+       push 0x21
+       pop rcx
+       xor edx, edx
+
+pnp_loop:
+       lodsb
+       add dl, al
+       loop pnp_loop
+
+       test dl, dl
+       pop rsi
+       jnz pnp_add
+
+       mov edi, esi
+
+       /* Calculate the bios entry point (far pointer) */
+       xor eax, eax
+       mov ax, [esi + 0x0F]
+       shl eax, 16
+       mov ax, [esi + 0x0D]
+       mov _pnp_bios_entry_point, eax
+
+       /* Store bios data segment */
+       mov ax, [esi + 0x1B]
+       mov _pnp_bios_data_segment, ax
+
+pnp_not_found:
+       mov eax, edi
+
+       pop rdx
+       pop rcx
+       pop rsi
+       pop rdi
+
+       ret
+
+
+/*
+ * U32 PnpBiosGetDeviceNodeCount(U32 *NodeSize, U32 *NodeCount);
+ *
+ * RETURNS:
+ */
+_pnp_result:
+       .long   0
+_pnp_node_size:
+       .word   0
+_pnp_node_count:
+       .word   0
+
+EXTERN(_PnpBiosGetDeviceNodeCount)
+       .code64
+
+       push rbp
+       mov rbp, rsp
+
+//     pushal FIXME
+//     push es
+
+       call x86_64_SwitchToReal
+       .code16
+
+       mov ax, _pnp_bios_data_segment
+       push ax
+
+       push cs
+       mov ax, _pnp_node_size
+       push ax
+
+       push cs
+       mov ax, _pnp_node_count
+       push ax
+
+       push 0
+
+       call [_pnp_bios_entry_point]
+       add sp, 12
+
+       movzx ecx, ax
+       mov _pnp_result, ecx
+
+       call    x86_16_SwitchToLong
+       .code64
+
+       mov esi, [rbp + 0x08]
+       mov ax, _pnp_node_size
+       movzx ecx, ax
+       mov [rsi], ecx
+
+       mov rsi, [ebp + 0x0C]
+       mov ax, _pnp_node_count
+       movzx ecx, ax
+       mov [rsi], eax
+
+//     pop es
+//     popal
+
+       mov rsp, rbp
+       pop rbp
+
+       xor rax, rax
+       mov eax, _pnp_result
+
+       ret
+
+
+/*
+ * U32 PnpBiosGetDeviceNode(U8 *NodeId, U8 *NodeBuffer);
+ *
+ * RETURNS:
+ */
+_pnp_buffer_segment:
+       .word   0
+_pnp_buffer_offset:
+       .word   0
+
+_pnp_node_number:
+       .byte   0
+
+EXTERN(_PnpBiosGetDeviceNode)
+       .code64
+
+       push rbp
+       mov rbp, rsp
+
+//     pushal
+//     push es
+
+       /* get current node number */
+       mov rsi, [rbp + 0x08]
+       mov al, [rsi]
+       mov _pnp_node_number, al
+
+       /* convert pointer to node buffer to segment/offset */ 
+       mov eax, [rbp + 0x0C]
+       shr eax, 4
+       and eax, 0xf000
+       mov _pnp_buffer_segment , ax
+       mov eax, [rbp + 0x0C]
+       and eax, 0xffff
+       mov _pnp_buffer_offset, ax
+
+       call x86_64_SwitchToReal
+       .code16
+
+       /* push bios segment */
+       mov ax, _pnp_bios_data_segment
+       push ax
+
+       /* push control flag */ 
+       push 0x0001
+
+       /* push pointer to node buffer (segment/offset) */
+       mov ax, _pnp_buffer_segment
+       push ax
+       mov ax, _pnp_buffer_offset
+       push ax
+
+       /* push pointer to node number (segment/offset) */
+       push cs
+       mov ax, _pnp_node_number
+       push ax
+
+       /* push function number */
+       push 1
+
+       /* call entry point */
+       call [_pnp_bios_entry_point]
+       add sp, 14
+
+       movzx ecx, ax
+       mov _pnp_result, ecx
+
+       call x86_16_SwitchToLong
+       .code64
+
+       /* update node number */
+       mov rsi, [rbp + 0x08]
+       mov al, _pnp_node_number
+       mov [rsi], al
+
+//     pop es
+//     popal
+
+       mov rsp, rbp
+       pop rbp
+
+       xor rax, rax
+       mov eax, _pnp_result
+
+       ret
+
+/* EOF */
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S
new file mode 100644 (file)
index 0000000..5410d88
--- /dev/null
@@ -0,0 +1,942 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+
+       .text
+       .code16
+
+#define ASM
+#include <arch.h>
+#include <ver.h>
+
+#define SCREEN_ATTR 0x1f                       /* Bright white on blue background */
+
+.macro SAVE_CPU_REGS
+       movl    %eax,i386_EAX
+       movl    %ebx,i386_EBX
+       movl    %ecx,i386_ECX
+       movl    %edx,i386_EDX
+       movl    %esp,i386_ESP
+       movl    %ebp,i386_EBP
+       movl    %esi,i386_ESI
+       movl    %edi,i386_EDI
+       movw    %ds,%ax
+       movw    %ax,i386_DS
+       movw    %es,%ax
+       movw    %ax,i386_ES
+       movw    %fs,%ax
+       movw    %ax,i386_FS
+       movw    %gs,%ax
+       movw    %ax,i386_GS
+       movw    %ss,%ax
+       movw    %ax,i386_SS
+       popl    %eax
+       movl    %eax,i386_EIP
+       popl    %eax
+       movw    %ax,i386_CS
+       popl    %eax
+       movl    %eax,i386_EFLAGS
+       movl    %cr0,%eax
+       movl    %eax,i386_CR0
+       //movl  %cr1,%eax
+       //movl  %eax,i386_CR1
+       movl    %cr2,%eax
+       movl    %eax,i386_CR2
+       movl    %cr3,%eax
+       movl    %eax,i386_CR3
+       movl    %dr0,%eax
+       movl    %eax,i386_DR0
+       movl    %dr1,%eax
+       movl    %eax,i386_DR1
+       movl    %dr2,%eax
+       movl    %eax,i386_DR2
+       movl    %dr3,%eax
+       movl    %eax,i386_DR3
+       movl    %dr6,%eax
+       movl    %eax,i386_DR6
+       movl    %dr7,%eax
+       movl    %eax,i386_DR7
+       sgdt    i386_GDTR
+       sidt    i386_IDTR
+       sldt    i386_LDTR
+       str             i386_TR
+.endm
+
+
+
+i386ExceptionHandlerText:
+       .ascii "An error occured in FreeLoader\n"
+       .ascii VERSION
+       .ascii "\n"
+       .asciz "Report this error to the ReactOS Development mailing list <ros-dev@reactos.org>\n\n"
+
+i386DivideByZeroText:
+       .asciz "Exception 00: DIVIDE BY ZERO\n\n"
+i386DebugExceptionText:
+       .asciz "Exception 01: DEBUG EXCEPTION\n\n"
+i386NMIExceptionText:
+       .asciz "Exception 02: NON-MASKABLE INTERRUPT EXCEPTION\n\n"
+i386BreakpointText:
+       .asciz "Exception 03: BREAKPOINT (INT 3)\n\n"
+i386OverflowText:
+       .asciz "Exception 04: OVERFLOW\n\n"
+i386BoundExceptionText:
+       .asciz "Exception 05: BOUND EXCEPTION\n\n"
+i386InvalidOpcodeText:
+       .asciz "Exception 06: INVALID OPCODE\n\n"
+i386FPUNotAvailableText:
+       .asciz "Exception 07: FPU NOT AVAILABLE\n\n"
+i386DoubleFaultText:
+       .asciz "Exception 08: DOUBLE FAULT\n\n"
+i386CoprocessorSegmentText:
+       .asciz "Exception 09: COPROCESSOR SEGMENT OVERRUN\n\n"
+i386InvalidTSSText:
+       .asciz "Exception 0A: INVALID TSS\n\n"
+i386SegmentNotPresentText:
+       .asciz "Exception 0B: SEGMENT NOT PRESENT\n\n"
+i386StackExceptionText:
+       .asciz "Exception 0C: STACK EXCEPTION\n\n"
+i386GeneralProtectionFaultText:
+       .asciz "Exception 0D: GENERAL PROTECTION FAULT\n\n"
+i386PageFaultText:
+       .asciz "Exception 0E: PAGE FAULT\n\n"
+i386CoprocessorErrorText:
+       .asciz "Exception 10: COPROCESSOR ERROR\n\n"
+i386AlignmentCheckText:
+       .asciz "Exception 11: ALIGNMENT CHECK\n\n"
+i386MachineCheckText:
+       .asciz "Exception 12: MACHINE CHECK\n\n"
+
+i386_EAX_Text:
+       .asciz "EAX: "
+i386_EBX_Text:
+       .asciz "EBX: "
+i386_ECX_Text:
+       .asciz "ECX: "
+i386_EDX_Text:
+       .asciz "EDX: "
+i386_ESP_Text:
+       .asciz "        ESP: "
+i386_EBP_Text:
+       .asciz "        EBP: "
+i386_ESI_Text:
+       .asciz "        ESI: "
+i386_EDI_Text:
+       .asciz "        EDI: "
+i386_CS_Text:
+       .asciz "CS: "
+i386_DS_Text:
+       .asciz "DS: "
+i386_ES_Text:
+       .asciz "ES: "
+i386_FS_Text:
+       .asciz "FS: "
+i386_GS_Text:
+       .asciz "GS: "
+i386_SS_Text:
+       .asciz "SS: "
+i386_EFLAGS_Text:
+       .asciz "        EFLAGS: "
+i386_EIP_Text:
+       .asciz "        EIP: "
+i386_ERROR_CODE_Text:
+       .asciz "        ERROR CODE: "
+i386_CR0_Text:
+       .asciz "        CR0: "
+i386_CR1_Text:
+       .asciz "        CR1: "
+i386_CR2_Text:
+       .asciz "        CR2: "
+i386_CR3_Text:
+       .asciz "        CR3: "
+i386_DR0_Text:
+       .asciz "        DR0: "
+i386_DR1_Text:
+       .asciz "        DR1: "
+i386_DR2_Text:
+       .asciz "        DR2: "
+i386_DR3_Text:
+       .asciz "        DR3: "
+i386_DR6_Text:
+       .asciz "        DR6: "
+i386_DR7_Text:
+       .asciz "        DR7: "
+i386_GDTR_Text:
+       .asciz "        GDTR Base: "
+i386_IDTR_Text:
+       .asciz "        IDTR Base: "
+i386_Limit_Text:
+       .asciz " Limit: "
+i386_LDTR_Text:
+       .asciz "        LDTR: "
+i386_TR_Text:
+       .asciz " TR: "
+
+i386FramesText:
+       .asciz "Frames:\n"
+
+/* Set by each exception handler to the address of the description text */
+i386ExceptionDescriptionText:
+       .long   0
+
+/* Used to store the contents of all the registers when an exception occurs */
+i386_EAX:
+       .long   0
+i386_EBX:
+       .long   0
+i386_ECX:
+       .long   0
+i386_EDX:
+       .long   0
+i386_ESP:
+       .long   0
+i386_EBP:
+       .long   0
+i386_ESI:
+       .long   0
+i386_EDI:
+       .long   0
+i386_CS:
+       .word   0
+i386_DS:
+       .word   0
+i386_ES:
+       .word   0
+i386_FS:
+       .word   0
+i386_GS:
+       .word   0
+i386_SS:
+       .word   0
+i386_EFLAGS:
+       .long   0
+i386_EIP:
+       .long   0
+i386_ERROR_CODE:
+       .long   0
+i386_CR0:
+       .long   0
+i386_CR1:
+       .long   0
+i386_CR2:
+       .long   0
+i386_CR3:
+       .long   0
+i386_DR0:
+       .long   0
+i386_DR1:
+       .long   0
+i386_DR2:
+       .long   0
+i386_DR3:
+       .long   0
+i386_DR6:
+       .long   0
+i386_DR7:
+       .long   0
+i386_GDTR:
+       .word   0
+       .long   0
+i386_IDTR:
+       .word   0
+       .long   0
+i386_LDTR:
+       .word   0
+i386_TR:
+       .word   0
+
+/* Used to store the current X and Y position on the screen */
+i386_ScreenPosX:
+       .long   0
+i386_ScreenPosY:
+       .long   0
+
+/************************************************************************/
+i386CommonExceptionHandler:
+       .code32
+
+       SAVE_CPU_REGS
+
+       pushl   $SCREEN_ATTR
+       call    _MachVideoClearScreen
+       add     $4,%esp
+
+       movl    $i386ExceptionHandlerText,%esi
+       call    i386PrintText
+
+       movl    i386ExceptionDescriptionText,%esi
+       call    i386PrintText
+
+       movl    $i386_EAX_Text,%esi
+       call    i386PrintText
+       movl    i386_EAX,%eax
+       call    i386PrintHexDword                                       // Display EAX
+       movl    $i386_ESP_Text,%esi
+       call    i386PrintText
+       movl    i386_ESP,%eax
+       call    i386PrintHexDword                                       // Display ESP
+       movl    $i386_CR0_Text,%esi
+       call    i386PrintText
+       movl    i386_CR0,%eax
+       call    i386PrintHexDword                                       // Display CR0
+       movl    $i386_DR0_Text,%esi
+       call    i386PrintText
+       movl    i386_DR0,%eax
+       call    i386PrintHexDword                                       // Display DR0
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_EBX_Text,%esi
+       call    i386PrintText
+       movl    i386_EBX,%eax
+       call    i386PrintHexDword                                       // Display EBX
+       movl    $i386_EBP_Text,%esi
+       call    i386PrintText
+       movl    i386_EBP,%eax
+       call    i386PrintHexDword                                       // Display EBP
+       movl    $i386_CR1_Text,%esi
+       call    i386PrintText
+       movl    i386_CR1,%eax
+       call    i386PrintHexDword                                       // Display CR1
+       movl    $i386_DR1_Text,%esi
+       call    i386PrintText
+       movl    i386_DR1,%eax
+       call    i386PrintHexDword                                       // Display DR1
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_ECX_Text,%esi
+       call    i386PrintText
+       movl    i386_ECX,%eax
+       call    i386PrintHexDword                                       // Display ECX
+       movl    $i386_ESI_Text,%esi
+       call    i386PrintText
+       movl    i386_ESI,%eax
+       call    i386PrintHexDword                                       // Display ESI
+       movl    $i386_CR2_Text,%esi
+       call    i386PrintText
+       movl    i386_CR2,%eax
+       call    i386PrintHexDword                                       // Display CR2
+       movl    $i386_DR2_Text,%esi
+       call    i386PrintText
+       movl    i386_DR2,%eax
+       call    i386PrintHexDword                                       // Display DR2
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_EDX_Text,%esi
+       call    i386PrintText
+       movl    i386_EDX,%eax
+       call    i386PrintHexDword                                       // Display EDX
+       movl    $i386_EDI_Text,%esi
+       call    i386PrintText
+       movl    i386_EDI,%eax
+       call    i386PrintHexDword                                       // Display EDI
+       movl    $i386_CR3_Text,%esi
+       call    i386PrintText
+       movl    i386_CR3,%eax
+       call    i386PrintHexDword                                       // Display CR3
+       movl    $i386_DR3_Text,%esi
+       call    i386PrintText
+       movl    i386_DR3,%eax
+       call    i386PrintHexDword                                       // Display DR3
+       incl    i386_ScreenPosY
+       movl    $55,i386_ScreenPosX
+       movl    $i386_DR6_Text,%esi
+       call    i386PrintText
+       movl    i386_DR6,%eax
+       call    i386PrintHexDword                                       // Display DR6
+       incl    i386_ScreenPosY
+       movl    $55,i386_ScreenPosX
+       movl    $i386_DR7_Text,%esi
+       call    i386PrintText
+       movl    i386_DR7,%eax
+       call    i386PrintHexDword                                       // Display DR7
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       incl    i386_ScreenPosY
+       movl    $i386_CS_Text,%esi
+       call    i386PrintText
+       movw    i386_CS,%ax
+       call    i386PrintHexWord                                        // Display CS
+       movl    $i386_EIP_Text,%esi
+       call    i386PrintText
+       movl    i386_EIP,%eax
+       call    i386PrintHexDword                                       // Display EIP
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_DS_Text,%esi
+       call    i386PrintText
+       movw    i386_DS,%ax
+       call    i386PrintHexWord                                        // Display DS
+       movl    $i386_ERROR_CODE_Text,%esi
+       call    i386PrintText
+       movl    i386_ERROR_CODE,%eax
+       call    i386PrintHexDword                                       // Display ERROR CODE
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_ES_Text,%esi
+       call    i386PrintText
+       movw    i386_ES,%ax
+       call    i386PrintHexWord                                        // Display ES
+       movl    $i386_EFLAGS_Text,%esi
+       call    i386PrintText
+       movl    i386_EFLAGS,%eax
+       call    i386PrintHexDword                                       // Display EFLAGS
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_FS_Text,%esi
+       call    i386PrintText
+       movw    i386_FS,%ax
+       call    i386PrintHexWord                                        // Display FS
+       movl    $i386_GDTR_Text,%esi
+       call    i386PrintText
+       movl    i386_GDTR+2,%eax
+       call    i386PrintHexDword                                       // Display GDTR Base
+       movl    $i386_Limit_Text,%esi
+       call    i386PrintText
+       movw    i386_GDTR,%ax
+       call    i386PrintHexWord                                        // Display GDTR Limit
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_GS_Text,%esi
+       call    i386PrintText
+       movw    i386_GS,%ax
+       call    i386PrintHexWord                                        // Display GS
+       movl    $i386_IDTR_Text,%esi
+       call    i386PrintText
+       movl    i386_IDTR+2,%eax
+       call    i386PrintHexDword                                       // Display IDTR Base
+       movl    $i386_Limit_Text,%esi
+       call    i386PrintText
+       movw    i386_IDTR,%ax
+       call    i386PrintHexWord                                        // Display IDTR Limit
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       movl    $i386_SS_Text,%esi
+       call    i386PrintText
+       movw    i386_SS,%ax
+       call    i386PrintHexWord                                        // Display SS
+       movl    $i386_LDTR_Text,%esi
+       call    i386PrintText
+       movw    i386_LDTR,%ax
+       call    i386PrintHexWord                                        // Display LDTR
+       movl    $i386_TR_Text,%esi
+       call    i386PrintText
+       movw    i386_TR,%ax
+       call    i386PrintHexWord                                        // Display TR
+       movl    $0,i386_ScreenPosX
+       incl    i386_ScreenPosY
+       incl    i386_ScreenPosY
+       call    i386PrintFrames                                         // Display frames
+       incl    i386_ScreenPosY
+       incl    i386_ScreenPosY
+
+       cli
+i386ExceptionHandlerHang:
+       hlt
+       jmp     i386ExceptionHandlerHang
+
+       iret
+
+i386PrintFrames:
+       movl    $0,i386_ScreenPosX
+       movl    $i386FramesText,%esi
+       call    i386PrintText
+
+       movl    i386_EBP,%edi
+printnextframe:
+       test    %edi,%edi
+       je      nomoreframes
+       movl    $STACK32ADDR,%eax
+       cmpl    %edi,%eax
+       jbe     nomoreframes
+       movl    4(%edi),%eax
+       pushl   %edi
+       call    i386PrintHexDword                                       // Display frame
+       popl    %edi
+       incl    i386_ScreenPosX
+       incl    i386_ScreenPosX
+       movl    0(%edi),%edi
+       jmp     printnextframe
+nomoreframes:
+       ret
+
+/************************************************************************/
+/* AL = Char to display                                                 */
+/************************************************************************/
+i386PrintChar:
+       .code32
+
+       pushl   i386_ScreenPosY
+       pushl   i386_ScreenPosX
+       pushl   $SCREEN_ATTR
+       andl    $0xff,%eax
+       pushl   %eax
+       call    _MachVideoPutChar
+       addl    $16,%esp
+
+       ret
+
+/************************************************************************/
+/* ESI = Address of text to display                                     */
+/************************************************************************/
+i386PrintText:
+       .code32
+
+i386PrintTextLoop:
+       lodsb
+
+       // Check for end of string char
+       cmp     $0,%al
+       je      i386PrintTextDone
+
+       // Check for newline char
+       cmp     $0x0a,%al
+       jne     i386PrintTextLoop2
+       incl    i386_ScreenPosY
+       movl    $0,i386_ScreenPosX
+       jmp     i386PrintTextLoop
+
+i386PrintTextLoop2:
+       call    i386PrintChar
+       incl    i386_ScreenPosX
+
+       jmp     i386PrintTextLoop
+
+i386PrintTextDone:
+       
+       ret
+
+/************************************************************************/
+/* Prints the value in EAX on the screen in hex                         */
+/************************************************************************/
+i386PrintHexDword:
+       .code32
+
+       call    i386PrintHex1
+
+i386PrintHex1:
+       call    i386PrintHex2
+i386PrintHex2:
+       call    i386PrintHex3
+i386PrintHex3:
+       movb    $4,%cl
+       rol             %cl,%eax
+       push    %eax
+       andb    $0x0f,%al
+       movl    $i386PrintHexTable,%ebx
+       xlat    /*$i386PrintHexTable*/
+       call    i386PrintChar
+       incl    i386_ScreenPosX
+       pop             %eax
+
+       ret
+
+i386PrintHexTable:
+       .ascii  "0123456789ABCDEF"
+
+/************************************************************************/
+/* Prints the value in AX on the screen in hex                         */
+/************************************************************************/
+i386PrintHexWord:
+       .code32
+
+       call    i386PrintHexWord1
+i386PrintHexWord1:
+       call    i386PrintHexWord2
+i386PrintHexWord2:
+       movb    $4,%cl
+       rol             %cl,%ax
+       push    %eax
+       andb    $0x0f,%al
+       movl    $i386PrintHexTable,%ebx
+       xlat    /*$i386PrintHexTable*/
+       call    i386PrintChar
+       incl    i386_ScreenPosX
+       pop     %eax
+
+       ret
+
+/************************************************************************/
+/* Prints the value in AL on the screen in hex                         */
+/************************************************************************/
+i386PrintHexByte:
+       .code32
+
+       call    i386PrintHexByte1
+i386PrintHexByte1:
+       movb    $4,%cl
+       rol             %cl,%al
+       push    %eax
+       andb    $0x0f,%al
+       movl    $i386PrintHexTable,%ebx
+       xlat    /*$i386PrintHexTable*/
+       call    i386PrintChar
+       incl    i386_ScreenPosX
+       pop             %eax
+
+       ret
+
+/************************************************************************/
+EXTERN(i386DivideByZero)
+       .code32
+
+       movl    $i386DivideByZeroText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386DebugException)
+       .code32
+
+       movl    $i386DebugExceptionText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386NMIException)
+       .code32
+
+       movl    $i386NMIExceptionText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386Breakpoint)
+       .code32
+
+       movl    $i386BreakpointText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386Overflow)
+       .code32
+
+       movl    $i386OverflowText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386BoundException)
+       .code32
+
+       movl    $i386BoundExceptionText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386InvalidOpcode)
+       .code32
+
+       movl    $i386InvalidOpcodeText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386FPUNotAvailable)
+       .code32
+
+       movl    $i386FPUNotAvailableText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386DoubleFault)
+       .code32
+
+       popl    %eax
+       movl    %eax,i386_ERROR_CODE
+
+       movl    $i386DoubleFaultText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386CoprocessorSegment)
+       .code32
+
+       movl    $i386CoprocessorSegmentText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386InvalidTSS)
+       .code32
+
+       popl    %eax
+       movl    %eax,i386_ERROR_CODE
+
+       movl    $i386InvalidTSSText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386SegmentNotPresent)
+       .code32
+
+       popl    %eax
+       movl    %eax,i386_ERROR_CODE
+
+       movl    $i386SegmentNotPresentText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386StackException)
+       .code32
+
+       popl    %eax
+       movl    %eax,i386_ERROR_CODE
+
+       movl    $i386StackExceptionText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386GeneralProtectionFault)
+       .code32
+
+       popl    %eax
+       movl    %eax,i386_ERROR_CODE
+
+       movl    $i386GeneralProtectionFaultText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386PageFault)
+       .code32
+
+       popl    %eax
+       movl    %eax,i386_ERROR_CODE
+
+       movl    $i386PageFaultText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386CoprocessorError)
+       .code32
+
+       movl    $i386CoprocessorErrorText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386AlignmentCheck)
+       .code32
+
+       movl    $i386AlignmentCheckText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************/
+EXTERN(i386MachineCheck)
+       .code32
+
+       movl    $i386MachineCheckText,i386ExceptionDescriptionText
+       jmp             i386CommonExceptionHandler
+
+/************************************************************************
+ * DEBUGGING SUPPORT FUNCTIONS
+ ************************************************************************/
+EXTERN(_INSTRUCTION_BREAKPOINT1)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr0
+       movl    %dr7,%eax
+       andl    $0xfff0ffff,%eax
+       orl             $0x00000303,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_READWRITE_BREAKPOINT1)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr0
+       movl    %dr7,%eax
+       andl    $0xfff0ffff,%eax
+       orl             $0x00030303,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_WRITE_BREAKPOINT1)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr0
+       movl    %dr7,%eax
+       andl    $0xfff0ffff,%eax
+       orl             $0x00010303,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_INSTRUCTION_BREAKPOINT2)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr1
+       movl    %dr7,%eax
+       andl    $0xff0fffff,%eax
+       orl             $0x0000030c,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_READWRITE_BREAKPOINT2)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr1
+       movl    %dr7,%eax
+       andl    $0xff0fffff,%eax
+       orl             $0x0030030c,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_WRITE_BREAKPOINT2)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr1
+       movl    %dr7,%eax
+       andl    $0xff0fffff,%eax
+       orl             $0x0010030c,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_INSTRUCTION_BREAKPOINT3)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr2
+       movl    %dr7,%eax
+       andl    $0xf0ffffff,%eax
+       orl             $0x00000330,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_READWRITE_BREAKPOINT3)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr2
+       movl    %dr7,%eax
+       andl    $0xf0ffffff,%eax
+       orl             $0x03000330,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_WRITE_BREAKPOINT3)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr2
+       movl    %dr7,%eax
+       andl    $0xf0ffffff,%eax
+       orl             $0x01000330,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_INSTRUCTION_BREAKPOINT4)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr3
+       movl    %dr7,%eax
+       andl    $0x0fffffff,%eax
+       orl             $0x000003c0,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_READWRITE_BREAKPOINT4)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr3
+       movl    %dr7,%eax
+       andl    $0x0fffffff,%eax
+       orl             $0x300003c0,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
+
+EXTERN(_MEMORY_WRITE_BREAKPOINT4)
+       .code32
+
+       pushl   %eax
+
+       movl    8(%esp),%eax
+
+       movl    %eax,%dr3
+       movl    %dr7,%eax
+       andl    $0x0fffffff,%eax
+       orl             $0x100003c0,%eax
+       movl    %eax,%dr7
+
+       popl    %eax
+
+       ret
diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/mb.S b/reactos/boot/freeldr/freeldr/arch/amd64/mb.S
new file mode 100644 (file)
index 0000000..d87e457
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+
+       .text
+       .code16
+
+#define ASM
+#include <arch.h>
+#include <multiboot.h>
+
+       /*
+        * Here we assume the kernel is loaded at 1mb
+        * This boots the kernel
+        */
+       .code32
+    .globl _PageDirectoryStart
+    
+    .globl _startup_pagedirectory
+    .globl _lowmem_pagetable
+    .globl _kernel_pagetable
+    .globl _hyperspace_pagetable
+    .globl _apic_pagetable
+    .globl _kpcr_pagetable
+    .globl _kuser_pagetable
+
+    .globl _PageDirectoryEnd
+
+       //
+       // Boot information structure
+       //
+
+EXTERN(_reactos_memory_map_descriptor_size)
+       .long   0
+
+EXTERN(_reactos_memory_map)
+       .rept   (32 * /*sizeof(memory_map_t)*/24)
+       .byte   0
+       .endr
+
+.bss
+_PageDirectoryStart:
+_startup_pagedirectory:
+       .fill 4096, 1, 0
+
+_lowmem_pagetable:
+       .fill 4096, 1, 0
+
+_kernel_pagetable:
+       .fill 2*4096, 1, 0
+
+_hyperspace_pagetable:
+       .fill 4096, 1, 0
+       
+_apic_pagetable:
+       .fill 4096, 1, 0
+
+_kpcr_pagetable:
+       .fill 4096, 1, 0   
+
+_kuser_pagetable:
+       .fill 4096, 1, 0   
+
+_PageDirectoryEnd: