#ifndef _KERN_PROCESSOR_H_
#define _KERN_PROCESSOR_H_
#include <mach/boolean.h>
#include <mach/kern_return.h>
#include <kern/kern_types.h>
#include <sys/cdefs.h>
#ifdef MACH_KERNEL_PRIVATE
#include <mach/mach_types.h>
#include <kern/ast.h>
#include <kern/cpu_number.h>
#include <kern/lock.h>
#include <kern/queue.h>
#include <kern/sched.h>
#include <kern/processor_data.h>
#include <machine/ast_types.h>
struct processor_set {
queue_head_t active_queue;
queue_head_t idle_queue;
processor_t low_pri, low_count;
int processor_count;
decl_simple_lock_data(,sched_lock)
struct ipc_port * pset_self;
struct ipc_port * pset_name_self;
processor_set_t pset_list;
pset_node_t node;
};
extern struct processor_set pset0;
struct pset_node {
processor_set_t psets;
pset_node_t nodes;
pset_node_t node_list;
pset_node_t parent;
};
extern struct pset_node pset_node0;
extern queue_head_t tasks, threads;
extern int tasks_count, threads_count;
decl_lck_mtx_data(extern,tasks_threads_lock)
struct processor_meta {
queue_head_t idle_queue;
processor_t primary;
};
typedef struct processor_meta *processor_meta_t;
#define PROCESSOR_META_NULL ((processor_meta_t) 0)
struct processor {
queue_chain_t processor_queue;
int state;
struct thread
*active_thread,
*next_thread,
*idle_thread;
processor_set_t processor_set;
int current_pri;
int cpu_id;
timer_call_data_t quantum_timer;
uint64_t quantum_end;
uint64_t last_dispatch;
uint64_t deadline;
int timeslice;
struct run_queue runq;
processor_meta_t processor_meta;
struct ipc_port * processor_self;
processor_t processor_list;
processor_data_t processor_data;
};
extern processor_t processor_list;
extern unsigned int processor_count;
decl_simple_lock_data(extern,processor_list_lock)
extern uint32_t processor_avail_count;
extern processor_t master_processor;
#define PROCESSOR_OFF_LINE 0
#define PROCESSOR_SHUTDOWN 1
#define PROCESSOR_START 2
#define PROCESSOR_INACTIVE 3
#define PROCESSOR_IDLE 4
#define PROCESSOR_DISPATCHING 5
#define PROCESSOR_RUNNING 6
extern processor_t current_processor(void);
extern processor_t cpu_to_processor(
int cpu);
#define pset_lock(p) simple_lock(&(p)->sched_lock)
#define pset_unlock(p) simple_unlock(&(p)->sched_lock)
#define pset_lock_init(p) simple_lock_init(&(p)->sched_lock, 0)
#define pset_pri_hint(ps, p, pri) \
MACRO_BEGIN \
if ((p) != (ps)->low_pri) { \
if ((pri) < (ps)->low_pri->current_pri) \
(ps)->low_pri = (p); \
else \
if ((ps)->low_pri->state < PROCESSOR_IDLE) \
(ps)->low_pri = (p); \
} \
MACRO_END
#define pset_count_hint(ps, p, cnt) \
MACRO_BEGIN \
if ((p) != (ps)->low_count) { \
if ((cnt) < (ps)->low_count->runq.count) \
(ps)->low_count = (p); \
else \
if ((ps)->low_count->state < PROCESSOR_IDLE) \
(ps)->low_count = (p); \
} \
MACRO_END
extern void processor_bootstrap(void) __attribute__((section("__TEXT, initcode")));
extern void processor_init(
processor_t processor,
int cpu_id,
processor_set_t processor_set) __attribute__((section("__TEXT, initcode")));
extern void processor_meta_init(
processor_t processor,
processor_t primary);
extern kern_return_t processor_shutdown(
processor_t processor);
extern void processor_queue_shutdown(
processor_t processor);
extern processor_set_t processor_pset(
processor_t processor);
extern pset_node_t pset_node_root(void);
extern processor_set_t pset_create(
pset_node_t node);
extern void pset_init(
processor_set_t pset,
pset_node_t node) __attribute__((section("__TEXT, initcode")));
extern kern_return_t processor_info_count(
processor_flavor_t flavor,
mach_msg_type_number_t *count);
#define pset_deallocate(x)
#define pset_reference(x)
extern void machine_run_count(
uint32_t count);
extern boolean_t machine_cpu_is_inactive(
int cpu_id);
#else
__BEGIN_DECLS
extern void pset_deallocate(
processor_set_t pset);
extern void pset_reference(
processor_set_t pset);
__END_DECLS
#endif
#endif