* init_double_fault() accidently initialized the wrong TSS for the handler (the regular

one, not the one intended for the double fault) since r20131. IOW double faults are
  now working again.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21645 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2007-07-18 12:40:38 +00:00
parent da819d069e
commit 0379077f09
+22 -12
View File
@@ -209,12 +209,13 @@ init_double_fault(int cpuNum)
{
/* set up the double fault tss */
/* TODO: Axel - fix SMP support */
struct tss *tss = &gCPU[cpuNum].arch.tss;
struct tss *tss = &gCPU[cpuNum].arch.double_fault_tss;
memset(tss, 0, sizeof(struct tss));
tss->sp0 = (uint32)sDoubleFaultStack + sizeof(sDoubleFaultStack);
tss->ss0 = KERNEL_DATA_SEG;
read_cr3(tss->cr3); // copy the current cr3 to the double fault cr3
read_cr3(tss->cr3);
// copy the current cr3 to the double fault cr3
tss->eip = (uint32)&double_fault;
tss->es = KERNEL_DATA_SEG;
tss->cs = KERNEL_CODE_SEG;
@@ -226,12 +227,13 @@ init_double_fault(int cpuNum)
tss->ldt_seg_selector = 0;
// add TSS descriptor for this new TSS
set_tss_descriptor(&gGDT[DOUBLE_FAULT_TSS_BASE_SEGMENT + cpuNum], (addr_t)tss, sizeof(struct tss));
// set_tss_descriptor(&gGDT[DOUBLE_FAULT_TSS_SEGMENT + cpuNum], (addr_t)sDoubleFaultTSS[cpuNum], sizeof(struct tss));
set_tss_descriptor(&gGDT[DOUBLE_FAULT_TSS_BASE_SEGMENT + cpuNum],
(addr_t)tss, sizeof(struct tss));
}
static void make_feature_string(cpu_ent *cpu, char *str, size_t strlen)
static void
make_feature_string(cpu_ent *cpu, char *str, size_t strlen)
{
str[0] = 0;
@@ -321,7 +323,9 @@ static void make_feature_string(cpu_ent *cpu, char *str, size_t strlen)
strlcat(str, "3dnow ", strlen);
}
static int detect_cpu(int curr_cpu)
static int
detect_cpu(int curr_cpu)
{
cpuid_info cpuid;
unsigned int data[4];
@@ -414,7 +418,9 @@ static int detect_cpu(int curr_cpu)
return 0;
}
bool x86_check_feature(uint32 feature, enum x86_feature_type type)
bool
x86_check_feature(uint32 feature, enum x86_feature_type type)
{
cpu_ent *cpu = get_cpu_struct();
@@ -429,8 +435,10 @@ bool x86_check_feature(uint32 feature, enum x86_feature_type type)
return (cpu->arch.feature[type] & feature) ? TRUE : FALSE;
}
// #pragma mark -
status_t
arch_cpu_preboot_init_percpu(kernel_args *args, int curr_cpu)
{
@@ -471,8 +479,8 @@ arch_cpu_init_post_vm(kernel_args *args)
// account for the segment descriptors
gGDT = (segment_descriptor *)args->arch_args.vir_gdt;
create_area("gdt", (void **)&gGDT, B_EXACT_ADDRESS, B_PAGE_SIZE, B_ALREADY_WIRED,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
create_area("gdt", (void **)&gGDT, B_EXACT_ADDRESS, B_PAGE_SIZE,
B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
// currently taken out of the build, because it's not yet used (and assumes
// (a fixed number of used GDT entries)
@@ -480,12 +488,14 @@ arch_cpu_init_post_vm(kernel_args *args)
// setup task-state segments
for (i = 0; i < args->num_cpus; i++) {
// initialize the regular and double fault tss stored in the per-cpu structure
// initialize the regular and double fault tss stored in the per-cpu
// structure
memset(&gCPU[i].arch.tss, 0, sizeof(struct tss));
gCPU[i].arch.tss.ss0 = KERNEL_DATA_SEG;
// add TSS descriptor for this new TSS
set_tss_descriptor(&gGDT[TSS_BASE_SEGMENT + i], (addr_t)&gCPU[i].arch.tss, sizeof(struct tss));
set_tss_descriptor(&gGDT[TSS_BASE_SEGMENT + i],
(addr_t)&gCPU[i].arch.tss, sizeof(struct tss));
// initialize the double fault tss
init_double_fault(i);