From cdbb6c70ba419b926823ecc7afab7025e10da7d1 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Sun, 28 Aug 2011 12:56:46 +0200 Subject: [PATCH] Kernel: Some MP structures. --- Kernel/include/Tier0/mp.h | 19 +++++++++++++++++++ Kernel/src/Tier0/mp.c | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/Kernel/include/Tier0/mp.h b/Kernel/include/Tier0/mp.h index da0d12d..4ab6b18 100755 --- a/Kernel/include/Tier0/mp.h +++ b/Kernel/include/Tier0/mp.h @@ -3,6 +3,25 @@ #include "types.h" +// OS structures +typedef enum { + E_MP_CPU_STATE_DISABLED, + E_MP_CPU_STATE_HALTED, + E_MP_CPU_STATE_IDLE, + E_MP_CPU_STATE_RUNNING +} E_MP_CPU_STATE; + +typedef struct { + u8 ID; + u32 CPUID; + + u8 LAPICID; + E_MP_CPU_STATE State; + + u8 Bootstrap : 1; +} T_MP_CPU; + +// BIOS-provided Structures typedef struct { s8 Signature[4]; u32 TablePhysical; diff --git a/Kernel/src/Tier0/mp.c b/Kernel/src/Tier0/mp.c index b9fdcd7..661d83f 100755 --- a/Kernel/src/Tier0/mp.c +++ b/Kernel/src/Tier0/mp.c @@ -8,6 +8,13 @@ #define MP_TEMP_BUFFER_LENGTH 1024 u8 g_EntriesBuffer[MP_TEMP_BUFFER_LENGTH]; +#define MP_MAX_CPU 32 + +struct { + T_MP_CPU CPUs[MP_MAX_CPU]; + u8 NumCPUs; +} g_MP; + u64 mp_find_pointer(u64 Start, u64 End) { for (u64 i = Start & ~((u64)0x10); i < End; i += 16) @@ -94,16 +101,35 @@ void mp_initialize(void) } } -u8 mp_parse_cpu(u32 EntryAddress, u8 CPUNum) +u8 mp_parse_cpu(u32 EntryAddress) { + u8 i = g_MP.NumCPUs; T_MP_ENTRY_CPU *CPU = (T_MP_ENTRY_CPU *)&g_EntriesBuffer[EntryAddress]; if (CPU->FlagBootstrap) - kprintf(" CPU #%i, LAPIC sig %x, cpuid %x (bootstrap)\n", CPUNum, CPU->LAPICID, CPU->CPUID); + { + kprintf(" CPU #%i, LAPIC sig %x, cpuid %x (bootstrap)\n", i, CPU->LAPICID, CPU->CPUID); + g_MP.CPUs[i].Bootstrap = 1; + g_MP.CPUs[i].State = E_MP_CPU_STATE_RUNNING; + } else if (!CPU->FlagAvailable) - kprintf(" CPU #%i, LAPIC sig %x, cpuid %x, (UNAVAILABLE!!!)", CPUNum, CPU->LAPICID, CPU->CPUID); + { + kprintf(" CPU #%i, LAPIC sig %x, cpuid %x, (UNAVAILABLE!!!)", i, CPU->LAPICID, CPU->CPUID); + g_MP.CPUs[i].Bootstrap = 0; + g_MP.CPUs[i].State = E_MP_CPU_STATE_DISABLED; + } else - kprintf(" CPU #%i, LAPIC sig %x, cpuid %x (halted)\n", CPUNum, CPU->LAPICID, CPU->CPUID); + { + kprintf(" CPU #%i, LAPIC sig %x, cpuid %x (halted)\n", i, CPU->LAPICID, CPU->CPUID); + g_MP.CPUs[i].Bootstrap = 0; + g_MP.CPUs[i].State = E_MP_CPU_STATE_HALTED; + } + + g_MP.CPUs[i].ID = i; + g_MP.CPUs[i].CPUID = CPU->CPUID; + g_MP.CPUs[i].LAPICID = CPU->LAPICID; + + g_MP.NumCPUs++; return sizeof(T_MP_ENTRY_CPU); } @@ -132,15 +158,14 @@ void mp_parse_configuration_table(u32 TableAddress) physmem_read(TableAddress + 44, Header.BaseTableLength - 44, g_EntriesBuffer); u32 EntryAddress = 0; - u8 CPUNum = 0; + g_MP.NumCPUs = 0; while (1) { u8 EntryType = g_EntriesBuffer[EntryAddress]; switch (EntryType) { case 0x00: - EntryAddress += mp_parse_cpu(EntryAddress, CPUNum); - CPUNum++; + EntryAddress += mp_parse_cpu(EntryAddress); break; default: for (;;) {}