00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _RTAI_ASM_I386_SHM_H
00020 #define _RTAI_ASM_I386_SHM_H
00021
00022 #include <asm/pgtable.h>
00023 #include <asm/io.h>
00024 #include <asm/rtai_vectors.h>
00025 #include <rtai_wrappers.h>
00026
00027 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
00028 #define VMALLOC_VMADDR(x) ((unsigned long)(x))
00029 #endif
00030
00031 #ifndef __KERNEL__
00032
00033 static inline long long rtai_shmrq(int srq, unsigned long args)
00034 {
00035 long long retval;
00036 RTAI_DO_TRAP(RTAI_SYS_VECTOR, retval, srq, args);
00037 return retval;
00038 }
00039
00040 #endif
00041
00042
00043
00044
00045 static inline unsigned long uvirt_to_kva(pgd_t *pgd, unsigned long adr)
00046 {
00047 unsigned long ret = 0UL;
00048 pmd_t *pmd;
00049 pte_t *ptep, pte;
00050
00051 if(!pgd_none(*pgd)) {
00052 pmd = pmd_offset(pgd, adr);
00053 if (!pmd_none(*pmd)) {
00054 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
00055 ptep = pte_offset(pmd, adr);
00056 #else
00057 ptep = pte_offset_kernel(pmd, adr);
00058 #endif
00059 pte = *ptep;
00060 if(pte_present(pte)){
00061 ret = (unsigned long) page_address(pte_page(pte));
00062 ret |= (adr&(PAGE_SIZE-1));
00063 }
00064 }
00065 }
00066 return ret;
00067 }
00068
00069 static inline unsigned long uvirt_to_bus(unsigned long adr)
00070 {
00071 unsigned long kva, ret;
00072
00073 kva = uvirt_to_kva(pgd_offset(current->mm, adr), adr);
00074 ret = virt_to_bus((void *)kva);
00075
00076 return ret;
00077 }
00078
00079 static inline unsigned long kvirt_to_bus(unsigned long adr)
00080 {
00081 unsigned long va, kva, ret;
00082
00083 va = VMALLOC_VMADDR(adr);
00084 kva = uvirt_to_kva(pgd_offset_k(va), va);
00085 ret = virt_to_bus((void *)kva);
00086
00087 return ret;
00088 }
00089
00090 static inline unsigned long kvirt_to_pa(unsigned long adr)
00091 {
00092 unsigned long va, kva, ret;
00093
00094 va = VMALLOC_VMADDR(adr);
00095 kva = uvirt_to_kva(pgd_offset_k(va), va);
00096 ret = __pa(kva);
00097
00098 return ret;
00099 }
00100
00101 #endif