2023-09-16 17:32:10 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @file sys.c
|
2023-12-02 10:16:14 +08:00
|
|
|
|
* @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
|
|
|
|
|
|
*
|
2023-09-11 00:49:51 +08:00
|
|
|
|
*/
|
2024-04-10 15:35:35 +08:00
|
|
|
|
#include "arch.h"
|
2023-09-11 00:49:51 +08:00
|
|
|
|
#include "factory.h"
|
|
|
|
|
|
#include "globals.h"
|
|
|
|
|
|
#include "init.h"
|
2024-04-10 15:35:35 +08:00
|
|
|
|
#include "kobject.h"
|
|
|
|
|
|
#include "log.h"
|
|
|
|
|
|
#include "mm_wrap.h"
|
2023-09-11 00:49:51 +08:00
|
|
|
|
#include "printk.h"
|
|
|
|
|
|
#include "types.h"
|
|
|
|
|
|
#include "util.h"
|
2024-04-10 15:35:35 +08:00
|
|
|
|
#if IS_ENABLED(CONFIG_MMU)
|
|
|
|
|
|
#include <vma.h>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#include <cpio.h>
|
2024-10-07 16:49:32 +08:00
|
|
|
|
#include <boot_info.h>
|
2024-04-10 15:35:35 +08:00
|
|
|
|
#include <globals.h>
|
|
|
|
|
|
#include <task.h>
|
|
|
|
|
|
#include <thread.h>
|
2025-02-05 14:44:49 +08:00
|
|
|
|
#include <thread_knl.h>
|
2023-09-11 00:49:51 +08:00
|
|
|
|
|
2024-10-07 16:49:32 +08:00
|
|
|
|
typedef struct sys
|
|
|
|
|
|
{
|
2023-09-11 00:49:51 +08:00
|
|
|
|
kobject_t kobj;
|
|
|
|
|
|
} sys_t;
|
|
|
|
|
|
|
2023-09-29 01:03:19 +08:00
|
|
|
|
static sys_t sys_obj;
|
2023-09-11 00:49:51 +08:00
|
|
|
|
|
2024-10-07 16:49:32 +08:00
|
|
|
|
enum sys_op
|
|
|
|
|
|
{
|
2023-09-11 00:49:51 +08:00
|
|
|
|
SYS_INFO_GET,
|
2024-11-11 08:59:39 +08:00
|
|
|
|
SYS_INFO2_GET,
|
2023-09-11 00:49:51 +08:00
|
|
|
|
REBOOT,
|
2024-01-05 23:59:48 +08:00
|
|
|
|
MEM_INFO,
|
2024-02-24 14:30:37 +08:00
|
|
|
|
DIS_IRQ,
|
2023-09-11 00:49:51 +08:00
|
|
|
|
};
|
2024-04-10 15:35:35 +08:00
|
|
|
|
#define SYS_FLAGS_MAP_CPIO_FS 0x1
|
2023-09-11 00:49:51 +08:00
|
|
|
|
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)
|
|
|
|
|
|
{
|
2023-09-30 13:19:58 +08:00
|
|
|
|
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);
|
2023-09-11 00:49:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2024-04-10 15:35:35 +08:00
|
|
|
|
int ret = 0;
|
2023-09-11 00:49:51 +08:00
|
|
|
|
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL);
|
2024-10-07 16:49:32 +08:00
|
|
|
|
if (sys_p.prot != SYS_PROT)
|
|
|
|
|
|
{
|
2024-04-04 16:51:29 +00:00
|
|
|
|
f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw;
|
2023-09-11 00:49:51 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-10-07 16:49:32 +08:00
|
|
|
|
switch (sys_p.op)
|
|
|
|
|
|
{
|
|
|
|
|
|
case SYS_INFO_GET:
|
|
|
|
|
|
{
|
2024-04-10 15:35:35 +08:00
|
|
|
|
umword_t flags = f->regs[0];
|
|
|
|
|
|
addr_t cpio_addr;
|
|
|
|
|
|
|
2024-04-04 16:51:29 +00:00
|
|
|
|
f->regs[1] = sys_tick_cnt_get();
|
2024-04-07 15:04:30 +00:00
|
|
|
|
#if IS_ENABLED(CONFIG_MMU)
|
2024-10-07 16:49:32 +08:00
|
|
|
|
if (flags & SYS_FLAGS_MAP_CPIO_FS)
|
|
|
|
|
|
{
|
2024-04-10 15:35:35 +08:00
|
|
|
|
ret = task_vma_alloc(&(thread_get_current_task()->mm_space.mem_vma),
|
|
|
|
|
|
vma_addr_create(VPAGE_PROT_RO, VMA_ADDR_RESV, 0),
|
|
|
|
|
|
cpio_get_size(cpio_images), (paddr_t)cpio_images, &cpio_addr);
|
|
|
|
|
|
f->regs[2] = cpio_addr;
|
2024-10-07 16:49:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2024-04-10 15:35:35 +08:00
|
|
|
|
f->regs[2] = CONFIG_BOOT_FS_VADDR;
|
|
|
|
|
|
}
|
2024-04-07 15:04:30 +00:00
|
|
|
|
#else
|
2024-10-07 16:49:32 +08:00
|
|
|
|
f->regs[2] = arch_get_boot_info()->flash_layer.flash_layer_list[BOOTFS_LAYER_3].st_addr;
|
2024-04-07 15:04:30 +00:00
|
|
|
|
#endif
|
2024-04-04 16:51:29 +00:00
|
|
|
|
f->regs[3] = arch_get_sys_clk();
|
2024-11-11 08:59:39 +08:00
|
|
|
|
|
2024-04-10 15:35:35 +08:00
|
|
|
|
tag = msg_tag_init4(0, 0, 0, ret);
|
2024-10-07 16:49:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2024-11-11 08:59:39 +08:00
|
|
|
|
case SYS_INFO2_GET:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_DTBO_SUPPORT)
|
|
|
|
|
|
f->regs[1] = arch_get_boot_info()->flash_layer.flash_layer_list[DTBO_LAYER_1].st_addr;
|
|
|
|
|
|
#else
|
|
|
|
|
|
f->regs[1] = 0;
|
|
|
|
|
|
#endif
|
2025-02-05 14:44:49 +08:00
|
|
|
|
f->regs[2] = cpu_get_current_usage();
|
2024-11-11 08:59:39 +08:00
|
|
|
|
tag = msg_tag_init4(0, 0, 0, ret);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-10-07 16:49:32 +08:00
|
|
|
|
case REBOOT:
|
|
|
|
|
|
{
|
2024-01-05 23:59:48 +08:00
|
|
|
|
printk("sys reboot.\n");
|
|
|
|
|
|
sys_reset();
|
|
|
|
|
|
tag = msg_tag_init4(0, 0, 0, 0);
|
2024-10-07 16:49:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MEM_INFO:
|
|
|
|
|
|
{
|
2025-03-30 13:16:30 +08:00
|
|
|
|
size_t total = 0;
|
|
|
|
|
|
size_t free = 0;
|
2024-01-05 23:59:48 +08:00
|
|
|
|
|
2025-03-30 13:16:30 +08:00
|
|
|
|
for (int i = 0; i < arch_get_boot_info()->mem.mem_num; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
size_t item_total;
|
|
|
|
|
|
size_t item_free;
|
|
|
|
|
|
|
|
|
|
|
|
printk("================================mem:[%d]=============================\n", i);
|
|
|
|
|
|
mm_info_raw(i, &item_total, &item_free);
|
|
|
|
|
|
printk("total:0x%x free:0x%x\n", item_total, item_free);
|
|
|
|
|
|
printk("=====================================================================\n\n", i);
|
|
|
|
|
|
total += item_total;
|
|
|
|
|
|
free += item_free;
|
|
|
|
|
|
}
|
2024-04-04 16:51:29 +00:00
|
|
|
|
f->regs[1] = total;
|
|
|
|
|
|
f->regs[2] = free;
|
2024-01-05 23:59:48 +08:00
|
|
|
|
tag = msg_tag_init4(0, 0, 0, 0);
|
2024-10-07 16:49:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIS_IRQ:
|
|
|
|
|
|
{
|
2024-04-04 16:51:29 +00:00
|
|
|
|
arch_disable_irq(f->regs[0]);
|
2024-02-24 14:30:37 +08:00
|
|
|
|
tag = msg_tag_init4(0, 0, 0, 0);
|
2024-10-07 16:49:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2023-09-11 00:49:51 +08:00
|
|
|
|
default:
|
|
|
|
|
|
tag = msg_tag_init4(0, 0, 0, -ENOSYS);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-04-04 16:51:29 +00:00
|
|
|
|
f->regs[0] = tag.raw;
|
2023-09-11 00:49:51 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void sys_dump(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|