Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion components/dfs/dfs_v1/filesystems/nfs/rpc/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ typedef unsigned long u_long;
typedef int bool_t;
typedef int enum_t;

#if !defined(RT_USING_NEWLIB) && !defined(RT_USING_MUSL)
#if !defined(RT_USING_NEWLIB) && !defined(RT_USING_MUSLLIBC)
typedef unsigned long dev_t;
#endif

Expand Down
100 changes: 100 additions & 0 deletions components/lwp/libc_musl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-07-11 RT-Thread first version
*/

#ifndef __LIBC_MUSL_H__
#define __LIBC_MUSL_H__

/* from internal/futex.h */

#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
#define FUTEX_FD 2
#define FUTEX_REQUEUE 3
#define FUTEX_CMP_REQUEUE 4
#define FUTEX_WAKE_OP 5
#define FUTEX_LOCK_PI 6
#define FUTEX_UNLOCK_PI 7
#define FUTEX_TRYLOCK_PI 8
#define FUTEX_WAIT_BITSET 9

#define FUTEX_PRIVATE 128

#define FUTEX_CLOCK_REALTIME 256

/* for pmutex op */
#define PMUTEX_INIT 0
#define PMUTEX_LOCK 1
#define PMUTEX_UNLOCK 2
#define PMUTEX_DESTROY 3

/* for sys/mman.h */
#define MAP_FAILED ((void *) -1)

#define MAP_SHARED 0x01
#define MAP_PRIVATE 0x02
#define MAP_SHARED_VALIDATE 0x03
#define MAP_TYPE 0x0f
#define MAP_FIXED 0x10
#define MAP_ANON 0x20
#define MAP_ANONYMOUS MAP_ANON
#define MAP_NORESERVE 0x4000
#define MAP_GROWSDOWN 0x0100
#define MAP_DENYWRITE 0x0800
#define MAP_EXECUTABLE 0x1000
#define MAP_LOCKED 0x2000
#define MAP_POPULATE 0x8000
#define MAP_NONBLOCK 0x10000
#define MAP_STACK 0x20000
#define MAP_HUGETLB 0x40000
#define MAP_SYNC 0x80000
#define MAP_FIXED_NOREPLACE 0x100000
#define MAP_FILE 0

#define MAP_UNINITIALIZED 0x4000000 /** For anonymous mmap, memory could be
* uninitialized */

#define MAP_HUGE_SHIFT 26
#define MAP_HUGE_MASK 0x3f
#define MAP_HUGE_16KB (14 << 26)
#define MAP_HUGE_64KB (16 << 26)
#define MAP_HUGE_512KB (19 << 26)
#define MAP_HUGE_1MB (20 << 26)
#define MAP_HUGE_2MB (21 << 26)
#define MAP_HUGE_8MB (23 << 26)
#define MAP_HUGE_16MB (24 << 26)
#define MAP_HUGE_32MB (25 << 26)
#define MAP_HUGE_256MB (28 << 26)
#define MAP_HUGE_512MB (29 << 26)
#define MAP_HUGE_1GB (30 << 26)
#define MAP_HUGE_2GB (31 << 26)
#define MAP_HUGE_16GB (34U << 26)

#define PROT_NONE 0
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4
#define PROT_GROWSDOWN 0x01000000
#define PROT_GROWSUP 0x02000000

#define MS_ASYNC 1
#define MS_INVALIDATE 2
#define MS_SYNC 4

#define MCL_CURRENT 1
#define MCL_FUTURE 2
#define MCL_ONFAULT 4

#define POSIX_MADV_NORMAL 0
#define POSIX_MADV_RANDOM 1
#define POSIX_MADV_SEQUENTIAL 2
#define POSIX_MADV_WILLNEED 3
#define POSIX_MADV_DONTNEED 4

#endif /* __LIBC_MUSL_H__ */
2 changes: 1 addition & 1 deletion components/lwp/lwp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1341,7 +1341,7 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp)
return -RT_ERROR;
}

#ifdef RT_USING_MUSL
#ifdef RT_USING_MUSLLIBC
extern char **__environ;
#else
char **__environ = 0;
Expand Down
16 changes: 10 additions & 6 deletions components/lwp/lwp.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,29 +23,33 @@
#include <rtthread.h>
#include <dfs.h>

#include "lwp_arch.h"
#include "lwp_pid.h"
#include "lwp_ipc.h"
#include "lwp_signal.h"
#include "lwp_syscall.h"
#include "lwp_avl.h"
#include "mm_aspace.h"

#ifdef RT_USING_MUSLLIBC
#include "libc_musl.h"
#endif /* RT_USING_MUSLLIBC */

#ifdef ARCH_MM_MMU
#include "lwp_shm.h"

#include "mmu.h"
#include "page.h"
#else
#include "lwp_mpu.h"
#endif
#include "lwp_arch.h"
#endif /* ARCH_MM_MMU */

#ifdef RT_USING_MUSL
#ifdef RT_USING_MUSLLIBC
#include <locale.h>
#endif
#endif /* RT_USING_MUSLLIBC */

#ifdef RT_USING_TTY
struct tty_struct;
#endif
#endif /* RT_USING_TTY */

#ifdef __cplusplus
extern "C" {
Expand Down
10 changes: 5 additions & 5 deletions components/lwp/lwp_syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -764,26 +764,26 @@ sysret_t sys_poll(struct pollfd *fds, nfds_t nfds, int timeout)
kmem_put(kfds);
return ret;
#else
#ifdef RT_USING_MUSL
#ifdef RT_USING_MUSLLIBC
for (i = 0; i < nfds; i++)
{
musl2dfs_events(&fds->events);
}
#endif /* RT_USING_MUSL */
#endif /* RT_USING_MUSLLIBC */
if (!lwp_user_accessable((void *)fds, nfds * sizeof *fds))
{
return -EFAULT;
}
ret = poll(fds, nfds, timeout);
#ifdef RT_USING_MUSL
#ifdef RT_USING_MUSLLIBC
if (ret > 0)
{
for (i = 0; i < nfds; i++)
{
dfs2musl_events(&fds->revents);
}
}
#endif /* RT_USING_MUSL */
#endif /* RT_USING_MUSLLIBC */
return ret;
#endif /* ARCH_MM_MMU */
}
Expand Down Expand Up @@ -3986,7 +3986,7 @@ sysret_t sys_rmdir(const char *path)
#endif
}

#ifdef RT_USING_MUSL
#ifdef RT_USING_MUSLLIBC
typedef uint64_t ino_t;
#endif

Expand Down
24 changes: 19 additions & 5 deletions components/lwp/lwp_user_mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
#include <mmu.h>
#include <page.h>

#ifdef RT_USING_MUSLLIBC
#include "libc_musl.h"
#endif

#define DBG_TAG "LwP"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
Expand Down Expand Up @@ -506,8 +510,6 @@ rt_base_t lwp_brk(void *addr)
return ret;
}

#define MAP_ANONYMOUS 0x20

void *lwp_mmap2(void *addr, size_t length, int prot, int flags, int fd,
off_t pgoffset)
{
Expand Down Expand Up @@ -622,11 +624,10 @@ size_t lwp_put_to_user(void *dst, void *src, size_t size)
return lwp_data_put(lwp, dst, src, size);
}

int lwp_user_accessable(void *addr, size_t size)
int lwp_user_accessible_ext(struct rt_lwp *lwp, void *addr, size_t size)
{
void *addr_start = RT_NULL, *addr_end = RT_NULL, *next_page = RT_NULL;
void *tmp_addr = RT_NULL;
struct rt_lwp *lwp = lwp_self();

if (!lwp)
{
Expand Down Expand Up @@ -669,7 +670,15 @@ int lwp_user_accessable(void *addr, size_t size)
if (tmp_addr == ARCH_MAP_FAILED)
{
if ((rt_ubase_t)addr_start >= USER_STACK_VSTART && (rt_ubase_t)addr_start < USER_STACK_VEND)
tmp_addr = *(void **)addr_start;
{
struct rt_aspace_fault_msg msg = {
.fault_op = MM_FAULT_OP_WRITE,
.fault_type = MM_FAULT_TYPE_PAGE_FAULT,
.fault_vaddr = addr_start,
};
if (!rt_aspace_fault_try_fix(lwp->aspace, &msg))
return 0;
}
else
return 0;
}
Expand All @@ -680,6 +689,11 @@ int lwp_user_accessable(void *addr, size_t size)
return 1;
}

int lwp_user_accessable(void *addr, size_t size)
{
return lwp_user_accessible_ext(lwp_self(), addr, size);
}

/* src is in mmu_info space, dst is in current thread space */
size_t lwp_data_get(struct rt_lwp *lwp, void *dst, void *src, size_t size)
{
Expand Down
1 change: 1 addition & 0 deletions components/lwp/lwp_user_mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ int lwp_munmap(void *addr);
size_t lwp_get_from_user(void *dst, void *src, size_t size);
size_t lwp_put_to_user(void *dst, void *src, size_t size);
int lwp_user_accessable(void *addr, size_t size);
int lwp_user_accessible_ext(struct rt_lwp *lwp, void *addr, size_t size);

size_t lwp_data_get(struct rt_lwp *lwp, void *dst, void *src, size_t size);
size_t lwp_data_put(struct rt_lwp *lwp, void *dst, void *src, size_t size);
Expand Down
44 changes: 41 additions & 3 deletions components/mm/mm_aspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,11 +400,11 @@ static inline int _not_align(void *start, rt_size_t length, rt_size_t mask)
(((uintptr_t)start & mask) || (length & mask));
}

/** if the flag is currently supported */
static inline int _not_support(rt_size_t flags)
{
rt_size_t support_ops = (MMF_PREFETCH | MMF_MAP_FIXED | MMF_TEXT |
MMF_STATIC_ALLOC | MMF_REQUEST_ALIGN);
return flags & ~(support_ops | _MMF_ALIGN_MASK);
rt_size_t support_ops = MMF_CREATE(((__MMF_INVALID - 1) << 1) - 1, 1);
return flags & ~(support_ops);
}

int rt_aspace_map(rt_aspace_t aspace, void **addr, rt_size_t length,
Expand Down Expand Up @@ -855,6 +855,15 @@ int rt_varea_map_page(rt_varea_t varea, void *vaddr, void *page)

#define ALIGNED(addr) (!((rt_size_t)(addr) & ARCH_PAGE_MASK))

int rt_varea_unmap_page(rt_varea_t varea, void *vaddr)
{
void *va_aligned = (void *)RT_ALIGN_DOWN((rt_base_t)vaddr, ARCH_PAGE_SIZE);
return rt_varea_unmap_range(varea, va_aligned, ARCH_PAGE_SIZE);
}

/**
* @note Caller should take care of synchronization of its varea among all the map/unmap operation
*/
int rt_varea_map_range(rt_varea_t varea, void *vaddr, void *paddr, rt_size_t length)
{
int err;
Expand Down Expand Up @@ -883,6 +892,35 @@ int rt_varea_map_range(rt_varea_t varea, void *vaddr, void *paddr, rt_size_t len
return err;
}

/**
* @note Caller should take care of synchronization of its varea among all the map/unmap operation
*/
int rt_varea_unmap_range(rt_varea_t varea, void *vaddr, rt_size_t length)
{
int err;
rt_base_t va_align;

if (!varea || !vaddr || !length)
{
LOG_W("%s(%p,%p,%lx): invalid input", __func__, varea, vaddr, length);
err = -RT_EINVAL;
}
else if (_not_in_range(vaddr, length, varea->start, varea->size))
{
LOG_W("%s(%p,%lx): not in range of varea(%p,%lx)", __func__,
vaddr, length, varea->start, varea->size);
err = -RT_EINVAL;
}
else
{
va_align = RT_ALIGN_DOWN((rt_base_t)vaddr, ARCH_PAGE_SIZE);
rt_hw_mmu_unmap(varea->aspace, (void *)va_align, length);
rt_hw_tlb_invalidate_range(varea->aspace, (void *)va_align, length, ARCH_PAGE_SIZE);
err = RT_EOK;
}
return err;
}

int rt_aspace_offload_page(rt_aspace_t aspace, void *addr, rt_size_t npage)
{
return -RT_ENOSYS;
Expand Down
26 changes: 26 additions & 0 deletions components/mm/mm_aspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,22 @@ void rt_aspace_print_all(rt_aspace_t aspace);
*/
int rt_varea_map_page(rt_varea_t varea, void *vaddr, void *page);

/**
* @brief Unmap one page in varea
*
* @param varea target varea
* @param addr user address
* @param page the page frame to be mapped
* @return int
*/
int rt_varea_unmap_page(rt_varea_t varea, void *vaddr);

/**
* @brief Map a range of physical address to varea
*
* @warning Caller should take care of synchronization of its varea among all
* the map/unmap operation
*
* @param varea target varea
* @param vaddr user address
* @param paddr physical address
Expand All @@ -217,6 +230,19 @@ int rt_varea_map_page(rt_varea_t varea, void *vaddr, void *page);
*/
int rt_varea_map_range(rt_varea_t varea, void *vaddr, void *paddr, rt_size_t length);

/**
* @brief Unmap a range of physical address in varea
*
* @warning Caller should take care of synchronization of its varea among all
* the map/unmap operation
*
* @param varea target varea
* @param vaddr user address
* @param length map range
* @return int
*/
int rt_varea_unmap_range(rt_varea_t varea, void *vaddr, rt_size_t length);

/**
* @brief Insert page to page manager of varea
* The page will be freed by varea on uninstall automatically
Expand Down
Loading