18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file compat22.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Compatability functions for 2.2 kernels
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef COMPAT22_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define COMPAT22_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <linux/smp_lock.h>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define local_irq_disable()	__cli()
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define local_irq_enable()	__sti()
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define pte_page_address(a) pte_page(a)
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define GET_VM_OFFSET(v) ((v)->vm_offset)
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define MODULE_LICENSE(l)
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define NEED_2_2_DENTRIES
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define INC_USE_COUNT_MAYBE MOD_INC_USE_COUNT
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define DEC_USE_COUNT_MAYBE MOD_DEC_USE_COUNT
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define lock_execve lock_kernel
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define unlock_execve unlock_kernel
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* BKL-protected on 2.2 */
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define lock_mmap(mm) do {} while (0)
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define unlock_mmap(mm) do {} while (0)
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* on 2.2 we use pid as tgid, thread seperation is possible but
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * each thread is in its own thread group */
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic inline pid_t op_get_tgid(void)
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return current->pid;
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* the wake_up path doesn't disable interrupts for wait queue
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * manipulation. So let's force it to.
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic inline void oprof_wake_up(struct wait_queue **q)
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unsigned long flags;
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	save_flags(flags);
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cli();
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	wake_up(q);
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	restore_flags(flags);
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern int wind_dentries_2_2(struct dentry * dentry);
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern uint do_path_hash_2_2(struct dentry * dentry);
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define wind_dentries(d, v, r, m) wind_dentries_2_2(d)
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define hash_path(f) do_path_hash_2_2((f)->f_dentry)
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic inline void lock_out_mmap(void)
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	lock_kernel();
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	down(&current->mm->mmap_sem);
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic inline void unlock_out_mmap(void)
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unlock_kernel();
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	up(&current->mm->mmap_sem);
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* different request_region */
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define request_region_check compat_request_region
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid * compat_request_region (unsigned long start, unsigned long n, char const * name);
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define __exit
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define virt_to_page(va) MAP_NR(va)
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* 2.2 has no cpu_number_map on UP */
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifdef CONFIG_SMP
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define op_cpu_id() cpu_number_map[smp_processor_id()]
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#else
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define op_cpu_id() smp_processor_id()
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* CONFIG_SMP */
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* provide a working smp_call_function */
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#if !defined(CONFIG_SMP)
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#undef smp_call_function
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	static int inline smp_call_function (void (*func) (void * info), void * info,
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					     int retry, int wait)
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	{
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return 0;
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !CONFIG_SMP */
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#if V_BEFORE(2, 2, 18)
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* 2.2.18 introduced module_init */
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* Not sure what version aliases were introduced in, but certainly in 2.91.66.  */
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91)
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#define module_init(x)	int init_module(void) __attribute__((alias(#x)));
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#define module_exit(x)	void cleanup_module(void) __attribute__((alias(#x)));
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#else
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#define module_init(x)	int init_module(void) { return x(); }
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#define module_exit(x)	void cleanup_module(void) { x(); }
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#endif
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* 2.2.18 introduced vmalloc_32 */
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define vmalloc_32 vmalloc
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* 2.2.18 add doubled linked list wait_queue and mutex */
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define DECLARE_WAIT_QUEUE_HEAD(q) struct wait_queue * q = NULL
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define DECLARE_MUTEX(foo)	struct semaphore foo = MUTEX
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* 2.2.18 add THIS_MODULE */
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define THIS_MODULE (&__this_module)
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* 2.2.18 add BUG() FIXME: this is arch dependant would must use
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * *(char *)0 = 0 instead ? */
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define BUG() __asm__ __volatile__("ud2\n");
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* V_BEFORE(2,2,18) */
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* 2.2.18 introduced the rtc lock */
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifdef RTC_LOCK
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define lock_rtc(f) spin_lock_irqsave(&rtc_lock, f)
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define unlock_rtc(f) spin_unlock_irqrestore(&rtc_lock, f)
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#else
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define lock_rtc(f) do { save_flags(f); cli(); } while (0)
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define unlock_rtc(f) restore_flags(f)
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* RTC_LOCK */
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#if V_AT_LEAST(2, 2, 20)
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define PTRACE_OFF(t) ((t)->ptrace &= ~PT_DTRACE)
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#else
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	#define PTRACE_OFF(t) ((t)->flags &= ~PF_DTRACE)
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* 2.2.21 introduced cpuid_edx */
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#if V_BEFORE(2, 2, 21)
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic inline unsigned int cpuid_edx(unsigned int op)
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unsigned int eax, edx;
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	__asm__("cpuid"
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		: "=a" (eax), "=d" (edx)
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		: "0" (op)
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		: "bx", "cx");
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return edx;
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* COMPAT22_H */
154