修复ipc映射时错误的bug

This commit is contained in:
zhangzheng
2023-10-02 01:38:38 +08:00
parent eea118f9b7
commit a6bc1d330e
11 changed files with 192 additions and 284 deletions

View File

@@ -174,7 +174,12 @@
"__strerror.h": "c",
"sstream": "c",
"u_drv.h": "c",
"__node_handle": "c"
"__node_handle": "c",
"__hash_table": "c",
"__tuple": "c",
"limits": "c",
"compare": "c",
"algorithm": "c"
},
"cortex-debug.showRTOS": false,
"cortex-debug.variableUseNaturalFormat": false,

View File

@@ -83,18 +83,20 @@ typedef union vpage
struct
{
umword_t attrs : 4; //!< 权限
umword_t : 8; //!< 保留
umword_t flags : 8; //!< 保留
umword_t addr : (WORD_BITS - 12); //!< 地址
};
} vpage_t;
#define VPAGE_FLAGS_MAP 0x1 //!< 是否ipc时立刻映射操作
static inline vpage_t vpage_create_raw(umword_t raw)
{
return (vpage_t){.raw = raw};
}
static inline vpage_t vpage_create3(umword_t attrs, umword_t resv, umword_t addr)
static inline vpage_t vpage_create3(umword_t attrs, umword_t flags, umword_t addr)
{
return (vpage_t){.attrs = attrs, .addr = addr};
return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr};
}
static inline obj_handler_t vpage_get_obj_handler(vpage_t vpage)
{

View File

@@ -220,14 +220,19 @@ static int ipc_data_copy(thread_t *dst_th, thread_t *src_th, msg_tag_t tag)
task_t *dst_tk = thread_get_bind_task(dst_th);
for (int i = 0; i < map_len; i++)
{
int ret = 0;
vpage_t dst_page = vpage_create_raw(dst_ipc->map_buf[i]);
vpage_t src_page = vpage_create_raw(src_ipc->map_buf[i]);
int ret = obj_map_src_dst(&dst_tk->obj_space, &src_tk->obj_space,
if (src_page.flags & VPAGE_FLAGS_MAP)
{
ret = obj_map_src_dst(&dst_tk->obj_space, &src_tk->obj_space,
vpage_get_obj_handler(dst_page),
vpage_get_obj_handler(src_page),
dst_tk->lim,
vpage_get_attrs(src_page), &del);
}
if (ret < 0)
{

View File

@@ -14,7 +14,6 @@
#define THREAD_MAIN THREAD_PROT
#define TASK_THIS TASK_PROT
#define MSG_TAG_KNL_ERR 0x8
typedef union msg_tag
@@ -79,16 +78,18 @@ typedef union vpage
struct
{
umword_t attrs : 4; //!< 权限
umword_t : 8; //!< 保留
umword_t flags : 8; //!< 保留
umword_t addr : (WORD_BITS - 12); //!< 地址
};
} vpage_t;
#define VPAGE_FLAGS_MAP 0x1 //!< 是否ipc时立刻映射
static inline vpage_t vpage_create_raw(umword_t raw)
{
return (vpage_t){.raw = raw};
}
static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t resv, umword_t addr)
static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t flags, umword_t addr)
{
return (vpage_t){.attrs = attrs, .addr = addr};
return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr};
}

View File

@@ -106,6 +106,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd)
};
rpc_obj_handler_t_t rpc_svr_hd = {
.data = newfd,
.del_map_flags = VPAGE_FLAGS_MAP,
};
msg_tag_t tag = ns_t_query_call(u_get_global_env()->ns_hd, &rpc_path, &rpc_svr_hd);
@@ -117,7 +118,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd)
}
if (reg_hd(path, newfd) == FALSE)
{
printf("客户端服务缓存区已满.\n");
printf("The client service cache is full.\n");
handler_free_umap(newfd);
return -ENOMEM;
}

View File

@@ -37,133 +37,19 @@ RPC_GENERATION_OP2(ns_t, NS_QUERY_OP, query,
int ret = namespace_query((char *)(path->data), &cli_hd->data);
if (ret >= 0)
{
printf("请求服务[%s]成功.\n", (char *)(path->data));
printf("The request service [%s] was successful.", (char *)(path->data));
}
else
{
printf("请求服务[%s]失败.\n", (char *)(path->data));
printf("Failed to request service [%s]", (char *)(path->data));
}
return ret;
}
// RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query,
// rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
// rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
msg_tag_t ns_t_query_dispatch(ns_t *obj, msg_tag_t tag, ipc_msg_t *ipc_msg)
{
rpc_array_uint32_t_uint8_t_32_t var0;
rpc_obj_handler_t_t var1;
size_t op_val;
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf);
int off = 0;
rpc_var_rpc_array_uint32_t_uint8_t_32_t_init(&var0);
rpc_var_rpc_obj_handler_t_t_init(&var1);
op_val = *((typeof(((uint16_t)1)) *)value);
if (op_val != ((uint16_t)1))
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (-71)});
}
off += sizeof(typeof(((uint16_t)1)));
off = rpc_align(off, __alignof(typeof(((uint16_t)1))));
do
{
if (1 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_svr_buf_to_msg_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (2 == 1)
{
if (4 == 1 || 4 == 4)
{
int ret = rpc_svr_buf_to_msg_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
short ret_val = ns_t_query_op(obj, &var0, &var1);
if (ret_val < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret_val)});
}
off = 0;
int off_map = 0;
do
{
if (1 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (2 == 1)
{
if (4 == 2 || 4 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 2)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(ipc_msg->map_buf), off_map);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_map = ret;
}
}
} while (0);
do
{
if (2 == 2)
{
if (4 == 2 || 4 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(ipc_msg->map_buf), off_map);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_map = ret;
}
}
} while (0);
return ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_map) / ((sizeof(void *)))) + (((off_map) % ((sizeof(void *)))) ? 1 : 0))), .prot = (ret_val)});
}
RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
RPC_DISPATCH2(ns_t, typeof(NS_REGISTER_OP), NS_REGISTER_OP, register, NS_QUERY_OP, query)
void ns_init(ns_t *ns)

View File

@@ -193,14 +193,14 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
RPC_ARRAY_TYPE_DEF(len_type, data_type, length); \
RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(len, __alignof(d->len)) + d->len > \
if (rpc_align(len, __alignof(d->len)) > \
IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
*((typeof(d->len) *)(&buf[len])) = d->len; \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
@@ -215,14 +215,14 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
} \
RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(len, __alignof(d->len)) + d->len > \
if (rpc_align(len, __alignof(d->len)) > \
max) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
d->len = *((typeof(d->len) *)(&buf[len])); \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
{ \
return -ETOLONG; \
} \
@@ -237,14 +237,14 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
} \
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(len, __alignof(d->len)) + d->len > \
if (rpc_align(len, __alignof(d->len)) > \
IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
*((typeof(d->len) *)(&buf[len])) = d->len; \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
@@ -259,14 +259,13 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
} \
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(len, __alignof(d->len)) + d->len > \
max) \
if (rpc_align(len, __alignof(d->len)) > max) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
d->len = *((typeof(d->len) *)(&buf[len])); \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
{ \
return -ETOLONG; \
} \
@@ -308,13 +307,13 @@ RPC_ARRAY_DEF(uint32_t, uint8_t, 32)
RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length); \
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_ref_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(len, __alignof(d->len)) + d->len > IPC_MSG_SIZE) \
if (rpc_align(len, __alignof(d->len)) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
*((typeof(d->len) *)(&buf[len])) = d->len; \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
@@ -329,14 +328,14 @@ RPC_ARRAY_DEF(uint32_t, uint8_t, 32)
} \
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_ref_array_uint32_t_uint8_t_32_t, int) \
{ \
if (rpc_align(len, __alignof(d->len)) + d->len > \
if (rpc_align(len, __alignof(d->len)) > \
max) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
d->len = *((typeof(d->len) *)(&buf[len])); \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
{ \
return -ETOLONG; \
} \
@@ -361,7 +360,16 @@ RPC_REF_ARRAY_DEF(uint32_t, uint8_t, 32)
* @brief Construct a new rpc type def object
*
*/
RPC_TYPE_DEF(obj_handler_t);
// RPC_TYPE_DEF(obj_handler_t);
#define RPC_OBJ_HANDLER_TYPE_DEF(type) \
typedef struct rpc_##type \
{ \
type data; \
uint8_t del_map_flags; \
} rpc_##type##_t
RPC_OBJ_HANDLER_TYPE_DEF(obj_handler_t);
/**
* @brief Construct a new rpc cli msg to buf without impl object
*
@@ -373,7 +381,7 @@ RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
return -ETOLONG;
}
len = rpc_align(len, __alignof(d->data));
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0xff & (~(d->del_map_flags)), d->data).raw;
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
}
/**
@@ -395,7 +403,7 @@ RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
return -ETOLONG;
}
len = rpc_align(len, __alignof(d->data));
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0xff & (~(d->del_map_flags)), d->data).raw;
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
}
/**

View File

@@ -21,7 +21,7 @@ void sys_info_unlock(void)
int sys_info_save(void)
{
int fd = fs_open("/sys_info.bin", O_CREAT | O_RDONLY, 0777);
int fd = fs_open("/sys_info.bin", O_CREAT | O_WRONLY, 0777);
if (fd < 0)
{
return fd;
@@ -40,7 +40,7 @@ int sys_info_save(void)
}
int sys_info_read(void)
{
int fd = fs_open("/sys_info.bin", O_CREAT | O_WRONLY, 0777);
int fd = fs_open("/sys_info.bin", O_CREAT | O_RDONLY, 0777);
if (fd < 0)
{
return fd;

View File

@@ -25,11 +25,11 @@ int main(int argc, char *args[])
printf("argc:%d args[0]:%s\n", argc, args[0]);
drv_init();
u_sleep_ms(100);
sys_info.devID = 12;
sys_info_save();
sys_info.devID = 0;
sys_info_read();
assert(sys_info.devID == 12);
// sys_info.devID = 12;
// sys_info_save();
// sys_info.devID = 0;
// sys_info_read();
// assert(sys_info.devID == 12);
ulog_write_str(u_get_global_env()->log_hd, "app start..\n");
relay_test();
while (1)

View File

@@ -84,7 +84,7 @@
/ Locale and Namespace Configurations
/---------------------------------------------------------------------------*/
#define FF_CODE_PAGE 932
#define FF_CODE_PAGE 437
/* This option specifies the OEM code page to be used on the target system.
/ Incorrect code page setting can cause a file open failure.
/
@@ -113,8 +113,8 @@
*/
#define FF_USE_LFN 0
#define FF_MAX_LFN 255
#define FF_USE_LFN 1
#define FF_MAX_LFN 64
/* The FF_USE_LFN switches the support for LFN (long file name).
/
/ 0: Disable LFN. FF_MAX_LFN has no effect.
@@ -224,7 +224,7 @@
/ System Configurations
/---------------------------------------------------------------------------*/
#define FF_FS_TINY 0
#define FF_FS_TINY 1
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
/ Instead of private sector buffer eliminated from the file object, common sector

View File

@@ -18,7 +18,7 @@ typedef struct file_desc
FIL fp;
} file_desc_t;
#define FILE_DESC_NR 1
#define FILE_DESC_NR 8
static file_desc_t files[FILE_DESC_NR];
void *file_temp_buf_get(void)