From cf1d99fb791bcdf69d15750a61f409c0cfa65a99 Mon Sep 17 00:00:00 2001 From: rami Date: Mon, 29 Jul 2024 19:43:44 -0400 Subject: [PATCH] reboot syscall and shell cmd using ps2 controller --- boot/initrd | Bin 964 -> 1040 bytes include/kernel/ps2.h | 2 ++ kernel/init.asm | 2 ++ kernel/kernel.c | 7 ++++++- kernel/pic.c | 4 ++-- user/shell.c | 23 ++++++++++++++++++----- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/boot/initrd b/boot/initrd index ddd825f659c771e63c1459263740b438bdbc4389..453728e415a06b8be94dc8eb39a41554cca20c08 100755 GIT binary patch delta 355 zcmX@YK7nI`1n2Dr77h~z28JIK6_r_UFfuUQnCRKTv4aUHbhcr_#50P*4UH@uFDCr| z|G)VNOU5D)r+E^iXiNuKgePMuP^7o@&%giw171jh#W-3Il=5e+1*!CaXnVaaV?UCz z&p^e^M?lKhUnBxmyq=zM45S*Oo#l1Mx=FabvPAlQc_Getya1P^S9HmzhMFv=}G9Vv^$o1w;cdgd!#jGAlFQm~6_d&iV$( eUobh5S(&v57-W`{H!=%Pp2IA_cy#hwW^n-Cg?9!3 delta 307 zcmbQhafE$>1n0R177h~z28J~g6_r_+GBPkMo#@#y@t#a-NFxi!i@E>*|8G9Rl2HcY zOn`D2fU0_1|NQ&^KOl?Y#Z<5;PevtB2~_ljI#`UO^*||qMk7dTC`9Y)Z5fk6TsJ6p z`Q$oA$H~VSO(*|hR0x#-Is@dK79cGIw1f{xuLJTGpnPEucA2asYAU|?d92ht%x zd3zuYQm+Q2k>z!P{1uZMnWQH#W~!O2z%0V}Z}LY*;mID%Je(lkg#i5#I60PCnQ`gl fMrL)^9YFqs$!nRFSv{B-7>vMbUoZ=>R>61xSh!?^ diff --git a/include/kernel/ps2.h b/include/kernel/ps2.h index 4b6bafc..f21d5f0 100644 --- a/include/kernel/ps2.h +++ b/include/kernel/ps2.h @@ -5,6 +5,8 @@ #define PS2_8042_STATUS 0x64 #define PS2_8042_COMMAND 0x64 +#define ps2_reboot outb(0x64, 0xFE) + // SCANCODES #define KBD_ESC 0x01 #define KBD_1 0x02 diff --git a/kernel/init.asm b/kernel/init.asm index fb16599..34a17cf 100644 --- a/kernel/init.asm +++ b/kernel/init.asm @@ -279,10 +279,12 @@ boot_page_tab: times 1024 dd 0 extern syscall_read extern syscall_write +extern syscall_reboot global syscall_table syscall_table: dd syscall_read dd syscall_write + dd syscall_reboot section .bss align 16 diff --git a/kernel/kernel.c b/kernel/kernel.c index 168c467..f06d8c7 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -44,6 +44,7 @@ void syscall_read(stack_frame_t r) { if (fd == FD_STDOUT) { // Not yet } else if (fd == FD_STDIN) { + // for some reason interrupts are disabled asm volatile ("sti" ::); while (ctx.current_task->stdin[ctx.current_task->stdin_len - 1] != '\n') cpu_relax; if (ctx.current_task->stdin_len > 0) ctx.current_task->stdin[--ctx.current_task->stdin_len] = 0; @@ -53,6 +54,11 @@ void syscall_read(stack_frame_t r) { } } +void syscall_reboot(stack_frame_t r) { + (void)r; + ps2_reboot; +} + void syscall_uptime(stack_frame_t r) { uint64_t *buf = (uint64_t *)r.esi; *buf = ctx.ticks; @@ -191,7 +197,6 @@ void kernel(multiboot_info_t *info) { : "eax", "ecx", "edx" ); - LOG("Switching to ring 3... EIP: 0x%08X ESP: 0x%08X\n", task.eip, task.esp); jmp_user_mode(task.esp, task.eip); diff --git a/kernel/pic.c b/kernel/pic.c index a74cd11..6013df5 100644 --- a/kernel/pic.c +++ b/kernel/pic.c @@ -26,6 +26,6 @@ void pic_remap(int pic1_start, int pic2_start) { outb(PIC_2_DATA, 0x01); // Unmask - outb(PIC_1_DATA, 0b11111101); - outb(PIC_2_DATA, 0b11111101); + outb(PIC_1_DATA, 0b11111100); + outb(PIC_2_DATA, 0b11111100); } diff --git a/user/shell.c b/user/shell.c index 36aa38f..08d6b16 100644 --- a/user/shell.c +++ b/user/shell.c @@ -22,6 +22,16 @@ void read(int fd, void *buf, int size) { ); } +void reboot() { + asm volatile ( + "movl $2, %%eax\n\t" + "int $0x80" + : + : + : "eax" + ); +} + extern char *buf; void _start() { @@ -30,10 +40,13 @@ void _start() { while (1) { puts("> "); read(0, buf1, 256); - if (!strcmp(buf1, "SKIBIDI")) { - puts("dop dop yes yes!\n"); - } else { - puts("unknown command!\n"); - } + if (!strcmp(buf1, "SKIBIDI")) { + puts("dop dop yes yes!\n"); + } else if (!strcmp(buf1, "REBOOT")) { + reboot(); + } + else { + puts("unknown command!\n"); + } } }