Skip to content

Commit

Permalink
syscall sleep works now, pic bug still existing
Browse files Browse the repository at this point in the history
* modified some comment
* reinit pic(pic_init) to avoid this bug...
  • Loading branch information
SilverRainZ committed Sep 9, 2015
1 parent c3c8cc7 commit e42e99b
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 15 deletions.
1 change: 1 addition & 0 deletions inc/proc.h
Expand Up @@ -55,6 +55,7 @@ void sched();
int fork();
int wait();
void sleep(void *chan);
void wakeup(void *chan);
int kill(uint8_t pid);
void exit();

Expand Down
5 changes: 2 additions & 3 deletions kern/syscall.c
Expand Up @@ -78,7 +78,7 @@ int fetchstr(uint32_t addr, char **pp){
}

int argint(int n, int *ip){
// TODO why diff wiht xv6?
// TODO
return fetchint(proc->fm->user_esp + 4*n, ip);
}

Expand Down Expand Up @@ -111,7 +111,7 @@ int argptr(int n, char **pp, int size){
}

int sys_none(){
return 1;
return -1;
}

void sys_init(){
Expand All @@ -122,7 +122,6 @@ void syscall(){
int cn;

printl("syscall: number: %d, form ring@%d\n", proc->fm->eax, proc->fm->cs&0x3);
printl("syscall: stack pointer: 0x%x\n", proc->fm->user_esp);

cn = proc->fm->eax;

Expand Down
3 changes: 3 additions & 0 deletions kern/timer.c
Expand Up @@ -32,6 +32,9 @@ void timer_handler(struct int_frame *r){
/* trigger when every 18 clocks (approximately 1 second) */

timer_ticks++;

wakeup(&timer_ticks);

if (!proc) return;

if (timer_ticks % 100 == 0){
Expand Down
11 changes: 7 additions & 4 deletions proc/init.asm
Expand Up @@ -7,20 +7,23 @@ align 4
[global __init_start]
__init_start:
nop ; hava a rest~
; push 233
; push (msg_arg1 - $$) + 0xc0000000
push 233
push (msg_arg1 - $$) + 0xc0000000
mov eax, 1
int 0x80
cmp eax, 0
cmp eax, 0 ; fork test
jz child
jmp $
child:
mov eax, 1
mov eax, 1 ; fork again
int 0x80
cmp eax, 0
jz child2
jmp $
child2:
push 1000
mov eax, 13
int 0x80
jmp $

msg_arg1:
Expand Down
20 changes: 12 additions & 8 deletions proc/proc.c
Expand Up @@ -32,8 +32,8 @@ struct proc *proc = NULL;

/* import pic_init(), only use in fork_ret */
extern void pic_init();
/* do not ask me why use irq_remap here, irq didn't work after fork()
* and I don't know why, and have to reinit it
/* do not ask me why call pic_init here, irq didn't work after fork()
* I have to reinit it
* thx to fleuria
*/
void fork_ret(){
Expand Down Expand Up @@ -92,7 +92,7 @@ static struct proc *proc_alloc(){
return pp;
}
}
return NULL;
return 0;
}

void proc_init(){
Expand Down Expand Up @@ -155,25 +155,29 @@ void scheduler(){
if (pp->state != P_RUNABLE){
continue;
}

printl("scheduler: proc `%s`(PID: %d) will run\n", pp->name, pp->pid);
// printl("scheduler: switch pgdir & set tss\n");

printl("scheduler: switch pgdir & set tss\n");
uvm_switch(pp);
pp->state = P_RUNNING;

proc = pp;

printl(">>>> context switch\n");
context_switch(&cpu_context, pp->context);
printl("<<<< return form proc `%s`\n", pp->name);
printl("<<<< return form proc `%s`(PID: %d)\n", pp->name, pp->pid);
}
}
}

void sched(){
assert(proc->state != P_RUNABLE, "sched: no runable")

proc->state = P_RUNABLE;
if (proc->state == P_RUNNING){
proc->state = P_RUNABLE;
}

context_switch(&proc->context, cpu_context);
}

Expand All @@ -188,6 +192,8 @@ void sleep(void *chan){

// wake up
proc->chan = 0;

printl("sleep: proc `%s`(PID: %d) is trying to wakeup...\n", proc->name, proc->pid);
}

void wakeup(void *chan){
Expand Down Expand Up @@ -253,8 +259,6 @@ void exit(){
iput(proc->cwd);
proc->cwd = 0;

wakeup(proc->parent);

for (pp = ptable; pp < &proc[NPROC]; pp++){
pp->parent = initproc;
if (pp->state == P_ZOMBIE){
Expand Down
31 changes: 31 additions & 0 deletions proc/sysproc.c
@@ -1,7 +1,10 @@
#define __LOG_ON 1
// std
#include <type.h>
#include <timer.h>
#include <syscall.h>
// libs
#include <printk.h>
// proc
#include <proc.h>
#include <sysproc.h>
Expand All @@ -25,14 +28,42 @@ int sys_kill(){
if (argint(0, &pid) < 0){
return -1;
}

printl("sys_kill: param: pid = %d\n", pid);
return kill(pid);
}

int sys_getpid(){
return proc->pid;
}

extern void pic_init();

int sys_sleep(){
int n, trick0;

printl("sys_sleep: proc `%s`(PID: %d)\n", proc->name, proc->pid);
if (argint(0, &n) < 0){
return -1;
}

printl("sys_sleep: sleep for %d0ms\n", n);

trick0 = timer_ticks;
while ((int)timer_ticks - trick0 < n){

printl("sys_sleep: proc `%s`(PID: %d) is still sleeping...\n", proc->name, proc->pid);

if (proc->killed){
return -1;
}
sleep(&timer_ticks);
}

printl("sys_sleep: proc `%s`(PID: %d) weakup, acutal time: %d0ms\n", proc->name, proc->pid, timer_ticks - trick0);

// yes, we call pic_init again... :(
pic_init();
return 0;
}

Expand Down

0 comments on commit e42e99b

Please sign in to comment.