phunix/minix/kernel/cpulocals.h
Lionel Sambuc 733a844ac6 kernel/cpulocals.h: Simplify macros
Change-Id: Ice845fb0743ff686398293cef2620f5ac9c902ad
2016-07-09 12:18:15 +02:00

80 lines
2.2 KiB
C

/* Implementation of CPU local variables generics */
#ifndef __CPULOCALS_H__
#define __CPULOCALS_H__
#ifndef __ASSEMBLY__
#ifdef CONFIG_SMP
/* SMP */
#define CPULOCAL_ARRAY [CONFIG_MAX_CPUS]
#define get_cpu_var(cpu, name) __cpu_local_vars[cpu].name
#define get_cpu_var_ptr(cpu, name) (&(get_cpu_var(cpu, name)))
#define get_cpulocal_var(name) get_cpu_var(cpuid, name)
#define get_cpulocal_var_ptr(name) get_cpu_var_ptr(cpuid, name)
/* FIXME - padd the structure so that items in the array do not share cacheline
* with other cpus */
#else
/* single CPU */
#define CPULOCAL_ARRAY
#define get_cpulocal_var(name) __cpu_local_vars.name
#define get_cpulocal_var_ptr(name) &(get_cpulocal_var(name))
#define get_cpu_var(cpu, name) get_cpulocal_var(name)
#define get_cpu_var_ptr(cpu, name) get_cpulocal_var_ptr(name)
#endif
/*
* The global cpu local variables in use
*/
extern struct __cpu_local_vars {
/* Process scheduling information and the kernel reentry count. */
struct proc *proc_ptr;/* pointer to currently running process */
struct proc *bill_ptr;/* process to bill for clock ticks */
struct proc idle_proc;/* stub for an idle process */
/*
* signal whether pagefault is already being handled to detect recursive
* pagefaults
*/
int pagefault_handled;
/*
* which processpage tables are loaded right now. We need to know this because
* some processes are loaded in each process pagetables and don't have their own
* pagetables. Therefore we cannot use the proc_ptr pointer
*/
struct proc * ptproc;
/* CPU private run queues */
struct proc * run_q_head[NR_SCHED_QUEUES]; /* ptrs to ready list headers */
struct proc * run_q_tail[NR_SCHED_QUEUES]; /* ptrs to ready list tails */
int cpu_is_idle; /* let the others know that you are idle */
int idle_interrupted; /* to interrupt busy-idle
while profiling */
u64_t tsc_ctr_switch; /* when did we switched time accounting */
/* last values read from cpu when sending ooq msg to scheduler */
u64_t cpu_last_tsc;
u64_t cpu_last_idle;
char fpu_presence; /* whether the cpu has FPU or not */
struct proc * fpu_owner; /* who owns the FPU of the local cpu */
} __cpu_local_vars CPULOCAL_ARRAY;
#endif /* __ASSEMBLY__ */
#endif /* __CPULOCALS_H__ */