diff --git a/paw/stos/arch/amd64/cpu/init.c b/paw/stos/arch/amd64/cpu/init.c new file mode 100644 index 0000000..7dde42f --- /dev/null +++ b/paw/stos/arch/amd64/cpu/init.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Kernel processor control region + * Author: Chloe M. + */ + +#include +#include +#include +#include + +#define DTRACE(Fmt, ...) \ + TRACE("[ CPU ]: " Fmt, ##__VA_ARGS__) + +static VOID +ProcessorIdentify(MCB *Mcb) +{ + ULONG Eax, Unused; + UCHAR ModelLow, ModelHigh; + UCHAR FamilyLow, FamilyHigh; + + if (Mcb == NULL) { + return; + } + + CPUID(1, Eax, Unused, Unused, Unused); + + /* Extarct the model ID */ + ModelLow = (Eax >> 4) & 0xF; + ModelHigh = (Eax >> 16) & 0xF; + Mcb->ModelId = (ModelHigh << 4) | ModelLow; + + /* Extract the family ID */ + FamilyLow = (Eax >> 8) & 0xF; + FamilyHigh = (Eax >> 20) & 0xFF; + Mcb->FamilyId = (FamilyHigh << 4) | FamilyLow; + + /* Informational logging */ + DTRACE("model : %X\n", Mcb->ModelId); + DTRACE("family : %X\n", Mcb->FamilyId); +} + +VOID +HalKpcrP1Init(KPCR *Kpcr) +{ + MCB *Mcb; + + if (Kpcr == NULL) { + return; + } + + Mcb = &Kpcr->Mcb; + ProcessorIdentify(Mcb); +} diff --git a/paw/stos/head/arch/amd64/mcb.h b/paw/stos/head/arch/amd64/mcb.h new file mode 100644 index 0000000..e5dac0b --- /dev/null +++ b/paw/stos/head/arch/amd64/mcb.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Machine core block + * Author: Chloe M. + */ + +#ifndef _MACHINE_MCB_H_ +#define _MACHINE_MCB_H_ 1 + +#include + +/* + * The machine-core block contains machine specific + * processor information + * + * @ModelId: Processor model ID + * @FamilyId: Processor family ID + */ +typedef struct { + UCHAR ModelId; + USHORT FamilyId : 12; +} MCB; + +#endif /* !_MACHINE_MCB_H_ */ diff --git a/paw/stos/head/hal/kpcr.h b/paw/stos/head/hal/kpcr.h index 8c81149..eda957b 100644 --- a/paw/stos/head/hal/kpcr.h +++ b/paw/stos/head/hal/kpcr.h @@ -10,15 +10,25 @@ #define _HAL_KPCR_H_ 1 #include +#include /* * The kernel processor control region contains MI * information about the processor. * * @CoreId: Processor core ID assigned by us + * @Mcb: Machine-core block */ typedef struct { USHORT CoreId; + MCB Mcb; } KPCR; +/* + * Phase 1 initialization of processor + * + * @Kpcr: KPCR to initialize + */ +VOID HalKpcrP1Init(KPCR *Kpcr); + #endif /* !_HAL_KPCR_H_ */ diff --git a/paw/stos/init/init.c b/paw/stos/init/init.c index fe650dd..bf93889 100644 --- a/paw/stos/init/init.c +++ b/paw/stos/init/init.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,9 @@ #define DTRACE(Fmt, ...) \ TRACE("[ INIT ]: " Fmt, ##__VA_ARGS__) +/* Globals */ +static KPCR BootstrapCore; + /* * Display a boot banner */ @@ -47,4 +51,7 @@ KiKernelEntry(VOID) /* Initialize physical memory */ MmInitPmm(); + + /* Phase 1 initialization the bootstrap core */ + HalKpcrP1Init(&BootstrapCore); }