Files
mkrtos-real/mkrtos_knl/knl/log.c

129 lines
2.9 KiB
C
Raw Normal View History

/**
* @file log.c
* @author ATShining (1358745329@qq.com)
* @brief
* @version 0.1
* @date 2023-09-14
*
* @copyright Copyright (c) 2023
*
2023-08-20 20:52:23 +08:00
*/
#include "log.h"
2025-03-13 09:37:35 +08:00
#include "arch.h"
2023-08-20 20:52:23 +08:00
#include "factory.h"
#include "kobject.h"
#include "globals.h"
2023-08-22 00:26:34 +08:00
#include "init.h"
2023-08-20 20:52:23 +08:00
#include "printk.h"
2023-09-03 15:55:06 +08:00
#include "types.h"
#include "util.h"
#include "irq_sender.h"
#include "uart/uart.h"
typedef struct log
{
irq_sender_t kobj;
} log_t;
2023-08-20 20:52:23 +08:00
static log_t log;
enum log_op
{
WRITE_DATA,
READ_DATA,
SET_FLAGS
};
2023-09-03 15:55:06 +08:00
static void log_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f);
2023-08-20 20:52:23 +08:00
static void log_trigger(irq_entry_t *irq)
{
uart_tigger(irq);
}
2023-08-22 00:26:34 +08:00
static void log_reg(void)
2023-08-20 20:52:23 +08:00
{
// kobject_init(&log.kobj);
irq_sender_init(&log.kobj);
log.kobj.kobj.kobj_type = IRQ_SENDER_TYPE;
log.kobj.kobj.invoke_func = log_syscall;
2023-09-29 01:03:19 +08:00
log.kobj.kobj.stage_1_func = kobject_release_stage1;
log.kobj.kobj.stage_2_func = kobject_release_stage2;
log.kobj.kobj.put_func = kobject_put;
global_reg_kobj(&log.kobj.kobj, LOG_PROT);
irq_alloc(LOG_INTR_NO, &log.kobj, log_trigger);
2025-03-13 09:37:35 +08:00
arch_set_enable_irq_prio(LOG_INTR_NO, 0, 0);
arch_enable_irq(LOG_INTR_NO);
2023-08-20 20:52:23 +08:00
}
2023-08-22 00:26:34 +08:00
INIT_KOBJ(log_reg);
2023-08-20 20:52:23 +08:00
static msg_tag_t log_write_data(log_t *log, const char *data, int len)
{
put_bytes((const uint8_t *)data, len);
2023-08-20 20:52:23 +08:00
return msg_tag_init(0);
}
static int log_read_data(log_t *log, uint8_t *data, int len, int flags)
{
for (int i = 0; i < len; i++)
{
again:;
int c = getc();
if (c < 0 && i == 0)
{
int ret = irq_sender_wait(&log->kobj, thread_get_current(), flags);
if (ret < 0)
{
return ret;
}
goto again;
}
else if (c < 0)
{
return i;
}
data[i] = (uint8_t)c;
}
return len;
}
2023-09-03 15:55:06 +08:00
static void
log_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
2023-08-20 20:52:23 +08:00
{
2023-09-07 23:47:34 +08:00
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL);
if (sys_p.prot == LOG_PROT)
2023-08-20 20:52:23 +08:00
{
switch (sys_p.op)
{
case WRITE_DATA:
tag = log_write_data(
2024-04-04 16:51:29 +00:00
(log_t *)kobj, (const char *)(&f->regs[1]),
MIN(in_tag.msg_buf_len * WORD_BYTES, WORD_BYTES * 5));
break;
case READ_DATA:
{
int ret = log_read_data((log_t *)kobj, (uint8_t *)(&f->regs[1]), MIN(f->regs[1], WORD_BYTES * 3), f->regs[2]);
tag = msg_tag_init4(0, 0, 0, ret);
}
break;
case SET_FLAGS:
printk("don't support set flags.\n");
break;
default:
tag = msg_tag_init4(0, 0, 0, -ENOSYS);
break;
}
2024-04-04 16:51:29 +00:00
f->regs[0] = tag.raw;
2023-08-20 20:52:23 +08:00
}
else if (sys_p.prot == IRQ_PROT)
2023-08-20 20:52:23 +08:00
{
irq_sender_syscall(kobj, sys_p, in_tag, f);
}
else
{
2024-04-04 16:51:29 +00:00
f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw;
return;
2023-08-20 20:52:23 +08:00
}
2023-09-03 15:55:06 +08:00
return;
2023-08-22 00:26:34 +08:00
}
void log_dump(void)
{
2023-08-20 20:52:23 +08:00
}