static RTAI_SYSCALL_MODE int sys_rtdm_recvmsg(long fd, struct msghdr *msg, long flags) { struct msghdr krnl_msg; struct task_struct *curr = current; int ret; if (unlikely(!__xn_access_ok(curr, VERIFY_WRITE, msg, sizeof(krnl_msg)))) { return -EFAULT; } __xn_copy_from_user(curr, &krnl_msg, msg, sizeof(krnl_msg)); if ((ret = __rt_dev_recvmsg(curr, fd, &krnl_msg, flags)) >= 0) { __xn_copy_to_user(curr, msg, &krnl_msg, sizeof(krnl_msg)); } return ret; }
static int sys_rtdm_recvmsg(struct pt_regs *regs) { struct task_struct *p = current; struct msghdr krnl_msg; int ret; if (unlikely(!access_wok(__xn_reg_arg2(regs), sizeof(krnl_msg)) || __xn_copy_from_user(&krnl_msg, (void __user *)__xn_reg_arg2(regs), sizeof(krnl_msg)))) return -EFAULT; ret = __rt_dev_recvmsg(p, __xn_reg_arg1(regs), &krnl_msg, __xn_reg_arg3(regs)); if (unlikely(ret < 0)) return ret; if (unlikely(__xn_copy_to_user((void __user *)__xn_reg_arg2(regs), &krnl_msg, sizeof(krnl_msg)))) return -EFAULT; return ret; }