summaryrefslogtreecommitdiff
path: root/trapasm.S
diff options
context:
space:
mode:
Diffstat (limited to 'trapasm.S')
-rw-r--r--trapasm.S132
1 files changed, 0 insertions, 132 deletions
diff --git a/trapasm.S b/trapasm.S
deleted file mode 100644
index 6b6b567..0000000
--- a/trapasm.S
+++ /dev/null
@@ -1,132 +0,0 @@
-#include "param.h"
-#include "x86.h"
-#include "mmu.h"
-
-# the offset of cs in trapframe (i.e., tf->cs - tf)
-#define CSOFF 144
-
-# vectors.S sends all traps here.
-.globl alltraps
-alltraps:
- # Build trap frame.
- push %r15
- push %r14
- push %r13
- push %r12
- push %r11
- push %r10
- push %r9
- push %r8
- push %rdi
- push %rsi
- push %rbp
- push %rdx
- push %rcx
- push %rbx
- push %rax
-
- cmpw $SEG_KCODE, CSOFF(%rsp) # compare to saved cs
- jz 1f
- swapgs
-
-1:mov %rsp, %rdi # frame in arg1
- call trap
-
-# Return falls through to trapret...
-.globl trapret
-trapret:
- cli
- cmpw $SEG_KCODE, CSOFF(%rsp) # compare to saved cs
- jz 1f
- swapgs
-
-1:pop %rax
- pop %rbx
- pop %rcx
- pop %rdx
- pop %rbp
- pop %rsi
- pop %rdi
- pop %r8
- pop %r9
- pop %r10
- pop %r11
- pop %r12
- pop %r13
- pop %r14
- pop %r15
-
- add $16, %rsp # discard trapnum and errorcode
- iretq
-
-#PAGEBREAK!
-
-# syscall jumps here after syscall instruction
-.globl sysentry
-sysentry: # Build syscall frame.
- // load kernel stack address
- swapgs
- movq %rax, %gs:0 // save %rax in syscallno of cpu entry
- movq %rsp, %gs:8 // user sp
- movq %gs:16, %rax // proc entry
-
- movq %ss:0(%rax), %rax // load kstack from proc
- addq $(KSTACKSIZE), %rax
-
- movq %rax, %rsp
- movq %gs:0, %rax // restore rax
-
- push %gs:8
- push %rcx
- push %r11
- push %rax
-
- push %rbp
- push %rbx
- push %r12
- push %r13
- push %r14
- push %r15
-
- push %r9
- push %r8
- push %r10
- push %rdx
- push %rsi
- push %rdi
-
- mov %rsp, %rdi # frame in arg1
-
- call syscall
- # fall through to sysexit
-
-.globl sysexit
-sysexit:
- # to make sure we don't get any interrupts on the user stack while in
- # supervisor mode. insufficient? (see vunerability reports for sysret)
- cli
-
- pop %rdi
- pop %rsi
- pop %rdx
- pop %r10
- pop %r8
- pop %r9
-
- pop %r15
- pop %r14
- pop %r13
- pop %r12
- pop %rbx
- pop %rbp
-
- pop %rax
- pop %r11
- pop %rcx
-
- mov (%rsp),%rsp # switch to the user stack
- # there are two more values on the stack, but we don't care about them
- swapgs
-
- sysretq
-