Draft: lab 3 irq wtf
This commit is contained in:
@@ -1,10 +1,13 @@
|
||||
#include <stddef.h>
|
||||
#include <errcode.h>
|
||||
#include <kmalloc.h>
|
||||
#include <utils.h>
|
||||
#include <string.h>
|
||||
#include <uart.h>
|
||||
#include <mbox.h>
|
||||
#include <shell.h>
|
||||
#include <exec.h>
|
||||
#include <mman.h>
|
||||
|
||||
#define INPUT_BUFLEN 1000
|
||||
|
||||
@@ -13,25 +16,29 @@
|
||||
#define PM_RSTC 0x3F10001c
|
||||
#define PM_WDOG 0x3F100024
|
||||
|
||||
void help (void)
|
||||
static inline
|
||||
void _help (void)
|
||||
{
|
||||
uart_puts(
|
||||
"help : print this help menu" ENDL
|
||||
"hello : print Hello World!" ENDL
|
||||
"hwinfo : print hardware info" ENDL
|
||||
"memalloc : alloate memory and print" ENDL
|
||||
"ls : list directory contents" ENDL
|
||||
"cat : concatenate files and print" ENDL
|
||||
"reboot : reboot the device" ENDL
|
||||
"help : print this help menu" ENDL
|
||||
"hello : print Hello World!" ENDL
|
||||
"hwinfo : print hardware info" ENDL
|
||||
"memalloc <size>: alloate memory and print" ENDL
|
||||
"ls : list directory contents" ENDL
|
||||
"cat <file>: concatenate files and print" ENDL
|
||||
"exec <file>: execute file in usermode" ENDL
|
||||
"reboot : reboot the device" ENDL
|
||||
);
|
||||
}
|
||||
|
||||
void hello (void)
|
||||
static inline
|
||||
void _hello (void)
|
||||
{
|
||||
uart_puts("hello, world" ENDL);
|
||||
}
|
||||
|
||||
void hwinfo (void)
|
||||
static inline
|
||||
void _hwinfo (void)
|
||||
{
|
||||
uart_puts(
|
||||
"hwinfo: " ENDL
|
||||
@@ -51,7 +58,8 @@ void hwinfo (void)
|
||||
uart_puts(ENDL);
|
||||
}
|
||||
|
||||
void memalloc(size_t size)
|
||||
static inline
|
||||
void _memalloc(size_t size)
|
||||
{
|
||||
void *addr = kmalloc(size);
|
||||
uart_puts("size: ");
|
||||
@@ -63,40 +71,60 @@ void memalloc(size_t size)
|
||||
uart_puts(ENDL);
|
||||
}
|
||||
|
||||
void ls_initrd_callback(file_node_t *tr)
|
||||
static inline
|
||||
void _ls_initrd_callback(file_node_t *tr)
|
||||
{
|
||||
uart_puts(tr->filename);
|
||||
uart_puts(ENDL);
|
||||
}
|
||||
|
||||
void ls(file_node_t *root)
|
||||
static inline
|
||||
void _ls(file_node_t *root)
|
||||
{
|
||||
initrd_traverse(root, ls_initrd_callback);
|
||||
initrd_traverse(root, _ls_initrd_callback);
|
||||
}
|
||||
|
||||
void cat(file_node_t *root, const char *filename)
|
||||
static inline
|
||||
void _cat(file_node_t *root, const char *filename)
|
||||
{
|
||||
file_node_t *tr = initrd_get(root, filename);
|
||||
if (tr) {
|
||||
uart_puts((char *)tr->filecontent);
|
||||
} else {
|
||||
uart_puts("FILE NOT EXIST!" ENDL);
|
||||
exit(ERR_NOT_EXIST);
|
||||
}
|
||||
}
|
||||
|
||||
void set(long addr, unsigned int value) {
|
||||
volatile unsigned int* point = (unsigned int*)addr;
|
||||
*point = value;
|
||||
}
|
||||
|
||||
void reset(int tick) { // reboot after watchdog timer expire
|
||||
set(PM_RSTC, PM_PASSWORD | 0x20); // full reset
|
||||
set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick
|
||||
}
|
||||
|
||||
void reboot(void)
|
||||
static inline
|
||||
void _exec(file_node_t *root, const char *filename)
|
||||
{
|
||||
reset(1 << 16);
|
||||
file_node_t *tr = initrd_get(root, filename);
|
||||
if (tr) {
|
||||
void *userspace = allocate_page(1 << 6);
|
||||
memcpy(userspace, tr->filecontent, tr->filesize);
|
||||
user_exec(userspace, userspace + (1 << (12 + 6)) - 8);
|
||||
kfree(userspace);
|
||||
} else {
|
||||
exit(ERR_NOT_EXIST);
|
||||
}
|
||||
}
|
||||
|
||||
static inline
|
||||
void _set(long addr, unsigned int value) {
|
||||
volatile unsigned int* point = (unsigned int*)addr;
|
||||
*point = value;
|
||||
}
|
||||
|
||||
static inline
|
||||
void _reset(int tick) { // reboot after watchdog timer expire
|
||||
_set(PM_RSTC, PM_PASSWORD | 0x20); // full reset
|
||||
_set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick
|
||||
}
|
||||
|
||||
static inline
|
||||
void _reboot(void)
|
||||
{
|
||||
_reset(1 << 16);
|
||||
}
|
||||
|
||||
int shell(file_node_t *initrd_root)
|
||||
@@ -127,19 +155,21 @@ int shell(file_node_t *initrd_root)
|
||||
*j = '\0';
|
||||
|
||||
if (!strcmp(bin, "help")) {
|
||||
help();
|
||||
_help();
|
||||
} else if (!strcmp(bin, "hello")) {
|
||||
hello();
|
||||
_hello();
|
||||
} else if (!strcmp(bin, "hwinfo")) {
|
||||
hwinfo();
|
||||
_hwinfo();
|
||||
} else if (!strcmp(bin, "memalloc")){
|
||||
memalloc((size_t)atoi32(param));
|
||||
_memalloc((size_t)atoi32(param));
|
||||
} else if (!strcmp(bin, "ls")) {
|
||||
ls(initrd_root);
|
||||
_ls(initrd_root);
|
||||
} else if (!strcmp(bin, "cat")) {
|
||||
cat(initrd_root, param);
|
||||
_cat(initrd_root, param);
|
||||
} else if (!strcmp(bin, "exec")) {
|
||||
_exec(initrd_root, param);
|
||||
} else if (!strcmp(bin, "reboot")) {
|
||||
reboot();
|
||||
_reboot();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user