Another SMP oversight: the TSS was not explicetly loaded for all CPUs.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15517 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-12-12 14:38:26 +00:00
parent 1eed15a2d2
commit aa9d29ba97
+15 -10
View File
@@ -44,6 +44,17 @@ x86_get_main_tss(void)
} }
static void
load_tss(void *data, int cpu)
{
short seg = ((TSS_BASE_SEGMENT + cpu) << 3) | DPL_KERNEL;
asm("movw %0, %%ax;"
"ltr %%ax;" : : "r" (seg) : "eax");
sIsTSSLoaded[cpu] = true;
}
static void static void
init_double_fault(int cpuNum) init_double_fault(int cpuNum)
{ {
@@ -158,15 +169,9 @@ arch_cpu_init_post_vm(kernel_args *args)
// initialize TSS // initialize TSS
init_double_fault(i); init_double_fault(i);
} }
/* TODO: Axel - call on all CPUs */ call_all_cpus(&load_tss, NULL);
{
short seg = ((TSS_BASE_SEGMENT + 0) << 3) | DPL_KERNEL;
asm("movw %0, %%ax;"
"ltr %%ax;" : : "r" (seg) : "eax");
sIsTSSLoaded[0] = true;
}
x86_set_task_gate(8, DOUBLE_FAULT_TSS_BASE_SEGMENT << 3); x86_set_task_gate(8, DOUBLE_FAULT_TSS_BASE_SEGMENT << 3);
// setup TLS descriptors (one for every CPU) // setup TLS descriptors (one for every CPU)
@@ -175,7 +180,7 @@ arch_cpu_init_post_vm(kernel_args *args)
set_segment_descriptor(&gGDT[TLS_BASE_SEGMENT + i], 0, TLS_SIZE, set_segment_descriptor(&gGDT[TLS_BASE_SEGMENT + i], 0, TLS_SIZE,
DT_DATA_WRITEABLE, DPL_USER); DT_DATA_WRITEABLE, DPL_USER);
} }
return B_OK; return B_OK;
} }