Implement MmAllocateProcessorStructures() routine as a temporary hack to get a buffer for AP initialization
Builds / ExectOS (amd64) (push) Successful in 46s Details
Builds / ExectOS (i686) (push) Successful in 44s Details

This commit is contained in:
Rafal Kupiec 2024-05-07 23:30:11 +02:00
parent 8d6d27651c
commit b65ff2a767
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
6 changed files with 85 additions and 0 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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 */

View File

@ -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);

View File

@ -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};

View File

@ -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;
}