Advertisement
Guest User

Untitled

a guest
Feb 9th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. /*
  2. * Register setup:
  3. * rax system call number
  4. * rdi arg0
  5. * rcx return address for syscall/sysret, C arg3
  6. * rsi arg1
  7. * rdx arg2
  8. * r10 arg3 (--> moved to rcx for C)
  9. * r8 arg4
  10. * r9 arg5
  11. * r11 eflags for syscall/sysret, temporary for C
  12. * r12-r15,rbp,rbx saved by C code, not touched.
  13. *
  14. * Interrupts are off on entry.
  15. * Only called from user space.
  16. *
  17. * XXX if we had a free scratch register we could save the RSP into the stack frame
  18. * and report it properly in ps. Unfortunately we haven't.
  19. *
  20. * When user can change the frames always force IRET. That is because
  21. * it deals with uncanonical addresses better. SYSRET has trouble
  22. * with them due to bugs in both AMD and Intel CPUs.
  23. */
  24.  
  25. ENTRY(system_call)
  26. SWAPGS_UNSAFE_STACK
  27. GLOBAL(system_call_after_swapgs)
  28. movq %rsp,PER_CPU_VAR(old_rsp)
  29. movq PER_CPU_VAR(kernel_stack),%rsp
  30. ENABLE_INTERRUPTS(CLBR_NONE)
  31. SAVE_ARGS 8,0
  32. movq %rax,ORIG_RAX-ARGOFFSET(%rsp)
  33. movq %rcx,RIP-ARGOFFSET(%rsp)
  34. testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
  35. jnz tracesys
  36. system_call_fastpath:
  37. cmpq $__NR_syscall_max,%rax
  38. ja badsys
  39. movq %r10,%rcx
  40. call *sys_call_table(,%rax,8) # XXX: rip relative
  41. movq %rax,RAX-ARGOFFSET(%rsp)
  42. /*
  43. * Syscall return path ending with SYSRET (fast path)
  44. * Has incomplete stack frame and undefined top of stack.
  45. */
  46. ret_from_sys_call:
  47. movl $_TIF_ALLWORK_MASK,%edi
  48. /* edi: flagmask */
  49. sysret_check:
  50. DISABLE_INTERRUPTS(CLBR_NONE)
  51. movl TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET),%edx
  52. andl %edi,%edx
  53. jnz sysret_careful
  54. /* * sysretq will re-enable interrupts: */
  55. movq RIP-ARGOFFSET(%rsp),%rcx
  56. RESTORE_ARGS 1,-ARG_SKIP,0
  57. movq PER_CPU_VAR(old_rsp), %rsp
  58. /* USERGS_SYSRET64 */
  59. swapgs
  60. sysretq
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement