From 4a57f675831d8657b3deb2d128813514b93c6fc2 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 27 Oct 2013 18:27:56 +0100 Subject: [PATCH] Implement the reboot command --- Makefile | 1 + addresses.bash | 8 ++++---- kernel/include/addresses.hpp | 2 +- kernel/include/kernel_utils.hpp | 8 ++++++++ kernel/src/kernel.cpp | 21 +++++++++++++++++---- micro_kernel/interrupts.asm | 24 ++++++++++++++++++++++++ micro_kernel/micro_kernel.asm | 3 +++ 7 files changed, 58 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index b79800e1..48b25e1b 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ MICRO_KERNEL_UTILS_SRC=$(wildcard micro_kernel/utils/*.asm) micro_kernel.bin: $(MICRO_KERNEL_SRC) $(MICRO_KERNEL_UTILS_SRC) nasm -w+all -f bin -o micro_kernel.bin micro_kernel/micro_kernel.asm nasm -D DEBUG -g -w+all -f elf64 -o micro_kernel.g micro_kernel/micro_kernel.asm + bash addresses.bash KERNEL_FLAGS=-masm=intel -Ikernel/include/ -O1 -std=c++11 -Wall -Wextra -fno-exceptions -fno-rtti -ffreestanding KERNEL_LINK_FLAGS=-std=c++11 -T linker.ld -ffreestanding -O1 -nostdlib diff --git a/addresses.bash b/addresses.bash index 8a72460e..a25af3d3 100644 --- a/addresses.bash +++ b/addresses.bash @@ -5,12 +5,12 @@ function generate_address { hex_address="0x$address" hex_offset=`echo "obase=16; $(($hex_address+0x1000))" | bc` - echo "#define asm_$1 0x$hex_offset" >> src/addresses.hpp + echo "#define asm_$1 0x$hex_offset" >> kernel/include/addresses.hpp } -echo "#ifndef ADDRESSES_H" > src/addresses.hpp -echo "#define ADDRESSES_H" >> src/addresses.hpp +echo "#ifndef ADDRESSES_H" > kernel/include/addresses.hpp +echo "#define ADDRESSES_H" >> kernel/include/addresses.hpp generate_address "register_irq_handler" -echo "#endif" >> src/addresses.hpp +echo "#endif" >> kernel/include/addresses.hpp diff --git a/kernel/include/addresses.hpp b/kernel/include/addresses.hpp index 27a7f808..04b8f6ef 100644 --- a/kernel/include/addresses.hpp +++ b/kernel/include/addresses.hpp @@ -1,4 +1,4 @@ #ifndef ADDRESSES_H #define ADDRESSES_H -#define asm_register_irq_handler 0x272E +#define asm_register_irq_handler 0x276D #endif diff --git a/kernel/include/kernel_utils.hpp b/kernel/include/kernel_utils.hpp index 45256528..d8555abe 100644 --- a/kernel/include/kernel_utils.hpp +++ b/kernel/include/kernel_utils.hpp @@ -13,6 +13,14 @@ void register_irq_handler(void (*handler)()){ ); } +template +void interrupt(){ + asm ("int %0" + : + : "i" (INT) + ); +} + uint8_t in_byte(uint16_t _port); void out_byte (uint16_t _port, uint8_t _data); diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index f276895b..24f9d0ac 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -57,8 +57,21 @@ void keyboard_handler(){ } } -void exec_command(){ - k_print("The command \""); - k_print(current_input); - k_print_line("\" does not exist"); +bool str_equals(const char* a, const char* b){ + while(*a && *a == *b){ + ++a; + ++b; + } + + return *a == *b; +} + +void exec_command(){ + if(str_equals("reboot", current_input)){ + interrupt<60>(); + } else { + k_print("The command \""); + k_print(current_input); + k_print_line("\" does not exist"); + } } diff --git a/micro_kernel/interrupts.asm b/micro_kernel/interrupts.asm index 9625a483..abc22521 100644 --- a/micro_kernel/interrupts.asm +++ b/micro_kernel/interrupts.asm @@ -208,6 +208,11 @@ install_irqs: ret +install_syscalls: + IDT_SET_GATE 60, syscall_reboot, LONG_SELECTOR-GDT64, 0x8E + + ret + ; r8 = irq ; r9 = handler address register_irq_handler: @@ -215,6 +220,25 @@ register_irq_handler: ret +; Syscalls + +; Reboot the computer +; No parameters +syscall_reboot: + cli + + push rax + + mov al, 0x64 + or al, 0xFE + out 0x64, al + mov al, 0xFE + out 0x64, al + + pop rax + + iretq + ; Data structures ; each idt entry is form like that: diff --git a/micro_kernel/micro_kernel.asm b/micro_kernel/micro_kernel.asm index 62e7e7f7..c106ad01 100644 --- a/micro_kernel/micro_kernel.asm +++ b/micro_kernel/micro_kernel.asm @@ -99,6 +99,9 @@ lm_start: ; Install all IRQs call install_irqs + ; Install custom syscalls + call install_syscalls + sti call install_timer