stos: ex: Add per-cpu pool allocator groundwork
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright (c) 2026, Chloe M.
|
||||
* Provided under the BSD-3 clause.
|
||||
*
|
||||
* Description: Pool allocator
|
||||
* Author: Chloe M.
|
||||
*/
|
||||
|
||||
#ifndef _EX_POOL_H_
|
||||
#define _EX_POOL_H_ 1
|
||||
|
||||
#include <hal/page.h>
|
||||
#include <stapi/status.h>
|
||||
#include <stdef.h>
|
||||
|
||||
/* Compute the granularity of a specific level */
|
||||
#define LEVEL_GRAN(LEVEL) \
|
||||
(1 << (3 + (LEVEL)))
|
||||
|
||||
/* Maximum levels per pool */
|
||||
#define LEVEL_COUNT 8
|
||||
|
||||
/*
|
||||
* When allocating pages, we sacrifice a little bit of its
|
||||
* first bytes to store some metadata. This is the true size
|
||||
* of unreserved / usable data.
|
||||
*/
|
||||
#define POOL_REAL_PAGESZ \
|
||||
(PAGESIZE - sizeof(MEMORY_PAGE))
|
||||
|
||||
/*
|
||||
* Page data structure used internally to link together page
|
||||
* lists
|
||||
*
|
||||
* @Bitmap: Bitmap to data [0 : free, 1 : allocated]
|
||||
* @Next: Next page in list
|
||||
*/
|
||||
typedef struct _MEMORY_PAGE {
|
||||
UQUAD Bitmap;
|
||||
struct _MEMORY_PAGE *Next;
|
||||
} MEMORY_PAGE;
|
||||
|
||||
/*
|
||||
* A memory block holds a list of memory chunks of a specific
|
||||
* granularity.
|
||||
*
|
||||
* @FirstPage: First page in list
|
||||
* @LastPage: Last page in list
|
||||
* @PageCount: Number of pages total
|
||||
*/
|
||||
typedef struct {
|
||||
MEMORY_PAGE *FirstPage;
|
||||
MEMORY_PAGE *LastPage;
|
||||
USIZE PageCount;
|
||||
} MEMORY_BLOCK;
|
||||
|
||||
/*
|
||||
* A memory pool holds blocks of varying granularities
|
||||
*
|
||||
* @BlockLevels: Block levels [granularity : GRAN(level)]
|
||||
*/
|
||||
typedef struct {
|
||||
MEMORY_BLOCK BlockLevels[LEVEL_COUNT];
|
||||
} MEMORY_POOL;
|
||||
|
||||
/*
|
||||
* Initialize a memory pool
|
||||
*
|
||||
* @Pool: Memory pool to initialize
|
||||
*/
|
||||
ST_STATUS ExPoolInit(MEMORY_POOL *Pool);
|
||||
|
||||
#endif /* !_EX_POOL_H_ */
|
||||
@@ -11,17 +11,20 @@
|
||||
|
||||
#include <stdef.h>
|
||||
#include <machine/mcb.h>
|
||||
#include <ex/pool.h>
|
||||
|
||||
/*
|
||||
* The kernel processor control region contains MI
|
||||
* information about the processor.
|
||||
*
|
||||
* @CoreId: Processor core ID assigned by us
|
||||
* @Mcb: Machine-core block
|
||||
* @CoreId: Processor core ID assigned by us
|
||||
* @Mcb: Machine-core block
|
||||
* @AllocPool: Memory-allocation pool
|
||||
*/
|
||||
typedef struct {
|
||||
USHORT CoreId;
|
||||
MCB Mcb;
|
||||
MEMORY_POOL AllocPool;
|
||||
} KPCR;
|
||||
|
||||
/*
|
||||
@@ -31,4 +34,11 @@ typedef struct {
|
||||
*/
|
||||
VOID HalKpcrP1Init(KPCR *Kpcr);
|
||||
|
||||
/*
|
||||
* Phase 2 initialization of processor
|
||||
*
|
||||
* @Kpcr: KPCR to initialize
|
||||
*/
|
||||
VOID HalKpcrP2Init(KPCR *Kpcr);
|
||||
|
||||
#endif /* !_HAL_KPCR_H_ */
|
||||
|
||||
Reference in New Issue
Block a user