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

90 lines
1.8 KiB
C
Raw Normal View History

2023-09-16 17:32:10 +08:00
/**
* @file sys.c
* @author ATShining (1358745329@qq.com)
2023-09-16 17:32:10 +08:00
* @brief 使
* @version 0.1
* @date 2023-09-16
*
* @copyright Copyright (c) 2023
*
*/
#include "log.h"
#include "factory.h"
#include "kobject.h"
#include "globals.h"
#include "init.h"
#include "printk.h"
#include "types.h"
#include "util.h"
#include "arch.h"
2024-01-05 23:59:48 +08:00
#include "mm_wrap.h"
typedef struct sys
{
kobject_t kobj;
} sys_t;
2023-09-29 01:03:19 +08:00
static sys_t sys_obj;
enum sys_op
{
SYS_INFO_GET,
REBOOT,
2024-01-05 23:59:48 +08:00
MEM_INFO,
};
static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f);
static void sys_reg(void)
{
kobject_init(&sys_obj.kobj, SYS_TYPE);
2023-09-29 01:03:19 +08:00
sys_obj.kobj.invoke_func = sys_syscall;
global_reg_kobj(&sys_obj.kobj, SYS_PROT);
}
INIT_KOBJ(sys_reg);
static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
{
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL);
2023-09-16 17:32:10 +08:00
if (sys_p.prot != SYS_PROT)
{
f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw;
return;
}
switch (sys_p.op)
{
case SYS_INFO_GET:
{
f->r[1] = sys_tick_cnt_get();
2024-01-18 00:48:16 +08:00
f->r[2] = CONFIG_KNL_TEXT_ADDR + CONFIG_BOOTFS_OFFSET;
tag = msg_tag_init4(0, 0, 0, 0);
}
break;
case REBOOT:
{
2024-01-05 23:59:48 +08:00
printk("sys reboot.\n");
sys_reset();
tag = msg_tag_init4(0, 0, 0, 0);
}
break;
case MEM_INFO:
{
size_t total;
size_t free;
mm_info(&total, &free);
f->r[1] = total;
f->r[2] = free;
tag = msg_tag_init4(0, 0, 0, 0);
}
break;
default:
tag = msg_tag_init4(0, 0, 0, -ENOSYS);
break;
}
f->r[0] = tag.raw;
return;
}
void sys_dump(void)
{
}