From fcfe1dfb4af34e6651ff546bcb6ef1e888dddd9a Mon Sep 17 00:00:00 2001 From: Chloe M Date: Tue, 14 Jul 2026 16:14:03 -0400 Subject: [PATCH] ptos: ps+hal: Add thread control block init Signed-off-by: Chloe M --- service/ptos/arch/amd64/ps/thread.c | 81 +++++++++++++++++++++++++++++ service/ptos/head/arch/amd64/tcb.h | 25 +++++++++ service/ptos/head/hal/tcb.h | 18 +++++++ service/ptos/head/hal/thread.h | 25 +++++++++ service/ptos/head/ps/thread.h | 11 +++- service/ptos/ps/thread.c | 10 +++- 6 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 service/ptos/arch/amd64/ps/thread.c create mode 100644 service/ptos/head/arch/amd64/tcb.h create mode 100644 service/ptos/head/hal/tcb.h create mode 100644 service/ptos/head/hal/thread.h diff --git a/service/ptos/arch/amd64/ps/thread.c b/service/ptos/arch/amd64/ps/thread.c new file mode 100644 index 0000000..affb1f1 --- /dev/null +++ b/service/ptos/arch/amd64/ps/thread.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: MD thread management + * Author: Chloe M. + */ + +#include +#include +#include +#include +#include +#include + +/* + * Allocate a kernel stack for a thread + */ +static VOID * +ThreadAllocKStack(VOID) +{ + MM_RANGE StackRange; + PT_STATUS Status; + + Status = MmAllocatePages(1, &StackRange); + if (PT_ERROR(Status)) { + return NULL; + } + + return RANGE_PTR(&StackRange); +} + +/* + * Initialize a thread control block + * + * @Thread: Thread to initialize TCB of + * @Tcb: Thread control block to initialize + * @Ip: Instruction pointer value to start off with + * + * TODO: Support user threads + */ +static PT_STATUS +ThreadInitTcb(THREAD *Thread, TCB *Tcb, UPTR Ip) +{ + TRAP_FRAME *Frame; + + if (Thread == NULL || Tcb == NULL) { + return STATUS_INVALID_PARAM; + } + + Thread->StackBase = (UPTR)ThreadAllocKStack(); + if (Thread->StackBase == 0) { + return STATUS_NO_MEMORY; + } + + /* Zero the whole frame */ + Frame = &Tcb->FrameSnapshot; + RtlMemSet(Frame, 0, sizeof(*Frame)); + + /* Initialize only whats needed */ + Frame->Rflags = 0x202; + Frame->Rsp = Thread->StackBase + PAGESIZE; + Frame->Rip = Ip; + Frame->CodeSeg = GDT_KCODE; + Frame->StackSeg = GDT_KDATA; + return STATUS_SUCCESS; +} + +PT_STATUS +HalThreadInit(THREAD *Thread, ULONG Flags, UPTR Ip) +{ + TCB *Tcb; + + if (Thread == NULL) { + return STATUS_INVALID_PARAM; + } + + Tcb = &Thread->Tcb; + ThreadInitTcb(Thread, Tcb, Ip); + return STATUS_SUCCESS; +} diff --git a/service/ptos/head/arch/amd64/tcb.h b/service/ptos/head/arch/amd64/tcb.h new file mode 100644 index 0000000..e49fb83 --- /dev/null +++ b/service/ptos/head/arch/amd64/tcb.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Thread control block + * Author: Chloe M. + */ + +#ifndef _MACHINE_TCB_H_ +#define _MACHINE_TCB_H_ 1 + +#include +#include + +/* + * The thread control block contains machine specific thread + * information. + * + * @FrameSnapshot: Processor state snapshot + */ +typedef struct { + TRAP_FRAME FrameSnapshot; +} TCB; + +#endif /* !_MACHINE_TCB_H_ */ diff --git a/service/ptos/head/hal/tcb.h b/service/ptos/head/hal/tcb.h new file mode 100644 index 0000000..052d254 --- /dev/null +++ b/service/ptos/head/hal/tcb.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Thread control block bridge + * Author: Chloe M. + */ + +#ifndef _HAL_TCB_H_ +#define _HAL_TCB_H_ 1 + +/* + * This header must define the TCB structure for MD + * thread information. + */ +#include + +#endif /* !_HAL_TCB_H_ */ diff --git a/service/ptos/head/hal/thread.h b/service/ptos/head/hal/thread.h new file mode 100644 index 0000000..3121451 --- /dev/null +++ b/service/ptos/head/hal/thread.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: HAL thread management + * Author: Chloe M. + */ + +#ifndef _HAL_THREAD_H_ +#define _HAL_THREAD_H_ 1 + +#include +#include +#include + +/* + * Initialize machine specific thread information + * + * @Thread: Thread to initialize + * @Flags: Optional init flags + * @Ip: Instruction pointer value to start off with + */ +PT_STATUS HalThreadInit(THREAD *Thread, ULONG Flags, UPTR Ip); + +#endif /* !_HAL_THREAD_H_ */ diff --git a/service/ptos/head/ps/thread.h b/service/ptos/head/ps/thread.h index 70abab0..e32afce 100644 --- a/service/ptos/head/ps/thread.h +++ b/service/ptos/head/ps/thread.h @@ -10,6 +10,7 @@ #define _PS_THREAD_H_ 1 #include +#include #include #include @@ -22,11 +23,15 @@ struct _PROCESS; * processes. * * @Tid: Thread ID + * @Tcb: Thread control block + * @StackBase: Execution stack base * @Parent: Parent process * @ThreadLink: Thread queue link */ typedef struct _THREAD { UQUAD Tid; + TCB Tcb; + UPTR StackBase; struct _PROCESS *Parent; TAILQ_ENTRY(_THREAD) ThreadLink; } THREAD; @@ -36,8 +41,12 @@ typedef struct _THREAD { * * @Parent: Parent of thread to create * @Flags: Optional init flags + * @Ip: Instruction pointer value to start off with * @Result: Result is written here */ -PT_STATUS PsCreateThread(struct _PROCESS *Parent, ULONG Flags, THREAD **Result); +PT_STATUS PsCreateThread( + struct _PROCESS *Parent, ULONG Flags, + UPTR Ip, THREAD **Result +); #endif /* !_PS_THREAD_H_ */ diff --git a/service/ptos/ps/thread.c b/service/ptos/ps/thread.c index 1cf3abb..c5dc25d 100644 --- a/service/ptos/ps/thread.c +++ b/service/ptos/ps/thread.c @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -15,9 +16,10 @@ static UQUAD NextThreadTid = 0; PT_STATUS -PsCreateThread(struct _PROCESS *Parent, ULONG Flags, THREAD **Result) +PsCreateThread(struct _PROCESS *Parent, ULONG Flags, UPTR Ip, THREAD **Result) { THREAD *Thread; + PT_STATUS Status; if (Parent == NULL || Result == NULL) { return STATUS_INVALID_PARAM; @@ -35,6 +37,12 @@ PsCreateThread(struct _PROCESS *Parent, ULONG Flags, THREAD **Result) Thread->Tid = AtomicIncQuad(&NextThreadTid); Thread->Parent = Parent; + Status = HalThreadInit(Thread, Flags, Ip); + if (PT_ERROR(Status)) { + ExFreePoolWithTag(Thread, THREAD_POOL_TAG); + return Status; + } + *Result = Thread; return STATUS_SUCCESS; }