rtdm_iomap_to_user does not handle I/O memory mapping of
physical I/O address grater than 4 GB.
This patch changes the src_addr argument and underlying
code to handle this case.
Signed-off-by: Luis Herrera-Bendezu <lherr...@xxxxxxxxxxx>
---
diff --git a/include/asm-generic/system.h b/include/asm-generic/system.h
index 020e763..f2a9424 100644
--- a/include/asm-generic/system.h
+++ b/include/asm-generic/system.h
@@ -417,7 +417,7 @@ static inline int xnarch_remap_vm_page(struct
vm_area_struct *vma,
static inline int xnarch_remap_io_page_range(struct file *filp,
struct vm_area_struct *vma,
unsigned long from,
- unsigned long to,
+ phys_addr_t to,
unsigned long size,
pgprot_t prot)
{
diff --git a/include/asm-generic/wrappers.h
b/include/asm-generic/wrappers.h
index 943ed34..239eb93 100644
--- a/include/asm-generic/wrappers.h
+++ b/include/asm-generic/wrappers.h
@@ -400,4 +400,8 @@ static inline int wrap_raise_cap(int cap)
}
#endif /* LINUX_VERSION_CODE >= 2.6.29 */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
+typedef unsigned long phys_addr_t;
+#endif
+
#endif /* _XENO_ASM_GENERIC_WRAPPERS_H */
diff --git a/include/rtdm/rtdm_driver.h b/include/rtdm/rtdm_driver.h
index 3026aff..0340de8 100644
--- a/include/rtdm/rtdm_driver.h
+++ b/include/rtdm/rtdm_driver.h
@@ -1168,7 +1168,7 @@ int rtdm_mmap_to_user(rtdm_user_info_t *user_info,
struct vm_operations_struct *vm_ops,
void *vm_private_data);
int rtdm_iomap_to_user(rtdm_user_info_t *user_info,
- unsigned long src_addr, size_t len,
+ phys_addr_t src_addr, size_t len,
int prot, void **pptr,
struct vm_operations_struct *vm_ops,
void *vm_private_data);
diff --git a/ksrc/skins/rtdm/drvlib.c b/ksrc/skins/rtdm/drvlib.c
index 65c630f..8922689 100644
--- a/ksrc/skins/rtdm/drvlib.c
+++ b/ksrc/skins/rtdm/drvlib.c
@@ -1765,7 +1765,7 @@ void rtdm_nrtsig_pend(rtdm_nrtsig_t *nrt_sig);
#if defined(CONFIG_XENO_OPT_PERVASIVE) || defined(DOXYGEN_CPP)
struct rtdm_mmap_data {
void *src_vaddr;
- unsigned long src_paddr;
+ phys_addr_t src_paddr;
struct vm_operations_struct *vm_ops;
void *vm_private_data;
};
@@ -1773,14 +1773,15 @@ struct rtdm_mmap_data {
static int rtdm_mmap_buffer(struct file *filp, struct vm_area_struct
*vma)
{
struct rtdm_mmap_data *mmap_data = filp->private_data;
- unsigned long vaddr, paddr, maddr, size;
+ unsigned long vaddr, maddr, size;
+ phys_addr_t paddr;
int ret;
vma->vm_ops = mmap_data->vm_ops;
vma->vm_private_data = mmap_data->vm_private_data;
vaddr = (unsigned long)mmap_data->src_vaddr;
- paddr = (unsigned long)mmap_data->src_paddr;
+ paddr = mmap_data->src_paddr;
if (!paddr)
/* kmalloc memory */
paddr = virt_to_phys((void *)vaddr);
@@ -1982,7 +1983,7 @@ EXPORT_SYMBOL(rtdm_mmap_to_user);
* Rescheduling: possible.
*/
int rtdm_iomap_to_user(rtdm_user_info_t *user_info,
- unsigned long src_addr, size_t len,
+ phys_addr_t src_addr, size_t len,
int prot, void **pptr,
struct vm_operations_struct *vm_ops,
void *vm_private_data)
---
_______________________________________________
Xenomai-core mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-core