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