diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-12-01 21:49:22 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-12-01 21:49:22 +0100 |
| commit | d8331335ff1720ce28eba45afe1a02814b38b033 (patch) | |
| tree | f671279d258477321699d158765f576512851e3a /asm | |
| parent | 100be313c22bd6116b1adc5eb30f5db56f4b0772 (diff) | |
finally implemented fork() syscall
Diffstat (limited to 'asm')
| -rw-r--r-- | asm/int_clock_handler.asm | 44 | ||||
| -rw-r--r-- | asm/int_syscall_handler.asm | 38 |
2 files changed, 50 insertions, 32 deletions
diff --git a/asm/int_clock_handler.asm b/asm/int_clock_handler.asm index 627e432..6301dc6 100644 --- a/asm/int_clock_handler.asm +++ b/asm/int_clock_handler.asm @@ -1,45 +1,25 @@ global int_clock_handler [extern task_switch_next] - [bits 32] -int_clock_handler: - - cli - - ;Notice there is no IRQ number or error code - we don't need them - -; inc byte [CLOCK_COUNTER] - -; cmp byte [CLOCK_COUNTER], 0x2 -; jne skip_clock - -; mov byte [CLOCK_COUNTER], 0x00 +int_clock_handler: +cli pusha ;Push all standard registers - mov eax, esp - mov esp,0x1000 ;put the stack outside of virtual memory in kernel space! - push eax ;Push pointer to all the stuff we just pushed - call task_switch_next ;Call C code - - ;pop ebx +mov eax, esp ;save current stack pointer in esp +mov esp, 0x1000 ;now put the stack outside of virtual memory in kernel space! - ;compare: - ;cmp eax,ebx - ;jne compare - - mov esp, eax ;Replace the stack with what the C code gave us +push eax ;Push pointer to all the stuff we just pushed +call task_switch_next ;Call C code +mov esp, eax ;Replace the stack with what the C code gave us -; skip_clock: - mov al, 0x20 ;Port number AND command number to Acknowledge IRQ - out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts +mov al, 0x20 ;Port number AND command number to Acknowledge IRQ +out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts - popa ;Put the standard registers back +popa ;Put the standard registers back +sti - ;We didn't push an error code or IRQ number, so we don't have to edit esp now - sti - - iretd ;Interrupt-Return +iretd ;Interrupt-Return diff --git a/asm/int_syscall_handler.asm b/asm/int_syscall_handler.asm index 50202d3..89f152b 100644 --- a/asm/int_syscall_handler.asm +++ b/asm/int_syscall_handler.asm @@ -1,4 +1,5 @@ global int_syscall_handler +[extern task_fork] [extern syscall_exit] [extern syscall_write] @@ -13,11 +14,18 @@ global int_syscall_handler [extern syscall_sbrk] [extern syscall_stat] [extern syscall_lstat] +[extern syscall_fork] [extern syscall_unhandled] [bits 32] + +pid: dd 0x0 + int_syscall_handler: +cmp eax, 72 +je call_fork + cli push ebx @@ -63,6 +71,7 @@ int_syscall_handler: cmp eax, 79 je call_lstat + push eax jmp call_unhandled @@ -89,6 +98,34 @@ done_blocking: iret ;Interrupt-Return +call_fork: + + cli + + pusha ;Push all standard registers + + mov ebx, esp ;save current stack pointer in esp + mov esp, 0x7000 ;now put the stack outside of virtual memory in kernel space! + + push ebx ;Push pointer to all the stuff we just pushed + call task_fork ;Call C code + mov [pid],eax + + mov esp, ebx ;Replace the stack with what the C code gave us + + mov al, 0x20 ;Port number AND command number to Acknowledge IRQ + out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts + + + popa ;Put the standard registers back + + mov ebx,[pid] + + sti + + iretd ;Interrupt-Return + ;;;; + call_stat: call syscall_stat jmp done @@ -139,6 +176,7 @@ call_unhandled: ;;; THIS CALLS NEED REENABLE INTERRUPTS BEFORE calling workers + ;; TODO: redesign this shit! call_read: mov al, 0x20 ;Port number AND command number to Acknowledge IRQ |
