diff --git a/sdk/xtdk/ketypes.h b/sdk/xtdk/ketypes.h index 9bc7d2f..8b63870 100644 --- a/sdk/xtdk/ketypes.h +++ b/sdk/xtdk/ketypes.h @@ -39,6 +39,10 @@ #define KTIMER_WAIT_BLOCK 3 #define SEMAPHORE_WAIT_BLOCK 2 +/* Quantum values */ +#define READY_SKIP_QUANTUM 2 +#define THREAD_QUANTUM 6 + /* Adjust reason */ typedef enum _ADJUST_REASON { @@ -96,6 +100,17 @@ typedef enum _KOBJECTS MaximumKernelObject = 25 } KOBJECTS, *PKOBJECTS; +/* Process states */ +typedef enum _KPROCESS_STATE +{ + ProcessInMemory, + ProcessOutOfMemory, + ProcessInTransition, + ProcessOutTransition, + ProcessInSwap, + ProcessOutSwap +} KPROCESS_STATE, *PKPROCESS_STATE; + /* Thread state */ typedef enum _KTHREAD_STATE { @@ -252,6 +267,13 @@ typedef struct _KWAIT_BLOCK /* Process control block structure definition */ typedef struct _KPROCESS { + DISPATCHER_HEADER Header; + LIST_ENTRY ProfileListHead; + ULONG_PTR DirectoryTable[2]; + USHORT IopmOffset; + LIST_ENTRY ReadyListHead; + LIST_ENTRY ThreadListHead; + KAFFINITY Affinity; union { struct @@ -263,6 +285,10 @@ typedef struct _KPROCESS }; LONG ProcessFlags; }; + SCHAR BasePriority; + SCHAR Quantum; + UCHAR State; + ULONG_PTR StackCount; } KPROCESS, *PKPROCESS; /* Thread control block structure definition */ diff --git a/sdk/xtdk/xtbase.h b/sdk/xtdk/xtbase.h index 13f9a64..d733cc1 100644 --- a/sdk/xtdk/xtbase.h +++ b/sdk/xtdk/xtbase.h @@ -14,6 +14,9 @@ #include +/* Kernel affinity */ +typedef ULONG_PTR KAFFINITY, *PKAFFINITY; + /* Interrupt Request Level (IRQL) */ typedef UCHAR KIRQL, *PKIRQL; diff --git a/sdk/xtdk/xtdefs.h b/sdk/xtdk/xtdefs.h index 1559748..d29a1c5 100644 --- a/sdk/xtdk/xtdefs.h +++ b/sdk/xtdk/xtdefs.h @@ -30,6 +30,14 @@ #define NULL ((PVOID) 0) #define NULL64 ((VOID * PVOID) 0) +/* Type limits */ +#define MINCHAR 0x80 +#define MAXCHAR 0x7F +#define MINSHORT 0x8000 +#define MAXSHORT 0x7FFF +#define MINLONG 0x80000000 +#define MAXLONG 0x7FFFFFFF + /* Preprocessor macros for defining a structure alignment and packing */ #define ALIGN(x) __attribute__((aligned(x))) #define PACK __attribute__((packed)) diff --git a/sdk/xtdk/xtstruct.h b/sdk/xtdk/xtstruct.h index 820f6c6..88f59ba 100644 --- a/sdk/xtdk/xtstruct.h +++ b/sdk/xtdk/xtstruct.h @@ -40,6 +40,7 @@ typedef enum _EFI_UART_STOP_BITS_TYPE EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_B typedef enum _EFI_UNIVERSA_GRAPHICS_BLT_OPERATION EFI_UNIVERSA_GRAPHICS_BLT_OPERATION, *PEFI_UNIVERSA_GRAPHICS_BLT_OPERATION; typedef enum _KAPC_ENVIRONMENT KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT; typedef enum _KOBJECTS KOBJECTS, *PKOBJECTS; +typedef enum _KPROCESS_STATE KPROCESS_STATE, *PKPROCESS_STATE; typedef enum _KTHREAD_STATE KTHREAD_STATE, *PKTHREAD_STATE; typedef enum _KTIMER_TYPE KTIMER_TYPE, *PKTIMER_TYPE; typedef enum _LOADER_MEMORY_TYPE LOADER_MEMORY_TYPE, *PLOADER_MEMORY_TYPE; diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index a6ffad3..1927736 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -18,6 +18,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/ioport.c ${XTOSKRNL_SOURCE_DIR}/ke/apc.c ${XTOSKRNL_SOURCE_DIR}/ke/globals.c + ${XTOSKRNL_SOURCE_DIR}/ke/kprocess.c ${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c ${XTOSKRNL_SOURCE_DIR}/ke/kthread.c ${XTOSKRNL_SOURCE_DIR}/ke/semphore.c diff --git a/xtoskrnl/includes/kepfuncs.h b/xtoskrnl/includes/kepfuncs.h index b090ea3..5820991 100644 --- a/xtoskrnl/includes/kepfuncs.h +++ b/xtoskrnl/includes/kepfuncs.h @@ -12,6 +12,14 @@ #include +XTAPI +VOID +KeInitializeProcess(IN OUT PKPROCESS Process, + IN KPRIORITY Priority, + IN KAFFINITY Affinity, + IN PULONG_PTR DirectoryTable, + IN BOOLEAN Alignment); + XTAPI XTSTATUS KeInitializeThread(IN PKTHREAD Thread, diff --git a/xtoskrnl/ke/kprocess.c b/xtoskrnl/ke/kprocess.c new file mode 100644 index 0000000..30a6d41 --- /dev/null +++ b/xtoskrnl/ke/kprocess.c @@ -0,0 +1,69 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/kprocess.c + * DESCRIPTION: XT kernel process manipulation support + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Initializes the process. + * + * @param Process + * Supplies a pointer to process that will be initialized. + * + * @param Priority + * Specifies the process priority. + * + * @param Affinity + * Specifies a process affinity designating processors on which process can run. + * + * @param DirectoryTable + * Supplies a pointer to the directory table. + * + * @param Alignment + * Specifies the exceptions alignment of the process. + * + * @return This routine does not return any value. + * + * @since NT 3.5 + */ +XTAPI +VOID +KeInitializeProcess(IN OUT PKPROCESS Process, + IN KPRIORITY Priority, + IN KAFFINITY Affinity, + IN PULONG_PTR DirectoryTable, + IN BOOLEAN Alignment) +{ + /* Initialize process dispatcher header */ + Process->Header.Type = ProcessObject; + + /* Initialize process wait list */ + RtlInitializeListHead(&Process->Header.WaitListHead); + + /* Initialize process list heads */ + RtlInitializeListHead(&Process->ProfileListHead); + RtlInitializeListHead(&Process->ReadyListHead); + RtlInitializeListHead(&Process->ThreadListHead); + + /* Set base process properties */ + Process->BasePriority = Priority; + Process->Affinity = Affinity; + Process->AutoAlignment = Alignment; + Process->DirectoryTable[0] = DirectoryTable[0]; + Process->DirectoryTable[1] = DirectoryTable[1]; + Process->StackCount = MAXSHORT; + + /* Set thread quantum */ + Process->Quantum = THREAD_QUANTUM; + + /* Set IOPM offset */ + Process->IopmOffset = sizeof(KTSS); + + /* Set initial process state */ + Process->State = ProcessInMemory; +}