entry.S 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. /*
  2. * linux/arch/x86_64/entry.S
  3. *
  4. * Copyright (C) 1991, 1992 Linus Torvalds
  5. * Copyright (C) 2000, 2001, 2002 Andi Kleen SuSE Labs
  6. * Copyright (C) 2000 Pavel Machek <pavel@suse.cz>
  7. *
  8. * $Id$
  9. */
  10. /*
  11. * entry.S contains the system-call and fault low-level handling routines.
  12. *
  13. * NOTE: This code handles signal-recognition, which happens every time
  14. * after an interrupt and after each system call.
  15. *
  16. * Normal syscalls and interrupts don't save a full stack frame, this is
  17. * only done for syscall tracing, signals or fork/exec et.al.
  18. *
  19. * A note on terminology:
  20. * - top of stack: Architecture defined interrupt frame from SS to RIP
  21. * at the top of the kernel process stack.
  22. * - partial stack frame: partially saved registers upto R11.
  23. * - full stack frame: Like partial stack frame, but all register saved.
  24. *
  25. * TODO:
  26. * - schedule it carefully for the final hardware.
  27. */
  28. #define ASSEMBLY 1
  29. #include <linux/config.h>
  30. #include <linux/linkage.h>
  31. #include <asm/segment.h>
  32. #include <asm/smp.h>
  33. #include <asm/cache.h>
  34. #include <asm/errno.h>
  35. #include <asm/dwarf2.h>
  36. #include <asm/calling.h>
  37. #include <asm/offset.h>
  38. #include <asm/msr.h>
  39. #include <asm/unistd.h>
  40. #include <asm/thread_info.h>
  41. #include <asm/hw_irq.h>
  42. .code64
  43. #ifdef CONFIG_PREEMPT
  44. #define preempt_stop cli
  45. #else
  46. #define preempt_stop
  47. #define retint_kernel retint_restore_args
  48. #endif
  49. /*
  50. * C code is not supposed to know about undefined top of stack. Every time
  51. * a C function with an pt_regs argument is called from the SYSCALL based
  52. * fast path FIXUP_TOP_OF_STACK is needed.
  53. * RESTORE_TOP_OF_STACK syncs the syscall state after any possible ptregs
  54. * manipulation.
  55. */
  56. /* %rsp:at FRAMEEND */
  57. .macro FIXUP_TOP_OF_STACK tmp
  58. movq %gs:pda_oldrsp,\tmp
  59. movq \tmp,RSP(%rsp)
  60. movq $__USER_DS,SS(%rsp)
  61. movq $__USER_CS,CS(%rsp)
  62. movq $-1,RCX(%rsp)
  63. movq R11(%rsp),\tmp /* get eflags */
  64. movq \tmp,EFLAGS(%rsp)
  65. .endm
  66. .macro RESTORE_TOP_OF_STACK tmp,offset=0
  67. movq RSP-\offset(%rsp),\tmp
  68. movq \tmp,%gs:pda_oldrsp
  69. movq EFLAGS-\offset(%rsp),\tmp
  70. movq \tmp,R11-\offset(%rsp)
  71. .endm
  72. .macro FAKE_STACK_FRAME child_rip
  73. /* push in order ss, rsp, eflags, cs, rip */
  74. xorq %rax, %rax
  75. pushq %rax /* ss */
  76. CFI_ADJUST_CFA_OFFSET 8
  77. pushq %rax /* rsp */
  78. CFI_ADJUST_CFA_OFFSET 8
  79. CFI_OFFSET rip,0
  80. pushq $(1<<9) /* eflags - interrupts on */
  81. CFI_ADJUST_CFA_OFFSET 8
  82. pushq $__KERNEL_CS /* cs */
  83. CFI_ADJUST_CFA_OFFSET 8
  84. pushq \child_rip /* rip */
  85. CFI_ADJUST_CFA_OFFSET 8
  86. CFI_OFFSET rip,0
  87. pushq %rax /* orig rax */
  88. CFI_ADJUST_CFA_OFFSET 8
  89. .endm
  90. .macro UNFAKE_STACK_FRAME
  91. addq $8*6, %rsp
  92. CFI_ADJUST_CFA_OFFSET -(6*8)
  93. .endm
  94. .macro CFI_DEFAULT_STACK
  95. CFI_ADJUST_CFA_OFFSET (SS)
  96. CFI_OFFSET r15,R15-SS
  97. CFI_OFFSET r14,R14-SS
  98. CFI_OFFSET r13,R13-SS
  99. CFI_OFFSET r12,R12-SS
  100. CFI_OFFSET rbp,RBP-SS
  101. CFI_OFFSET rbx,RBX-SS
  102. CFI_OFFSET r11,R11-SS
  103. CFI_OFFSET r10,R10-SS
  104. CFI_OFFSET r9,R9-SS
  105. CFI_OFFSET r8,R8-SS
  106. CFI_OFFSET rax,RAX-SS
  107. CFI_OFFSET rcx,RCX-SS
  108. CFI_OFFSET rdx,RDX-SS
  109. CFI_OFFSET rsi,RSI-SS
  110. CFI_OFFSET rdi,RDI-SS
  111. CFI_OFFSET rsp,RSP-SS
  112. CFI_OFFSET rip,RIP-SS
  113. .endm
  114. /*
  115. * A newly forked process directly context switches into this.
  116. */
  117. /* rdi: prev */
  118. ENTRY(ret_from_fork)
  119. CFI_STARTPROC
  120. CFI_DEFAULT_STACK
  121. call schedule_tail
  122. GET_THREAD_INFO(%rcx)
  123. testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%rcx)
  124. jnz rff_trace
  125. rff_action:
  126. RESTORE_REST
  127. testl $3,CS-ARGOFFSET(%rsp) # from kernel_thread?
  128. je int_ret_from_sys_call
  129. testl $_TIF_IA32,threadinfo_flags(%rcx)
  130. jnz int_ret_from_sys_call
  131. RESTORE_TOP_OF_STACK %rdi,ARGOFFSET
  132. jmp ret_from_sys_call
  133. rff_trace:
  134. movq %rsp,%rdi
  135. call syscall_trace_leave
  136. GET_THREAD_INFO(%rcx)
  137. jmp rff_action
  138. CFI_ENDPROC
  139. /*
  140. * System call entry. Upto 6 arguments in registers are supported.
  141. *
  142. * SYSCALL does not save anything on the stack and does not change the
  143. * stack pointer.
  144. */
  145. /*
  146. * Register setup:
  147. * rax system call number
  148. * rdi arg0
  149. * rcx return address for syscall/sysret, C arg3
  150. * rsi arg1
  151. * rdx arg2
  152. * r10 arg3 (--> moved to rcx for C)
  153. * r8 arg4
  154. * r9 arg5
  155. * r11 eflags for syscall/sysret, temporary for C
  156. * r12-r15,rbp,rbx saved by C code, not touched.
  157. *
  158. * Interrupts are off on entry.
  159. * Only called from user space.
  160. *
  161. * XXX if we had a free scratch register we could save the RSP into the stack frame
  162. * and report it properly in ps. Unfortunately we haven't.
  163. */
  164. ENTRY(system_call)
  165. CFI_STARTPROC
  166. swapgs
  167. movq %rsp,%gs:pda_oldrsp
  168. movq %gs:pda_kernelstack,%rsp
  169. sti
  170. SAVE_ARGS 8,1
  171. movq %rax,ORIG_RAX-ARGOFFSET(%rsp)
  172. movq %rcx,RIP-ARGOFFSET(%rsp)
  173. GET_THREAD_INFO(%rcx)
  174. testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%rcx)
  175. jnz tracesys
  176. cmpq $__NR_syscall_max,%rax
  177. ja badsys
  178. movq %r10,%rcx
  179. call *sys_call_table(,%rax,8) # XXX: rip relative
  180. movq %rax,RAX-ARGOFFSET(%rsp)
  181. /*
  182. * Syscall return path ending with SYSRET (fast path)
  183. * Has incomplete stack frame and undefined top of stack.
  184. */
  185. .globl ret_from_sys_call
  186. ret_from_sys_call:
  187. movl $_TIF_ALLWORK_MASK,%edi
  188. /* edi: flagmask */
  189. sysret_check:
  190. GET_THREAD_INFO(%rcx)
  191. cli
  192. movl threadinfo_flags(%rcx),%edx
  193. andl %edi,%edx
  194. jnz sysret_careful
  195. movq RIP-ARGOFFSET(%rsp),%rcx
  196. RESTORE_ARGS 0,-ARG_SKIP,1
  197. movq %gs:pda_oldrsp,%rsp
  198. swapgs
  199. sysretq
  200. /* Handle reschedules */
  201. /* edx: work, edi: workmask */
  202. sysret_careful:
  203. bt $TIF_NEED_RESCHED,%edx
  204. jnc sysret_signal
  205. sti
  206. pushq %rdi
  207. call schedule
  208. popq %rdi
  209. jmp sysret_check
  210. /* Handle a signal */
  211. /* edx: work flags (arg3) */
  212. sysret_signal:
  213. sti
  214. leaq do_notify_resume(%rip),%rax
  215. leaq -ARGOFFSET(%rsp),%rdi # &pt_regs -> arg1
  216. xorl %esi,%esi # oldset -> arg2
  217. call ptregscall_common
  218. jmp sysret_check
  219. /* Do syscall tracing */
  220. tracesys:
  221. SAVE_REST
  222. movq $-ENOSYS,RAX(%rsp)
  223. FIXUP_TOP_OF_STACK %rdi
  224. movq %rsp,%rdi
  225. call syscall_trace_enter
  226. LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */
  227. RESTORE_REST
  228. cmpq $__NR_syscall_max,%rax
  229. ja 1f
  230. movq %r10,%rcx /* fixup for C */
  231. call *sys_call_table(,%rax,8)
  232. movq %rax,RAX-ARGOFFSET(%rsp)
  233. 1: SAVE_REST
  234. movq %rsp,%rdi
  235. call syscall_trace_leave
  236. RESTORE_TOP_OF_STACK %rbx
  237. RESTORE_REST
  238. jmp ret_from_sys_call
  239. badsys:
  240. movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
  241. jmp ret_from_sys_call
  242. /*
  243. * Syscall return path ending with IRET.
  244. * Has correct top of stack, but partial stack frame.
  245. */
  246. ENTRY(int_ret_from_sys_call)
  247. cli
  248. testl $3,CS-ARGOFFSET(%rsp)
  249. je retint_restore_args
  250. movl $_TIF_ALLWORK_MASK,%edi
  251. /* edi: mask to check */
  252. int_with_check:
  253. GET_THREAD_INFO(%rcx)
  254. movl threadinfo_flags(%rcx),%edx
  255. andl %edi,%edx
  256. jnz int_careful
  257. jmp retint_swapgs
  258. /* Either reschedule or signal or syscall exit tracking needed. */
  259. /* First do a reschedule test. */
  260. /* edx: work, edi: workmask */
  261. int_careful:
  262. bt $TIF_NEED_RESCHED,%edx
  263. jnc int_very_careful
  264. sti
  265. pushq %rdi
  266. call schedule
  267. popq %rdi
  268. jmp int_with_check
  269. /* handle signals and tracing -- both require a full stack frame */
  270. int_very_careful:
  271. sti
  272. SAVE_REST
  273. /* Check for syscall exit trace */
  274. testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edx
  275. jz int_signal
  276. pushq %rdi
  277. leaq 8(%rsp),%rdi # &ptregs -> arg1
  278. call syscall_trace_leave
  279. popq %rdi
  280. andl $~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edi
  281. jmp int_restore_rest
  282. int_signal:
  283. testl $(_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_SINGLESTEP),%edx
  284. jz 1f
  285. movq %rsp,%rdi # &ptregs -> arg1
  286. xorl %esi,%esi # oldset -> arg2
  287. call do_notify_resume
  288. 1: movl $_TIF_NEED_RESCHED,%edi
  289. int_restore_rest:
  290. RESTORE_REST
  291. jmp int_with_check
  292. CFI_ENDPROC
  293. /*
  294. * Certain special system calls that need to save a complete full stack frame.
  295. */
  296. .macro PTREGSCALL label,func,arg
  297. .globl \label
  298. \label:
  299. leaq \func(%rip),%rax
  300. leaq -ARGOFFSET+8(%rsp),\arg /* 8 for return address */
  301. jmp ptregscall_common
  302. .endm
  303. PTREGSCALL stub_clone, sys_clone, %r8
  304. PTREGSCALL stub_fork, sys_fork, %rdi
  305. PTREGSCALL stub_vfork, sys_vfork, %rdi
  306. PTREGSCALL stub_rt_sigsuspend, sys_rt_sigsuspend, %rdx
  307. PTREGSCALL stub_sigaltstack, sys_sigaltstack, %rdx
  308. PTREGSCALL stub_iopl, sys_iopl, %rsi
  309. ENTRY(ptregscall_common)
  310. CFI_STARTPROC
  311. popq %r11
  312. CFI_ADJUST_CFA_OFFSET -8
  313. SAVE_REST
  314. movq %r11, %r15
  315. FIXUP_TOP_OF_STACK %r11
  316. call *%rax
  317. RESTORE_TOP_OF_STACK %r11
  318. movq %r15, %r11
  319. RESTORE_REST
  320. pushq %r11
  321. CFI_ADJUST_CFA_OFFSET 8
  322. ret
  323. CFI_ENDPROC
  324. ENTRY(stub_execve)
  325. CFI_STARTPROC
  326. popq %r11
  327. CFI_ADJUST_CFA_OFFSET -8
  328. SAVE_REST
  329. movq %r11, %r15
  330. FIXUP_TOP_OF_STACK %r11
  331. call sys_execve
  332. GET_THREAD_INFO(%rcx)
  333. bt $TIF_IA32,threadinfo_flags(%rcx)
  334. jc exec_32bit
  335. RESTORE_TOP_OF_STACK %r11
  336. movq %r15, %r11
  337. RESTORE_REST
  338. push %r11
  339. ret
  340. exec_32bit:
  341. CFI_ADJUST_CFA_OFFSET REST_SKIP
  342. movq %rax,RAX(%rsp)
  343. RESTORE_REST
  344. jmp int_ret_from_sys_call
  345. CFI_ENDPROC
  346. /*
  347. * sigreturn is special because it needs to restore all registers on return.
  348. * This cannot be done with SYSRET, so use the IRET return path instead.
  349. */
  350. ENTRY(stub_rt_sigreturn)
  351. CFI_STARTPROC
  352. addq $8, %rsp
  353. SAVE_REST
  354. movq %rsp,%rdi
  355. FIXUP_TOP_OF_STACK %r11
  356. call sys_rt_sigreturn
  357. movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer
  358. RESTORE_REST
  359. jmp int_ret_from_sys_call
  360. CFI_ENDPROC
  361. /*
  362. * Interrupt entry/exit.
  363. *
  364. * Interrupt entry points save only callee clobbered registers in fast path.
  365. *
  366. * Entry runs with interrupts off.
  367. */
  368. /* 0(%rsp): interrupt number */
  369. .macro interrupt func
  370. CFI_STARTPROC simple
  371. CFI_DEF_CFA rsp,(SS-RDI)
  372. CFI_REL_OFFSET rsp,(RSP-ORIG_RAX)
  373. CFI_REL_OFFSET rip,(RIP-ORIG_RAX)
  374. cld
  375. #ifdef CONFIG_DEBUG_INFO
  376. SAVE_ALL
  377. movq %rsp,%rdi
  378. /*
  379. * Setup a stack frame pointer. This allows gdb to trace
  380. * back to the original stack.
  381. */
  382. movq %rsp,%rbp
  383. CFI_DEF_CFA_REGISTER rbp
  384. #else
  385. SAVE_ARGS
  386. leaq -ARGOFFSET(%rsp),%rdi # arg1 for handler
  387. #endif
  388. testl $3,CS(%rdi)
  389. je 1f
  390. swapgs
  391. 1: addl $1,%gs:pda_irqcount # RED-PEN should check preempt count
  392. movq %gs:pda_irqstackptr,%rax
  393. cmoveq %rax,%rsp
  394. pushq %rdi # save old stack
  395. call \func
  396. .endm
  397. ENTRY(common_interrupt)
  398. interrupt do_IRQ
  399. /* 0(%rsp): oldrsp-ARGOFFSET */
  400. ret_from_intr:
  401. popq %rdi
  402. cli
  403. subl $1,%gs:pda_irqcount
  404. #ifdef CONFIG_DEBUG_INFO
  405. movq RBP(%rdi),%rbp
  406. #endif
  407. leaq ARGOFFSET(%rdi),%rsp
  408. exit_intr:
  409. GET_THREAD_INFO(%rcx)
  410. testl $3,CS-ARGOFFSET(%rsp)
  411. je retint_kernel
  412. /* Interrupt came from user space */
  413. /*
  414. * Has a correct top of stack, but a partial stack frame
  415. * %rcx: thread info. Interrupts off.
  416. */
  417. retint_with_reschedule:
  418. movl $_TIF_WORK_MASK,%edi
  419. retint_check:
  420. movl threadinfo_flags(%rcx),%edx
  421. andl %edi,%edx
  422. jnz retint_careful
  423. retint_swapgs:
  424. cli
  425. swapgs
  426. retint_restore_args:
  427. cli
  428. RESTORE_ARGS 0,8,0
  429. iret_label:
  430. iretq
  431. .section __ex_table,"a"
  432. .quad iret_label,bad_iret
  433. .previous
  434. .section .fixup,"ax"
  435. /* force a signal here? this matches i386 behaviour */
  436. /* running with kernel gs */
  437. bad_iret:
  438. movq $-9999,%rdi /* better code? */
  439. jmp do_exit
  440. .previous
  441. /* edi: workmask, edx: work */
  442. retint_careful:
  443. bt $TIF_NEED_RESCHED,%edx
  444. jnc retint_signal
  445. sti
  446. pushq %rdi
  447. call schedule
  448. popq %rdi
  449. GET_THREAD_INFO(%rcx)
  450. cli
  451. jmp retint_check
  452. retint_signal:
  453. sti
  454. SAVE_REST
  455. movq $-1,ORIG_RAX(%rsp)
  456. xorq %rsi,%rsi # oldset
  457. movq %rsp,%rdi # &pt_regs
  458. call do_notify_resume
  459. RESTORE_REST
  460. cli
  461. GET_THREAD_INFO(%rcx)
  462. jmp retint_check
  463. #ifdef CONFIG_PREEMPT
  464. /* Returning to kernel space. Check if we need preemption */
  465. /* rcx: threadinfo. interrupts off. */
  466. .p2align
  467. retint_kernel:
  468. cmpl $0,threadinfo_preempt_count(%rcx)
  469. jnz retint_restore_args
  470. bt $TIF_NEED_RESCHED,threadinfo_flags(%rcx)
  471. jnc retint_restore_args
  472. bt $9,EFLAGS-ARGOFFSET(%rsp) /* interrupts off? */
  473. jnc retint_restore_args
  474. call preempt_schedule_irq
  475. jmp exit_intr
  476. #endif
  477. CFI_ENDPROC
  478. /*
  479. * APIC interrupts.
  480. */
  481. .macro apicinterrupt num,func
  482. pushq $\num-256
  483. interrupt \func
  484. jmp ret_from_intr
  485. CFI_ENDPROC
  486. .endm
  487. ENTRY(thermal_interrupt)
  488. apicinterrupt THERMAL_APIC_VECTOR,smp_thermal_interrupt
  489. #ifdef CONFIG_SMP
  490. ENTRY(reschedule_interrupt)
  491. apicinterrupt RESCHEDULE_VECTOR,smp_reschedule_interrupt
  492. ENTRY(invalidate_interrupt)
  493. apicinterrupt INVALIDATE_TLB_VECTOR,smp_invalidate_interrupt
  494. ENTRY(call_function_interrupt)
  495. apicinterrupt CALL_FUNCTION_VECTOR,smp_call_function_interrupt
  496. #endif
  497. #ifdef CONFIG_X86_LOCAL_APIC
  498. ENTRY(apic_timer_interrupt)
  499. apicinterrupt LOCAL_TIMER_VECTOR,smp_apic_timer_interrupt
  500. ENTRY(error_interrupt)
  501. apicinterrupt ERROR_APIC_VECTOR,smp_error_interrupt
  502. ENTRY(spurious_interrupt)
  503. apicinterrupt SPURIOUS_APIC_VECTOR,smp_spurious_interrupt
  504. #endif
  505. /*
  506. * Exception entry points.
  507. */
  508. .macro zeroentry sym
  509. pushq $0 /* push error code/oldrax */
  510. pushq %rax /* push real oldrax to the rdi slot */
  511. leaq \sym(%rip),%rax
  512. jmp error_entry
  513. .endm
  514. .macro errorentry sym
  515. pushq %rax
  516. leaq \sym(%rip),%rax
  517. jmp error_entry
  518. .endm
  519. /* error code is on the stack already */
  520. /* handle NMI like exceptions that can happen everywhere */
  521. .macro paranoidentry sym
  522. SAVE_ALL
  523. cld
  524. movl $1,%ebx
  525. movl $MSR_GS_BASE,%ecx
  526. rdmsr
  527. testl %edx,%edx
  528. js 1f
  529. swapgs
  530. xorl %ebx,%ebx
  531. 1: movq %rsp,%rdi
  532. movq ORIG_RAX(%rsp),%rsi
  533. movq $-1,ORIG_RAX(%rsp)
  534. call \sym
  535. .endm
  536. /*
  537. * Exception entry point. This expects an error code/orig_rax on the stack
  538. * and the exception handler in %rax.
  539. */
  540. ENTRY(error_entry)
  541. CFI_STARTPROC simple
  542. CFI_DEF_CFA rsp,(SS-RDI)
  543. CFI_REL_OFFSET rsp,(RSP-RDI)
  544. CFI_REL_OFFSET rip,(RIP-RDI)
  545. /* rdi slot contains rax, oldrax contains error code */
  546. cld
  547. subq $14*8,%rsp
  548. CFI_ADJUST_CFA_OFFSET (14*8)
  549. movq %rsi,13*8(%rsp)
  550. CFI_REL_OFFSET rsi,RSI
  551. movq 14*8(%rsp),%rsi /* load rax from rdi slot */
  552. movq %rdx,12*8(%rsp)
  553. CFI_REL_OFFSET rdx,RDX
  554. movq %rcx,11*8(%rsp)
  555. CFI_REL_OFFSET rcx,RCX
  556. movq %rsi,10*8(%rsp) /* store rax */
  557. CFI_REL_OFFSET rax,RAX
  558. movq %r8, 9*8(%rsp)
  559. CFI_REL_OFFSET r8,R8
  560. movq %r9, 8*8(%rsp)
  561. CFI_REL_OFFSET r9,R9
  562. movq %r10,7*8(%rsp)
  563. CFI_REL_OFFSET r10,R10
  564. movq %r11,6*8(%rsp)
  565. CFI_REL_OFFSET r11,R11
  566. movq %rbx,5*8(%rsp)
  567. CFI_REL_OFFSET rbx,RBX
  568. movq %rbp,4*8(%rsp)
  569. CFI_REL_OFFSET rbp,RBP
  570. movq %r12,3*8(%rsp)
  571. CFI_REL_OFFSET r12,R12
  572. movq %r13,2*8(%rsp)
  573. CFI_REL_OFFSET r13,R13
  574. movq %r14,1*8(%rsp)
  575. CFI_REL_OFFSET r14,R14
  576. movq %r15,(%rsp)
  577. CFI_REL_OFFSET r15,R15
  578. xorl %ebx,%ebx
  579. testl $3,CS(%rsp)
  580. je error_kernelspace
  581. error_swapgs:
  582. swapgs
  583. error_sti:
  584. movq %rdi,RDI(%rsp)
  585. movq %rsp,%rdi
  586. movq ORIG_RAX(%rsp),%rsi /* get error code */
  587. movq $-1,ORIG_RAX(%rsp)
  588. call *%rax
  589. /* ebx: no swapgs flag (1: don't need swapgs, 0: need it) */
  590. error_exit:
  591. movl %ebx,%eax
  592. RESTORE_REST
  593. cli
  594. GET_THREAD_INFO(%rcx)
  595. testl %eax,%eax
  596. jne retint_kernel
  597. movl threadinfo_flags(%rcx),%edx
  598. movl $_TIF_WORK_MASK,%edi
  599. andl %edi,%edx
  600. jnz retint_careful
  601. swapgs
  602. RESTORE_ARGS 0,8,0
  603. iretq
  604. CFI_ENDPROC
  605. error_kernelspace:
  606. incl %ebx
  607. /* There are two places in the kernel that can potentially fault with
  608. usergs. Handle them here. The exception handlers after
  609. iret run with kernel gs again, so don't set the user space flag.
  610. B stepping K8s sometimes report an truncated RIP for IRET
  611. exceptions returning to compat mode. Check for these here too. */
  612. leaq iret_label(%rip),%rbp
  613. cmpq %rbp,RIP(%rsp)
  614. je error_swapgs
  615. movl %ebp,%ebp /* zero extend */
  616. cmpq %rbp,RIP(%rsp)
  617. je error_swapgs
  618. cmpq $gs_change,RIP(%rsp)
  619. je error_swapgs
  620. jmp error_sti
  621. /* Reload gs selector with exception handling */
  622. /* edi: new selector */
  623. ENTRY(load_gs_index)
  624. pushf
  625. cli
  626. swapgs
  627. gs_change:
  628. movl %edi,%gs
  629. 2: mfence /* workaround */
  630. swapgs
  631. popf
  632. ret
  633. .section __ex_table,"a"
  634. .align 8
  635. .quad gs_change,bad_gs
  636. .previous
  637. .section .fixup,"ax"
  638. /* running with kernelgs */
  639. bad_gs:
  640. swapgs /* switch back to user gs */
  641. xorl %eax,%eax
  642. movl %eax,%gs
  643. jmp 2b
  644. .previous
  645. /*
  646. * Create a kernel thread.
  647. *
  648. * C extern interface:
  649. * extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
  650. *
  651. * asm input arguments:
  652. * rdi: fn, rsi: arg, rdx: flags
  653. */
  654. ENTRY(kernel_thread)
  655. CFI_STARTPROC
  656. FAKE_STACK_FRAME $child_rip
  657. SAVE_ALL
  658. # rdi: flags, rsi: usp, rdx: will be &pt_regs
  659. movq %rdx,%rdi
  660. orq kernel_thread_flags(%rip),%rdi
  661. movq $-1, %rsi
  662. movq %rsp, %rdx
  663. xorl %r8d,%r8d
  664. xorl %r9d,%r9d
  665. # clone now
  666. call do_fork
  667. movq %rax,RAX(%rsp)
  668. xorl %edi,%edi
  669. /*
  670. * It isn't worth to check for reschedule here,
  671. * so internally to the x86_64 port you can rely on kernel_thread()
  672. * not to reschedule the child before returning, this avoids the need
  673. * of hacks for example to fork off the per-CPU idle tasks.
  674. * [Hopefully no generic code relies on the reschedule -AK]
  675. */
  676. RESTORE_ALL
  677. UNFAKE_STACK_FRAME
  678. ret
  679. CFI_ENDPROC
  680. child_rip:
  681. /*
  682. * Here we are in the child and the registers are set as they were
  683. * at kernel_thread() invocation in the parent.
  684. */
  685. movq %rdi, %rax
  686. movq %rsi, %rdi
  687. call *%rax
  688. # exit
  689. xorq %rdi, %rdi
  690. call do_exit
  691. /*
  692. * execve(). This function needs to use IRET, not SYSRET, to set up all state properly.
  693. *
  694. * C extern interface:
  695. * extern long execve(char *name, char **argv, char **envp)
  696. *
  697. * asm input arguments:
  698. * rdi: name, rsi: argv, rdx: envp
  699. *
  700. * We want to fallback into:
  701. * extern long sys_execve(char *name, char **argv,char **envp, struct pt_regs regs)
  702. *
  703. * do_sys_execve asm fallback arguments:
  704. * rdi: name, rsi: argv, rdx: envp, fake frame on the stack
  705. */
  706. ENTRY(execve)
  707. CFI_STARTPROC
  708. FAKE_STACK_FRAME $0
  709. SAVE_ALL
  710. call sys_execve
  711. movq %rax, RAX(%rsp)
  712. RESTORE_REST
  713. testq %rax,%rax
  714. je int_ret_from_sys_call
  715. RESTORE_ARGS
  716. UNFAKE_STACK_FRAME
  717. ret
  718. CFI_ENDPROC
  719. ENTRY(page_fault)
  720. errorentry do_page_fault
  721. ENTRY(coprocessor_error)
  722. zeroentry do_coprocessor_error
  723. ENTRY(simd_coprocessor_error)
  724. zeroentry do_simd_coprocessor_error
  725. ENTRY(device_not_available)
  726. zeroentry math_state_restore
  727. /* runs on exception stack */
  728. ENTRY(debug)
  729. CFI_STARTPROC
  730. pushq $0
  731. CFI_ADJUST_CFA_OFFSET 8
  732. paranoidentry do_debug
  733. /* switch back to process stack to restore the state ptrace touched */
  734. movq %rax,%rsp
  735. testl $3,CS(%rsp)
  736. jnz paranoid_userspace
  737. jmp paranoid_exit
  738. CFI_ENDPROC
  739. /* runs on exception stack */
  740. ENTRY(nmi)
  741. CFI_STARTPROC
  742. pushq $-1
  743. CFI_ADJUST_CFA_OFFSET 8
  744. paranoidentry do_nmi
  745. /* ebx: no swapgs flag */
  746. paranoid_exit:
  747. testl %ebx,%ebx /* swapgs needed? */
  748. jnz paranoid_restore
  749. paranoid_swapgs:
  750. cli
  751. swapgs
  752. paranoid_restore:
  753. RESTORE_ALL 8
  754. iretq
  755. paranoid_userspace:
  756. cli
  757. GET_THREAD_INFO(%rcx)
  758. movl threadinfo_flags(%rcx),%edx
  759. testl $_TIF_WORK_MASK,%edx
  760. jz paranoid_swapgs
  761. testl $_TIF_NEED_RESCHED,%edx
  762. jnz paranoid_resched
  763. sti
  764. xorl %esi,%esi /* oldset */
  765. movq %rsp,%rdi /* &pt_regs */
  766. call do_notify_resume
  767. jmp paranoid_exit
  768. paranoid_resched:
  769. sti
  770. call schedule
  771. jmp paranoid_exit
  772. CFI_ENDPROC
  773. ENTRY(int3)
  774. zeroentry do_int3
  775. ENTRY(overflow)
  776. zeroentry do_overflow
  777. ENTRY(bounds)
  778. zeroentry do_bounds
  779. ENTRY(invalid_op)
  780. zeroentry do_invalid_op
  781. ENTRY(coprocessor_segment_overrun)
  782. zeroentry do_coprocessor_segment_overrun
  783. ENTRY(reserved)
  784. zeroentry do_reserved
  785. /* runs on exception stack */
  786. ENTRY(double_fault)
  787. CFI_STARTPROC
  788. paranoidentry do_double_fault
  789. movq %rax,%rsp
  790. testl $3,CS(%rsp)
  791. jnz paranoid_userspace
  792. jmp paranoid_exit
  793. CFI_ENDPROC
  794. ENTRY(invalid_TSS)
  795. errorentry do_invalid_TSS
  796. ENTRY(segment_not_present)
  797. errorentry do_segment_not_present
  798. /* runs on exception stack */
  799. ENTRY(stack_segment)
  800. CFI_STARTPROC
  801. paranoidentry do_stack_segment
  802. movq %rax,%rsp
  803. testl $3,CS(%rsp)
  804. jnz paranoid_userspace
  805. jmp paranoid_exit
  806. CFI_ENDPROC
  807. ENTRY(general_protection)
  808. errorentry do_general_protection
  809. ENTRY(alignment_check)
  810. errorentry do_alignment_check
  811. ENTRY(divide_error)
  812. zeroentry do_divide_error
  813. ENTRY(spurious_interrupt_bug)
  814. zeroentry do_spurious_interrupt_bug
  815. #ifdef CONFIG_X86_MCE
  816. /* runs on exception stack */
  817. ENTRY(machine_check)
  818. CFI_STARTPROC
  819. pushq $0
  820. CFI_ADJUST_CFA_OFFSET 8
  821. paranoidentry do_machine_check
  822. jmp paranoid_exit
  823. CFI_ENDPROC
  824. #endif
  825. ENTRY(call_debug)
  826. zeroentry do_call_debug