alarm task finished

This commit is contained in:
2025-06-18 16:02:24 +08:00
parent 4c08583743
commit c7c962ffef
10 changed files with 60 additions and 3 deletions

View File

@ -213,7 +213,8 @@ endif
ifeq ($(LAB),traps)
UPROGS += \
$U/_call\
$U/_bttest
$U/_bttest\
$U/_alarmtest
endif
ifeq ($(LAB),lazy)

View File

@ -132,6 +132,12 @@ found:
return 0;
}
if((p->pre_trapframe = (struct trapframe *)kalloc()) == 0){
freeproc(p);
release(&p->lock);
return 0;
}
// An empty user page table.
p->pagetable = proc_pagetable(p);
if(p->pagetable == 0){
@ -160,6 +166,9 @@ freeproc(struct proc *p)
p->trapframe = 0;
if(p->pagetable)
proc_freepagetable(p->pagetable, p->sz);
if(p->pre_trapframe)
kfree((void*)p->pre_trapframe);
p->pre_trapframe = 0;
p->pagetable = 0;
p->sz = 0;
p->pid = 0;

View File

@ -104,4 +104,8 @@ struct proc {
struct file *ofile[NOFILE]; // Open files
struct inode *cwd; // Current directory
char name[16]; // Process name (debugging)
int alarm_cnt; // Alarm count
int inter_cnt; // interrupts count
uint64 handler; // alarm func address
struct trapframe *pre_trapframe;
};

View File

@ -101,6 +101,8 @@ extern uint64 sys_unlink(void);
extern uint64 sys_link(void);
extern uint64 sys_mkdir(void);
extern uint64 sys_close(void);
extern uint64 sys_sigalarm(void);
extern uint64 sys_sigreturn(void);
// An array mapping syscall numbers from syscall.h
// to the function that handles the system call.
@ -126,6 +128,8 @@ static uint64 (*syscalls[])(void) = {
[SYS_link] sys_link,
[SYS_mkdir] sys_mkdir,
[SYS_close] sys_close,
[SYS_sigalarm] sys_sigalarm,
[SYS_sigreturn] sys_sigreturn,
};
void

View File

@ -20,3 +20,5 @@
#define SYS_link 19
#define SYS_mkdir 20
#define SYS_close 21
#define SYS_sigalarm 22
#define SYS_sigreturn 23

View File

@ -93,3 +93,28 @@ sys_uptime(void)
release(&tickslock);
return xticks;
}
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;
}

View File

@ -77,8 +77,15 @@ usertrap(void)
exit(-1);
// give up the CPU if this is a timer interrupt.
if(which_dev == 2)
yield();
if(which_dev == 2){
p->inter_cnt++;
if (p->inter_cnt == p->alarm_cnt && 0 < p->alarm_cnt) {
*p->pre_trapframe = *p->trapframe;
p->trapframe->epc = p->handler;
} else {
yield();
}
}
usertrapret();
}

1
time.txt Normal file
View File

@ -0,0 +1 @@
8

View File

@ -22,6 +22,8 @@ int getpid(void);
char* sbrk(int);
int sleep(int);
int uptime(void);
int sigalarm(int, void(*)());
int sigreturn(void);
// ulib.c
int stat(const char*, struct stat*);

View File

@ -36,3 +36,5 @@ entry("getpid");
entry("sbrk");
entry("sleep");
entry("uptime");
entry("sigalarm");
entry("sigreturn");