Kernel: Some MP structures.

alentours-dev
Sergiusz Bazanski 2011-08-28 12:56:46 +02:00
parent 7166c7c725
commit cdbb6c70ba
2 changed files with 51 additions and 7 deletions

View File

@ -3,6 +3,25 @@
#include "types.h" #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 { typedef struct {
s8 Signature[4]; s8 Signature[4];
u32 TablePhysical; u32 TablePhysical;

View File

@ -8,6 +8,13 @@
#define MP_TEMP_BUFFER_LENGTH 1024 #define MP_TEMP_BUFFER_LENGTH 1024
u8 g_EntriesBuffer[MP_TEMP_BUFFER_LENGTH]; 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) u64 mp_find_pointer(u64 Start, u64 End)
{ {
for (u64 i = Start & ~((u64)0x10); i < End; i += 16) 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]; T_MP_ENTRY_CPU *CPU = (T_MP_ENTRY_CPU *)&g_EntriesBuffer[EntryAddress];
if (CPU->FlagBootstrap) 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) 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 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); 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); physmem_read(TableAddress + 44, Header.BaseTableLength - 44, g_EntriesBuffer);
u32 EntryAddress = 0; u32 EntryAddress = 0;
u8 CPUNum = 0; g_MP.NumCPUs = 0;
while (1) while (1)
{ {
u8 EntryType = g_EntriesBuffer[EntryAddress]; u8 EntryType = g_EntriesBuffer[EntryAddress];
switch (EntryType) switch (EntryType)
{ {
case 0x00: case 0x00:
EntryAddress += mp_parse_cpu(EntryAddress, CPUNum); EntryAddress += mp_parse_cpu(EntryAddress);
CPUNum++;
break; break;
default: default:
for (;;) {} for (;;) {}