mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 12:23:25 +00:00
- implement _alloca (untested), ChainLoadBiosBootSectorCode, SoftReboot
- copy drvmap.S, i386cpu.S, i386idt.S, i386pnp.S, i386trap.S, mb.S svn path=/branches/ros-amd64-bringup/; revision=34726
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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 */
|
||||
@@ -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 */
|
||||
@@ -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 */
|
||||
@@ -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
|
||||
@@ -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:
|
||||
Reference in New Issue
Block a user