内核对象支持权限
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
#pragma
|
||||
|
||||
#include "u_types.h"
|
||||
#include "u_prot.h"
|
||||
|
||||
msg_tag_t factory_create_ipc(obj_handler_t obj, obj_handler_t tgt_obj_handler);
|
||||
msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler);
|
||||
msg_tag_t factory_create_task(obj_handler_t obj, obj_handler_t tgt_obj_handler);
|
||||
msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage);
|
||||
msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage);
|
||||
msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage);
|
||||
@@ -55,3 +55,23 @@ static inline syscall_prot_t syscall_prot_create(uint8_t op, uint8_t prot, obj_h
|
||||
.obj_inx = obj_inx,
|
||||
};
|
||||
}
|
||||
|
||||
typedef union vpage
|
||||
{
|
||||
umword_t raw;
|
||||
struct
|
||||
{
|
||||
umword_t attrs : 4; //!< 权限
|
||||
umword_t : 8; //!< 保留
|
||||
umword_t addr : (WORD_BITS - 12); //!< 地址
|
||||
};
|
||||
} vpage_t;
|
||||
|
||||
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)
|
||||
{
|
||||
return (vpage_t){.attrs = attrs, .addr = addr};
|
||||
}
|
||||
|
||||
@@ -2,7 +2,13 @@
|
||||
#include "u_prot.h"
|
||||
#include "u_types.h"
|
||||
|
||||
enum obj_attrs
|
||||
{
|
||||
KOBJ_DELETE_RIGHT = 1,
|
||||
KOBJ_ALL_RIGHTS = 3,
|
||||
};
|
||||
|
||||
msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx);
|
||||
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj);
|
||||
msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj);
|
||||
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs);
|
||||
msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage);
|
||||
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr);
|
||||
|
||||
@@ -7,14 +7,14 @@ enum
|
||||
FACTORY_CREATE_KOBJ
|
||||
};
|
||||
|
||||
msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler)
|
||||
msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj),
|
||||
0,
|
||||
THREAD_PROT,
|
||||
tgt_obj_handler,
|
||||
vpage.raw,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
@@ -22,14 +22,14 @@ msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler
|
||||
|
||||
return tag;
|
||||
}
|
||||
msg_tag_t factory_create_task(obj_handler_t obj, obj_handler_t tgt_obj_handler)
|
||||
msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj),
|
||||
0,
|
||||
TASK_PROT,
|
||||
tgt_obj_handler,
|
||||
vpage.raw,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
@@ -37,14 +37,14 @@ msg_tag_t factory_create_task(obj_handler_t obj, obj_handler_t tgt_obj_handler)
|
||||
|
||||
return tag;
|
||||
}
|
||||
msg_tag_t factory_create_ipc(obj_handler_t obj, obj_handler_t tgt_obj_handler)
|
||||
msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj),
|
||||
0,
|
||||
IPC_PROT,
|
||||
tgt_obj_handler,
|
||||
vpage.raw,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
@@ -46,6 +46,6 @@ void handler_free(obj_handler_t hd_inx)
|
||||
*/
|
||||
void handler_free_umap(obj_handler_t hd_inx)
|
||||
{
|
||||
task_unmap(TASK_THIS, hd_inx);
|
||||
task_unmap(TASK_THIS, vpage_create_raw3(0, 0, hd_inx));
|
||||
handler_free(hd_inx);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx)
|
||||
return tag;
|
||||
}
|
||||
|
||||
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj)
|
||||
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
@@ -32,7 +32,7 @@ msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t
|
||||
0,
|
||||
src_obj,
|
||||
dst_obj,
|
||||
0,
|
||||
attrs,
|
||||
0,
|
||||
0);
|
||||
msg_tag_t tag = msg_tag_init(r0);
|
||||
@@ -40,13 +40,13 @@ msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t
|
||||
return tag;
|
||||
}
|
||||
|
||||
msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj)
|
||||
msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(TASK_OBJ_UNMAP, TASK_PROT, task_han),
|
||||
0,
|
||||
obj,
|
||||
vpage.raw,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
@@ -21,14 +21,17 @@ int main(int argc, char *args[])
|
||||
printf_test();
|
||||
thread_test();
|
||||
thread_exit_test();
|
||||
map_test();
|
||||
ipc_test();
|
||||
map_test();
|
||||
#endif
|
||||
ipc_timeout_test();
|
||||
// ipc_timeout_test();
|
||||
app_test();
|
||||
while (1)
|
||||
;
|
||||
task_unmap(TASK_THIS, TASK_THIS);
|
||||
// while (1)
|
||||
// ;
|
||||
// factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, 10));
|
||||
// factory_create_thread(FACTORY_PROT, vpage_create_raw3(0, 0, 11));
|
||||
// factory_create_task(FACTORY_PROT, vpage_create_raw3(0, 0, 12));
|
||||
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); // 删除当前task,以及申请得所有对象
|
||||
printf("exit init.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
void app_test(void)
|
||||
{
|
||||
msg_tag_t tag;
|
||||
umword_t addr = cpio_find_file((umword_t)0x8020000, (umword_t)0x8040000, "fatfs");
|
||||
umword_t addr = cpio_find_file((umword_t)0x8020000, (umword_t)0x8040000, "shell");
|
||||
assert(addr);
|
||||
|
||||
app_info_t *app = (app_info_t *)addr;
|
||||
@@ -30,21 +30,23 @@ void app_test(void)
|
||||
assert(hd_task != HANDLER_INVALID);
|
||||
assert(hd_thread != HANDLER_INVALID);
|
||||
|
||||
tag = factory_create_task(FACTORY_PROT, hd_task);
|
||||
tag = factory_create_task(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd_task));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, hd_thread);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd_thread));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_ipc(FACTORY_PROT, hd_ipc);
|
||||
tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd_ipc));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
printf("ipc hd is %d\n", hd_ipc);
|
||||
|
||||
tag = task_alloc_ram_base(hd_task, app->i.ram_size, &ram_base);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = task_map(hd_task, LOG_PROT, LOG_PROT);
|
||||
tag = task_map(hd_task, hd_task, TASK_PROT, 0);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = task_map(hd_task, hd_ipc, hd_ipc);
|
||||
tag = task_map(hd_task, LOG_PROT, LOG_PROT, 0);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = task_map(hd_task, hd_thread, THREAD_MAIN);
|
||||
tag = task_map(hd_task, hd_ipc, hd_ipc, 0);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = task_map(hd_task, hd_thread, THREAD_MAIN, 0);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
void *sp_addr = (char *)ram_base + app->i.stack_offset - app->i.data_offset;
|
||||
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;
|
||||
|
||||
@@ -2,13 +2,17 @@
|
||||
#include "u_prot.h"
|
||||
#include "u_factory.h"
|
||||
#include "u_task.h"
|
||||
#include "u_hd_man.h"
|
||||
#include <assert.h>
|
||||
void factory_test(void)
|
||||
{
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, 12);
|
||||
obj_handler_t hd = handler_alloc();
|
||||
assert(hd != HANDLER_INVALID);
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd));
|
||||
if (msg_tag_get_prot(tag) < 0)
|
||||
{
|
||||
printf("factory_create_ipc no memory\n");
|
||||
return;
|
||||
}
|
||||
task_unmap(TASK_PROT, 12);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, hd));
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ static void thread_test_func(void)
|
||||
ipc_reply(ipc_hd, msg_tag_init4(0, ROUND_UP(strlen(buf), WORD_BYTES), 0, 0));
|
||||
}
|
||||
printf("thread_test_func.\n");
|
||||
task_unmap(TASK_PROT, th1_hd);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, th1_hd));
|
||||
printf("Error\n");
|
||||
}
|
||||
static void thread_test_func2(void)
|
||||
@@ -100,7 +100,7 @@ static void thread_test_func2(void)
|
||||
printf("th2:%s", buf);
|
||||
}
|
||||
printf("thread_test_func2.\n");
|
||||
task_unmap(TASK_PROT, th2_hd);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, th2_hd));
|
||||
printf("Error\n");
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ static void thread_test_func3(void)
|
||||
printf("th3:%s", buf);
|
||||
}
|
||||
printf("thread_test_func2.\n");
|
||||
task_unmap(TASK_PROT, th3_hd);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, th3_hd));
|
||||
printf("Error\n");
|
||||
}
|
||||
#endif
|
||||
@@ -135,9 +135,9 @@ void ipc_test(void)
|
||||
ipc_hd = handler_alloc();
|
||||
assert(ipc_hd != HANDLER_INVALID);
|
||||
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, ipc_hd);
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, ipc_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, th1_hd);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th1_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
ipc_bind(ipc_hd, th1_hd, 0);
|
||||
tag = thread_msg_buf_set(th1_hd, msg_buf0);
|
||||
@@ -149,7 +149,7 @@ void ipc_test(void)
|
||||
tag = thread_run(th1_hd);
|
||||
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, th2_hd);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th2_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_msg_buf_set(th2_hd, msg_buf1);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
@@ -161,7 +161,7 @@ void ipc_test(void)
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, th3_hd);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th3_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_msg_buf_set(th3_hd, msg_buf2);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
@@ -176,7 +176,7 @@ void ipc_test(void)
|
||||
void ipc_timeout_test(void)
|
||||
{
|
||||
obj_handler_t hd = handler_alloc();
|
||||
factory_create_ipc(FACTORY_PROT, hd);
|
||||
factory_create_ipc(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd));
|
||||
printf("sleep.\n");
|
||||
ipc_call(hd, msg_tag_init4(0, 0, 0, 0), ipc_timeout_create2(100, 100));
|
||||
printf("sleep.\n");
|
||||
|
||||
@@ -34,17 +34,18 @@ static void thread_test_func(void)
|
||||
char *buf;
|
||||
umword_t len;
|
||||
ipc_msg_t *ipc_msg;
|
||||
|
||||
obj_handler_t log_hd = handler_alloc();
|
||||
thread_msg_buf_get(th1_hd, (umword_t *)(&buf), NULL);
|
||||
ipc_msg = (ipc_msg_t *)buf;
|
||||
ipc_msg->map_buf[0] = handler_alloc();
|
||||
ipc_msg->map_buf[0] = vpage_create_raw3(0, 0, log_hd).raw;
|
||||
ipc_wait(ipc_hd, 0);
|
||||
printf("srv recv:%s", buf);
|
||||
ulog_write_str(ipc_msg->map_buf[0], "map test success.\n");
|
||||
ulog_write_str(log_hd, "map test success.\n");
|
||||
hard_sleep();
|
||||
ipc_reply(ipc_hd, msg_tag_init4(0, ROUND_UP(strlen(buf), WORD_BYTES), 0, 0));
|
||||
printf("thread_test_func.\n");
|
||||
task_unmap(TASK_PROT, th1_hd);
|
||||
handler_free(log_hd);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, th1_hd));
|
||||
printf("Error\n");
|
||||
}
|
||||
static void thread_test_func2(void)
|
||||
@@ -56,11 +57,11 @@ static void thread_test_func2(void)
|
||||
thread_msg_buf_get(th2_hd, (umword_t *)(&buf), NULL);
|
||||
ipc_msg = (ipc_msg_t *)buf;
|
||||
strcpy(ipc_msg->msg_buf, "I am th2.\n");
|
||||
ipc_msg->map_buf[0] = LOG_PROT;
|
||||
ipc_msg->map_buf[0] = vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, LOG_PROT).raw;
|
||||
ipc_call(ipc_hd, msg_tag_init4(0, ROUND_UP(strlen(ipc_msg->msg_buf), WORD_BYTES), 1, 0), ipc_timeout_create2(0, 0));
|
||||
printf("th2:%s", buf);
|
||||
printf("thread_test_func2.\n");
|
||||
task_unmap(TASK_PROT, th2_hd);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, th2_hd));
|
||||
printf("Error\n");
|
||||
}
|
||||
/**
|
||||
@@ -74,9 +75,9 @@ void map_test(void)
|
||||
th2_hd = handler_alloc();
|
||||
assert(th2_hd != HANDLER_INVALID);
|
||||
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, ipc_hd);
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, ipc_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, th1_hd);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th1_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
ipc_bind(ipc_hd, th1_hd, 0);
|
||||
tag = thread_msg_buf_set(th1_hd, msg_buf0);
|
||||
@@ -88,7 +89,7 @@ void map_test(void)
|
||||
tag = thread_run(th1_hd);
|
||||
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, th2_hd);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th2_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_msg_buf_set(th2_hd, msg_buf1);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
static umword_t th1_hd = 0;
|
||||
static umword_t th2_hd = 0;
|
||||
static umword_t ipc_hd = 0;
|
||||
@@ -22,7 +21,7 @@ static __attribute__((aligned(8))) uint8_t stack1[STACK_SIZE];
|
||||
|
||||
static void hard_sleep(void)
|
||||
{
|
||||
|
||||
|
||||
for (volatile int i; i < 10000000; i++)
|
||||
;
|
||||
}
|
||||
@@ -32,7 +31,7 @@ static void thread_test_func(void)
|
||||
umword_t len;
|
||||
thread_msg_buf_get(th1_hd, (umword_t *)(&buf), NULL);
|
||||
printf("thread_test_func.\n");
|
||||
task_unmap(TASK_PROT, th1_hd);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, th1_hd));
|
||||
printf("Error\n");
|
||||
}
|
||||
static void thread_test_func2(void)
|
||||
@@ -41,11 +40,10 @@ static void thread_test_func2(void)
|
||||
umword_t len;
|
||||
thread_msg_buf_get(th2_hd, (umword_t *)(&buf), NULL);
|
||||
printf("thread_test_func2.\n");
|
||||
task_unmap(TASK_PROT, th2_hd);
|
||||
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, th2_hd));
|
||||
printf("Error\n");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 启动两个线程并进行ipc测试
|
||||
*
|
||||
@@ -59,9 +57,9 @@ void thread_exit_test(void)
|
||||
ipc_hd = handler_alloc();
|
||||
assert(ipc_hd != HANDLER_INVALID);
|
||||
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, ipc_hd);
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, ipc_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, th1_hd);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th1_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_msg_buf_set(th1_hd, msg_buf0);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
@@ -72,7 +70,7 @@ void thread_exit_test(void)
|
||||
tag = thread_run(th1_hd);
|
||||
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = factory_create_thread(FACTORY_PROT, th2_hd);
|
||||
tag = factory_create_thread(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th2_hd));
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_msg_buf_set(th2_hd, msg_buf1);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
@@ -82,5 +80,4 @@ void thread_exit_test(void)
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_run(th2_hd);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ int main(int argc, char *args[])
|
||||
umword_t len;
|
||||
thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL);
|
||||
printf(buf);
|
||||
task_unmap(TASK_THIS, TASK_THIS);
|
||||
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS));
|
||||
ulog_write_str(LOG_PROT, "Error.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user