10 #include "sys/syscalls.h"
14 #include "sys/file_descriptors.h"
16 #include <sys/trigger.h>
18 syscall_fn_t* calls_table[NUM_CALLS] = {0};
28 if (regs.eax >= NUM_CALLS) {
29 qemu_err(
"Invalid system call: %d!", regs.eax);
31 __asm__
volatile(
"movl %0, %%eax" ::
"r"(0));
35 syscall_fn_t* entry_point = (syscall_fn_t*)calls_table[regs.eax];
37 regs.eax = entry_point(regs.ebx, regs.ecx, regs.edx);
41 __asm__
volatile(
"movl %0, %%eax" ::
"r"(regs.eax));
44 size_t syscall_env(
struct env* position) {
45 memcpy(position, &system_environment,
sizeof(
env_t));
50 size_t syscall_memory_alloc(
size_t size,
size_t align,
void** out) {
51 void* allocated = kcalloc(size, align);
58 size_t syscall_memory_realloc(
void* memory,
size_t size,
void** out) {
59 void* r = krealloc(memory, size);
66 size_t syscall_memory_free(
void* memory) {
72 size_t syscall_tty_write(
char* text) {
77 int syscall_trigger_reg(
int type,trigger_cmd_t handler){
79 qemu_warn(
"[SysCall] [Triggers] REG -> I:%x | T:%x",init, type);
83 size_t syscall_trigger_on(
int index){
84 qemu_warn(
"[SysCall] [Triggers] ON -> I:%x",index);
89 size_t syscall_trigger_off(
int index){
90 qemu_warn(
"[SysCall] [Triggers] OFF -> I:%x",index);
95 size_t syscall_trigger_del(
int index){
96 qemu_warn(
"[SysCall] [Triggers] Delete -> I:%x",index);
101 size_t syscall_getkey() {
105 size_t syscall_get_timer_ticks() {
109 size_t syscall_sleep(uint32_t millis) {
121 size_t syscall_exit(uint32_t status) {
124 qemu_log(
"Exit requested (status %d) by PID %d\n", status, proc->pid);
127 qemu_warn(
"Request cancelled because PID == 0");
143 calls_table[0] = (syscall_fn_t *)syscall_env;
144 calls_table[1] = (syscall_fn_t *)syscall_memory_alloc;
145 calls_table[2] = (syscall_fn_t *)syscall_memory_free;
146 calls_table[3] = (syscall_fn_t *)syscall_tty_write;
147 calls_table[4] = (syscall_fn_t *)file_descriptor_allocate;
148 calls_table[5] = (syscall_fn_t *)file_descriptor_read;
149 calls_table[6] = (syscall_fn_t *)file_descriptor_close;
150 calls_table[7] = (syscall_fn_t *)file_descriptor_seek;
151 calls_table[8] = (syscall_fn_t *)file_descriptor_tell;
152 calls_table[9] = (syscall_fn_t *)syscall_trigger_reg;
153 calls_table[10] = (syscall_fn_t *)syscall_trigger_on;
154 calls_table[11] = (syscall_fn_t *)syscall_trigger_off;
155 calls_table[12] = (syscall_fn_t *)syscall_trigger_del;
156 calls_table[13] = (syscall_fn_t *)syscall_getkey;
157 calls_table[14] = (syscall_fn_t *)syscall_get_timer_ticks;
158 calls_table[15] = (syscall_fn_t *)syscall_sleep;
159 calls_table[16] = (syscall_fn_t *)syscall_datetime;
160 calls_table[17] = (syscall_fn_t *)syscall_exit;
161 calls_table[18] = (syscall_fn_t *)syscall_memory_realloc;
162 calls_table[19] = (syscall_fn_t *)file_descriptor_write;
164 qemu_ok(
"System calls initialized!");
sayori_time_t get_time()
Считывает время и передает в удобной структуре
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
volatile process_t * get_current_proc(void)
Получить текущий обработчик процесса
size_t getTicks()
Получить количество тиков
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
void init_syscalls(void)
Инициализация системных вызовов
void syscall_handler(volatile registers_t regs)
Обработчик системных вызовов
void DeleteTrigger(int index)
Удаление триггера
void OffTrigger(int index)
Выключить триггер
void OnTrigger(int index)
Включить триггер
int RegTrigger(int type, trigger_cmd_t handler)
Регистрация триггера