|
|
- #include <memlayout.h>
-
- # vectors.S sends all traps here.
- .text
- .globl __alltraps
- __alltraps:
- # push registers to build a trap frame
- # therefore make the stack look like a struct trapframe
- pushl %ds
- pushl %es
- pushl %fs
- pushl %gs
- pushal
-
- # load GD_KDATA into %ds and %es to set up data segments for kernel
- movl $GD_KDATA, %eax
- movw %ax, %ds
- movw %ax, %es
-
- # push %esp to pass a pointer to the trapframe as an argument to trap()
- pushl %esp
-
- # call trap(tf), where tf=%esp
- call trap
-
- # pop the pushed stack pointer
- popl %esp
-
- # return falls through to trapret...
- .globl __trapret
- __trapret:
- # restore registers from stack
- popal
-
- # restore %ds, %es, %fs and %gs
- popl %gs
- popl %fs
- popl %es
- popl %ds
-
- # get rid of the trap number and error code
- addl $0x8, %esp
- iret
-
- .globl forkrets
- forkrets:
- # set stack to this new process's trapframe
- movl 4(%esp), %esp
- jmp __trapret
|