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(¤t->mm->mmap_sem); 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd} 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic inline void unlock_out_mmap(void) 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unlock_kernel(); 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd up(¤t->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