94 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.8 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)		CPULOCAL_STRUCT[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)		CPULOCAL_STRUCT.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
 | |
| 
 | |
| 
 | |
| 
 | |
| #define DECLARE_CPULOCAL(type, name)	type name
 | |
| 
 | |
| #define CPULOCAL_STRUCT			__cpu_local_vars
 | |
| #define ___CPULOCAL_START		struct CPULOCAL_STRUCT {
 | |
| #define ___CPULOCAL_END		} CPULOCAL_STRUCT CPULOCAL_ARRAY;
 | |
| 
 | |
| #define DECLARE_CPULOCAL_START		extern ___CPULOCAL_START
 | |
| #define DECLARE_CPULOCAL_END		___CPULOCAL_END
 | |
| 
 | |
| #define DEFINE_CPULOCAL_VARS	struct CPULOCAL_STRUCT CPULOCAL_STRUCT CPULOCAL_ARRAY
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * The global cpu local variables in use
 | |
|  */
 | |
| DECLARE_CPULOCAL_START
 | |
| 
 | |
| /* Process scheduling information and the kernel reentry count. */
 | |
| DECLARE_CPULOCAL(struct proc *,proc_ptr);/* pointer to currently running process */
 | |
| DECLARE_CPULOCAL(struct proc *,bill_ptr);/* process to bill for clock ticks */
 | |
| DECLARE_CPULOCAL(struct proc ,idle_proc);/* stub for an idle process */
 | |
| 
 | |
| /* 
 | |
|  * signal whether pagefault is already being handled to detect recursive
 | |
|  * pagefaults
 | |
|  */
 | |
| DECLARE_CPULOCAL(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
 | |
|  */
 | |
| DECLARE_CPULOCAL(struct proc *, ptproc);
 | |
| 
 | |
| /* CPU private run queues */
 | |
| DECLARE_CPULOCAL(struct proc *, run_q_head[NR_SCHED_QUEUES]); /* ptrs to ready list headers */
 | |
| DECLARE_CPULOCAL(struct proc *, run_q_tail[NR_SCHED_QUEUES]); /* ptrs to ready list tails */
 | |
| DECLARE_CPULOCAL(volatile int, cpu_is_idle); /* let the others know that you are idle */
 | |
| 
 | |
| DECLARE_CPULOCAL(volatile int, idle_interrupted); /* to interrupt busy-idle
 | |
| 						     while profiling */
 | |
| 
 | |
| DECLARE_CPULOCAL(u64_t ,tsc_ctr_switch); /* when did we switched time accounting */
 | |
| 
 | |
| /* last values read from cpu when sending ooq msg to scheduler */
 | |
| DECLARE_CPULOCAL(u64_t, cpu_last_tsc);
 | |
| DECLARE_CPULOCAL(u64_t, cpu_last_idle);
 | |
| 
 | |
| 
 | |
| DECLARE_CPULOCAL(char ,fpu_presence); /* whether the cpu has FPU or not */
 | |
| DECLARE_CPULOCAL(struct proc * ,fpu_owner); /* who owns the FPU of the local cpu */
 | |
| 
 | |
| DECLARE_CPULOCAL_END
 | |
| 
 | |
| #endif /* __ASSEMBLY__ */
 | |
| 
 | |
| #endif /* __CPULOCALS_H__ */
 | 
