中断支持转发到用户态

This commit is contained in:
zhangzheng
2023-09-15 00:20:54 +08:00
parent 4cdd72c0d7
commit e80891ba8e
9 changed files with 114 additions and 14 deletions

View File

@@ -3,6 +3,7 @@
#include "u_types.h"
#include "u_prot.h"
msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage);
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);

View File

@@ -0,0 +1,7 @@
#pragma once
#include "u_types.h"
msg_tag_t uirq_bind(obj_handler_t obj_inx, umword_t irq_no);
msg_tag_t uirq_wait(obj_handler_t obj_inx);
msg_tag_t uirq_ack(obj_handler_t obj_inx, umword_t irq_no);

View File

@@ -6,7 +6,21 @@ enum
{
FACTORY_CREATE_KOBJ
};
msg_tag_t factory_create_irq_sender(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,
IRQ_PROT,
vpage.raw,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}
msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage)
{
register volatile umword_t r0 asm("r0");

View File

@@ -0,0 +1,65 @@
#include "u_log.h"
#include "u_prot.h"
#include "u_types.h"
#include "u_util.h"
#include <string.h>
enum log_op
{
WRITE_DATA,
READ_DATA,
SET_FLAGS
};
enum irq_sender_op
{
BIND_IRQ, //!< 绑定一个中断号
UNBIND_IRQ, //!< 解除绑定
WAIT_IRQ, //!< 等待中断触发
ACK_IRQ, //!< 中断确认
};
msg_tag_t uirq_bind(obj_handler_t obj_inx, umword_t irq_no)
{
register volatile umword_t r0 asm("r0");
syscall(syscall_prot_create(BIND_IRQ, IRQ_PROT, obj_inx),
0,
irq_no,
0,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}
msg_tag_t uirq_wait(obj_handler_t obj_inx)
{
register volatile umword_t r0 asm("r0");
syscall(syscall_prot_create(WAIT_IRQ, IRQ_PROT, obj_inx),
0,
0,
0,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}
msg_tag_t uirq_ack(obj_handler_t obj_inx, umword_t irq_no)
{
register volatile umword_t r0 asm("r0");
syscall(syscall_prot_create(ACK_IRQ, IRQ_PROT, obj_inx),
0,
irq_no,
0,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}

View File

@@ -9,22 +9,12 @@
#include <stdio.h>
#include "u_ipc.h"
#include "u_hd_man.h"
#include "u_irq_sender.h"
extern void futex_init(void);
int main(int argc, char *args[])
{
uint8_t data[10];
// futex_init();
ulog_write_str(LOG_PROT, "init..\n");
// while (1)
// {
// int len = ulog_read_bytes(LOG_PROT, data, sizeof(data) - 1);
// if (len > 0)
// {
// data[len] = 0;
// printf("%s\n", data);
// }
// }
#if 0
mm_test();
ulog_test();
@@ -36,8 +26,9 @@ int main(int argc, char *args[])
ipc_test();
map_test();
ipc_timeout_test();
#endif
app_test();
#endif
irq_test();
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); // 删除当前task以及申请得所有对象
printf("exit init.\n");
return 0;

View File

@@ -0,0 +1,13 @@
#include "u_types.h"
#include "u_prot.h"
#include "u_factory.h"
void irq_test(void)
{
obj_handler_t obj = handler_alloc();
factory_create_irq_sender(FACTORY_PROT, vpage_create_raw3(0, 0, obj));
uirq_bind(obj, 38);
uirq_wait(obj);
uirq_ack(obj, 38);
}

View File

@@ -3,6 +3,14 @@
void ulog_test(void)
{
uint8_t data[10];
ulog_write_str(LOG_PROT, "Init task running..\n");
ulog_write_str(LOG_PROT, "todo..\n");
int len = ulog_read_bytes(LOG_PROT, data, sizeof(data) - 1);
if (len > 0)
{
data[len] = 0;
printf("%s\n", data);
}
}

View File

@@ -12,3 +12,4 @@ void ipc_test(void);
void thread_exit_test(void);
void map_test(void);
void ipc_timeout_test(void);
void irq_test(void);