diff options
| -rw-r--r-- | trapasm.S | 37 | 
1 files changed, 21 insertions, 16 deletions
@@ -1,33 +1,38 @@  .text  .globl trap  .globl trapret1 -  .globl alltraps + +.set SEG_KDATA_SEL  0x10   # selector for SEG_KDATA + +  # vectors.S sends all traps here.  alltraps: -  /* vectors.S sends all traps here */ -  pushl   %ds      # build -  pushl   %es      #  trap -  pushal           #  frame -  movl $16,%eax    # SEG_KDATA << 3 -  movw %ax,%ds     #  kernel -  movw %ax,%es     #  segments -  pushl %esp       # pass pointer to this trapframe -  call    trap     #  and call trap() +  # Build trap frame. +  pushl %ds +  pushl %es +  pushal +   +  # Set up data segments. +  movl $SEG_KDATA_SEL, %eax +  movw %ax,%ds +  movw %ax,%es + +  # Call trap(tf), where tf=%esp +  pushl %esp +  call trap    addl $4, %esp -  # return falls through to trapret... -  /* -   * a forked process RETs here -   * expects ESP to point to a Trapframe -   */ +  # Return falls through to trapret...  .globl trapret  trapret:    popal    popl %es    popl %ds -  addl $0x8, %esp /* trapno and errcode */ +  addl $0x8, %esp  # trapno and errcode    iret +  # A forked process switches to user mode by calling +  # forkret1(tf), where tf is the trap frame to use.  .globl forkret1  forkret1:    movl 4(%esp), %esp  | 
