Implement the reboot command

This commit is contained in:
Baptiste Wicht 2013-10-27 18:27:56 +01:00
parent a198047bef
commit 4a57f67583
7 changed files with 58 additions and 9 deletions

View File

@ -9,6 +9,7 @@ MICRO_KERNEL_UTILS_SRC=$(wildcard micro_kernel/utils/*.asm)
micro_kernel.bin: $(MICRO_KERNEL_SRC) $(MICRO_KERNEL_UTILS_SRC) 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 -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 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_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 KERNEL_LINK_FLAGS=-std=c++11 -T linker.ld -ffreestanding -O1 -nostdlib

View File

@ -5,12 +5,12 @@ function generate_address {
hex_address="0x$address" hex_address="0x$address"
hex_offset=`echo "obase=16; $(($hex_address+0x1000))" | bc` 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 "#ifndef ADDRESSES_H" > kernel/include/addresses.hpp
echo "#define ADDRESSES_H" >> src/addresses.hpp echo "#define ADDRESSES_H" >> kernel/include/addresses.hpp
generate_address "register_irq_handler" generate_address "register_irq_handler"
echo "#endif" >> src/addresses.hpp echo "#endif" >> kernel/include/addresses.hpp

View File

@ -1,4 +1,4 @@
#ifndef ADDRESSES_H #ifndef ADDRESSES_H
#define ADDRESSES_H #define ADDRESSES_H
#define asm_register_irq_handler 0x272E #define asm_register_irq_handler 0x276D
#endif #endif

View File

@ -13,6 +13,14 @@ void register_irq_handler(void (*handler)()){
); );
} }
template<uint8_t INT>
void interrupt(){
asm ("int %0"
:
: "i" (INT)
);
}
uint8_t in_byte(uint16_t _port); uint8_t in_byte(uint16_t _port);
void out_byte (uint16_t _port, uint8_t _data); void out_byte (uint16_t _port, uint8_t _data);

View File

@ -57,8 +57,21 @@ void keyboard_handler(){
} }
} }
void exec_command(){ bool str_equals(const char* a, const char* b){
k_print("The command \""); while(*a && *a == *b){
k_print(current_input); ++a;
k_print_line("\" does not exist"); ++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");
}
} }

View File

@ -208,6 +208,11 @@ install_irqs:
ret ret
install_syscalls:
IDT_SET_GATE 60, syscall_reboot, LONG_SELECTOR-GDT64, 0x8E
ret
; r8 = irq ; r8 = irq
; r9 = handler address ; r9 = handler address
register_irq_handler: register_irq_handler:
@ -215,6 +220,25 @@ register_irq_handler:
ret 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 ; Data structures
; each idt entry is form like that: ; each idt entry is form like that:

View File

@ -99,6 +99,9 @@ lm_start:
; Install all IRQs ; Install all IRQs
call install_irqs call install_irqs
; Install custom syscalls
call install_syscalls
sti sti
call install_timer call install_timer