137 lines
2.3 KiB
C
137 lines
2.3 KiB
C
#include "types.h"
|
||
#include "riscv.h"
|
||
#include "defs.h"
|
||
#include "param.h"
|
||
#include "memlayout.h"
|
||
#include "spinlock.h"
|
||
#include "proc.h"
|
||
|
||
uint64
|
||
sys_exit(void)
|
||
{
|
||
int n;
|
||
argint(0, &n);
|
||
exit(n);
|
||
return 0; // not reached
|
||
}
|
||
|
||
uint64
|
||
sys_getpid(void)
|
||
{
|
||
return myproc()->pid;
|
||
}
|
||
|
||
uint64
|
||
sys_fork(void)
|
||
{
|
||
return fork();
|
||
}
|
||
|
||
uint64
|
||
sys_wait(void)
|
||
{
|
||
uint64 p;
|
||
argaddr(0, &p);
|
||
return wait(p);
|
||
}
|
||
|
||
uint64
|
||
sys_sbrk(void)
|
||
{
|
||
uint64 addr;
|
||
int n;
|
||
|
||
argint(0, &n);
|
||
addr = myproc()->sz;
|
||
if(growproc(n) < 0)
|
||
return -1;
|
||
return addr;
|
||
}
|
||
|
||
uint64
|
||
sys_sleep(void)
|
||
{
|
||
int n;
|
||
uint ticks0;
|
||
|
||
backtrace();
|
||
|
||
argint(0, &n);
|
||
if(n < 0)
|
||
n = 0;
|
||
acquire(&tickslock);
|
||
ticks0 = ticks;
|
||
while(ticks - ticks0 < n){
|
||
if(killed(myproc())){
|
||
release(&tickslock);
|
||
return -1;
|
||
}
|
||
sleep(&ticks, &tickslock);
|
||
}
|
||
release(&tickslock);
|
||
return 0;
|
||
}
|
||
|
||
uint64
|
||
sys_kill(void)
|
||
{
|
||
int pid;
|
||
|
||
argint(0, &pid);
|
||
return kill(pid);
|
||
}
|
||
|
||
// return how many clock tick interrupts have occurred
|
||
// since start.
|
||
uint64
|
||
sys_uptime(void)
|
||
{
|
||
uint xticks;
|
||
|
||
acquire(&tickslock);
|
||
xticks = ticks;
|
||
release(&tickslock);
|
||
return xticks;
|
||
}
|
||
|
||
// sys_sigalarm函数用于设置进程的定时信号处理机制。
|
||
// 参数:
|
||
// alarm_cnt:定时器计数值,表示每经过alarm_cnt个时钟中断后触发一次信号处理。
|
||
// addr:信号处理函数的用户空间地址。
|
||
// 实现:
|
||
// 1. 通过argint和argaddr获取用户传入的参数。
|
||
// 2. 将进程的inter_cnt(中断计数器)清零。
|
||
// 3. 保存信号处理函数地址和定时器计数值到进程结构体。
|
||
// 4. 返回0,表示设置成功。
|
||
|
||
// sys_sigreturn函数用于在信号处理函数执行完毕后恢复进程的上下文。
|
||
// 实现:
|
||
// 1. 获取当前进程指针。
|
||
// 2. 将trapframe恢复为信号处理前保存的pre_trapframe,恢复进程上下文。
|
||
// 3. 将inter_cnt(中断计数器)清零,重新计数。
|
||
// 4. 返回信号处理前a0寄存器的值,作为系统调用的返回值。
|
||
uint64
|
||
sys_sigalarm(void)
|
||
{
|
||
int alarm_cnt;
|
||
uint64 addr;
|
||
struct proc *p = myproc();
|
||
argint(0, &alarm_cnt);
|
||
argaddr(1, &addr);
|
||
|
||
p->inter_cnt = 0;
|
||
p->handler = addr;
|
||
p->alarm_cnt = alarm_cnt;
|
||
|
||
return 0;
|
||
}
|
||
|
||
uint64
|
||
sys_sigreturn(void)
|
||
{
|
||
struct proc* p = myproc();
|
||
*p->trapframe = *p->pre_trapframe;
|
||
p->inter_cnt = 0;
|
||
return p->pre_trapframe->a0;
|
||
}
|