compat22.h revision cc2ee177dbb3befca43e36cfc56778b006c3d050
1/**
2 * @file compat22.h
3 * Compatability functions for 2.2 kernels
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#ifndef COMPAT22_H
13#define COMPAT22_H
14
15#include <linux/smp_lock.h>
16
17#define local_irq_disable()	__cli()
18#define local_irq_enable()	__sti()
19#define pte_page_address(a) pte_page(a)
20
21#define GET_VM_OFFSET(v) ((v)->vm_offset)
22#define MODULE_LICENSE(l)
23#define NEED_2_2_DENTRIES
24#define INC_USE_COUNT_MAYBE MOD_INC_USE_COUNT
25#define DEC_USE_COUNT_MAYBE MOD_DEC_USE_COUNT
26#define lock_execve lock_kernel
27#define unlock_execve unlock_kernel
28
29/* BKL-protected on 2.2 */
30#define lock_mmap(mm) do {} while (0)
31#define unlock_mmap(mm) do {} while (0)
32
33/* on 2.2 we use pid as tgid, thread seperation is possible but
34 * each thread is in its own thread group */
35static inline pid_t op_get_tgid(void)
36{
37	return current->pid;
38}
39
40/* the wake_up path doesn't disable interrupts for wait queue
41 * manipulation. So let's force it to.
42 */
43static inline void oprof_wake_up(struct wait_queue **q)
44{
45	unsigned long flags;
46	save_flags(flags);
47	cli();
48	wake_up(q);
49	restore_flags(flags);
50}
51
52extern int wind_dentries_2_2(struct dentry *dentry);
53extern uint do_path_hash_2_2(struct dentry *dentry);
54#define wind_dentries(d, v, r, m) wind_dentries_2_2(d)
55#define hash_path(f) do_path_hash_2_2((f)->f_dentry)
56
57static inline void lock_out_mmap(void)
58{
59	lock_kernel();
60	down(&current->mm->mmap_sem);
61}
62
63static inline void unlock_out_mmap(void)
64{
65	unlock_kernel();
66	up(&current->mm->mmap_sem);
67}
68
69/* different request_region */
70#define request_region_check compat_request_region
71void *compat_request_region (unsigned long start, unsigned long n, char const * name);
72
73#define __exit
74
75#define virt_to_page(va) MAP_NR(va)
76
77/* 2.2 has no cpu_number_map on UP */
78#ifdef CONFIG_SMP
79	#define op_cpu_id() cpu_number_map[smp_processor_id()]
80#else
81	#define op_cpu_id() smp_processor_id()
82#endif /* CONFIG_SMP */
83
84/* provide a working smp_call_function */
85#if !defined(CONFIG_SMP)
86
87	#undef smp_call_function
88	static int inline smp_call_function (void (*func) (void *info), void *info,
89					     int retry, int wait)
90	{
91		return 0;
92	}
93
94#endif /* !CONFIG_SMP */
95
96#if V_BEFORE(2,2,18)
97
98	/* 2.2.18 introduced module_init */
99	/* Not sure what version aliases were introduced in, but certainly in 2.91.66.  */
100	#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91)
101		#define module_init(x)	int init_module(void) __attribute__((alias(#x)));
102		#define module_exit(x)	void cleanup_module(void) __attribute__((alias(#x)));
103	#else
104		#define module_init(x)	int init_module(void) { return x(); }
105		#define module_exit(x)	void cleanup_module(void) { x(); }
106	#endif
107
108	/* 2.2.18 introduced vmalloc_32 */
109	#define vmalloc_32 vmalloc
110
111	/* 2.2.18 add doubled linked list wait_queue and mutex */
112	#define DECLARE_WAIT_QUEUE_HEAD(q) struct wait_queue *q = NULL
113	#define DECLARE_MUTEX(foo)	struct semaphore foo = MUTEX
114
115	/* 2.2.18 add THIS_MODULE */
116	#define THIS_MODULE (&__this_module)
117
118	/* 2.2.18 add BUG() FIXME: this is arch dependant would must use
119	 * *(char *)0 = 0 instead ? */
120	#define BUG() __asm__ __volatile__("ud2\n");
121
122#endif /* V_BEFORE(2,2,18) */
123
124/* 2.2.18 introduced the rtc lock */
125#ifdef RTC_LOCK
126	#define lock_rtc(f) spin_lock_irqsave(&rtc_lock, f)
127	#define unlock_rtc(f) spin_unlock_irqrestore(&rtc_lock, f)
128#else
129	#define lock_rtc(f) do { save_flags(f); cli(); } while (0)
130	#define unlock_rtc(f) restore_flags(f)
131#endif /* RTC_LOCK */
132
133#if V_AT_LEAST(2,2,20)
134	#define PTRACE_OFF(t) ((t)->ptrace &= ~PT_DTRACE)
135#else
136	#define PTRACE_OFF(t) ((t)->flags &= ~PF_DTRACE)
137#endif
138
139/* 2.2.21 introduced cpuid_edx */
140#if V_BEFORE(2,2,21)
141static inline unsigned int cpuid_edx(unsigned int op)
142{
143	unsigned int eax, edx;
144
145	__asm__("cpuid"
146		: "=a" (eax), "=d" (edx)
147		: "0" (op)
148		: "bx", "cx");
149	return edx;
150}
151#endif
152
153#endif /* COMPAT22_H */
154