kernel: x86 SSE improvements

* Prepend x86_ to non-static x86 code
* Add x86_init_fpu function to kernel header
* Don't init fpu multiple times on smp systems
* Verified fpu is still started on smp and non-smp
* SSE code still generates general protection faults
  on smp systems though
This commit is contained in:
Alexander von Gluck IV
2012-02-15 12:33:45 -06:00
parent eed234ca08
commit 3f1eed704a
3 changed files with 9 additions and 12 deletions
@@ -352,6 +352,7 @@ status_t x86_get_mtrr(uint32 index, uint64* _base, uint64* _length,
uint8* _type);
void x86_set_mtrrs(uint8 defaultType, const x86_mtrr_info* infos,
uint32 count);
void x86_init_fpu();
bool x86_check_feature(uint32 feature, enum x86_feature_type type);
void* x86_get_double_fault_stack(int32 cpu, size_t* _size);
int32 x86_double_fault_get_cpu(void);
+6 -9
View File
@@ -299,25 +299,25 @@ x86_set_mtrrs(uint8 defaultType, const x86_mtrr_info* infos, uint32 count)
}
extern "C" void
init_fpu(void)
void
x86_init_fpu(void)
{
if (!x86_check_feature(IA32_FEATURE_FPU, FEATURE_COMMON)) {
// No FPU... time to install one in your 386?
dprintf("Warning: CPU has no reported FPU.\n");
dprintf("%s: Warning: CPU has no reported FPU.\n", __func__);
gX86SwapFPUFunc = i386_noop_swap;
return;
}
if (!x86_check_feature(IA32_FEATURE_SSE, FEATURE_COMMON)
|| !x86_check_feature(IA32_FEATURE_FXSR, FEATURE_COMMON)) {
dprintf("CPU has no SSE... just enabling FPU.\n");
dprintf("%s: CPU has no SSE... just enabling FPU.\n", __func__);
// we don't have proper SSE support, just enable FPU
x86_write_cr0(x86_read_cr0() & ~(CR0_FPU_EMULATION | CR0_MONITOR_FPU));
gX86SwapFPUFunc = i386_fnsave_swap;
return;
}
dprintf("CPU has SSE... enabling FXSR and XMM.\n");
dprintf("%s: CPU has SSE... enabling FXSR and XMM.\n", __func__);
// enable OS support for SSE
x86_write_cr4(x86_read_cr4() | CR4_OS_FXSR | CR4_OS_XMM_EXCEPTION);
@@ -669,7 +669,7 @@ x86_double_fault_get_cpu(void)
status_t
arch_cpu_preboot_init_percpu(kernel_args *args, int cpu)
{
// A simple nop FPU call until init_fpu
// A simple nop FPU call until x86_init_fpu
gX86SwapFPUFunc = i386_noop_swap;
// On SMP system we want to synchronize the CPUs' TSCs, so system_time()
@@ -802,9 +802,6 @@ arch_cpu_init_post_vm(kernel_args *args)
DT_DATA_WRITEABLE, DPL_USER);
}
// setup FPU and SSE if supported
init_fpu();
return B_OK;
}
+2 -3
View File
@@ -33,11 +33,10 @@
# define TRACE(x) ;
#endif
static uint32 sCPUAPICIds[B_MAX_CPU_COUNT];
static uint32 sAPICVersions[B_MAX_CPU_COUNT];
extern "C" void init_fpu(void);
static int32
i386_ici_interrupt(void *data)
@@ -108,7 +107,7 @@ arch_smp_per_cpu_init(kernel_args *args, int32 cpu)
apic_per_cpu_init(args, cpu);
// setup FPU and SSE if supported
init_fpu();
x86_init_fpu();
return B_OK;
}