X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..3a60a9f5b85abb8c2cf24e1926c5c7b3f608a5e2:/osfmk/i386/cpu.c diff --git a/osfmk/i386/cpu.c b/osfmk/i386/cpu.c index 5d6d05cae..f16989952 100644 --- a/osfmk/i386/cpu.c +++ b/osfmk/i386/cpu.c @@ -25,10 +25,20 @@ * cpu specific routines */ -#include +#include #include -#include +#include #include +#include +#include +#include +#include +#include +#include +#include + + +struct processor processor_master; /*ARGSUSED*/ kern_return_t @@ -37,15 +47,16 @@ cpu_control( processor_info_t info, unsigned int count) { - printf("cpu_control not implemented\n"); + printf("cpu_control(%d,0x%x,%d) not implemented\n", + slot_num, info, count); return (KERN_FAILURE); } /*ARGSUSED*/ kern_return_t cpu_info_count( - processor_flavor_t flavor, - unsigned int *count) + __unused processor_flavor_t flavor, + unsigned int *count) { *count = 0; return (KERN_FAILURE); @@ -59,12 +70,158 @@ cpu_info( processor_info_t info, unsigned int *count) { - printf("cpu_info not implemented\n"); + printf("cpu_info(%d,%d,0x%x,0x%x) not implemented\n", + flavor, slot_num, info, count); return (KERN_FAILURE); } void -cpu_sleep() +cpu_sleep(void) +{ + cpu_data_t *proc_info = current_cpu_datap(); + + PE_cpu_machine_quiesce(proc_info->cpu_id); + + cpu_thread_halt(); +} + +void +cpu_init(void) +{ + cpu_data_t *cdp = current_cpu_datap(); + +#ifdef MACH_BSD + /* FIXME */ + cdp->cpu_type = CPU_TYPE_I386; + cdp->cpu_subtype = CPU_SUBTYPE_PENTPRO; +#else + cdp->cpu_type = cpuid_cputype(0); + cdp->cpu_subtype = CPU_SUBTYPE_AT386; +#endif + cdp->cpu_running = TRUE; +} + +kern_return_t +cpu_start( + int cpu) +{ + kern_return_t ret; + + if (cpu == cpu_number()) { + cpu_machine_init(); + return KERN_SUCCESS; + } else { + /* + * Should call out through PE. + * But take the shortcut here. + */ + ret = intel_startCPU(cpu); + return(ret); + } +} + +void +cpu_exit_wait( + __unused int cpu) +{ +} + +void +cpu_machine_init( + void) +{ + int cpu; + + cpu = get_cpu_number(); + PE_cpu_machine_init(cpu_datap(cpu)->cpu_id, TRUE); +#if 0 + if (cpu_datap(cpu)->hibernate) + { + cpu_datap(cpu)->hibernate = 0; + hibernate_machine_init(); + } +#endif + ml_init_interrupt(); +} + +processor_t +cpu_processor_alloc(boolean_t is_boot_cpu) +{ + int ret; + processor_t proc; + + if (is_boot_cpu) + return &processor_master; + + ret = kmem_alloc(kernel_map, (vm_offset_t *) &proc, sizeof(*proc)); + if (ret != KERN_SUCCESS) + return NULL; + + bzero((void *) proc, sizeof(*proc)); + return proc; +} + +void +cpu_processor_free(processor_t proc) +{ + if (proc != NULL && proc != &processor_master) + kfree((void *) proc, sizeof(*proc)); +} + +processor_t +current_processor(void) +{ + return current_cpu_datap()->cpu_processor; +} + +processor_t +cpu_to_processor( + int cpu) +{ + return cpu_datap(cpu)->cpu_processor; +} + +ast_t * +ast_pending(void) +{ + return (¤t_cpu_datap()->cpu_pending_ast); +} + +cpu_type_t +slot_type( + int slot_num) +{ + return (cpu_datap(slot_num)->cpu_type); +} + +cpu_subtype_t +slot_subtype( + int slot_num) +{ + return (cpu_datap(slot_num)->cpu_subtype); +} + +cpu_threadtype_t +slot_threadtype( + int slot_num) +{ + return (cpu_datap(slot_num)->cpu_threadtype); +} + +cpu_type_t +cpu_type(void) +{ + return (current_cpu_datap()->cpu_type); +} + +cpu_subtype_t +cpu_subtype(void) +{ + return (current_cpu_datap()->cpu_subtype); +} + +cpu_threadtype_t +cpu_threadtype(void) { - printf("cpu_sleep not implemented\n"); + return (current_cpu_datap()->cpu_threadtype); }