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 
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
00053 
        pmd = pmd_offset(pgd, adr);
00054 
#else 
00055         pmd = pmd_offset(pud_offset(pgd, adr), adr);
00056 
#endif 
00057         
if (!pmd_none(*pmd)) {
00058 
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
00059 
            ptep = pte_offset(pmd, adr);
00060 
#else 
00061             ptep = pte_offset_kernel(pmd, adr);
00062 
#endif 
00063             pte = *ptep;
00064             
if(pte_present(pte)){
00065                 ret = (
unsigned long) page_address(pte_page(pte));
00066                 ret |= (adr&(PAGE_SIZE-1));
00067             }
00068         }
00069     }
00070     
return ret;
00071 }
00072 
00073 static inline unsigned long uvirt_to_bus(
unsigned long adr)
00074 {
00075     
unsigned long kva, ret;
00076 
00077     kva = 
uvirt_to_kva(pgd_offset(current->mm, adr), adr);
00078     ret = virt_to_bus((
void *)kva);
00079 
00080     
return ret;
00081 }
00082 
00083 static inline unsigned long kvirt_to_bus(
unsigned long adr)
00084 {
00085     
unsigned long va, kva, ret;
00086 
00087     va = 
VMALLOC_VMADDR(adr);
00088     kva = 
uvirt_to_kva(pgd_offset_k(va), va);
00089     ret = virt_to_bus((
void *)kva);
00090 
00091     
return ret;
00092 }
00093 
00094 static inline unsigned long kvirt_to_pa(
unsigned long adr)
00095 {
00096     
unsigned long va, kva, ret;
00097 
00098     va = 
VMALLOC_VMADDR(adr);
00099     kva = 
uvirt_to_kva(pgd_offset_k(va), va);
00100     ret = __pa(kva);
00101 
00102     
return ret;
00103 }
00104 
00105 
#endif