Switch kernel stack and move boot structures initialization into separate routine
All checks were successful
ci/woodpecker/push/build Pipeline was successful
All checks were successful
ci/woodpecker/push/build Pipeline was successful
This commit is contained in:
parent
6255165f10
commit
12b8c5f539
@ -12,6 +12,7 @@ list(APPEND XTOSKRNL_SOURCE
|
|||||||
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/cpufunc.c
|
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/cpufunc.c
|
||||||
${XTOSKRNL_SOURCE_DIR}/ke/globals.c
|
${XTOSKRNL_SOURCE_DIR}/ke/globals.c
|
||||||
${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c
|
${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c
|
||||||
|
${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/krnlinit.c
|
||||||
${XTOSKRNL_SOURCE_DIR}/rtl/memory.c
|
${XTOSKRNL_SOURCE_DIR}/rtl/memory.c
|
||||||
${XTOSKRNL_SOURCE_DIR}/rtl/plist.c
|
${XTOSKRNL_SOURCE_DIR}/rtl/plist.c
|
||||||
${XTOSKRNL_SOURCE_DIR}/rtl/string.c
|
${XTOSKRNL_SOURCE_DIR}/rtl/string.c
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#ifndef __XTOSKRNL_GLOBALS_H
|
#ifndef __XTOSKRNL_GLOBALS_H
|
||||||
#define __XTOSKRNL_GLOBALS_H
|
#define __XTOSKRNL_GLOBALS_H
|
||||||
|
|
||||||
#include <xtkmapi.h>
|
#include <xtos.h>
|
||||||
|
|
||||||
|
|
||||||
/* Kernel initialization block passed by boot loader */
|
/* Kernel initialization block passed by boot loader */
|
||||||
|
27
xtoskrnl/includes/kepfuncs.h
Normal file
27
xtoskrnl/includes/kepfuncs.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: xtoskrnl/includes/kefuncs.h
|
||||||
|
* DESCRIPTION: Private routine definitions for kernel services
|
||||||
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __XTOSKRNL_KEFUNCS_H
|
||||||
|
#define __XTOSKRNL_KEFUNCS_H
|
||||||
|
|
||||||
|
#include <xtos.h>
|
||||||
|
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepStartKernel(VOID);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepInitializeBootStructures(IN PKERNEL_INITIALIZATION_BLOCK Parameters);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepSwitchBootStack(IN ULONG_PTR Stack);
|
||||||
|
|
||||||
|
#endif /* __XTOSKRNL_KEFUNCS_H */
|
@ -11,3 +11,4 @@
|
|||||||
|
|
||||||
/* Kernel specific headers */
|
/* Kernel specific headers */
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
|
#include "kepfuncs.h"
|
||||||
|
48
xtoskrnl/ke/amd64/krnlinit.c
Normal file
48
xtoskrnl/ke/amd64/krnlinit.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: xtoskrnl/ke/amd64/krnlinit.c
|
||||||
|
* DESCRIPTION: CPU architecture specific kernel initialization
|
||||||
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtos.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine starts up the XT kernel. It is called after switching boot stack.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepStartKernel(VOID)
|
||||||
|
{
|
||||||
|
LdrPrint(L"Hello from new kernel stack!\n");
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switches to a new kernel boot stack.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepSwitchBootStack(IN ULONG_PTR Stack)
|
||||||
|
{
|
||||||
|
/* Discard old stack frame, switch stack and jump to KepStartKernel() */
|
||||||
|
asm volatile("mov %0, %%rdx\n"
|
||||||
|
"xor %%rbp, %%rbp\n"
|
||||||
|
"mov %%rdx, %%rsp\n"
|
||||||
|
"sub %1, %%rsp\n"
|
||||||
|
"jmp KepStartKernel\n"
|
||||||
|
:
|
||||||
|
: "m" (Stack),
|
||||||
|
"i" (FLOATING_SAVE_AREA_SIZE | KEXCEPTION_FRAME_SIZE | KSWITCH_FRAME_SIZE),
|
||||||
|
"p" (KepStartKernel));
|
||||||
|
}
|
50
xtoskrnl/ke/i686/krnlinit.c
Normal file
50
xtoskrnl/ke/i686/krnlinit.c
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: xtoskrnl/ke/i686/krnlinit.c
|
||||||
|
* DESCRIPTION: CPU architecture specific kernel initialization
|
||||||
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtos.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine starts up the XT kernel. It is called after switching boot stack.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepStartKernel(VOID)
|
||||||
|
{
|
||||||
|
LdrPrint(L"Hello from new kernel stack!\n");
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switches to a new kernel boot stack.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepSwitchBootStack(IN ULONG_PTR Stack)
|
||||||
|
{
|
||||||
|
/* Discard old stack frame, switch stack, make space for NPX and jump to KepStartKernel() */
|
||||||
|
asm volatile("mov %0, %%edx\n"
|
||||||
|
"xor %%ebp, %%ebp\n"
|
||||||
|
"mov %%edx, %%esp\n"
|
||||||
|
"sub %1, %%esp\n"
|
||||||
|
"push %2\n"
|
||||||
|
"jmp _KepStartKernel@0\n"
|
||||||
|
:
|
||||||
|
: "m" (Stack),
|
||||||
|
"i" (KTRAP_FRAME_ALIGN | KTRAP_FRAME_SIZE | NPX_FRAME_SIZE),
|
||||||
|
"i" (CR0_EM | CR0_MP | CR0_TS),
|
||||||
|
"p" (KepStartKernel));
|
||||||
|
}
|
@ -45,6 +45,27 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize kernel boot structures */
|
||||||
|
KepInitializeBootStructures(Parameters);
|
||||||
|
|
||||||
|
/* Switch boot stack alligning it to 4 byte boundary */
|
||||||
|
KepSwitchBootStack(KeInitializationBlock->KernelBootStack & ~0x3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes boot structures needed by the kernel startup code.
|
||||||
|
*
|
||||||
|
* @param Parameters
|
||||||
|
* Supplies a pointer to memory area containing parameters passed to kernel by bootloader.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
KepInitializeBootStructures(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
|
||||||
|
{
|
||||||
/* Make sure kernel boot stack is initialized */
|
/* Make sure kernel boot stack is initialized */
|
||||||
if(!Parameters->KernelBootStack)
|
if(!Parameters->KernelBootStack)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user