/**
* @file compat22.h
* Compatability functions for 2.2 kernels
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
* @author Philippe Elie
*/
#ifndef COMPAT22_H
#define COMPAT22_H
#include <linux/smp_lock.h>
#define local_irq_disable() __cli()
#define local_irq_enable() __sti()
#define pte_page_address(a) pte_page(a)
#define GET_VM_OFFSET(v) ((v)->vm_offset)
#define MODULE_LICENSE(l)
#define NEED_2_2_DENTRIES
#define INC_USE_COUNT_MAYBE MOD_INC_USE_COUNT
#define DEC_USE_COUNT_MAYBE MOD_DEC_USE_COUNT
#define lock_execve lock_kernel
#define unlock_execve unlock_kernel
/* BKL-protected on 2.2 */
#define lock_mmap(mm) do {} while (0)
#define unlock_mmap(mm) do {} while (0)
/* on 2.2 we use pid as tgid, thread seperation is possible but
* each thread is in its own thread group */
static inline pid_t op_get_tgid(void)
{
return current->pid;
}
/* the wake_up path doesn't disable interrupts for wait queue
* manipulation. So let's force it to.
*/
static inline void oprof_wake_up(struct wait_queue **q)
{
unsigned long flags;
save_flags(flags);
cli();
wake_up(q);
restore_flags(flags);
}
extern int wind_dentries_2_2(struct dentry * dentry);
extern uint do_path_hash_2_2(struct dentry * dentry);
#define wind_dentries(d, v, r, m) wind_dentries_2_2(d)
#define hash_path(f) do_path_hash_2_2((f)->f_dentry)
static inline void lock_out_mmap(void)
{
lock_kernel();
down(¤t->mm->mmap_sem);
}
static inline void unlock_out_mmap(void)
{
unlock_kernel();
up(¤t->mm->mmap_sem);
}
/* different request_region */
#define request_region_check compat_request_region
void * compat_request_region (unsigned long start, unsigned long n, char const * name);
#define __exit
#define virt_to_page(va) MAP_NR(va)
/* 2.2 has no cpu_number_map on UP */
#ifdef CONFIG_SMP
#define op_cpu_id() cpu_number_map[smp_processor_id()]
#else
#define op_cpu_id() smp_processor_id()
#endif /* CONFIG_SMP */
/* provide a working smp_call_function */
#if !defined(CONFIG_SMP)
#undef smp_call_function
static int inline smp_call_function (void (*func) (void * info), void * info,
int retry, int wait)
{
return 0;
}
#endif /* !CONFIG_SMP */
#if V_BEFORE(2, 2, 18)
/* 2.2.18 introduced module_init */
/* Not sure what version aliases were introduced in, but certainly in 2.91.66. */
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91)
#define module_init(x) int init_module(void) __attribute__((alias(#x)));
#define module_exit(x) void cleanup_module(void) __attribute__((alias(#x)));
#else
#define module_init(x) int init_module(void) { return x(); }
#define module_exit(x) void cleanup_module(void) { x(); }
#endif
/* 2.2.18 introduced vmalloc_32 */
#define vmalloc_32 vmalloc
/* 2.2.18 add doubled linked list wait_queue and mutex */
#define DECLARE_WAIT_QUEUE_HEAD(q) struct wait_queue * q = NULL
#define DECLARE_MUTEX(foo) struct semaphore foo = MUTEX
/* 2.2.18 add THIS_MODULE */
#define THIS_MODULE (&__this_module)
/* 2.2.18 add BUG() FIXME: this is arch dependant would must use
* *(char *)0 = 0 instead ? */
#define BUG() __asm__ __volatile__("ud2\n");
#endif /* V_BEFORE(2,2,18) */
/* 2.2.18 introduced the rtc lock */
#ifdef RTC_LOCK
#define lock_rtc(f) spin_lock_irqsave(&rtc_lock, f)
#define unlock_rtc(f) spin_unlock_irqrestore(&rtc_lock, f)
#else
#define lock_rtc(f) do { save_flags(f); cli(); } while (0)
#define unlock_rtc(f) restore_flags(f)
#endif /* RTC_LOCK */
#if V_AT_LEAST(2, 2, 20)
#define PTRACE_OFF(t) ((t)->ptrace &= ~PT_DTRACE)
#else
#define PTRACE_OFF(t) ((t)->flags &= ~PF_DTRACE)
#endif
/* 2.2.21 introduced cpuid_edx */
#if V_BEFORE(2, 2, 21)
static inline unsigned int cpuid_edx(unsigned int op)
{
unsigned int eax, edx;
__asm__("cpuid"
: "=a" (eax), "=d" (edx)
: "0" (op)
: "bx", "cx");
return edx;
}
#endif
#endif /* COMPAT22_H */