[USER] System calls

This commit is contained in:
2016-12-06 15:50:35 +01:00
parent 63b3c3f2c0
commit a7d2b24a79
9 changed files with 166 additions and 2 deletions

View File

@@ -14,6 +14,7 @@
#define GS_OFFSET_CPU 0
#define GS_OFFSET_STATE 40
#define GS_OFFSET_STACK 48
#define GS_OFFSET_SCTEMP 56
#ifndef __ASSEMBLER__
#include <stdint.h>
@@ -31,6 +32,7 @@ typedef struct cpu_t
uint64_t is_bsp;
uint64_t current_state; // 40
void *kernel_stack; // 48
uint64_t syscall_temp; // 56
thread_t *current_thread;
thread_t *last_thread;
process_t *current_process;

View File

@@ -66,6 +66,7 @@
#define INT_APIC_ERROR 0x45
#define INT_APIC_SPUR 0xFF
#define INT_SYSCALL 0x80
#define RFLAGS_IOPL (3<<12)
#define RFLAGS_IOPL1 (1<<12)

41
kernel/include/syscall.h Normal file
View File

@@ -0,0 +1,41 @@
#pragma once
void syscall_init();
typedef long (*syscall_handler_t)(long num, long, long, long, long, long, long);
#define SYSCALL_DECL(name) \
long syscall_##name(long, long, long, long, long, long, long)
#define SYSCALL_DEF(name) \
long syscall_##name(long num, long _a1, long _a2, long _a3, long _a4, long _a5, long _a6)
#define _SYSCALL_INIT6(t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) \
(void)num; \
t1 n1 = (t1)_a1; \
(void)n1; \
t2 n2 = (t2)_a2; \
(void)n2; \
t3 n3 = (t3)_a3; \
(void)n3; \
t4 n4 = (t4)_a4; \
(void)n4; \
t5 n5 = (t5)_a5; \
(void)n5; \
t6 n6 = (t6)_a6; \
(void)n6;
#define _SYSCALL_INIT5(t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) _SYSCALL_INIT6(t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,long,__a6)
#define _SYSCALL_INIT4(t1,n1,t2,n2,t3,n3,t4,n4) _SYSCALL_INIT6(t1,n1,t2,n2,t3,n3,t4,n4,long,__a5,long,__a6)
#define _SYSCALL_INIT3(t1,n1,t2,n2,t3,n3) _SYSCALL_INIT6(t1,n1,t2,n2,t3,n3,long,__a4,long,__a5,long,__a6)
#define _SYSCALL_INIT2(t1,n1,t2,n2) _SYSCALL_INIT6(t1,n1,t2,n2,long,__a3,long,__a4,long,__a5,long,__a6)
#define _SYSCALL_INIT1(t1,n1) _SYSCALL_INIT6(t1,n1,long,__a2,long,__a3,long,__a4,long,__a5,long,__a6)
#define _SYSCALL_INIT0() _SYSCALL_INIT6(long,__a1,long,__a2,long,__a3,long,__a4,long,__a5,long,__a6)
#define __SYSCALL_NARGS(a0,b0,a1,b1,a2,b2,a3,b3,a4,b4,a5,b5,a6,n,...) n
#define _SYSCALL_NARGS(...) __SYSCALL_NARGS(__VA_ARGS__,6,6,5,5,4,4,3,3,2,2,1,1,0,0)
#define __SYSCALL_CONCAT(a,b) a##b
#define _SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT(a,b)
#define _SYSCALL_INIT(a,...) _SYSCALL_CONCAT(a, _SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
#define SYSCALL_INIT(...) _SYSCALL_INIT(_SYSCALL_INIT,__VA_ARGS__)
#define SYSCALL_REGISTER(name, num) syscall_handlers[num] = syscall_##name