syscall.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 _syscall_crash(interrupt_stack*)
  40. {
  41. tty_print(console, "\nan error occurred while executing command\n");
  42. asm_cli();
  43. asm_hlt();
  44. }
  45. void init_syscall(void)
  46. {
  47. syscall_handlers[0] = _syscall_fork;
  48. syscall_handlers[1] = _syscall_write;
  49. syscall_handlers[2] = _syscall_sleep;
  50. syscall_handlers[3] = _syscall_crash;
  51. syscall_handlers[4] = _syscall_not_impl;
  52. syscall_handlers[5] = _syscall_not_impl;
  53. syscall_handlers[6] = _syscall_not_impl;
  54. syscall_handlers[7] = _syscall_not_impl;
  55. }