- Add Ke386SetInterruptDescriptorTable inlined function to set the IDT.

- Rename and fixup initial stacks, instead of using 16 different variables all with confusining meanings and values. Define P0BootStack as the initial kernel stack, and KiDoubleFaultStack as the double-fault trap (and initial DPC) stack.
- Fix call to KiInitializePcr which was setting an incorrect DPC stack.
- Make space on the initial stack for a KTRAP_FRAME as well, not only for the FPU save area.
- Also push initial CR0 NPX state on the initial stack.
- Load the IDT and GDT directly in KiRosPrepareForSystemStartup.
- Completely rewrite main_asm.S in Intel syntax and clean it up.

svn path=/trunk/; revision=23901
This commit is contained in:
Alex Ionescu 2006-09-03 19:57:55 +00:00
parent 4eebe5e53f
commit c65323691c
10 changed files with 56 additions and 64 deletions

View file

@ -493,6 +493,11 @@ Author:
// Kernel Feature Bits // Kernel Feature Bits
// //
#define KF_RDTSC 0x00000002 #define KF_RDTSC 0x00000002
//
// Kernel Stack Size
//
#define KERNEL_STACK_SIZE 0x3000
#endif #endif
// //

View file

@ -145,6 +145,10 @@ KiThreadStartup(PKSYSTEM_ROUTINE SystemRoutine,
__asm__("lldt %0\n\t" \ __asm__("lldt %0\n\t" \
: /* no outputs */ \ : /* no outputs */ \
: "m" (X)); : "m" (X));
#define Ke386SetInterruptDescriptorTable(X) \
__asm__("lidt %0\n\t" \
: /* no outputs */ \
: "m" (X));
#define Ke386SetGlobalDescriptorTable(X) \ #define Ke386SetGlobalDescriptorTable(X) \
__asm__("lgdt %0\n\t" \ __asm__("lgdt %0\n\t" \
: /* no outputs */ \ : /* no outputs */ \

View file

@ -96,7 +96,11 @@ extern ULONG KeI386EFlagsOrMaskV86;
extern BOOLEAN KeI386VirtualIntExtensions; extern BOOLEAN KeI386VirtualIntExtensions;
extern KIDTENTRY KiIdt[]; extern KIDTENTRY KiIdt[];
extern KGDTENTRY KiBootGdt[]; extern KGDTENTRY KiBootGdt[];
extern KDESCRIPTOR KiGdtDescriptor;
extern KDESCRIPTOR KiIdtDescriptor;
extern KTSS KiBootTss; extern KTSS KiBootTss;
extern UCHAR P0BootStack[];
extern UCHAR KiDoubleFaultStack[];
extern FAST_MUTEX KernelAddressSpaceLock; extern FAST_MUTEX KernelAddressSpaceLock;
extern ULONG KiMaximumDpcQueueDepth; extern ULONG KiMaximumDpcQueueDepth;
extern ULONG KiMinimumDpcRate; extern ULONG KiMinimumDpcRate;
@ -119,7 +123,6 @@ extern KEVENT KiSwapEvent;
extern PKPRCB KiProcessorBlock[]; extern PKPRCB KiProcessorBlock[];
extern ULONG KiMask32Array[MAXIMUM_PRIORITY]; extern ULONG KiMask32Array[MAXIMUM_PRIORITY];
extern ULONG IdleProcessorMask; extern ULONG IdleProcessorMask;
extern ULONG trap_stack_top;
extern VOID KiTrap8(VOID); extern VOID KiTrap8(VOID);
extern VOID KiTrap2(VOID); extern VOID KiTrap2(VOID);

View file

@ -582,7 +582,7 @@ Ki386InitializeTss(VOID)
Tss = (PKTSS)KiDoubleFaultTSS; Tss = (PKTSS)KiDoubleFaultTSS;
KiInitializeTSS(Tss); KiInitializeTSS(Tss);
Tss->CR3 = _Ke386GetCr(3); Tss->CR3 = _Ke386GetCr(3);
Tss->Esp0 = trap_stack_top; Tss->Esp0 = PtrToUlong(KiDoubleFaultStack);
Tss->Eip = PtrToUlong(KiTrap8); Tss->Eip = PtrToUlong(KiTrap8);
Tss->Cs = KGDT_R0_CODE; Tss->Cs = KGDT_R0_CODE;
Tss->Fs = KGDT_R0_PCR; Tss->Fs = KGDT_R0_PCR;
@ -613,7 +613,7 @@ Ki386InitializeTss(VOID)
Tss = (PKTSS)KiNMITSS; Tss = (PKTSS)KiNMITSS;
KiInitializeTSS(Tss); KiInitializeTSS(Tss);
Tss->CR3 = _Ke386GetCr(3); Tss->CR3 = _Ke386GetCr(3);
Tss->Esp0 = trap_stack_top; Tss->Esp0 = PtrToUlong(KiDoubleFaultStack);
Tss->Eip = PtrToUlong(KiTrap2); Tss->Eip = PtrToUlong(KiTrap2);
Tss->Cs = KGDT_R0_CODE; Tss->Cs = KGDT_R0_CODE;
Tss->Fs = KGDT_R0_PCR; Tss->Fs = KGDT_R0_PCR;

View file

@ -26,7 +26,7 @@ ETHREAD KiInitialThread;
EPROCESS KiInitialProcess; EPROCESS KiInitialProcess;
extern ULONG Ke386GlobalPagesEnabled; extern ULONG Ke386GlobalPagesEnabled;
extern PVOID trap_stack, init_stack; extern PVOID trap_stack;
/* System-defined Spinlocks */ /* System-defined Spinlocks */
KSPIN_LOCK KiDispatcherLock; KSPIN_LOCK KiDispatcherLock;
@ -514,7 +514,7 @@ KiSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
KiBootGdt, KiBootGdt,
&KiBootTss, &KiBootTss,
&KiInitialThread.Tcb, &KiInitialThread.Tcb,
trap_stack); KiDoubleFaultStack);
/* Set us as the current process */ /* Set us as the current process */
KiInitialThread.Tcb.ApcState.Process = &KiInitialProcess.Pcb; KiInitialThread.Tcb.ApcState.Process = &KiInitialProcess.Pcb;
@ -554,7 +554,7 @@ AppCpuInit:
/* Call main kernel intialization */ /* Call main kernel intialization */
KiInitializeKernel(&KiInitialProcess.Pcb, KiInitializeKernel(&KiInitialProcess.Pcb,
&KiInitialThread.Tcb, &KiInitialThread.Tcb,
init_stack, P0BootStack,
Prcb, Prcb,
Cpu, Cpu,
LoaderBlock); LoaderBlock);

View file

@ -1,46 +1,45 @@
#include <roscfg.h> /*
#include <ndk/asm.h> * FILE: ntoskrnl/ke/i386/main_asm.S
* COPYRIGHT: See COPYING in the top level directory
* PURPOSE: Kernel Bootstrap Code
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
*/
#define AP_MAGIC (0x12481020) /* INCLUDES ******************************************************************/
.global _kernel_stack #include <asm.h>
.global _kernel_stack_top .intel_syntax noprefix
.global _kernel_trap_stack
.global _kernel_trap_stack_top
.globl _NtProcessStartup /* GLOBALS *******************************************************************/
.bss .bss
.align 4096 .align 16
/* Kernel Boot Stack */
.globl _P0BootStack
.space KERNEL_STACK_SIZE
_P0BootStack:
/* guard page for the kernel stack */ /* Kernel Double-Fault and Temporary DPC Stack */
.fill 4096, 1, 0 .globl _KiDoubleFaultStack
.space KERNEL_STACK_SIZE
_KiDoubleFaultStack:
_kernel_stack: /* FUNCTIONS *****************************************************************/
.fill 3*4096, 1, 0
_kernel_stack_top:
/* guard page for the trap stack */
.fill 4096, 1, 0
_kernel_trap_stack:
.fill 3*4096, 1, 0
_kernel_trap_stack_top:
.text .text
.func NtProcessStartup
_NtProcessStartup: _NtProcessStartup:
/* FIXME: Application processors should have their own GDT/IDT */
lgdt _KiGdtDescriptor
lidt _KiIdtDescriptor
/* Load the initial kernel stack */ /* Load the initial kernel stack */
lea _kernel_stack_top, %eax lea eax, _P0BootStack
sub $(SIZEOF_FX_SAVE_AREA), %eax sub eax, (NPX_FRAME_LENGTH + KTRAP_FRAME_LENGTH + KTRAP_FRAME_ALIGN)
movl %eax, %esp mov esp, eax
/* Save initial CR0 state */
push CR0_EM + CR0_TS + CR0_MP
/* Call the main kernel initialization */ /* Call the main kernel initialization */
pushl %edx push edx
call _KiRosPrepareForSystemStartup@4 call _KiRosPrepareForSystemStartup@4
.endfunc

View file

@ -86,9 +86,6 @@ _KiUnexpectedEntrySize:
_UnexpectedMsg: _UnexpectedMsg:
.asciz "\n\x7\x7!!! Unexpected Interrupt %02lx !!!\n" .asciz "\n\x7\x7!!! Unexpected Interrupt %02lx !!!\n"
Broken:
.asciz "\n\x7\x7!!! Broken TrapFrame. Magic: %08lx MagicB: %08lx!!!\n"
/* SOFTWARE INTERRUPT SERVICES ***********************************************/ /* SOFTWARE INTERRUPT SERVICES ***********************************************/
_KiGetTickCount: _KiGetTickCount:

View file

@ -48,18 +48,6 @@ PVOID KeRaiseUserExceptionDispatcher = NULL;
ULONG KeLargestCacheLine = 0x40; /* FIXME: Arch-specific */ ULONG KeLargestCacheLine = 0x40; /* FIXME: Arch-specific */
/* the initial stacks are declared in main_asm.S */
extern ULONG kernel_stack;
extern ULONG kernel_stack_top;
extern ULONG kernel_trap_stack;
extern ULONG kernel_trap_stack_top;
/* These point to the aligned 3 pages */
ULONG init_stack = (ULONG)&kernel_stack;
ULONG init_stack_top = (ULONG)&kernel_stack_top;
ULONG trap_stack = (ULONG)&kernel_trap_stack;
ULONG trap_stack_top = (ULONG)&kernel_trap_stack_top;
/* Cached modules from the loader block */ /* Cached modules from the loader block */
PLOADER_MODULE CachedModules[MaximumCachedModuleType]; PLOADER_MODULE CachedModules[MaximumCachedModuleType];
@ -97,6 +85,10 @@ KiRosPrepareForSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
PIMAGE_OPTIONAL_HEADER OptHead; PIMAGE_OPTIONAL_HEADER OptHead;
CHAR* s; CHAR* s;
/* Load the GDT and IDT */
Ke386SetGlobalDescriptorTable(KiGdtDescriptor);
Ke386SetInterruptDescriptorTable(KiIdtDescriptor);
/* Copy the Loader Block Data locally since Low-Memory will be wiped */ /* Copy the Loader Block Data locally since Low-Memory will be wiped */
memcpy(&KeLoaderBlock, LoaderBlock, sizeof(ROS_LOADER_PARAMETER_BLOCK)); memcpy(&KeLoaderBlock, LoaderBlock, sizeof(ROS_LOADER_PARAMETER_BLOCK));
memcpy(&KeLoaderModules[1], memcpy(&KeLoaderModules[1],

View file

@ -36,10 +36,6 @@ PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
PVOID MiNonPagedPoolStart; PVOID MiNonPagedPoolStart;
ULONG MiNonPagedPoolLength; ULONG MiNonPagedPoolLength;
extern ULONG init_stack;
extern ULONG init_stack_top;
extern ULONG trap_stack;
VOID INIT_FUNCTION NTAPI MmInitVirtualMemory(ULONG_PTR LastKernelAddress, ULONG KernelLength); VOID INIT_FUNCTION NTAPI MmInitVirtualMemory(ULONG_PTR LastKernelAddress, ULONG KernelLength);
#if defined (ALLOC_PRAGMA) #if defined (ALLOC_PRAGMA)
@ -394,10 +390,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
AddressRangeCount); AddressRangeCount);
kernel_len = LastKrnlPhysAddr - FirstKrnlPhysAddr; kernel_len = LastKrnlPhysAddr - FirstKrnlPhysAddr;
/* Unmap the guard pages from the initial stacks */
MmDeleteVirtualMapping(NULL, (PVOID)(init_stack - PAGE_SIZE), FALSE, NULL, NULL);
MmDeleteVirtualMapping(NULL, (PVOID)(trap_stack - PAGE_SIZE), FALSE, NULL, NULL);
/* /*
* Unmap low memory * Unmap low memory
*/ */

View file

@ -59,19 +59,19 @@ PsInitializeIdleOrFirstThread(PEPROCESS Process,
BOOLEAN First) BOOLEAN First)
{ {
PETHREAD Thread; PETHREAD Thread;
ULONG_PTR KernelStack; PVOID KernelStack;
extern unsigned int init_stack_top;
Thread = ExAllocatePool(NonPagedPool, sizeof(ETHREAD)); Thread = ExAllocatePool(NonPagedPool, sizeof(ETHREAD));
RtlZeroMemory(Thread, sizeof(ETHREAD)); RtlZeroMemory(Thread, sizeof(ETHREAD));
Thread->ThreadsProcess = Process; Thread->ThreadsProcess = Process;
if (First) if (First)
{ {
KernelStack = init_stack_top; KernelStack = P0BootStack;
} }
else else
{ {
KernelStack = (ULONG_PTR)MmCreateKernelStack(FALSE) + KERNEL_STACK_SIZE; KernelStack = (PVOID)((ULONG_PTR)MmCreateKernelStack(FALSE) +
KERNEL_STACK_SIZE);
} }
KeInitializeThread(&Process->Pcb, KeInitializeThread(&Process->Pcb,
&Thread->Tcb, &Thread->Tcb,
@ -80,7 +80,7 @@ PsInitializeIdleOrFirstThread(PEPROCESS Process,
NULL, NULL,
NULL, NULL,
NULL, NULL,
(PVOID)KernelStack); KernelStack);
InitializeListHead(&Thread->IrpList); InitializeListHead(&Thread->IrpList);
*ThreadPtr = Thread; *ThreadPtr = Thread;
return STATUS_SUCCESS; return STATUS_SUCCESS;