diff --git a/trapasm.S b/trapasm.S index 6eaa57de8c07da472a0881415fc28d3ce6129e6e..ac964131cbea1e80702a81fc6b92c5306e8f4f7e 100644 --- a/trapasm.S +++ b/trapasm.S @@ -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