syscall test
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<size_t>(-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
|
||||
|
||||
@@ -6,5 +6,7 @@
|
||||
align 8
|
||||
sys_call:
|
||||
; BSB2 1 - Syscall stub
|
||||
int 0x80
|
||||
ret
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ namespace Syscall {
|
||||
*/
|
||||
enum class ID : size_t {
|
||||
TEST = 0,
|
||||
WRITE = 1,
|
||||
};
|
||||
} // namespace Syscall
|
||||
|
||||
|
||||
@@ -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);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user