diff --git a/.config b/.config index 4fdf7e149..db6eedf40 100644 --- a/.config +++ b/.config @@ -1,5 +1,11 @@ CONFIG_RTT_DIR="./" +# +# Libc backend +# +CONFIG_MKRTOS_LIBC_FD_MAP_NR=128 +# end of Libc backend + # # DFS: device virtual file system # diff --git a/.config.old b/.config.old index adac55b18..4fdf7e149 100644 --- a/.config.old +++ b/.config.old @@ -1,3 +1,25 @@ +CONFIG_RTT_DIR="./" + +# +# DFS: device virtual file system +# +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_POSIX=y +CONFIG_DFS_USING_WORKDIR=y +# CONFIG_RT_USING_DFS_MNTTABLE is not set +CONFIG_DFS_FD_MAX=16 +CONFIG_RT_USING_DFS_V1=y +# CONFIG_RT_USING_DFS_V2 is not set +CONFIG_DFS_FILESYSTEMS_MAX=4 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 +# CONFIG_RT_USING_DFS_ELMFAT is not set +CONFIG_RT_USING_DFS_DEVFS=y +# CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set +# CONFIG_RT_USING_DFS_MQUEUE is not set +# end of DFS: device virtual file system # # Device Drivers diff --git a/.vscode/settings.json b/.vscode/settings.json index b08975598..888699c06 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -241,7 +241,9 @@ "uart_config.h": "c", "drv_crypto.h": "c", "drv_log.h": "c", - "drv_usart.h": "c" + "drv_usart.h": "c", + "__locale": "c", + "__string": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/mkrtos_user/Kconfig b/mkrtos_user/Kconfig index 7eb5ae5e2..3f5522ae9 100644 --- a/mkrtos_user/Kconfig +++ b/mkrtos_user/Kconfig @@ -1,3 +1,3 @@ - +source "mkrtos_user/lib/Kconfig" source "mkrtos_user/server/drv/rtthread_drv/Kconfig" diff --git a/mkrtos_user/lib/CMakeLists.txt b/mkrtos_user/lib/CMakeLists.txt index c61ce397a..a08d109a1 100644 --- a/mkrtos_user/lib/CMakeLists.txt +++ b/mkrtos_user/lib/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) # -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ " ) diff --git a/mkrtos_user/lib/Kconfig b/mkrtos_user/lib/Kconfig new file mode 100644 index 000000000..18ada0c37 --- /dev/null +++ b/mkrtos_user/lib/Kconfig @@ -0,0 +1,4 @@ + + +source "mkrtos_user/lib/libc_backend/Kconfig" + diff --git a/mkrtos_user/lib/at_device/at_device-2.1.0/CMakeLists.txt b/mkrtos_user/lib/at_device/at_device-2.1.0/CMakeLists.txt index 48f30cef0..1466bd714 100644 --- a/mkrtos_user/lib/at_device/at_device-2.1.0/CMakeLists.txt +++ b/mkrtos_user/lib/at_device/at_device-2.1.0/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \ -fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ " ) diff --git a/mkrtos_user/lib/cpio/CMakeLists.txt b/mkrtos_user/lib/cpio/CMakeLists.txt index 0c691e7df..6802307a6 100644 --- a/mkrtos_user/lib/cpio/CMakeLists.txt +++ b/mkrtos_user/lib/cpio/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ " ) diff --git a/mkrtos_user/lib/libc_backend/CMakeLists.txt b/mkrtos_user/lib/libc_backend/CMakeLists.txt index da0b62e2f..8c889c43b 100644 --- a/mkrtos_user/lib/libc_backend/CMakeLists.txt +++ b/mkrtos_user/lib/libc_backend/CMakeLists.txt @@ -14,6 +14,7 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_backend/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic @@ -28,6 +29,7 @@ target_link_libraries( PUBLIC muslc sys + sys_svr ) set_target_properties(libc_be PROPERTIES LINK_FLAGS "-pie ") diff --git a/mkrtos_user/lib/libc_backend/Kconfig b/mkrtos_user/lib/libc_backend/Kconfig new file mode 100644 index 000000000..3c4be2378 --- /dev/null +++ b/mkrtos_user/lib/libc_backend/Kconfig @@ -0,0 +1,8 @@ +menu "Libc backend" + +config MKRTOS_LIBC_FD_MAP_NR + int "fd map layer size" + default 32 + help + Set the number of mapping layers, the larger the number of FD available to the user. +endmenu \ No newline at end of file diff --git a/mkrtos_user/lib/libc_backend/inc/fd_map.h b/mkrtos_user/lib/libc_backend/inc/fd_map.h new file mode 100644 index 000000000..e50a2e23e --- /dev/null +++ b/mkrtos_user/lib/libc_backend/inc/fd_map.h @@ -0,0 +1,7 @@ +#pragma once +#include +typedef struct fd_map_entry fd_map_entry_t; + +int fd_map_alloc(uint16_t svr_fd, uint16_t priv_fd); +int fd_map_update(int fd, fd_map_entry_t *new_entry); +int fd_map_free(int fd, fd_map_entry_t *ret_entry); diff --git a/mkrtos_user/lib/libc_backend/src/fd_map.c b/mkrtos_user/lib/libc_backend/src/fd_map.c new file mode 100644 index 000000000..d250243c2 --- /dev/null +++ b/mkrtos_user/lib/libc_backend/src/fd_map.c @@ -0,0 +1,126 @@ + +#include +#include +#include +#include +#include +typedef struct fd_map_entry +{ + uint16_t svr_fd; + uint16_t priv_fd; + uint8_t flags; +} fd_map_entry_t; + +#define FD_MAP_ROW_CN 16 +#define FD_MAP_ROW_NR 16 + +#define FD_MAP_TOTAL (FD_MAP_ROW_CN * FD_MAP_ROW_NR) + +typedef struct fd_map_row +{ + fd_map_entry_t entry[FD_MAP_ROW_CN]; +} fd_map_row_t; + +typedef struct fd_map +{ + fd_map_row_t *row[FD_MAP_ROW_NR]; + pthread_spinlock_t lock; + uint16_t free_fd; +} fd_map_t; + +static fd_map_t fd_map; + +int fd_map_alloc(uint16_t svr_fd, uint16_t priv_fd) +{ + int alloc_fd = 0; + +again_alloc: + pthread_spin_lock(&fd_map.lock); + if (fd_map.free_fd >= FD_MAP_TOTAL) + { + // 没有可用的fd了,尝试循环查找 + for (int i = 0; i < FD_MAP_ROW_NR; i++) + { + for (int j = 0; j < FD_MAP_ROW_CN; j++) + { + if (fd_map.row[i]->entry[j].flags == 0) + { + alloc_fd = i * FD_MAP_ROW_CN + j; + goto next; + } + } + } + pthread_spin_unlock(&fd_map.lock); + // 没有可用的了 + return -EAGAIN; + } + else + { + alloc_fd = fd_map.free_fd; + } +next:; + int row_inx = alloc_fd / FD_MAP_ROW_CN; + int inx = alloc_fd % FD_MAP_ROW_CN; + + assert(row_inx < FD_MAP_ROW_NR); + if (fd_map.row[row_inx] == NULL) + { + fd_map.row[row_inx] = malloc(sizeof(fd_map_row_t)); + if (fd_map.row[row_inx] == NULL) + { + pthread_spin_unlock(&fd_map.lock); + return -EAGAIN; + } + } + assert(fd_map.row[row_inx]->entry[inx].flags == 0); + fd_map.row[row_inx]->entry[inx].flags = 1; + fd_map.row[row_inx]->entry[inx].svr_fd = svr_fd; + fd_map.row[row_inx]->entry[inx].priv_fd = priv_fd; + pthread_spin_unlock(&fd_map.lock); + + return alloc_fd; +} + +int fd_map_update(int fd, fd_map_entry_t *new_entry) +{ + if (fd >= FD_MAP_TOTAL) + { + return -1; + } + int row_inx = fd / FD_MAP_ROW_CN; + int inx = fd % FD_MAP_ROW_CN; + + pthread_spin_lock(&fd_map.lock); + int flags = fd_map.row[row_inx]->entry[inx].flags; + + fd_map.row[row_inx]->entry[inx] = *new_entry; + fd_map.row[row_inx]->entry[inx].flags = flags; + pthread_spin_unlock(&fd_map.lock); +} + +int fd_map_free(int fd, fd_map_entry_t *ret_entry) +{ + if (fd >= FD_MAP_TOTAL) + { + return -1; + } + int row_inx = fd / FD_MAP_ROW_CN; + int inx = fd % FD_MAP_ROW_CN; + + pthread_spin_lock(&fd_map.lock); + if (fd_map.row[row_inx]->entry[inx].flags == 1) + { + if (ret_entry) + { + *ret_entry = fd_map.row[row_inx]->entry[inx]; + } + fd_map.row[row_inx]->entry[inx].flags = 0; + pthread_spin_unlock(&fd_map.lock); + } + else + { + pthread_spin_unlock(&fd_map.lock); + return -1; + } + return 0; +} diff --git a/mkrtos_user/lib/libc_backend/src/fs_backend.c b/mkrtos_user/lib/libc_backend/src/fs_backend.c index 1131c6f68..f1d2c3460 100644 --- a/mkrtos_user/lib/libc_backend/src/fs_backend.c +++ b/mkrtos_user/lib/libc_backend/src/fs_backend.c @@ -1,6 +1,7 @@ #include "fs_backend.h" #include "syscall_backend.h" +#include "fs_cli.h" #include #include #include diff --git a/mkrtos_user/lib/mlibc/CMakeLists.txt b/mkrtos_user/lib/mlibc/CMakeLists.txt index 18e296110..4c119e0a3 100644 --- a/mkrtos_user/lib/mlibc/CMakeLists.txt +++ b/mkrtos_user/lib/mlibc/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=700 ") -set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -D_XOPEN_SOURCE=700 ") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w -D_XOPEN_SOURCE=700 ") +set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -w -D_XOPEN_SOURCE=700 ") file(GLOB_RECURSE deps src/*.C diff --git a/mkrtos_user/lib/modbus/CMakeLists.txt b/mkrtos_user/lib/modbus/CMakeLists.txt index 6ae70af89..f79f61d2e 100644 --- a/mkrtos_user/lib/modbus/CMakeLists.txt +++ b/mkrtos_user/lib/modbus/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \ -fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ " ) diff --git a/mkrtos_user/lib/stm32f1_bsp/CMakeLists.txt b/mkrtos_user/lib/stm32f1_bsp/CMakeLists.txt index e405d79bd..b1d4edb33 100644 --- a/mkrtos_user/lib/stm32f1_bsp/CMakeLists.txt +++ b/mkrtos_user/lib/stm32f1_bsp/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER=1 -DSTM32F10X_XL \ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w -DUSE_STDPERIPH_DRIVER=1 -DSTM32F10X_XL \ -fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ " ) diff --git a/mkrtos_user/lib/sys/inc/u_arch.h b/mkrtos_user/lib/sys/inc/u_arch.h index 8255195e9..17301b33c 100644 --- a/mkrtos_user/lib/sys/inc/u_arch.h +++ b/mkrtos_user/lib/sys/inc/u_arch.h @@ -20,3 +20,5 @@ static inline uint16_t swap_u16(uint16_t data) { return ((data >> 8) & 0xff) | ((data & 0xff) << 8); } + +int mk_syscall(unsigned long nr, ...); diff --git a/mkrtos_user/lib/sys/src/u_factory.c b/mkrtos_user/lib/sys/src/u_factory.c index 401af7c55..618487c2a 100644 --- a/mkrtos_user/lib/sys/src/u_factory.c +++ b/mkrtos_user/lib/sys/src/u_factory.c @@ -1,6 +1,7 @@ #include "u_types.h" #include "u_prot.h" #include "u_factory.h" +#include "u_arch.h" enum { @@ -10,7 +11,7 @@ msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj), + mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, IRQ_PROT, vpage.raw, @@ -25,7 +26,7 @@ msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj), + mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, THREAD_PROT, vpage.raw, @@ -40,7 +41,7 @@ msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj), + mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, TASK_PROT, vpage.raw, @@ -55,7 +56,7 @@ msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj), + mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, IPC_PROT, vpage.raw, diff --git a/mkrtos_user/lib/sys/src/u_ipc.c b/mkrtos_user/lib/sys/src/u_ipc.c index 17b13b059..bcc84d992 100644 --- a/mkrtos_user/lib/sys/src/u_ipc.c +++ b/mkrtos_user/lib/sys/src/u_ipc.c @@ -2,6 +2,8 @@ #include "u_prot.h" #include "u_ipc.h" #include "u_util.h" +#include "u_arch.h" + enum ipc_op { IPC_CALL, //!< 客户端CALL操作 @@ -14,7 +16,7 @@ msg_tag_t ipc_bind(obj_handler_t obj, obj_handler_t tag_th, umword_t user_obj) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(IPC_BIND, IPC_PROT, obj), + mk_syscall(syscall_prot_create(IPC_BIND, IPC_PROT, obj).raw, 0, tag_th, user_obj, @@ -34,7 +36,7 @@ msg_tag_t ipc_wait(obj_handler_t obj, umword_t *user_obj) register volatile umword_t r0 asm("r0"); register volatile umword_t r1 asm("r1"); - mk_syscall(syscall_prot_create(IPC_WAIT, IPC_PROT, obj), + mk_syscall(syscall_prot_create(IPC_WAIT, IPC_PROT, obj).raw, 0, 0, 0, @@ -55,7 +57,7 @@ msg_tag_t ipc_reply(obj_handler_t obj, msg_tag_t in_tag) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(IPC_REPLY, IPC_PROT, obj), + mk_syscall(syscall_prot_create(IPC_REPLY, IPC_PROT, obj).raw, in_tag.raw, 0, 0, @@ -74,7 +76,7 @@ msg_tag_t ipc_call(obj_handler_t obj, msg_tag_t in_tag, ipc_timeout_t timeout) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(IPC_CALL, IPC_PROT, obj), + mk_syscall(syscall_prot_create(IPC_CALL, IPC_PROT, obj).raw, in_tag.raw, timeout.raw, 0, diff --git a/mkrtos_user/lib/sys/src/u_irq_sender.c b/mkrtos_user/lib/sys/src/u_irq_sender.c index f71493360..58cd822e9 100644 --- a/mkrtos_user/lib/sys/src/u_irq_sender.c +++ b/mkrtos_user/lib/sys/src/u_irq_sender.c @@ -4,6 +4,7 @@ #include "u_prot.h" #include "u_types.h" #include "u_util.h" +#include "u_arch.h" #include enum log_op { @@ -22,7 +23,7 @@ msg_tag_t uirq_bind(obj_handler_t obj_inx, umword_t irq_no, umword_t prio_sub_pr { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(BIND_IRQ, IRQ_PROT, obj_inx), + mk_syscall(syscall_prot_create(BIND_IRQ, IRQ_PROT, obj_inx).raw, 0, irq_no, 0, @@ -41,7 +42,7 @@ msg_tag_t uirq_wait(obj_handler_t obj_inx, int flags) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(WAIT_IRQ, IRQ_PROT, obj_inx), + mk_syscall(syscall_prot_create(WAIT_IRQ, IRQ_PROT, obj_inx).raw, 0, flags, 0, @@ -60,7 +61,7 @@ msg_tag_t uirq_ack(obj_handler_t obj_inx, umword_t irq_no) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(ACK_IRQ, IRQ_PROT, obj_inx), + mk_syscall(syscall_prot_create(ACK_IRQ, IRQ_PROT, obj_inx).raw, 0, irq_no, 0, diff --git a/mkrtos_user/lib/sys/src/u_log.c b/mkrtos_user/lib/sys/src/u_log.c index 0ed6d5412..4070bf335 100644 --- a/mkrtos_user/lib/sys/src/u_log.c +++ b/mkrtos_user/lib/sys/src/u_log.c @@ -3,6 +3,7 @@ #include "u_log.h" #include "u_prot.h" #include "u_types.h" +#include "u_arch.h" #include "u_util.h" #include enum log_op @@ -19,7 +20,7 @@ static msg_tag_t ulog_read_bytes_raw(obj_handler_t obj_inx, umword_t data[5], in register volatile umword_t r3 asm("r3"); register volatile umword_t r4 asm("r4"); register volatile umword_t r5 asm("r5"); - mk_syscall(syscall_prot_create(READ_DATA, LOG_PROT, obj_inx), + mk_syscall(syscall_prot_create(READ_DATA, LOG_PROT, obj_inx).raw, msg_tag_init4(0, 0, 0, 0).raw, len, 0, @@ -71,7 +72,7 @@ void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len) if (i > 0) { umword_t *write_word_buf = (umword_t *)write_buf; - mk_syscall(syscall_prot_create(WRITE_DATA, LOG_PROT, obj_inx), + mk_syscall(syscall_prot_create(WRITE_DATA, LOG_PROT, obj_inx).raw, msg_tag_init4(0, ROUND_UP(i, WORD_BYTES), 0, 0).raw, write_word_buf[0], write_word_buf[1], diff --git a/mkrtos_user/lib/sys/src/u_mm.c b/mkrtos_user/lib/sys/src/u_mm.c index 6becbf2b2..6d87c13a3 100644 --- a/mkrtos_user/lib/sys/src/u_mm.c +++ b/mkrtos_user/lib/sys/src/u_mm.c @@ -1,6 +1,7 @@ #include "u_mm.h" #include "u_types.h" #include "u_prot.h" +#include "u_arch.h" enum mm_op { @@ -16,7 +17,7 @@ void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs) register volatile umword_t r1 asm("r1"); register volatile umword_t r2 asm("r2"); register volatile umword_t r3 asm("r3"); - mk_syscall(syscall_prot_create(MM_ALLOC, MM_PROT, obj_inx), + mk_syscall(syscall_prot_create(MM_ALLOC, MM_PROT, obj_inx).raw, 0, pnf_nr, attrs, @@ -40,7 +41,7 @@ void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs) } void mm_free_page(obj_handler_t obj_inx, void *addr, umword_t pfn_nr) { - mk_syscall(syscall_prot_create(MM_FREE, MM_PROT, obj_inx), + mk_syscall(syscall_prot_create(MM_FREE, MM_PROT, obj_inx).raw, 0, addr, pfn_nr, @@ -52,7 +53,7 @@ msg_tag_t mm_align_alloc(obj_handler_t obj_inx, void *addr, umword_t size) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(MM_ALIGN_ALLOC, MM_PROT, obj_inx), + mk_syscall(syscall_prot_create(MM_ALIGN_ALLOC, MM_PROT, obj_inx).raw, 0, addr, size, diff --git a/mkrtos_user/lib/sys/src/u_sys.c b/mkrtos_user/lib/sys/src/u_sys.c index e7ab82420..140a5252d 100644 --- a/mkrtos_user/lib/sys/src/u_sys.c +++ b/mkrtos_user/lib/sys/src/u_sys.c @@ -19,7 +19,7 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) register volatile umword_t r1 asm("r1"); register volatile umword_t r2 asm("r2"); - mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj), + mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj).raw, 0, 0, 0, diff --git a/mkrtos_user/lib/sys/src/u_task.c b/mkrtos_user/lib/sys/src/u_task.c index 1c5fc0824..5bb246386 100644 --- a/mkrtos_user/lib/sys/src/u_task.c +++ b/mkrtos_user/lib/sys/src/u_task.c @@ -1,5 +1,6 @@ #include "u_types.h" #include "u_prot.h" +#include "u_arch.h" #include "u_task.h" enum task_op_code { @@ -12,7 +13,7 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(TASK_OBJ_MAP, TASK_PROT, dst_task), + mk_syscall(syscall_prot_create(TASK_OBJ_MAP, TASK_PROT, dst_task).raw, 0, obj_inx, 0, @@ -32,7 +33,7 @@ msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(TASK_OBJ_MAP, TASK_PROT, dst_task), + mk_syscall(syscall_prot_create(TASK_OBJ_MAP, TASK_PROT, dst_task).raw, 0, src_obj, dst_obj, @@ -52,7 +53,7 @@ msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(TASK_OBJ_UNMAP, TASK_PROT, task_han), + mk_syscall(syscall_prot_create(TASK_OBJ_UNMAP, TASK_PROT, task_han).raw, 0, vpage.raw, 0, @@ -68,7 +69,7 @@ msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *all register volatile umword_t r0 asm("r0"); register volatile umword_t r1 asm("r1"); - mk_syscall(syscall_prot_create(TASK_ALLOC_RAM_BASE, TASK_PROT, task_han), + mk_syscall(syscall_prot_create(TASK_ALLOC_RAM_BASE, TASK_PROT, task_han).raw, 0, size, 0, diff --git a/mkrtos_user/lib/sys/src/u_thread.c b/mkrtos_user/lib/sys/src/u_thread.c index c18454359..cb456d5cc 100644 --- a/mkrtos_user/lib/sys/src/u_thread.c +++ b/mkrtos_user/lib/sys/src/u_thread.c @@ -15,7 +15,7 @@ msg_tag_t thread_msg_buf_set(obj_handler_t obj, void *msg) register volatile umword_t r1 asm("r1"); register volatile umword_t r2 asm("r2"); - mk_syscall(syscall_prot_create(MSG_BUG_SET, THREAD_PROT, obj), + mk_syscall(syscall_prot_create(MSG_BUG_SET, THREAD_PROT, obj).raw, 0, msg, 0, @@ -34,7 +34,7 @@ msg_tag_t thread_msg_buf_get(obj_handler_t obj, umword_t *msg, umword_t *len) register volatile umword_t r1 asm("r1"); register volatile umword_t r2 asm("r2"); - mk_syscall(syscall_prot_create4(MSG_BUG_GET, THREAD_PROT, obj, TRUE), + mk_syscall(syscall_prot_create4(MSG_BUG_GET, THREAD_PROT, obj, TRUE).raw, 0, 0, 0, @@ -60,7 +60,7 @@ msg_tag_t thread_exec_regs(obj_handler_t obj, umword_t pc, umword_t sp, umword_t { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(SET_EXEC_REGS, THREAD_PROT, obj), + mk_syscall(syscall_prot_create(SET_EXEC_REGS, THREAD_PROT, obj).raw, 0, pc, sp, @@ -79,7 +79,7 @@ msg_tag_t thread_run(obj_handler_t obj, uint8_t prio) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(RUN_THREAD, THREAD_PROT, obj), + mk_syscall(syscall_prot_create(RUN_THREAD, THREAD_PROT, obj).raw, 0, prio, 0, @@ -94,7 +94,7 @@ msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj) { register volatile umword_t r0 asm("r0"); - mk_syscall(syscall_prot_create(BIND_TASK, THREAD_PROT, obj), + mk_syscall(syscall_prot_create(BIND_TASK, THREAD_PROT, obj).raw, 0, tk_obj, 0, diff --git a/mkrtos_user/lib/sys_svr/src/drv_cli.c b/mkrtos_user/lib/sys_svr/src/drv_cli.c index 9caa48fc2..5d9d4cad1 100644 --- a/mkrtos_user/lib/sys_svr/src/drv_cli.c +++ b/mkrtos_user/lib/sys_svr/src/drv_cli.c @@ -5,6 +5,7 @@ #include "u_env.h" #include "u_prot.h" #include "u_hd_man.h" +#include #include #include #include @@ -17,15 +18,15 @@ RPC_GENERATION_CALL1(drv_t, DRV_CLOSE, close, RPC_GENERATION_CALL3(drv_t, DRV_READ, read, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) RPC_GENERATION_CALL3(drv_t, DRV_WRITE, write, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) RPC_GENERATION_CALL3(drv_t, DRV_IOCTL, ioctl, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_mword_t_t, rpc_mword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, data, + rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) int dev_fs_open(const char *path, uint32_t oflags) { @@ -38,7 +39,7 @@ int dev_fs_open(const char *path, uint32_t oflags) } rpc_ref_array_uint32_t_uint8_t_32_t rpc_path = { - .data = &path[ret], + .data = (uint8_t *)(&path[ret]), .len = strlen(&path[ret]) + 1, }; rpc_uint32_t_t rpc_flags = { @@ -102,7 +103,7 @@ int dev_fs_write(int desc, const void *buf, size_t size) .data = fd, }; rpc_ref_array_uint32_t_uint8_t_32_t rpc_data = { - .data = buf, + .data = (uint8_t *)buf, .len = size, }; rpc_size_t_t rpc_flags = { @@ -123,8 +124,8 @@ int dev_fs_ioctl(int desc, int cmd, void *args) rpc_int_t rpc_desc = { .data = fd, }; - rpc_int_t rpc_cmd = { - .data = fd, + rpc_mword_t_t rpc_cmd = { + .data = cmd, }; rpc_umword_t_t rpc_args = { .data = (umword_t)args, diff --git a/mkrtos_user/lib/sys_svr/src/drv_svr.c b/mkrtos_user/lib/sys_svr/src/drv_svr.c index fc8a04143..2bbaa751a 100644 --- a/mkrtos_user/lib/sys_svr/src/drv_svr.c +++ b/mkrtos_user/lib/sys_svr/src/drv_svr.c @@ -32,7 +32,7 @@ RPC_GENERATION_DISPATCH1(drv_t, DRV_CLOSE, close, RPC_GENERATION_OP3(drv_t, DRV_READ, read, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) { return dev_read(desc->data, data->data, size->data); } @@ -40,13 +40,13 @@ RPC_GENERATION_OP3(drv_t, DRV_READ, read, RPC_GENERATION_DISPATCH3(drv_t, DRV_READ, read, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) /*ssize_t mr_dev_write(int desc, const void *buf, size_t size);*/ RPC_GENERATION_OP3(drv_t, DRV_WRITE, write, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) { return dev_write(desc->data, data->data, size->data); } @@ -54,21 +54,21 @@ RPC_GENERATION_OP3(drv_t, DRV_WRITE, write, RPC_GENERATION_DISPATCH3(drv_t, DRV_WRITE, write, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) /*int mr_dev_ioctl(int desc, int cmd, void *args);*/ RPC_GENERATION_OP3(drv_t, DRV_IOCTL, ioctl, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_mword_t_t, rpc_mword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, data, + rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) { - return dev_ioctl(desc->data, data->data, size->data); + return dev_ioctl(desc->data, (int)(data->data), (void *)(size->data)); } RPC_GENERATION_DISPATCH3(drv_t, DRV_IOCTL, ioctl, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data, - rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) + rpc_mword_t_t, rpc_mword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, data, + rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size) /*dispatch*/ RPC_DISPATCH5(drv_t, typeof(DRV_OPEN), DRV_OPEN, open, DRV_CLOSE, close, DRV_READ, read, DRV_WRITE, write, DRV_IOCTL, ioctl) diff --git a/mkrtos_user/lib/sys_svr/src/ns_cli.c b/mkrtos_user/lib/sys_svr/src/ns_cli.c index a151132a8..ff23376b2 100644 --- a/mkrtos_user/lib/sys_svr/src/ns_cli.c +++ b/mkrtos_user/lib/sys_svr/src/ns_cli.c @@ -81,7 +81,7 @@ int ns_register(const char *path, obj_handler_t svr_hd) assert(path); rpc_ref_array_uint32_t_uint8_t_32_t rpc_path = { - .data = path, + .data = (uint8_t *)path, .len = strlen(path) + 1, }; rpc_obj_handler_t_t rpc_svr_hd = { @@ -115,7 +115,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd) } rpc_ref_array_uint32_t_uint8_t_32_t rpc_path = { - .data = path, + .data = (uint8_t *)path, .len = strlen(path) + 1, }; rpc_obj_handler_t_t rpc_svr_hd = { diff --git a/mkrtos_user/lib/sys_svr/src/ns_svr.c b/mkrtos_user/lib/sys_svr/src/ns_svr.c index c7c79bec7..2942d40ce 100644 --- a/mkrtos_user/lib/sys_svr/src/ns_svr.c +++ b/mkrtos_user/lib/sys_svr/src/ns_svr.c @@ -3,6 +3,7 @@ #include "ns_types.h" #include "u_rpc.h" #include "u_rpc_svr.h" +#include "u_arch.h" #include "u_hd_man.h" #include diff --git a/mkrtos_user/lib/sys_util/inc/u_rpc.h b/mkrtos_user/lib/sys_util/inc/u_rpc.h index d5aa2b3b7..bb7da90ba 100644 --- a/mkrtos_user/lib/sys_util/inc/u_rpc.h +++ b/mkrtos_user/lib/sys_util/inc/u_rpc.h @@ -179,9 +179,10 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size) RPC_CLI_TYPE_TRAN_TO_SVR_TYPE(rpc_##type##_t, rpc_##type##_t) RPC_TYPE_DEF_ALL(int) //!< 定义所有的 -RPC_TYPE_DEF_ALL(uint32_t) //!< 定义所有的 -RPC_TYPE_DEF_ALL(size_t) //!< 定义所有的 -RPC_TYPE_DEF_ALL(umword_t) //!< 定义所有的 +RPC_TYPE_DEF_ALL(uint32_t) //!< 定义所有的 +RPC_TYPE_DEF_ALL(size_t) //!< 定义所有的 +RPC_TYPE_DEF_ALL(umword_t) //!< 定义所有的 +RPC_TYPE_DEF_ALL(mword_t) //!< 定义所有的 RPC_TYPE_DEF_ALL(dirent_t) //!< 目录类型 RPC_TYPE_DEF_ALL(stat_t) @@ -565,49 +566,49 @@ RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t) } \ } while (0) -#define RPC_DISPATCH1(struct_type, op_type, func0_op, func0_name) \ - msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ - { \ - msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ - size_t op_val; \ - \ - op_val = *((op_type *)(ipc_msg->msg_buf)); \ - switch (op_val) \ - { \ - case func0_op: \ - { \ - tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - } \ - return tag; \ +#define RPC_DISPATCH1(struct_type, op_type, func0_op, func0_name) \ + msg_tag_t rpc_##struct_type##_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ + { \ + msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ + size_t op_val; \ + \ + op_val = *((op_type *)(ipc_msg->msg_buf)); \ + switch (op_val) \ + { \ + case func0_op: \ + { \ + tag = struct_type##_##func0_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + } \ + return tag; \ } -#define RPC_DISPATCH2(struct_type, op_type, func0_op, func0_name, func1_op, func1_name) \ - msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ - { \ - msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ - size_t op_val; \ - \ - op_val = *((op_type *)(ipc_msg->msg_buf)); \ - switch (op_val) \ - { \ - case func0_op: \ - { \ - tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func1_op: \ - { \ - tag = struct_type##_##func1_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - } \ - return tag; \ +#define RPC_DISPATCH2(struct_type, op_type, func0_op, func0_name, func1_op, func1_name) \ + msg_tag_t rpc_##struct_type##_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ + { \ + msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ + size_t op_val; \ + \ + op_val = *((op_type *)(ipc_msg->msg_buf)); \ + switch (op_val) \ + { \ + case func0_op: \ + { \ + tag = struct_type##_##func0_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func1_op: \ + { \ + tag = struct_type##_##func1_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + } \ + return tag; \ } #define RPC_DISPATCH3(struct_type, op_type, func0_op, func0_name, func1_op, func1_name, func2_op, func2_name) \ - msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ + msg_tag_t rpc_##struct_type##_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ { \ msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ size_t op_val; \ @@ -617,17 +618,17 @@ RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t) { \ case func0_op: \ { \ - tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \ + tag = struct_type##_##func0_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ } \ break; \ case func1_op: \ { \ - tag = struct_type##_##func1_name##_dispatch(obj, in_tag, ipc_msg); \ + tag = struct_type##_##func1_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ } \ break; \ case func2_op: \ { \ - tag = struct_type##_##func2_name##_dispatch(obj, in_tag, ipc_msg); \ + tag = struct_type##_##func2_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ } \ break; \ } \ @@ -635,7 +636,7 @@ RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t) } #define RPC_DISPATCH4(struct_type, op_type, func0_op, func0_name, func1_op, func1_name, func2_op, func2_name, func3_op, func3_name) \ - msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ + msg_tag_t rpc_##struct_type##_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ { \ msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ size_t op_val; \ @@ -645,144 +646,144 @@ RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t) { \ case func0_op: \ { \ - tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \ + tag = struct_type##_##func0_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ } \ break; \ case func1_op: \ { \ - tag = struct_type##_##func1_name##_dispatch(obj, in_tag, ipc_msg); \ + tag = struct_type##_##func1_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ } \ break; \ case func2_op: \ { \ - tag = struct_type##_##func2_name##_dispatch(obj, in_tag, ipc_msg); \ + tag = struct_type##_##func2_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ } \ break; \ case func3_op: \ { \ - tag = struct_type##_##func3_name##_dispatch(obj, in_tag, ipc_msg); \ + tag = struct_type##_##func3_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ } \ break; \ } \ return tag; \ } -#define RPC_DISPATCH5(struct_type, op_type, func0_op, func0_name, func1_op, func1_name, \ - func2_op, func2_name, func3_op, func3_name, \ - func4_op, func4_name) \ - msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ - { \ - msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ - size_t op_val; \ - \ - op_val = *((op_type *)(ipc_msg->msg_buf)); \ - switch (op_val) \ - { \ - case func0_op: \ - { \ - tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func1_op: \ - { \ - tag = struct_type##_##func1_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func2_op: \ - { \ - tag = struct_type##_##func2_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func3_op: \ - { \ - tag = struct_type##_##func3_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func4_op: \ - { \ - tag = struct_type##_##func4_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - } \ - return tag; \ +#define RPC_DISPATCH5(struct_type, op_type, func0_op, func0_name, func1_op, func1_name, \ + func2_op, func2_name, func3_op, func3_name, \ + func4_op, func4_name) \ + msg_tag_t rpc_##struct_type##_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ + { \ + msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ + size_t op_val; \ + \ + op_val = *((op_type *)(ipc_msg->msg_buf)); \ + switch (op_val) \ + { \ + case func0_op: \ + { \ + tag = struct_type##_##func0_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func1_op: \ + { \ + tag = struct_type##_##func1_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func2_op: \ + { \ + tag = struct_type##_##func2_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func3_op: \ + { \ + tag = struct_type##_##func3_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func4_op: \ + { \ + tag = struct_type##_##func4_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + } \ + return tag; \ } -#define RPC_DISPATCH12(struct_type, op_type, func0_op, func0_name, func1_op, func1_name, \ - func2_op, func2_name, func3_op, func3_name, \ - func4_op, func4_name, func5_op, func5_name, func6_op, func6_name, \ - func7_op, func7_name, func8_op, func8_name, func9_op, func9_name, \ - func10_op, func10_name, func11_op, func11_name) \ - msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ - { \ - msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ - size_t op_val; \ - \ - op_val = *((op_type *)(ipc_msg->msg_buf)); \ - switch (op_val) \ - { \ - case func0_op: \ - { \ - tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func1_op: \ - { \ - tag = struct_type##_##func1_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func2_op: \ - { \ - tag = struct_type##_##func2_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func3_op: \ - { \ - tag = struct_type##_##func3_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func4_op: \ - { \ - tag = struct_type##_##func4_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func5_op: \ - { \ - tag = struct_type##_##func5_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func6_op: \ - { \ - tag = struct_type##_##func6_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func7_op: \ - { \ - tag = struct_type##_##func7_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func8_op: \ - { \ - tag = struct_type##_##func8_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func9_op: \ - { \ - tag = struct_type##_##func9_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func10_op: \ - { \ - tag = struct_type##_##func10_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - case func11_op: \ - { \ - tag = struct_type##_##func11_name##_dispatch(obj, in_tag, ipc_msg); \ - } \ - break; \ - default: \ - break; \ - } \ - return tag; \ +#define RPC_DISPATCH12(struct_type, op_type, func0_op, func0_name, func1_op, func1_name, \ + func2_op, func2_name, func3_op, func3_name, \ + func4_op, func4_name, func5_op, func5_name, func6_op, func6_name, \ + func7_op, func7_name, func8_op, func8_name, func9_op, func9_name, \ + func10_op, func10_name, func11_op, func11_name) \ + msg_tag_t rpc_##struct_type##_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ + { \ + msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ + size_t op_val; \ + \ + op_val = *((op_type *)(ipc_msg->msg_buf)); \ + switch (op_val) \ + { \ + case func0_op: \ + { \ + tag = struct_type##_##func0_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func1_op: \ + { \ + tag = struct_type##_##func1_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func2_op: \ + { \ + tag = struct_type##_##func2_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func3_op: \ + { \ + tag = struct_type##_##func3_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func4_op: \ + { \ + tag = struct_type##_##func4_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func5_op: \ + { \ + tag = struct_type##_##func5_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func6_op: \ + { \ + tag = struct_type##_##func6_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func7_op: \ + { \ + tag = struct_type##_##func7_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func8_op: \ + { \ + tag = struct_type##_##func8_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func9_op: \ + { \ + tag = struct_type##_##func9_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func10_op: \ + { \ + tag = struct_type##_##func10_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func11_op: \ + { \ + tag = struct_type##_##func11_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + default: \ + break; \ + } \ + return tag; \ } #include "u_rpc_1.h" #include "u_rpc_2.h" diff --git a/mkrtos_user/lib/sys_util/inc/u_rpc_svr.h b/mkrtos_user/lib/sys_util/inc/u_rpc_svr.h index ab9cecfb5..d457d6793 100644 --- a/mkrtos_user/lib/sys_util/inc/u_rpc_svr.h +++ b/mkrtos_user/lib/sys_util/inc/u_rpc_svr.h @@ -3,7 +3,9 @@ #include "u_types.h" #include "u_prot.h" #include "u_ipc.h" -typedef msg_tag_t (*rpc_dispatch_func)(void *obj, msg_tag_t tag, ipc_msg_t *msg); + +struct rpc_svr_obj; +typedef msg_tag_t (*rpc_dispatch_func)(struct rpc_svr_obj *obj, msg_tag_t tag, ipc_msg_t *msg); typedef struct rpc_svr_obj {