#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;
int idle_count;
processor_t low_hint;
processor_t high_hint;
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_mutex_data(extern,tasks_threads_lock)
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;
timer_call_data_t quantum_timer;
uint64_t quantum_end;
uint64_t last_dispatch;
uint64_t deadline;
int timeslice;
struct run_queue runq;
struct ipc_port * processor_self;
decl_simple_lock_data(,lock)
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 processor_t master_processor;
#define PROCESSOR_OFF_LINE 0
#define PROCESSOR_SHUTDOWN 1
#define PROCESSOR_START 2
#define PROCESSOR_IDLE 3
#define PROCESSOR_DISPATCHING 4
#define PROCESSOR_RUNNING 5
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 processor_lock(p) simple_lock(&(p)->lock)
#define processor_unlock(p) simple_unlock(&(p)->lock)
#define processor_lock_init(p) simple_lock_init(&(p)->lock, 0)
#define pset_hint_low(ps, p) \
MACRO_BEGIN \
if ((ps)->low_hint != PROCESSOR_NULL) { \
if ((p) != (ps)->low_hint) { \
if ((p)->runq.count < (ps)->low_hint->runq.count) \
(ps)->low_hint = (p); \
} \
} \
else \
(ps)->low_hint = (p); \
MACRO_END
#define pset_hint_high(ps, p) \
MACRO_BEGIN \
if ((ps)->high_hint != PROCESSOR_NULL) { \
if ((p) != (ps)->high_hint) { \
if ((p)->runq.count > (ps)->high_hint->runq.count) \
(ps)->high_hint = (p); \
} \
} \
else \
(ps)->high_hint = (p); \
MACRO_END
extern void processor_bootstrap(void) __attribute__((section("__TEXT, initcode")));
extern void processor_init(
processor_t processor,
int slot_num,
processor_set_t processor_set) __attribute__((section("__TEXT, initcode")));
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)
#else
__BEGIN_DECLS
extern void pset_deallocate(
processor_set_t pset);
extern void pset_reference(
processor_set_t pset);
__END_DECLS
#endif
#ifdef XNU_KERNEL_PRIVATE
extern uint32_t processor_avail_count;
#endif
#endif