网络服务支持

This commit is contained in:
zhangzheng
2025-02-16 23:11:18 +08:00
parent 72cbd3d0cd
commit 7c5ff01e74
46 changed files with 463 additions and 235 deletions

View File

@@ -9,7 +9,7 @@
#include <u_task.h>
#include <u_thread.h>
#include <u_types.h>
#include <stdio.h>
#define MAGIC_NS_USERPID 0xbabababa
int fast_ipc_setsp(int i, void *stack);
@@ -43,8 +43,10 @@ static int fast_ipc_dat_copy(ipc_msg_t *dst_ipc, ipc_msg_t *src_ipc, msg_tag_t t
}
static void update_map_buf(void)
{
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++) {
if (cons_map_buf[i] == 0) {
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++)
{
if (cons_map_buf[i] == 0)
{
cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw; /*TODO:申请失败检查*/
}
}
@@ -59,19 +61,23 @@ static msg_tag_t process_ipc(int j, umword_t obj, long tag)
msg = (ipc_msg_t *)(&cons_msg_buf[j * MSG_BUG_LEN]);
ret_tag = msg_tag_init4(0, 0, 0, -EIO);
svr_obj = (rpc_svr_obj_t *)obj;
if (svr_obj == NULL) {
if (svr_obj == NULL)
{
ret_tag = msg_tag_init4(0, 0, 0, -EACCES);
goto end;
}
if (svr_obj == (void *)MAGIC_NS_USERPID) {
if (svr_obj == (void *)MAGIC_NS_USERPID)
{
/*获取ns的user id*/
svr_obj = meta_find_svr_obj(NS_PROT);
}
if (svr_obj == NULL) {
if (svr_obj == NULL)
{
ret_tag = msg_tag_init4(0, 0, 0, -EACCES);
goto end;
}
if (svr_obj->dispatch) {
if (svr_obj->dispatch)
{
ret_tag = svr_obj->dispatch(svr_obj, msg_tag_init(tag), msg);
}
end:
@@ -79,10 +85,13 @@ end:
}
static void update_map_buf_last(void)
{
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++) {
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++)
{
vpage_t vpage = vpage_create_raw(cons_map_buf[i]);
if (handler_is_used(vpage.addr)) {
if (task_obj_valid(TASK_THIS, vpage.addr, 0).prot == 1) {
if (handler_is_used(vpage.addr))
{
if (task_obj_valid(TASK_THIS, vpage.addr, 0).prot == 1)
{
cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw;
}
}
@@ -93,10 +102,10 @@ static void fast_ipc_goto_process(int j, long tag, umword_t obj, umword_t arg1,
msg_tag_t ret_tag;
ipc_msg_t *msg;
msg = (void *)(&cons_msg_buf[j * MSG_BUG_LEN]);
msg = (void *)(&cons_msg_buf[j * MSG_BUG_LEN]);
thread_msg_buf_set(-1, msg);
update_map_buf();
msg->user[3] = cons_thread_th[j];//设置私有变量FIXME: 一种更加通用的方法
msg->user[3] = cons_thread_th[j]; // 设置私有变量FIXME: 一种更加通用的方法
task_com_unlock(TASK_THIS);
ret_tag = process_ipc(j, obj, tag);
task_com_lock(TASK_THIS);
@@ -107,8 +116,10 @@ static void fast_ipc_goto_process(int j, long tag, umword_t obj, umword_t arg1,
static __attribute__((optimize(0))) void fast_ipc_com_point(msg_tag_t tag, umword_t arg0, umword_t arg1, umword_t arg2)
{
int i;
for (i = 0; i < stack_array_nr; i++) {
if ((cons_stack_bitmap & (1 << i)) == 0) {
for (i = 0; i < stack_array_nr; i++)
{
if ((cons_stack_bitmap & (1 << i)) == 0)
{
cons_stack_bitmap |= (1 << i);
break;
}
@@ -126,16 +137,24 @@ int u_fast_ipc_init(uint8_t *stack_array, uint8_t *msg_buf_array, int stack_msgb
cons_msg_buf = msg_buf_array;
cons_thread_th = threads_obj;
ipc_msg_t *msg = (void *)cons_msg_buf_main;
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++) {
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++)
{
cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw;
msg->map_buf[i] = cons_map_buf[i];
}
#if 1
for (int i = 0; i < stack_msgbuf_array_num; i++)
{
printf("stack 0x%x %x\n", stack_array + stack_size * i, stack_size);
}
#endif
msg->user[0] = (umword_t)((char *)fake_pthread + sizeof(fake_pthread));
tag = task_set_com_point(TASK_THIS, &fast_ipc_com_point, (addr_t)com_stack,
sizeof(com_stack), (void *)(&cons_stack_bitmap),
stack_msgbuf_array_num, cons_msg_buf_main);
if (msg_tag_get_val(tag) < 0) {
if (msg_tag_get_val(tag) < 0)
{
return msg_tag_get_val(tag);
}
return msg_tag_get_val(tag);