diff --git a/sdk/xtdk/amd64/ketypes.h b/sdk/xtdk/amd64/ketypes.h index 08e616f..80106ba 100644 --- a/sdk/xtdk/amd64/ketypes.h +++ b/sdk/xtdk/amd64/ketypes.h @@ -142,6 +142,10 @@ /* XTOS Kernel stack guard pages */ #define KERNEL_STACK_GUARD_PAGES 1 +/* Processor structures size */ +#define KPROCESSOR_STRUCTURES_SIZE ((2 * KERNEL_STACK_SIZE) + sizeof(ArInitialGdt) + sizeof(ArInitialTss) + \ + sizeof(ArInitialProcessorBlock) + MM_PAGE_SIZE) + /* Kernel frames */ #define KEXCEPTION_FRAME_SIZE sizeof(KEXCEPTION_FRAME) #define KSWITCH_FRAME_SIZE sizeof(KSWITCH_FRAME) diff --git a/sdk/xtdk/i686/ketypes.h b/sdk/xtdk/i686/ketypes.h index 98cf3f1..87c6b60 100644 --- a/sdk/xtdk/i686/ketypes.h +++ b/sdk/xtdk/i686/ketypes.h @@ -168,6 +168,10 @@ /* XTOS Kernel stack guard pages */ #define KERNEL_STACK_GUARD_PAGES 1 +/* Processor structures size */ +#define KPROCESSOR_STRUCTURES_SIZE ((2 * KERNEL_STACK_SIZE) + sizeof(ArInitialGdt) + sizeof(ArInitialTss) + \ + sizeof(ArInitialProcessorBlock) + MM_PAGE_SIZE) + /* Kernel frames */ #define KTRAP_FRAME_ALIGN 0x08 #define KTRAP_FRAME_SIZE sizeof(KTRAP_FRAME) diff --git a/xtoskrnl/includes/globals.h b/xtoskrnl/includes/globals.h index e6287e0..fc8cd92 100644 --- a/xtoskrnl/includes/globals.h +++ b/xtoskrnl/includes/globals.h @@ -60,4 +60,7 @@ EXTERN LOADER_MEMORY_MAPPING MmOldFreeDescriptor; /* Page Map Level */ EXTERN ULONG MmPageMapLevel; +/* Processor structures data (THIS IS A TEMPORARY HACK) */ +EXTERN UCHAR MmProcessorStructuresData[MAXIMUM_PROCESSORS - 1][KPROCESSOR_STRUCTURES_SIZE]; + #endif /* __XTOSKRNL_GLOBALS_H */ diff --git a/xtoskrnl/includes/mmi.h b/xtoskrnl/includes/mmi.h index 86b3040..d027abd 100644 --- a/xtoskrnl/includes/mmi.h +++ b/xtoskrnl/includes/mmi.h @@ -19,11 +19,20 @@ MmAllocateKernelStack(IN PVOID *Stack, IN BOOLEAN LargeStack, IN UCHAR SystemNode); +XTAPI +XTSTATUS +MmAllocateProcessorStructures(IN ULONG CpuNumber, + OUT PVOID *StructuresData); + XTAPI VOID MmFreeKernelStack(IN PVOID Stack, IN BOOLEAN LargeStack); +XTAPI +VOID +MmFreeProcessorStructures(IN PVOID StructuresData); + XTAPI VOID MmInitializeMemoryManager(VOID); diff --git a/xtoskrnl/mm/globals.c b/xtoskrnl/mm/globals.c index 0a7487f..203a812 100644 --- a/xtoskrnl/mm/globals.c +++ b/xtoskrnl/mm/globals.c @@ -26,3 +26,6 @@ LOADER_MEMORY_MAPPING MmOldFreeDescriptor; /* Page Map Level */ ULONG MmPageMapLevel; + +/* Processor structures data (THIS IS A TEMPORARY HACK) */ +UCHAR MmProcessorStructuresData[MAXIMUM_PROCESSORS - 1][KPROCESSOR_STRUCTURES_SIZE] = {0}; diff --git a/xtoskrnl/mm/kpools.c b/xtoskrnl/mm/kpools.c index d172bc2..5acea49 100644 --- a/xtoskrnl/mm/kpools.c +++ b/xtoskrnl/mm/kpools.c @@ -35,6 +35,51 @@ MmAllocateKernelStack(IN PVOID *Stack, return STATUS_NOT_IMPLEMENTED; } +/** + * Allocates a buffer for structures needed by a processor and assigns it to a corresponding CPU. + * + * @param CpuNumber + * Specifies the zero-indexed CPU number as an owner of the allocated structures. + * + * @param StructuresData + * Supplies a pointer to the memory area that will contain the allocated buffer. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTAPI +XTSTATUS +MmAllocateProcessorStructures(IN ULONG CpuNumber, + OUT PVOID *StructuresData) +{ + PKPROCESSOR_BLOCK ProcessorBlock; + PVOID ProcessorStructures; + UINT_PTR Address; + + /* Not implemented yet, this is just a hack */ + UNIMPLEMENTED; + + /* Assign memory for processor structures from preallocated buffer */ + ProcessorStructures = &MmProcessorStructuresData[CpuNumber - 1]; + + /* Make sure all structures are zeroed */ + RtlZeroMemory(ProcessorStructures, KPROCESSOR_STRUCTURES_SIZE); + + /* Align address to page size boundary and find a space for processor block */ + Address = ROUND_UP((UINT_PTR)ProcessorStructures, MM_PAGE_SIZE); + ProcessorBlock = (PKPROCESSOR_BLOCK)((PUCHAR)Address + (2 * KERNEL_STACK_SIZE) + sizeof(ArInitialGdt)); + + /* Store processor number in the processor block */ + ProcessorBlock->CpuNumber = CpuNumber; + + /* Return pointer to the processor structures */ + *StructuresData = ProcessorStructures; + + /* Return success */ + return STATUS_SUCCESS; +} + /** * Destroys a kernel stack and frees page table entry. * @@ -55,3 +100,20 @@ MmFreeKernelStack(IN PVOID Stack, { UNIMPLEMENTED; } + +/** + * Destroys an unused set of processor structures. + * + * @param StructuresData + * Supplies a pointer to the memory area containing the allocated buffer. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +MmFreeProcessorStructures(IN PVOID StructuresData) +{ + UNIMPLEMENTED; +}