alarm task finished
This commit is contained in:
3
Makefile
3
Makefile
@@ -213,7 +213,8 @@ endif
|
|||||||
ifeq ($(LAB),traps)
|
ifeq ($(LAB),traps)
|
||||||
UPROGS += \
|
UPROGS += \
|
||||||
$U/_call\
|
$U/_call\
|
||||||
$U/_bttest
|
$U/_bttest\
|
||||||
|
$U/_alarmtest
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(LAB),lazy)
|
ifeq ($(LAB),lazy)
|
||||||
|
|||||||
@@ -132,6 +132,12 @@ found:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((p->pre_trapframe = (struct trapframe *)kalloc()) == 0){
|
||||||
|
freeproc(p);
|
||||||
|
release(&p->lock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// An empty user page table.
|
// An empty user page table.
|
||||||
p->pagetable = proc_pagetable(p);
|
p->pagetable = proc_pagetable(p);
|
||||||
if(p->pagetable == 0){
|
if(p->pagetable == 0){
|
||||||
@@ -160,6 +166,9 @@ freeproc(struct proc *p)
|
|||||||
p->trapframe = 0;
|
p->trapframe = 0;
|
||||||
if(p->pagetable)
|
if(p->pagetable)
|
||||||
proc_freepagetable(p->pagetable, p->sz);
|
proc_freepagetable(p->pagetable, p->sz);
|
||||||
|
if(p->pre_trapframe)
|
||||||
|
kfree((void*)p->pre_trapframe);
|
||||||
|
p->pre_trapframe = 0;
|
||||||
p->pagetable = 0;
|
p->pagetable = 0;
|
||||||
p->sz = 0;
|
p->sz = 0;
|
||||||
p->pid = 0;
|
p->pid = 0;
|
||||||
|
|||||||
@@ -104,4 +104,8 @@ struct proc {
|
|||||||
struct file *ofile[NOFILE]; // Open files
|
struct file *ofile[NOFILE]; // Open files
|
||||||
struct inode *cwd; // Current directory
|
struct inode *cwd; // Current directory
|
||||||
char name[16]; // Process name (debugging)
|
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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ extern uint64 sys_unlink(void);
|
|||||||
extern uint64 sys_link(void);
|
extern uint64 sys_link(void);
|
||||||
extern uint64 sys_mkdir(void);
|
extern uint64 sys_mkdir(void);
|
||||||
extern uint64 sys_close(void);
|
extern uint64 sys_close(void);
|
||||||
|
extern uint64 sys_sigalarm(void);
|
||||||
|
extern uint64 sys_sigreturn(void);
|
||||||
|
|
||||||
// An array mapping syscall numbers from syscall.h
|
// An array mapping syscall numbers from syscall.h
|
||||||
// to the function that handles the system call.
|
// to the function that handles the system call.
|
||||||
@@ -126,6 +128,8 @@ static uint64 (*syscalls[])(void) = {
|
|||||||
[SYS_link] sys_link,
|
[SYS_link] sys_link,
|
||||||
[SYS_mkdir] sys_mkdir,
|
[SYS_mkdir] sys_mkdir,
|
||||||
[SYS_close] sys_close,
|
[SYS_close] sys_close,
|
||||||
|
[SYS_sigalarm] sys_sigalarm,
|
||||||
|
[SYS_sigreturn] sys_sigreturn,
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -20,3 +20,5 @@
|
|||||||
#define SYS_link 19
|
#define SYS_link 19
|
||||||
#define SYS_mkdir 20
|
#define SYS_mkdir 20
|
||||||
#define SYS_close 21
|
#define SYS_close 21
|
||||||
|
#define SYS_sigalarm 22
|
||||||
|
#define SYS_sigreturn 23
|
||||||
|
|||||||
@@ -93,3 +93,28 @@ sys_uptime(void)
|
|||||||
release(&tickslock);
|
release(&tickslock);
|
||||||
return xticks;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -77,8 +77,15 @@ usertrap(void)
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
|
|
||||||
// give up the CPU if this is a timer interrupt.
|
// give up the CPU if this is a timer interrupt.
|
||||||
if(which_dev == 2)
|
if(which_dev == 2){
|
||||||
yield();
|
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();
|
usertrapret();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ int getpid(void);
|
|||||||
char* sbrk(int);
|
char* sbrk(int);
|
||||||
int sleep(int);
|
int sleep(int);
|
||||||
int uptime(void);
|
int uptime(void);
|
||||||
|
int sigalarm(int, void(*)());
|
||||||
|
int sigreturn(void);
|
||||||
|
|
||||||
// ulib.c
|
// ulib.c
|
||||||
int stat(const char*, struct stat*);
|
int stat(const char*, struct stat*);
|
||||||
|
|||||||
@@ -36,3 +36,5 @@ entry("getpid");
|
|||||||
entry("sbrk");
|
entry("sbrk");
|
||||||
entry("sleep");
|
entry("sleep");
|
||||||
entry("uptime");
|
entry("uptime");
|
||||||
|
entry("sigalarm");
|
||||||
|
entry("sigreturn");
|
||||||
|
|||||||
Reference in New Issue
Block a user