ptos/amd64+ke: Add system call groundwork + exit syscall
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: System calls
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PTAPI_SYSCALL_H_
|
||||||
|
#define _PTAPI_SYSCALL_H_ 1
|
||||||
|
|
||||||
|
#define SYS_NOP 0x00 /* Does nothing / reserved */
|
||||||
|
#define SYS_EXIT 0x01 /* Exit the current thread */
|
||||||
|
#define _SYSCALL_MAX 0x02 /* Always bump when adding new system call */
|
||||||
|
|
||||||
|
#endif /* !_PTAPI_SYSCALL_H_ */
|
||||||
@@ -38,6 +38,7 @@ InitInterrupts(VOID)
|
|||||||
MdIdtSetGate(0x0C, (UPTR)TrapStackSegmentFault, IDT_TRAP_GATE, 0);
|
MdIdtSetGate(0x0C, (UPTR)TrapStackSegmentFault, IDT_TRAP_GATE, 0);
|
||||||
MdIdtSetGate(0x0D, (UPTR)TrapGeneralProtection, IDT_TRAP_GATE, 0);
|
MdIdtSetGate(0x0D, (UPTR)TrapGeneralProtection, IDT_TRAP_GATE, 0);
|
||||||
MdIdtSetGate(0x0E, (UPTR)TrapPageFault, IDT_TRAP_GATE, 0);
|
MdIdtSetGate(0x0E, (UPTR)TrapPageFault, IDT_TRAP_GATE, 0);
|
||||||
|
MdIdtSetGate(0x2E, (UPTR)TrapLegacySyscall, IDT_USER_GATE, 0);
|
||||||
MdIdtLoad();
|
MdIdtLoad();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -151,3 +151,10 @@ LapicTmrIsr:
|
|||||||
call HalContextSwitch
|
call HalContextSwitch
|
||||||
call MdLapicSendEoi
|
call MdLapicSendEoi
|
||||||
INTR_EXIT()
|
INTR_EXIT()
|
||||||
|
|
||||||
|
.globl TrapLegacySyscall
|
||||||
|
TrapLegacySyscall:
|
||||||
|
INTR_ENTRY($0x2C)
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call MdSyscallDispatch
|
||||||
|
INTR_EXIT()
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: System call dispatch
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ke/syscall.h>
|
||||||
|
#include <machine/frame.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dispatch incoming system calls
|
||||||
|
*
|
||||||
|
* @Frame: Trapframe snapshot
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
MdSyscallDispatch(TRAP_FRAME *Frame)
|
||||||
|
{
|
||||||
|
SYSCALL_ARGS ScArgs;
|
||||||
|
|
||||||
|
if (Frame == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is this system call number valid? */
|
||||||
|
if (Frame->Rax == 0 || Frame->Rax >= _SYSCALL_MAX) {
|
||||||
|
Frame->Rax = STATUS_INVALID_PARAM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScArgs.Arg[0] = Frame->Rdi;
|
||||||
|
ScArgs.Arg[1] = Frame->Rsi;
|
||||||
|
ScArgs.Arg[2] = Frame->Rdx;
|
||||||
|
ScArgs.Arg[3] = Frame->Rcx;
|
||||||
|
ScArgs.Arg[4] = Frame->R8;
|
||||||
|
ScArgs.Arg[5] = Frame->R9;
|
||||||
|
SystemCallTable[Frame->Rax](&ScArgs);
|
||||||
|
}
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
#define TRAP_STACK_SEG_FAULT 0x0C
|
#define TRAP_STACK_SEG_FAULT 0x0C
|
||||||
#define TRAP_GENERAL_PROTECTION 0x0D
|
#define TRAP_GENERAL_PROTECTION 0x0D
|
||||||
#define TRAP_PAGE_FAULT 0x0E
|
#define TRAP_PAGE_FAULT 0x0E
|
||||||
|
#define TRAP_SYSCALL 0x2E
|
||||||
|
|
||||||
/* Prototypes of trap functions */
|
/* Prototypes of trap functions */
|
||||||
VOID TrapDivError(VOID);
|
VOID TrapDivError(VOID);
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: System calls
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _KE_SYSCALL_H_
|
||||||
|
#define _KE_SYSCALL_H_ 1
|
||||||
|
|
||||||
|
#include <ptapi/status.h>
|
||||||
|
#include <ptapi/syscall.h>
|
||||||
|
#include <ptdef.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* System call arguments passed to system call handlers
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
UQUAD Arg[6];
|
||||||
|
} SYSCALL_ARGS;
|
||||||
|
|
||||||
|
extern PT_STATUS(*SystemCallTable[_SYSCALL_MAX])(SYSCALL_ARGS *Args);
|
||||||
|
|
||||||
|
#endif /* !_KE_SYSCALL_H_ */
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Process related user-API
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PS_UAPI_H_
|
||||||
|
#define _PS_UAPI_H_ 1
|
||||||
|
|
||||||
|
#include <ps/thread.h>
|
||||||
|
#include <ke/syscall.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Exit the current thread:
|
||||||
|
*
|
||||||
|
* @ARG[0]: Exit status code
|
||||||
|
*/
|
||||||
|
PT_STATUS PsSysThreadExit(SYSCALL_ARGS *Args);
|
||||||
|
|
||||||
|
#endif /* !_PS_UAPI_H_ */
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: System calls
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ptdef.h>
|
||||||
|
#include <ke/syscall.h>
|
||||||
|
#include <ps/uapi.h>
|
||||||
|
|
||||||
|
/* System call table */
|
||||||
|
PT_STATUS(*SystemCallTable[_SYSCALL_MAX])(SYSCALL_ARGS *Args) = {
|
||||||
|
[SYS_EXIT] = PsSysThreadExit
|
||||||
|
};
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Thread related user-API
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ps/uapi.h>
|
||||||
|
#include <ps/thread.h>
|
||||||
|
|
||||||
|
#include <ex/trace.h>
|
||||||
|
|
||||||
|
PT_STATUS
|
||||||
|
PsSysThreadExit(SYSCALL_ARGS *Args)
|
||||||
|
{
|
||||||
|
PsExitThread(Args->Arg[0]);
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user