syscall.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <asm/port_io.h>
  2. #include <kernel/syscall.hpp>
  3. #include <kernel/process.hpp>
  4. #include <kernel/tty.h>
  5. syscall_handler syscall_handlers[8];
  6. void _syscall_not_impl(interrupt_stack* data)
  7. {
  8. data->s_regs.eax = 0xffffffff;
  9. data->s_regs.edx = 0xffffffff;
  10. }
  11. void _syscall_fork(interrupt_stack* data)
  12. {
  13. thread_context_save(data, current_thread);
  14. process_context_save(data, current_process);
  15. process new_proc(*current_process, *current_thread);
  16. thread* new_thd = new_proc.thds.begin().ptr();
  17. // return value
  18. new_thd->regs.eax = 0;
  19. data->s_regs.eax = new_proc.pid;
  20. new_thd->regs.edx = 0;
  21. data->s_regs.edx = 0;
  22. add_to_process_list(types::move(new_proc));
  23. add_to_ready_list(new_thd);
  24. }
  25. void _syscall_write(interrupt_stack* data)
  26. {
  27. tty_print(console, reinterpret_cast<const char*>(data->s_regs.edi));
  28. data->s_regs.eax = 0;
  29. data->s_regs.edx = 0;
  30. }
  31. void _syscall_sleep(interrupt_stack* data)
  32. {
  33. current_thread->attr.ready = 0;
  34. current_thread->attr.wait = 1;
  35. data->s_regs.eax = 0;
  36. data->s_regs.edx = 0;
  37. do_scheduling(data);
  38. }
  39. void init_syscall(void)
  40. {
  41. syscall_handlers[0] = _syscall_fork;
  42. syscall_handlers[1] = _syscall_write;
  43. syscall_handlers[2] = _syscall_sleep;
  44. syscall_handlers[3] = _syscall_not_impl;
  45. syscall_handlers[4] = _syscall_not_impl;
  46. syscall_handlers[5] = _syscall_not_impl;
  47. syscall_handlers[6] = _syscall_not_impl;
  48. syscall_handlers[7] = _syscall_not_impl;
  49. }