| 733 | } |
| 734 | |
| 735 | void *lwp_memcpy(void * __restrict dst, const void * __restrict src, size_t size) |
| 736 | { |
| 737 | void *rc = dst; |
| 738 | long len; |
| 739 | |
| 740 | if (lwp_in_user_space(dst)) |
| 741 | { |
| 742 | if (!lwp_in_user_space(src)) |
| 743 | { |
| 744 | len = lwp_put_to_user(dst, (void *)src, size); |
| 745 | if (!len) |
| 746 | { |
| 747 | LOG_E("lwp_put_to_user(lwp=%p, dst=%p,src=%p,size=0x%lx) failed", lwp_self(), dst, src, size); |
| 748 | } |
| 749 | } |
| 750 | else |
| 751 | { |
| 752 | /* not support yet */ |
| 753 | LOG_W("%s(dst=%p,src=%p,size=0x%lx): operation not support", dst, src, size, __func__); |
| 754 | } |
| 755 | } |
| 756 | else |
| 757 | { |
| 758 | if (lwp_in_user_space(src)) |
| 759 | { |
| 760 | len = lwp_get_from_user(dst, (void *)src, size); |
| 761 | if (!len) |
| 762 | { |
| 763 | LOG_E("lwp_get_from_user(lwp=%p, dst=%p,src=%p,size=0x%lx) failed", lwp_self(), dst, src, size); |
| 764 | } |
| 765 | } |
| 766 | else |
| 767 | { |
| 768 | if (_can_unaligned_access(dst) && _can_unaligned_access(src)) |
| 769 | { |
| 770 | rc = memcpy(dst, src, size); |
| 771 | } |
| 772 | else |
| 773 | { |
| 774 | rt_memcpy(dst, src, size); |
| 775 | } |
| 776 | } |
| 777 | } |
| 778 | |
| 779 | return rc; |
| 780 | } |
| 781 | |
| 782 | int lwp_user_accessible_ext(struct rt_lwp *lwp, void *addr, size_t size) |
| 783 | { |
no test coverage detected