| 780 | } |
| 781 | |
| 782 | int lwp_user_accessible_ext(struct rt_lwp *lwp, void *addr, size_t size) |
| 783 | { |
| 784 | void *addr_start = RT_NULL, *addr_end = RT_NULL, *next_page = RT_NULL; |
| 785 | void *tmp_addr = RT_NULL; |
| 786 | |
| 787 | if (!lwp) |
| 788 | { |
| 789 | return RT_FALSE; |
| 790 | } |
| 791 | if (!size || !addr) |
| 792 | { |
| 793 | return RT_FALSE; |
| 794 | } |
| 795 | addr_start = addr; |
| 796 | addr_end = (void *)((char *)addr + size); |
| 797 | |
| 798 | #ifdef ARCH_RISCV64 |
| 799 | if (addr_start < (void *)USER_VADDR_START) |
| 800 | { |
| 801 | return RT_FALSE; |
| 802 | } |
| 803 | #else |
| 804 | if (addr_start >= (void *)USER_VADDR_TOP) |
| 805 | { |
| 806 | return RT_FALSE; |
| 807 | } |
| 808 | if (addr_end > (void *)USER_VADDR_TOP) |
| 809 | { |
| 810 | return RT_FALSE; |
| 811 | } |
| 812 | #endif |
| 813 | |
| 814 | next_page = |
| 815 | (void *)(((size_t)addr_start + ARCH_PAGE_SIZE) & ~(ARCH_PAGE_SIZE - 1)); |
| 816 | do |
| 817 | { |
| 818 | size_t len = (char *)next_page - (char *)addr_start; |
| 819 | |
| 820 | if (size < len) |
| 821 | { |
| 822 | len = size; |
| 823 | } |
| 824 | tmp_addr = lwp_v2p(lwp, addr_start); |
| 825 | if (tmp_addr == ARCH_MAP_FAILED && |
| 826 | !rt_aspace_query(lwp->aspace, addr_start)) |
| 827 | { |
| 828 | return RT_FALSE; |
| 829 | } |
| 830 | addr_start = (void *)((char *)addr_start + len); |
| 831 | size -= len; |
| 832 | next_page = (void *)((char *)next_page + ARCH_PAGE_SIZE); |
| 833 | } while (addr_start < addr_end); |
| 834 | return RT_TRUE; |
| 835 | } |
| 836 | |
| 837 | int lwp_user_accessable(void *addr, size_t size) |
| 838 | { |