diff --git a/kernel/arch/core_interrupt.h b/kernel/arch/core_interrupt.h index eda8aa2..c807aab 100644 --- a/kernel/arch/core_interrupt.h +++ b/kernel/arch/core_interrupt.h @@ -72,6 +72,8 @@ enum class Vector : uint8_t { PANIC = 99, ///< Panic interrupt to stop CPU (default value for \ref IOAPIC ///< devices) TIMER = 32, ///< Periodic CPU local \ref LAPIC::Timer interrupt + + SYSCALL = 0x80 }; constexpr size_t VECTORS = 256; diff --git a/kernel/main.cc b/kernel/main.cc index d9db9a6..7b2938c 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -5,6 +5,7 @@ #include "./device/serialstream.h" #include "./types.h" // This is actually used #include "arch/core_interrupt.h" +#include "syscall/handler.h" SerialStream sout; #include "./device/textstream.h" @@ -53,6 +54,8 @@ extern "C" int main() { // Activate Keyboard PS2Controller::init(); + Syscall::init(); + // Enter Level 1/2 Guarded g = Guard::enter(); @@ -73,7 +76,7 @@ extern "C" int main() { * Therefore activate the LAPIC timer in level 1/2 after initialization * (just before schedule()) */ - LAPIC::Timer::activate(); + //LAPIC::Timer::activate(); DBG_VERBOSE << "Schedule..." << endl; // Schedule first app diff --git a/kernel/syscall/handler.cc b/kernel/syscall/handler.cc index 0471cc4..609d3d2 100644 --- a/kernel/syscall/handler.cc +++ b/kernel/syscall/handler.cc @@ -1,14 +1,14 @@ #include "syscall/handler.h" -#include "arch/core.h" -#include "arch/core_interrupt.h" -#include "arch/gdt.h" -#include "arch/idt.h" -#include "debug/kernelpanic.h" -#include "debug/output.h" -#include "interrupt/guard.h" -#include "syscall/skeleton.h" -#include "syscall/stub.h" +#include "../arch/core.h" +#include "../arch/core_interrupt.h" +#include "../arch/gdt.h" +#include "../arch/idt.h" +#include "../debug/kernelpanic.h" +#include "../debug/output.h" +#include "../interrupt/guard.h" +#include "../syscall/skeleton.h" +#include "../syscall/stub.h" #include "types.h" /*! \brief Interrupt based system call entry function @@ -46,11 +46,22 @@ extern "C" size_t syscall_handler(size_t sysnum, size_t p1, size_t p2, (void)p5; (void)sysnum; (void)user; + + switch ((Syscall::ID)sysnum) { + case Syscall::ID::TEST: + Syscall::Skeleton::test(Guard::enter().vault(), p1, p2, p3, p4, p5); + break; + case Syscall::ID::WRITE: + break; + } + return static_cast(-1); } void init() { // Set interrupt based syscall handler + IDT::set(Core::Interrupt::Vector::SYSCALL, IDT::InterruptDescriptor::Returning(syscall_entry, 0, IDT::DPL_USER)); + IDT::load(); } } // namespace Syscall diff --git a/kernel/syscall/stub.asm b/kernel/syscall/stub.asm index 4c28098..dab2ab9 100644 --- a/kernel/syscall/stub.asm +++ b/kernel/syscall/stub.asm @@ -6,5 +6,7 @@ align 8 sys_call: ; BSB2 1 - Syscall stub + int 0x80 + ret diff --git a/kernel/syscall/stub.h b/kernel/syscall/stub.h index 5b219e8..c7e09fe 100644 --- a/kernel/syscall/stub.h +++ b/kernel/syscall/stub.h @@ -7,6 +7,7 @@ namespace Syscall { */ enum class ID : size_t { TEST = 0, + WRITE = 1, }; } // namespace Syscall diff --git a/kernel/user/app1/appl.cc b/kernel/user/app1/appl.cc index 79247c7..1952928 100644 --- a/kernel/user/app1/appl.cc +++ b/kernel/user/app1/appl.cc @@ -1,6 +1,7 @@ // vim: set noet ts=4 sw=4: #include "appl.h" +#include "../../syscall/stub.h" #include "../../arch/core.h" #include "../../arch/system.h" @@ -16,26 +17,29 @@ extern Application apps[]; void Application::action() { // NOLINT // Thread 1 may be an auxiliary thread + + sys_test(1,2,3,4,5); + unsigned id = 0; while (&apps[id++] != this); for (unsigned i = 0;; ++i) { - // Make sure that we can use kout exclusively due to the hardware cursor - // otherwise we'd get a word jumble - koutsem.p(Guard::enter().vault()); - kout.setPos(0U, id); - kout << i; - kout.flush(); - koutsem.v(Guard::enter().vault()); - // XXX: Doing this (the first time) in TASK 16 breaks all scheduling - if (i == 10000) { - if (id % 2 == 1) { - Guard::enter().vault().scheduler.kill(&apps[id - 1]); - } - } - Guard::enter().vault().scheduler.resume(); - if (id > 1) { - Guarded g = Guard::enter(); - g.vault().bellringer.sleep(g.vault(), id * id * 10); - } + //// Make sure that we can use kout exclusively due to the hardware cursor + //// otherwise we'd get a word jumble + //koutsem.p(Guard::enter().vault()); + //kout.setPos(0U, id); + //kout << i; + //kout.flush(); + //koutsem.v(Guard::enter().vault()); + //// XXX: Doing this (the first time) in TASK 16 breaks all scheduling + //if (i == 10000) { + // if (id % 2 == 1) { + // Guard::enter().vault().scheduler.kill(&apps[id - 1]); + // } + //} + //Guard::enter().vault().scheduler.resume(); + //if (id > 1) { + // Guarded g = Guard::enter(); + // g.vault().bellringer.sleep(g.vault(), id * id * 10); + //} } }