mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Added support for calling BIOS functions
Partially implemented VideoPortInt10 svn path=/trunk/; revision=1477
This commit is contained in:
parent
3b50cd9ca9
commit
390fd4f1fb
14 changed files with 371 additions and 44 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: vidport.c,v 1.15 2000/09/12 10:12:13 jean Exp $
|
/* $Id: vidport.c,v 1.16 2000/12/26 05:32:44 dwelch Exp $
|
||||||
*
|
*
|
||||||
* VideoPort driver
|
* VideoPort driver
|
||||||
* Written by Rex Jolliff
|
* Written by Rex Jolliff
|
||||||
|
@ -7,6 +7,8 @@
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <ddk/ntddvid.h>
|
#include <ddk/ntddvid.h>
|
||||||
|
|
||||||
|
#include "../../../ntoskrnl/include/internal/v86m.h"
|
||||||
|
|
||||||
#include "vidport.h"
|
#include "vidport.h"
|
||||||
|
|
||||||
#define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
|
#define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
|
||||||
|
@ -317,12 +319,26 @@ VideoPortInitialize(IN PVOID Context1,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
VP_STATUS
|
VP_STATUS STDCALL
|
||||||
STDCALL
|
|
||||||
VideoPortInt10(IN PVOID HwDeviceExtension,
|
VideoPortInt10(IN PVOID HwDeviceExtension,
|
||||||
IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments)
|
IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
KV86M_REGISTERS Regs;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
/* FIXME: Attach to csrss */
|
||||||
|
/* FIXME: Check address space is set up */
|
||||||
|
|
||||||
|
memset(&Regs, 0, sizeof(Regs));
|
||||||
|
Regs.Eax = BiosArguments->Eax;
|
||||||
|
Regs.Ebx = BiosArguments->Ebx;
|
||||||
|
Regs.Ecx = BiosArguments->Ecx;
|
||||||
|
Regs.Edx = BiosArguments->Edx;
|
||||||
|
Regs.Esi = BiosArguments->Esi;
|
||||||
|
Regs.Edi = BiosArguments->Edi;
|
||||||
|
Regs.Ebp = BiosArguments->Ebp;
|
||||||
|
Status = Ke386CallBios(0x10, &Regs);
|
||||||
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $Id: Makefile,v 1.5 2000/12/23 02:37:38 dwelch Exp $
|
# $Id: Makefile,v 1.6 2000/12/26 05:32:43 dwelch Exp $
|
||||||
#
|
#
|
||||||
# ReactOS Operating System
|
# ReactOS Operating System
|
||||||
#
|
#
|
||||||
|
@ -34,7 +34,8 @@ OBJECTS_NT = \
|
||||||
nt/nttimer.o \
|
nt/nttimer.o \
|
||||||
nt/plugplay.o \
|
nt/plugplay.o \
|
||||||
nt/profile.o \
|
nt/profile.o \
|
||||||
nt/zw.o
|
nt/zw.o \
|
||||||
|
nt/vdm.o
|
||||||
|
|
||||||
# Run-Time Library (Rtl)
|
# Run-Time Library (Rtl)
|
||||||
OBJECTS_RTL = \
|
OBJECTS_RTL = \
|
||||||
|
@ -97,7 +98,8 @@ OBJECTS_KE_I386 = \
|
||||||
ke/i386/syscall.o \
|
ke/i386/syscall.o \
|
||||||
ke/i386/tskswitch.o \
|
ke/i386/tskswitch.o \
|
||||||
ke/i386/v86m.o \
|
ke/i386/v86m.o \
|
||||||
ke/i386/v86m_sup.o
|
ke/i386/v86m_sup.o \
|
||||||
|
ke/i386/bios.o
|
||||||
|
|
||||||
# Memory Manager (Mm)
|
# Memory Manager (Mm)
|
||||||
OBJECTS_MM = \
|
OBJECTS_MM = \
|
||||||
|
|
|
@ -102,5 +102,7 @@ VOID KeInit1(VOID);
|
||||||
VOID KeInit2(VOID);
|
VOID KeInit2(VOID);
|
||||||
|
|
||||||
BOOLEAN KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
|
BOOLEAN KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
|
||||||
|
VOID
|
||||||
|
NtEarlyInitVdm(VOID);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -69,7 +69,10 @@ typedef struct _KV86M_REGISTERS
|
||||||
ULONG Vif;
|
ULONG Vif;
|
||||||
ULONG Flags;
|
ULONG Flags;
|
||||||
PNTSTATUS PStatus;
|
PNTSTATUS PStatus;
|
||||||
} KV86M_REGISTERS;
|
} KV86M_REGISTERS, *PKV86M_REGISTERS;
|
||||||
|
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
Ke386CallBios(UCHAR Int, PKV86M_REGISTERS Regs);
|
||||||
|
|
||||||
#else /* ASSEMBLER */
|
#else /* ASSEMBLER */
|
||||||
|
|
||||||
|
|
|
@ -35,13 +35,16 @@
|
||||||
|
|
||||||
#define TRAMPOLINE_BASE (0x10000)
|
#define TRAMPOLINE_BASE (0x10000)
|
||||||
|
|
||||||
|
extern VOID Ki386RetToV86Mode(PKV86M_REGISTERS InRegs,
|
||||||
|
PKV86M_REGISTERS OutRegs);
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
VOID
|
NTSTATUS STDCALL
|
||||||
Ke386CallBios(UCHAR Int, PKV86M_REGISTERS Regs)
|
Ke386CallBios(UCHAR Int, PKV86M_REGISTERS Regs)
|
||||||
{
|
{
|
||||||
PUCHAR Ip;
|
PUCHAR Ip;
|
||||||
KVM86_REGISTERS ORegs;
|
KV86M_REGISTERS ORegs;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -80,8 +83,8 @@ Ke386CallBios(UCHAR Int, PKV86M_REGISTERS Regs)
|
||||||
/*
|
/*
|
||||||
* Copy the return values back to the caller
|
* Copy the return values back to the caller
|
||||||
*/
|
*/
|
||||||
memcpy(Regs, &ORegs, sizeof(Regs));
|
memcpy(Regs, &ORegs, sizeof(KV86M_REGISTERS));
|
||||||
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include <internal/mm.h>
|
#include <internal/mm.h>
|
||||||
#include <internal/i386/segment.h>
|
#include <internal/i386/segment.h>
|
||||||
|
|
||||||
#define NDEBUG
|
//#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
@ -48,10 +48,189 @@ KeV86GPF(struct trap_frame* tf)
|
||||||
PUSHORT sp;
|
PUSHORT sp;
|
||||||
|
|
||||||
ip = (PUCHAR)((tf->cs & 0xFFFF) * 16 + (tf->eip & 0xFFFF));
|
ip = (PUCHAR)((tf->cs & 0xFFFF) * 16 + (tf->eip & 0xFFFF));
|
||||||
sp = (PUSHORT)((tf->ss0 & 0xFFFF) * 16 + (tf->esp & 0xFFFF));
|
sp = (PUSHORT)((tf->ss0 & 0xFFFF) * 16 + (tf->esp0 & 0xFFFF));
|
||||||
|
|
||||||
|
DPRINT("KeV86GPF handling %x at %x:%x ss:sp %x:%x\n",
|
||||||
|
ip[0], tf->cs, tf->eip, tf->ss0, tf->esp0);
|
||||||
|
|
||||||
switch (ip[0])
|
switch (ip[0])
|
||||||
{
|
{
|
||||||
|
/* sti */
|
||||||
|
case 0xFB:
|
||||||
|
if (tf->regs->Flags & KV86M_EMULATE_CLI_STI)
|
||||||
|
{
|
||||||
|
tf->eip++;
|
||||||
|
tf->regs->Vif = 1;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* cli */
|
||||||
|
case 0xFA:
|
||||||
|
if (tf->regs->Flags & KV86M_EMULATE_CLI_STI)
|
||||||
|
{
|
||||||
|
tf->eip++;
|
||||||
|
tf->regs->Vif = 0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* pushf */
|
||||||
|
case 0x9C:
|
||||||
|
if (tf->regs->Flags & KV86M_EMULATE_CLI_STI)
|
||||||
|
{
|
||||||
|
tf->eip++;
|
||||||
|
tf->esp0 = tf->esp0 - 2;
|
||||||
|
sp = sp - 1;
|
||||||
|
sp[0] = tf->eflags & 0xFFFF;
|
||||||
|
if (tf->regs->Vif)
|
||||||
|
{
|
||||||
|
sp[0] = sp[0] | INTERRUPT_FLAG;
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* popf */
|
||||||
|
case 0x9D:
|
||||||
|
if (tf->regs->Flags & KV86M_EMULATE_CLI_STI)
|
||||||
|
{
|
||||||
|
tf->eip++;
|
||||||
|
tf->eflags = tf->eflags & (~0xFFFF);
|
||||||
|
tf->eflags = tf->eflags | sp[0];
|
||||||
|
if (tf->eflags & INTERRUPT_FLAG)
|
||||||
|
{
|
||||||
|
tf->regs->Vif = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tf->regs->Vif = 0;
|
||||||
|
}
|
||||||
|
tf->eflags = tf->eflags & (~INTERRUPT_FLAG);
|
||||||
|
tf->esp0 = tf->esp0 + 2;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* iret */
|
||||||
|
case 0xCF:
|
||||||
|
if (tf->regs->Flags & KV86M_EMULATE_CLI_STI)
|
||||||
|
{
|
||||||
|
tf->eip = sp[0];
|
||||||
|
tf->cs = sp[1];
|
||||||
|
tf->eflags = tf->eflags & (~0xFFFF);
|
||||||
|
tf->eflags = tf->eflags | sp[2];
|
||||||
|
if (tf->eflags & INTERRUPT_FLAG)
|
||||||
|
{
|
||||||
|
tf->regs->Vif = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tf->regs->Vif = 0;
|
||||||
|
}
|
||||||
|
tf->eflags = tf->eflags & (~INTERRUPT_FLAG);
|
||||||
|
tf->esp0 = tf->esp0 + 6;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* out imm8, al */
|
||||||
|
case 0xE6:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)(ULONG)ip[1],
|
||||||
|
tf->eax & 0xFF);
|
||||||
|
tf->eip = tf->eip + 2;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* out imm8, ax */
|
||||||
|
case 0xE7:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
WRITE_PORT_USHORT((PUSHORT)(ULONG)ip[1], tf->eax & 0xFFFF);
|
||||||
|
tf->eip = tf->eip + 2;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* out dx, al */
|
||||||
|
case 0xEE:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)(tf->edx & 0xFFFF), tf->eax & 0xFF);
|
||||||
|
tf->eip = tf->eip + 1;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* out dx, ax */
|
||||||
|
case 0xEF:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
WRITE_PORT_USHORT((PUSHORT)(tf->edx & 0xFFFF), tf->eax & 0xFFFF);
|
||||||
|
tf->eip = tf->eip + 1;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* in al, imm8 */
|
||||||
|
case 0xE4:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
UCHAR v;
|
||||||
|
|
||||||
|
v = READ_PORT_UCHAR((PUCHAR)(ULONG)ip[1]);
|
||||||
|
tf->eax = tf->eax & (~0xFF);
|
||||||
|
tf->eax = tf->eax | v;
|
||||||
|
tf->eip = tf->eip + 2;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* in ax, imm8 */
|
||||||
|
case 0xE5:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
USHORT v;
|
||||||
|
|
||||||
|
v = READ_PORT_USHORT((PUSHORT)(ULONG)ip[1]);
|
||||||
|
tf->eax = tf->eax & (~0xFFFF);
|
||||||
|
tf->eax = tf->eax | v;
|
||||||
|
tf->eip = tf->eip + 2;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* in al, dx */
|
||||||
|
case 0xEC:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
UCHAR v;
|
||||||
|
|
||||||
|
v = READ_PORT_UCHAR((PUCHAR)(tf->edx & 0xFFFF));
|
||||||
|
tf->eax = tf->eax & (~0xFF);
|
||||||
|
tf->eax = tf->eax | v;
|
||||||
|
tf->eip = tf->eip + 1;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* in ax, dx */
|
||||||
|
case 0xED:
|
||||||
|
if (tf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
|
||||||
|
{
|
||||||
|
USHORT v;
|
||||||
|
|
||||||
|
v = READ_PORT_USHORT((PUSHORT)(tf->edx & 0xFFFF));
|
||||||
|
tf->eax = tf->eax & (~0xFFFF);
|
||||||
|
tf->eax = tf->eax | v;
|
||||||
|
tf->eip = tf->eip + 1;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
/* Int nn */
|
/* Int nn */
|
||||||
case 0xCD:
|
case 0xCD:
|
||||||
{
|
{
|
||||||
|
@ -62,7 +241,7 @@ KeV86GPF(struct trap_frame* tf)
|
||||||
entry = ((unsigned int *)0)[inum];
|
entry = ((unsigned int *)0)[inum];
|
||||||
|
|
||||||
tf->esp0 = tf->esp0 - 6;
|
tf->esp0 = tf->esp0 - 6;
|
||||||
sp = sp - 6;
|
sp = sp - 3;
|
||||||
|
|
||||||
sp[0] = (tf->eip & 0xFFFF) + 2;
|
sp[0] = (tf->eip & 0xFFFF) + 2;
|
||||||
sp[1] = tf->cs & 0xFFFF;
|
sp[1] = tf->cs & 0xFFFF;
|
||||||
|
@ -71,14 +250,20 @@ KeV86GPF(struct trap_frame* tf)
|
||||||
{
|
{
|
||||||
sp[2] = sp[2] | INTERRUPT_FLAG;
|
sp[2] = sp[2] | INTERRUPT_FLAG;
|
||||||
}
|
}
|
||||||
|
DPRINT("sp[0] %x sp[1] %x sp[2] %x\n", sp[0], sp[1], sp[2]);
|
||||||
tf->eip = entry & 0xFFFF;
|
tf->eip = entry & 0xFFFF;
|
||||||
tf->cs = entry >> 16;
|
tf->cs = entry >> 16;
|
||||||
tf->eflags = tf->eflags & (~TRAP_FLAG);
|
tf->eflags = tf->eflags & (~TRAP_FLAG);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
/* FIXME: Also emulate ins and outs */
|
||||||
|
/* FIXME: Handle opcode prefixes */
|
||||||
|
/* FIXME: Don't allow the BIOS to write to sensitive I/O ports */
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("V86GPF unhandled\n");
|
||||||
*tf->regs->PStatus = STATUS_NONCONTINUABLE_EXCEPTION;
|
*tf->regs->PStatus = STATUS_NONCONTINUABLE_EXCEPTION;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
@ -86,12 +271,15 @@ KeV86GPF(struct trap_frame* tf)
|
||||||
ULONG
|
ULONG
|
||||||
KeV86Exception(struct trap_frame* tf, ULONG address)
|
KeV86Exception(struct trap_frame* tf, ULONG address)
|
||||||
{
|
{
|
||||||
PVOID Ip;
|
PUCHAR Ip;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if we have reached the recovery instruction
|
* Check if we have reached the recovery instruction
|
||||||
*/
|
*/
|
||||||
Ip = (PVOID)((tf->cs & 0xFFFF) * 16 + (tf->eip & 0xFFFF));
|
Ip = (PUCHAR)((tf->cs & 0xFFFF) * 16 + (tf->eip & 0xFFFF));
|
||||||
|
DbgPrint("tf->type %d Ip[0] %x Ip[1] %x Ip[2] %x Ip[3] %x tf->cs %x "
|
||||||
|
"tf->eip %x\n", tf->type, Ip[0], Ip[1], Ip[2], Ip[3], tf->cs,
|
||||||
|
tf->eip);
|
||||||
if (tf->type == 6 &&
|
if (tf->type == 6 &&
|
||||||
memcmp(Ip, tf->regs->RecoveryInstruction, 4) == 0 &&
|
memcmp(Ip, tf->regs->RecoveryInstruction, 4) == 0 &&
|
||||||
(tf->cs * 16 + tf->eip) == tf->regs->RecoveryAddress)
|
(tf->cs * 16 + tf->eip) == tf->regs->RecoveryAddress)
|
||||||
|
@ -186,6 +374,7 @@ KeV86Exception(struct trap_frame* tf, ULONG address)
|
||||||
tf->error_code);
|
tf->error_code);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
DPRINT("V86Exception, halting due to page fault\n");
|
||||||
*tf->regs->PStatus = STATUS_NONCONTINUABLE_EXCEPTION;
|
*tf->regs->PStatus = STATUS_NONCONTINUABLE_EXCEPTION;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,7 @@ _Ki386RetToV86Mode:
|
||||||
* will be the current stack adjusted so we don't overwrite the
|
* will be the current stack adjusted so we don't overwrite the
|
||||||
* existing stack frames
|
* existing stack frames
|
||||||
*/
|
*/
|
||||||
|
movl $_KiTss, %esi
|
||||||
movl %esp, KTSS_ESP0(%esi)
|
movl %esp, KTSS_ESP0(%esi)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -120,10 +121,12 @@ _KiV86Complete:
|
||||||
popl KV86M_REGISTERS_EDI(%ebx)
|
popl KV86M_REGISTERS_EDI(%ebx)
|
||||||
popl KV86M_REGISTERS_ESI(%ebx)
|
popl KV86M_REGISTERS_ESI(%ebx)
|
||||||
popl KV86M_REGISTERS_EBP(%ebx)
|
popl KV86M_REGISTERS_EBP(%ebx)
|
||||||
|
addl $4, %esp /* Ignore ring0 esp */
|
||||||
popl KV86M_REGISTERS_EBX(%ebx)
|
popl KV86M_REGISTERS_EBX(%ebx)
|
||||||
popl KV86M_REGISTERS_EDX(%ebx)
|
popl KV86M_REGISTERS_EDX(%ebx)
|
||||||
popl KV86M_REGISTERS_ECX(%ebx)
|
popl KV86M_REGISTERS_ECX(%ebx)
|
||||||
popl KV86M_REGISTERS_EAX(%ebx)
|
popl KV86M_REGISTERS_EAX(%ebx)
|
||||||
|
addl $4, %esp /* Ignore trap code */
|
||||||
addl $16, %esp /* Ignore 32-bit segment registers */
|
addl $16, %esp /* Ignore 32-bit segment registers */
|
||||||
addl $4, %esp /* Ignore error code */
|
addl $4, %esp /* Ignore error code */
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: main.c,v 1.68 2000/12/23 02:37:40 dwelch Exp $
|
/* $Id: main.c,v 1.69 2000/12/26 05:32:44 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
#include <internal/mmhal.h>
|
#include <internal/mmhal.h>
|
||||||
#include <internal/i386/segment.h>
|
#include <internal/i386/segment.h>
|
||||||
#include <napi/shared_data.h>
|
#include <napi/shared_data.h>
|
||||||
|
#include <internal/v86m.h>
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
@ -361,7 +361,66 @@ InitSystemSharedUserPage (PCSZ ParameterLine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
extern NTSTATUS STDCALL
|
||||||
|
Ke386CallBios(UCHAR Int, KV86M_REGISTERS* Regs);
|
||||||
|
|
||||||
|
struct __attribute__((packed)) vesa_info
|
||||||
|
{
|
||||||
|
UCHAR Signature[4];
|
||||||
|
USHORT Version;
|
||||||
|
ULONG OEMName;
|
||||||
|
ULONG Capabilities;
|
||||||
|
ULONG SupportedModes;
|
||||||
|
USHORT TotalVideoMemory;
|
||||||
|
USHORT OEMVersion;
|
||||||
|
ULONG VendorName;
|
||||||
|
ULONG ProductName;
|
||||||
|
ULONG ProductRevisionString;
|
||||||
|
UCHAR Reserved[478];
|
||||||
|
};
|
||||||
|
|
||||||
|
VOID
|
||||||
|
TestV86Mode(VOID)
|
||||||
|
{
|
||||||
|
ULONG i;
|
||||||
|
extern UCHAR OrigIVT[1024];
|
||||||
|
KV86M_REGISTERS regs;
|
||||||
|
NTSTATUS Status;
|
||||||
|
struct vesa_info* vi;
|
||||||
|
|
||||||
|
for (i = 0; i < (640 / 4); i++)
|
||||||
|
{
|
||||||
|
MmCreateVirtualMapping(NULL,
|
||||||
|
(PVOID)(i * 4096),
|
||||||
|
PAGE_EXECUTE_READWRITE,
|
||||||
|
(ULONG)MmAllocPage(0));
|
||||||
|
}
|
||||||
|
for (; i < (1024 / 4); i++)
|
||||||
|
{
|
||||||
|
MmCreateVirtualMapping(NULL,
|
||||||
|
(PVOID)(i * 4096),
|
||||||
|
PAGE_EXECUTE_READ,
|
||||||
|
i * 4096);
|
||||||
|
}
|
||||||
|
vi = (struct vesa_info*)0x20000;
|
||||||
|
vi->Signature[0] = 'V';
|
||||||
|
vi->Signature[1] = 'B';
|
||||||
|
vi->Signature[2] = 'E';
|
||||||
|
vi->Signature[3] = '2';
|
||||||
|
memset(®s, 0, sizeof(regs));
|
||||||
|
regs.Eax = 0x4F00;
|
||||||
|
regs.Es = 0x2000;
|
||||||
|
regs.Edi = 0x0;
|
||||||
|
memcpy((PVOID)0x0, OrigIVT, 1024);
|
||||||
|
Status = Ke386CallBios(0x10, ®s);
|
||||||
|
DbgPrint("Finished (Status %x, CS:EIP %x:%x)\n", Status, regs.Cs,
|
||||||
|
regs.Eip);
|
||||||
|
DbgPrint("Eax %x\n", regs.Eax);
|
||||||
|
DbgPrint("Signature %.4s\n", vi->Signature);
|
||||||
|
DbgPrint("TotalVideoMemory %dKB\n", vi->TotalVideoMemory * 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
_main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock)
|
_main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Called by the boot loader to start the kernel
|
* FUNCTION: Called by the boot loader to start the kernel
|
||||||
|
@ -412,23 +471,28 @@ _main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock)
|
||||||
KeLowerIrql(DISPATCH_LEVEL);
|
KeLowerIrql(DISPATCH_LEVEL);
|
||||||
|
|
||||||
{
|
{
|
||||||
char tmpbuf[80];
|
char tmpbuf[80];
|
||||||
sprintf(tmpbuf,"system with %d MB extended memory\n"
|
sprintf(tmpbuf,"system with %d MB extended memory\n",
|
||||||
,(unsigned int)(KeLoaderBlock.MemLower)/1024);
|
(unsigned int)(KeLoaderBlock.MemLower)/1024);
|
||||||
HalDisplayString(tmpbuf);
|
HalDisplayString(tmpbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display version number and copyright/warranty message
|
* Display version number and copyright/warranty message
|
||||||
*/
|
*/
|
||||||
HalDisplayString("Starting ReactOS "KERNEL_VERSION_STR" (Build "KERNEL_VERSION_BUILD_STR")\n");
|
HalDisplayString("Starting ReactOS "KERNEL_VERSION_STR" (Build "
|
||||||
|
KERNEL_VERSION_BUILD_STR")\n");
|
||||||
HalDisplayString("Copyright 2000 (So who owns the copyright?).\n");
|
HalDisplayString("Copyright 2000 (So who owns the copyright?).\n");
|
||||||
HalDisplayString("ReactOS is free software, covered by the GNU General Public License, and you\n");
|
HalDisplayString("ReactOS is free software, covered by the GNU General "
|
||||||
HalDisplayString("are welcome to change it and/or distribute copies of it under certain\n");
|
"Public License, and you\n");
|
||||||
|
HalDisplayString("are welcome to change it and/or distribute copies of it "
|
||||||
|
"under certain\n");
|
||||||
HalDisplayString("conditions.\n");
|
HalDisplayString("conditions.\n");
|
||||||
HalDisplayString("There is absolutely no warranty for ReactOS.\n");
|
HalDisplayString("There is absolutely no warranty for ReactOS.\n");
|
||||||
|
|
||||||
last_kernel_address = KeLoaderModules[KeLoaderBlock.ModsCount - 1].ModEnd;
|
last_kernel_address = KeLoaderModules[KeLoaderBlock.ModsCount - 1].ModEnd;
|
||||||
|
|
||||||
|
NtEarlyInitVdm();
|
||||||
MmInit1(KeLoaderModules[0].ModStart - 0xc0000000 + 0x200000,
|
MmInit1(KeLoaderModules[0].ModStart - 0xc0000000 + 0x200000,
|
||||||
last_kernel_address - 0xc0000000 + 0x200000,
|
last_kernel_address - 0xc0000000 + 0x200000,
|
||||||
last_kernel_address);
|
last_kernel_address);
|
||||||
|
@ -521,8 +585,12 @@ _main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock)
|
||||||
/*
|
/*
|
||||||
* Launch initial process
|
* Launch initial process
|
||||||
*/
|
*/
|
||||||
|
#if 0
|
||||||
LdrLoadInitialProcess();
|
LdrLoadInitialProcess();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TestV86Mode();
|
||||||
|
|
||||||
DbgPrint("Finished main()\n");
|
DbgPrint("Finished main()\n");
|
||||||
PsTerminateSystemThread(STATUS_SUCCESS);
|
PsTerminateSystemThread(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: spinlock.c,v 1.5 2000/10/07 13:41:52 dwelch Exp $
|
/* $Id: spinlock.c,v 1.6 2000/12/26 05:32:44 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -73,6 +73,12 @@ KeAcquireSpinLockAtDpcLevel (PKSPIN_LOCK SpinLock)
|
||||||
{
|
{
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
|
if (!(SpinLock->Lock == 0 || SpinLock->Lock == 1))
|
||||||
|
{
|
||||||
|
DbgPrint("Lock %x has bad value %x\n", SpinLock, i);
|
||||||
|
KeBugCheck(0);
|
||||||
|
}
|
||||||
|
|
||||||
while ((i = InterlockedExchange(&SpinLock->Lock, 1)) == 1)
|
while ((i = InterlockedExchange(&SpinLock->Lock, 1)) == 1)
|
||||||
{
|
{
|
||||||
DbgPrint("Spinning on spinlock %x current value %x\n", SpinLock, i);
|
DbgPrint("Spinning on spinlock %x current value %x\n", SpinLock, i);
|
||||||
|
|
|
@ -31,10 +31,4 @@ NtDisplayString(IN PUNICODE_STRING DisplayString)
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL NtVdmControl(VOID)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
40
reactos/ntoskrnl/nt/vdm.c
Normal file
40
reactos/ntoskrnl/nt/vdm.c
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS kernel
|
||||||
|
* FILE: ntoskrnl/nt/vdm.c
|
||||||
|
* PURPOSE: Virtual DOS machine support
|
||||||
|
* PROGRAMMER: David Welch (welch@mcmail.com)
|
||||||
|
* UPDATE HISTORY:
|
||||||
|
* Created 22/05/98
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
|
||||||
|
#include <internal/debug.h>
|
||||||
|
|
||||||
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
|
/* static */ UCHAR OrigIVT[1024];
|
||||||
|
/* static UCHAR OrigBDA[]; */
|
||||||
|
/* static UCHAR OrigEBDA[]; */
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NtEarlyInitVdm(VOID)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Save various BIOS data tables. At this point the lower 4MB memory
|
||||||
|
* map is still active so we can just copy the data from low memory.
|
||||||
|
*/
|
||||||
|
memcpy(OrigIVT, (PVOID)0x0, 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtVdmControl(VOID)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntoskrnl.def,v 1.89 2000/10/08 12:43:56 ekohl Exp $
|
; $Id: ntoskrnl.def,v 1.90 2000/12/26 05:32:43 dwelch Exp $
|
||||||
;
|
;
|
||||||
; reactos/ntoskrnl/ntoskrnl.def
|
; reactos/ntoskrnl/ntoskrnl.def
|
||||||
;
|
;
|
||||||
|
@ -308,7 +308,7 @@ IofCompleteRequest@8
|
||||||
KdDebuggerEnabled DATA
|
KdDebuggerEnabled DATA
|
||||||
KdDebuggerNotPresent DATA
|
KdDebuggerNotPresent DATA
|
||||||
KdPollBreakIn@0
|
KdPollBreakIn@0
|
||||||
;Ke386CallBios
|
Ke386CallBios@8
|
||||||
;Ke386IoSetAccessProcess
|
;Ke386IoSetAccessProcess
|
||||||
;Ke386QueryIoAccessMap
|
;Ke386QueryIoAccessMap
|
||||||
;Ke386SetIoAccessMap
|
;Ke386SetIoAccessMap
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntoskrnl.edf,v 1.76 2000/10/08 12:43:56 ekohl Exp $
|
; $Id: ntoskrnl.edf,v 1.77 2000/12/26 05:32:43 dwelch Exp $
|
||||||
;
|
;
|
||||||
; reactos/ntoskrnl/ntoskrnl.def
|
; reactos/ntoskrnl/ntoskrnl.def
|
||||||
;
|
;
|
||||||
|
@ -308,7 +308,7 @@ IofCompleteRequest=IofCompleteRequest@8
|
||||||
KdDebuggerEnabled DATA
|
KdDebuggerEnabled DATA
|
||||||
KdDebuggerNotPresent DATA
|
KdDebuggerNotPresent DATA
|
||||||
KdPollBreakIn=KdPollBreakIn@0
|
KdPollBreakIn=KdPollBreakIn@0
|
||||||
;Ke386CallBios
|
Ke386CallBios=Ke386CallBios@8
|
||||||
;Ke386IoSetAccessProcess
|
;Ke386IoSetAccessProcess
|
||||||
;Ke386QueryIoAccessMap
|
;Ke386QueryIoAccessMap
|
||||||
;Ke386SetIoAccessMap
|
;Ke386SetIoAccessMap
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: thread.c,v 1.63 2000/12/24 03:35:54 dwelch Exp $
|
/* $Id: thread.c,v 1.64 2000/12/26 05:32:44 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -627,9 +627,10 @@ NtCallbackReturn (PVOID Result,
|
||||||
ULONG ResultLength,
|
ULONG ResultLength,
|
||||||
NTSTATUS Status)
|
NTSTATUS Status)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
NtW32Call (IN ULONG RoutineIndex,
|
NtW32Call (IN ULONG RoutineIndex,
|
||||||
IN PVOID Argument,
|
IN PVOID Argument,
|
||||||
|
@ -637,7 +638,7 @@ NtW32Call (IN ULONG RoutineIndex,
|
||||||
OUT PVOID* Result OPTIONAL,
|
OUT PVOID* Result OPTIONAL,
|
||||||
OUT PULONG ResultLength OPTIONAL)
|
OUT PULONG ResultLength OPTIONAL)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
|
|
Loading…
Reference in a new issue