x86/asm/entry: Rename 'init_tss' to 'cpu_tss'
[linux-2.6-block.git] / arch / x86 / ia32 / ia32entry.S
1 /*
2  * Compatibility mode system call entry point for x86-64. 
3  *              
4  * Copyright 2000-2002 Andi Kleen, SuSE Labs.
5  */              
6
7 #include <asm/dwarf2.h>
8 #include <asm/calling.h>
9 #include <asm/asm-offsets.h>
10 #include <asm/current.h>
11 #include <asm/errno.h>
12 #include <asm/ia32_unistd.h>    
13 #include <asm/thread_info.h>    
14 #include <asm/segment.h>
15 #include <asm/irqflags.h>
16 #include <asm/asm.h>
17 #include <asm/smap.h>
18 #include <linux/linkage.h>
19 #include <linux/err.h>
20
21 /* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this.  */
22 #include <linux/elf-em.h>
23 #define AUDIT_ARCH_I386         (EM_386|__AUDIT_ARCH_LE)
24 #define __AUDIT_ARCH_LE    0x40000000
25
26 #ifndef CONFIG_AUDITSYSCALL
27 #define sysexit_audit ia32_ret_from_sys_call
28 #define sysretl_audit ia32_ret_from_sys_call
29 #endif
30
31         .section .entry.text, "ax"
32
33         /* clobbers %rax */
34         .macro  CLEAR_RREGS _r9=rax
35         xorl    %eax,%eax
36         movq    %rax,R11(%rsp)
37         movq    %rax,R10(%rsp)
38         movq    %\_r9,R9(%rsp)
39         movq    %rax,R8(%rsp)
40         .endm
41
42         /*
43          * Reload arg registers from stack in case ptrace changed them.
44          * We don't reload %eax because syscall_trace_enter() returned
45          * the %rax value we should see.  Instead, we just truncate that
46          * value to 32 bits again as we did on entry from user mode.
47          * If it's a new value set by user_regset during entry tracing,
48          * this matches the normal truncation of the user-mode value.
49          * If it's -1 to make us punt the syscall, then (u32)-1 is still
50          * an appropriately invalid value.
51          */
52         .macro LOAD_ARGS32 _r9=0
53         .if \_r9
54         movl R9(%rsp),%r9d
55         .endif
56         movl RCX(%rsp),%ecx
57         movl RDX(%rsp),%edx
58         movl RSI(%rsp),%esi
59         movl RDI(%rsp),%edi
60         movl %eax,%eax                  /* zero extension */
61         .endm
62         
63         .macro CFI_STARTPROC32 simple
64         CFI_STARTPROC   \simple
65         CFI_UNDEFINED   r8
66         CFI_UNDEFINED   r9
67         CFI_UNDEFINED   r10
68         CFI_UNDEFINED   r11
69         CFI_UNDEFINED   r12
70         CFI_UNDEFINED   r13
71         CFI_UNDEFINED   r14
72         CFI_UNDEFINED   r15
73         .endm
74
75 #ifdef CONFIG_PARAVIRT
76 ENTRY(native_usergs_sysret32)
77         swapgs
78         sysretl
79 ENDPROC(native_usergs_sysret32)
80
81 ENTRY(native_irq_enable_sysexit)
82         swapgs
83         sti
84         sysexit
85 ENDPROC(native_irq_enable_sysexit)
86 #endif
87
88 /*
89  * 32bit SYSENTER instruction entry.
90  *
91  * SYSENTER loads ss, rsp, cs, and rip from previously programmed MSRs.
92  * IF and VM in rflags are cleared (IOW: interrupts are off).
93  * SYSENTER does not save anything on the stack,
94  * and does not save old rip (!!!) and rflags.
95  *
96  * Arguments:
97  * eax  system call number
98  * ebx  arg1
99  * ecx  arg2
100  * edx  arg3
101  * esi  arg4
102  * edi  arg5
103  * ebp  user stack
104  * 0(%ebp) arg6
105  *
106  * This is purely a fast path. For anything complicated we use the int 0x80
107  * path below. We set up a complete hardware stack frame to share code
108  * with the int 0x80 path.
109  */
110 ENTRY(ia32_sysenter_target)
111         CFI_STARTPROC32 simple
112         CFI_SIGNAL_FRAME
113         CFI_DEF_CFA     rsp,0
114         CFI_REGISTER    rsp,rbp
115         SWAPGS_UNSAFE_STACK
116         movq    PER_CPU_VAR(cpu_tss + TSS_sp0), %rsp
117         /*
118          * No need to follow this irqs on/off section: the syscall
119          * disabled irqs, here we enable it straight after entry:
120          */
121         ENABLE_INTERRUPTS(CLBR_NONE)
122         /* Construct iret frame (ss,rsp,rflags,cs,rip) */
123         movl    %ebp,%ebp               /* zero extension */
124         pushq_cfi $__USER32_DS
125         /*CFI_REL_OFFSET ss,0*/
126         pushq_cfi %rbp
127         CFI_REL_OFFSET rsp,0
128         pushfq_cfi
129         /*CFI_REL_OFFSET rflags,0*/
130         movl    TI_sysenter_return+THREAD_INFO(%rsp,3*8-KERNEL_STACK_OFFSET),%r10d
131         CFI_REGISTER rip,r10
132         pushq_cfi $__USER32_CS
133         /*CFI_REL_OFFSET cs,0*/
134         movl    %eax, %eax
135         /* Store thread_info->sysenter_return in rip stack slot */
136         pushq_cfi %r10
137         CFI_REL_OFFSET rip,0
138         /* Store orig_ax */
139         pushq_cfi %rax
140         /* Construct the rest of "struct pt_regs" */
141         cld
142         ALLOC_PT_GPREGS_ON_STACK
143         SAVE_C_REGS_EXCEPT_R891011
144         /*
145          * no need to do an access_ok check here because rbp has been
146          * 32bit zero extended
147          */
148         ASM_STAC
149 1:      movl    (%rbp),%ebp
150         _ASM_EXTABLE(1b,ia32_badarg)
151         ASM_CLAC
152
153         /*
154          * Sysenter doesn't filter flags, so we need to clear NT
155          * ourselves.  To save a few cycles, we can check whether
156          * NT was set instead of doing an unconditional popfq.
157          */
158         testl $X86_EFLAGS_NT,EFLAGS(%rsp)
159         jnz sysenter_fix_flags
160 sysenter_flags_fixed:
161
162         orl     $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP)
163         testl   $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP)
164         CFI_REMEMBER_STATE
165         jnz  sysenter_tracesys
166         cmpq    $(IA32_NR_syscalls-1),%rax
167         ja      ia32_badsys
168 sysenter_do_call:
169         /* 32bit syscall -> 64bit C ABI argument conversion */
170         movl    %edi,%r8d       /* arg5 */
171         movl    %ebp,%r9d       /* arg6 */
172         xchg    %ecx,%esi       /* rsi:arg2, rcx:arg4 */
173         movl    %ebx,%edi       /* arg1 */
174         movl    %edx,%edx       /* arg3 (zero extension) */
175 sysenter_dispatch:
176         call    *ia32_sys_call_table(,%rax,8)
177         movq    %rax,RAX(%rsp)
178         DISABLE_INTERRUPTS(CLBR_NONE)
179         TRACE_IRQS_OFF
180         testl   $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP)
181         jnz     sysexit_audit
182 sysexit_from_sys_call:
183         andl    $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP)
184         /* clear IF, that popfq doesn't enable interrupts early */
185         andl    $~0x200,EFLAGS(%rsp)
186         movl    RIP(%rsp),%edx          /* User %eip */
187         CFI_REGISTER rip,rdx
188         RESTORE_RSI_RDI
189         /* pop everything except ss,rsp,rflags slots */
190         REMOVE_PT_GPREGS_FROM_STACK 3*8
191         xorq    %r8,%r8
192         xorq    %r9,%r9
193         xorq    %r10,%r10
194         xorq    %r11,%r11
195         popfq_cfi
196         /*CFI_RESTORE rflags*/
197         popq_cfi %rcx                           /* User %esp */
198         CFI_REGISTER rsp,rcx
199         TRACE_IRQS_ON
200         /*
201          * 32bit SYSEXIT restores eip from edx, esp from ecx.
202          * cs and ss are loaded from MSRs.
203          */
204         ENABLE_INTERRUPTS_SYSEXIT32
205
206         CFI_RESTORE_STATE
207
208 #ifdef CONFIG_AUDITSYSCALL
209         .macro auditsys_entry_common
210         movl %esi,%r8d                  /* 5th arg: 4th syscall arg */
211         movl %ecx,%r9d                  /*swap with edx*/
212         movl %edx,%ecx                  /* 4th arg: 3rd syscall arg */
213         movl %r9d,%edx                  /* 3rd arg: 2nd syscall arg */
214         movl %ebx,%esi                  /* 2nd arg: 1st syscall arg */
215         movl %eax,%edi                  /* 1st arg: syscall number */
216         call __audit_syscall_entry
217         movl RAX(%rsp),%eax     /* reload syscall number */
218         cmpq $(IA32_NR_syscalls-1),%rax
219         ja ia32_badsys
220         movl %ebx,%edi                  /* reload 1st syscall arg */
221         movl RCX(%rsp),%esi     /* reload 2nd syscall arg */
222         movl RDX(%rsp),%edx     /* reload 3rd syscall arg */
223         movl RSI(%rsp),%ecx     /* reload 4th syscall arg */
224         movl RDI(%rsp),%r8d     /* reload 5th syscall arg */
225         .endm
226
227         .macro auditsys_exit exit
228         testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP)
229         jnz ia32_ret_from_sys_call
230         TRACE_IRQS_ON
231         ENABLE_INTERRUPTS(CLBR_NONE)
232         movl %eax,%esi          /* second arg, syscall return value */
233         cmpl $-MAX_ERRNO,%eax   /* is it an error ? */
234         jbe 1f
235         movslq %eax, %rsi       /* if error sign extend to 64 bits */
236 1:      setbe %al               /* 1 if error, 0 if not */
237         movzbl %al,%edi         /* zero-extend that into %edi */
238         call __audit_syscall_exit
239         movq RAX(%rsp),%rax     /* reload syscall return value */
240         movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
241         DISABLE_INTERRUPTS(CLBR_NONE)
242         TRACE_IRQS_OFF
243         testl %edi,TI_flags+THREAD_INFO(%rsp,RIP)
244         jz \exit
245         CLEAR_RREGS
246         jmp int_with_check
247         .endm
248
249 sysenter_auditsys:
250         auditsys_entry_common
251         movl %ebp,%r9d                  /* reload 6th syscall arg */
252         jmp sysenter_dispatch
253
254 sysexit_audit:
255         auditsys_exit sysexit_from_sys_call
256 #endif
257
258 sysenter_fix_flags:
259         pushq_cfi $(X86_EFLAGS_IF|X86_EFLAGS_FIXED)
260         popfq_cfi
261         jmp sysenter_flags_fixed
262
263 sysenter_tracesys:
264 #ifdef CONFIG_AUDITSYSCALL
265         testl   $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP)
266         jz      sysenter_auditsys
267 #endif
268         SAVE_EXTRA_REGS
269         CLEAR_RREGS
270         movq    $-ENOSYS,RAX(%rsp)/* ptrace can change this for a bad syscall */
271         movq    %rsp,%rdi        /* &pt_regs -> arg1 */
272         call    syscall_trace_enter
273         LOAD_ARGS32  /* reload args from stack in case ptrace changed it */
274         RESTORE_EXTRA_REGS
275         cmpq    $(IA32_NR_syscalls-1),%rax
276         ja      int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */
277         jmp     sysenter_do_call
278         CFI_ENDPROC
279 ENDPROC(ia32_sysenter_target)
280
281 /*
282  * 32bit SYSCALL instruction entry.
283  *
284  * 32bit SYSCALL saves rip to rcx, clears rflags.RF, then saves rflags to r11,
285  * then loads new ss, cs, and rip from previously programmed MSRs.
286  * rflags gets masked by a value from another MSR (so CLD and CLAC
287  * are not needed). SYSCALL does not save anything on the stack
288  * and does not change rsp.
289  *
290  * Note: rflags saving+masking-with-MSR happens only in Long mode
291  * (in legacy 32bit mode, IF, RF and VM bits are cleared and that's it).
292  * Don't get confused: rflags saving+masking depends on Long Mode Active bit
293  * (EFER.LMA=1), NOT on bitness of userspace where SYSCALL executes
294  * or target CS descriptor's L bit (SYSCALL does not read segment descriptors).
295  *
296  * Arguments:
297  * eax  system call number
298  * ecx  return address
299  * ebx  arg1
300  * ebp  arg2    (note: not saved in the stack frame, should not be touched)
301  * edx  arg3
302  * esi  arg4
303  * edi  arg5
304  * esp  user stack
305  * 0(%esp) arg6
306  *
307  * This is purely a fast path. For anything complicated we use the int 0x80
308  * path below. We set up a complete hardware stack frame to share code
309  * with the int 0x80 path.
310  */
311 ENTRY(ia32_cstar_target)
312         CFI_STARTPROC32 simple
313         CFI_SIGNAL_FRAME
314         CFI_DEF_CFA     rsp,KERNEL_STACK_OFFSET
315         CFI_REGISTER    rip,rcx
316         /*CFI_REGISTER  rflags,r11*/
317         SWAPGS_UNSAFE_STACK
318         movl    %esp,%r8d
319         CFI_REGISTER    rsp,r8
320         movq    PER_CPU_VAR(kernel_stack),%rsp
321         /*
322          * No need to follow this irqs on/off section: the syscall
323          * disabled irqs and here we enable it straight after entry:
324          */
325         ENABLE_INTERRUPTS(CLBR_NONE)
326         ALLOC_PT_GPREGS_ON_STACK 8      /* +8: space for orig_ax */
327         SAVE_C_REGS_EXCEPT_RCX_R891011
328         movl    %eax,%eax       /* zero extension */
329         movq    %rax,ORIG_RAX(%rsp)
330         movq    %rcx,RIP(%rsp)
331         CFI_REL_OFFSET rip,RIP
332         movq    %rbp,RCX(%rsp) /* this lies slightly to ptrace */
333         movl    %ebp,%ecx
334         movq    $__USER32_CS,CS(%rsp)
335         movq    $__USER32_DS,SS(%rsp)
336         movq    %r11,EFLAGS(%rsp)
337         /*CFI_REL_OFFSET rflags,EFLAGS*/
338         movq    %r8,RSP(%rsp)
339         CFI_REL_OFFSET rsp,RSP
340         /* iret stack frame is complete now */
341         /*
342          * no need to do an access_ok check here because r8 has been
343          * 32bit zero extended
344          */
345         ASM_STAC
346 1:      movl    (%r8),%r9d
347         _ASM_EXTABLE(1b,ia32_badarg)
348         ASM_CLAC
349         orl     $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP)
350         testl   $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP)
351         CFI_REMEMBER_STATE
352         jnz   cstar_tracesys
353         cmpq $IA32_NR_syscalls-1,%rax
354         ja  ia32_badsys
355 cstar_do_call:
356         /* 32bit syscall -> 64bit C ABI argument conversion */
357         movl    %edi,%r8d       /* arg5 */
358         /* r9 already loaded */ /* arg6 */
359         xchg    %ecx,%esi       /* rsi:arg2, rcx:arg4 */
360         movl    %ebx,%edi       /* arg1 */
361         movl    %edx,%edx       /* arg3 (zero extension) */
362 cstar_dispatch:
363         call *ia32_sys_call_table(,%rax,8)
364         movq %rax,RAX(%rsp)
365         DISABLE_INTERRUPTS(CLBR_NONE)
366         TRACE_IRQS_OFF
367         testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP)
368         jnz sysretl_audit
369 sysretl_from_sys_call:
370         andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP)
371         RESTORE_RSI_RDI_RDX
372         movl RIP(%rsp),%ecx
373         CFI_REGISTER rip,rcx
374         movl EFLAGS(%rsp),%r11d
375         /*CFI_REGISTER rflags,r11*/
376         xorq    %r10,%r10
377         xorq    %r9,%r9
378         xorq    %r8,%r8
379         TRACE_IRQS_ON
380         movl RSP(%rsp),%esp
381         CFI_RESTORE rsp
382         /*
383          * 64bit->32bit SYSRET restores eip from ecx,
384          * eflags from r11 (but RF and VM bits are forced to 0),
385          * cs and ss are loaded from MSRs.
386          * (Note: 32bit->32bit SYSRET is different: since r11
387          * does not exist, it merely sets eflags.IF=1).
388          */
389         USERGS_SYSRET32
390
391 #ifdef CONFIG_AUDITSYSCALL
392 cstar_auditsys:
393         CFI_RESTORE_STATE
394         movl %r9d,R9(%rsp)      /* register to be clobbered by call */
395         auditsys_entry_common
396         movl R9(%rsp),%r9d      /* reload 6th syscall arg */
397         jmp cstar_dispatch
398
399 sysretl_audit:
400         auditsys_exit sysretl_from_sys_call
401 #endif
402
403 cstar_tracesys:
404 #ifdef CONFIG_AUDITSYSCALL
405         testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP)
406         jz cstar_auditsys
407 #endif
408         xchgl %r9d,%ebp
409         SAVE_EXTRA_REGS
410         CLEAR_RREGS r9
411         movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */
412         movq %rsp,%rdi        /* &pt_regs -> arg1 */
413         call syscall_trace_enter
414         LOAD_ARGS32 1   /* reload args from stack in case ptrace changed it */
415         RESTORE_EXTRA_REGS
416         xchgl %ebp,%r9d
417         cmpq $(IA32_NR_syscalls-1),%rax
418         ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */
419         jmp cstar_do_call
420 END(ia32_cstar_target)
421                                 
422 ia32_badarg:
423         ASM_CLAC
424         movq $-EFAULT,%rax
425         jmp ia32_sysret
426         CFI_ENDPROC
427
428 /*
429  * Emulated IA32 system calls via int 0x80.
430  *
431  * Arguments:
432  * eax  system call number
433  * ebx  arg1
434  * ecx  arg2
435  * edx  arg3
436  * esi  arg4
437  * edi  arg5
438  * ebp  arg6    (note: not saved in the stack frame, should not be touched)
439  *
440  * Notes:
441  * Uses the same stack frame as the x86-64 version.
442  * All registers except eax must be saved (but ptrace may violate that).
443  * Arguments are zero extended. For system calls that want sign extension and
444  * take long arguments a wrapper is needed. Most calls can just be called
445  * directly.
446  * Assumes it is only called from user space and entered with interrupts off.
447  */
448
449 ENTRY(ia32_syscall)
450         CFI_STARTPROC32 simple
451         CFI_SIGNAL_FRAME
452         CFI_DEF_CFA     rsp,SS+8-RIP
453         /*CFI_REL_OFFSET        ss,SS-RIP*/
454         CFI_REL_OFFSET  rsp,RSP-RIP
455         /*CFI_REL_OFFSET        rflags,EFLAGS-RIP*/
456         /*CFI_REL_OFFSET        cs,CS-RIP*/
457         CFI_REL_OFFSET  rip,RIP-RIP
458         PARAVIRT_ADJUST_EXCEPTION_FRAME
459         SWAPGS
460         /*
461          * No need to follow this irqs on/off section: the syscall
462          * disabled irqs and here we enable it straight after entry:
463          */
464         ENABLE_INTERRUPTS(CLBR_NONE)
465         movl %eax,%eax
466         pushq_cfi %rax          /* store orig_ax */
467         cld
468         /* note the registers are not zero extended to the sf.
469            this could be a problem. */
470         ALLOC_PT_GPREGS_ON_STACK
471         SAVE_C_REGS_EXCEPT_R891011
472         orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP)
473         testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP)
474         jnz ia32_tracesys
475         cmpq $(IA32_NR_syscalls-1),%rax
476         ja ia32_badsys
477 ia32_do_call:
478         /* 32bit syscall -> 64bit C ABI argument conversion */
479         movl %edi,%r8d  /* arg5 */
480         movl %ebp,%r9d  /* arg6 */
481         xchg %ecx,%esi  /* rsi:arg2, rcx:arg4 */
482         movl %ebx,%edi  /* arg1 */
483         movl %edx,%edx  /* arg3 (zero extension) */
484         call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
485 ia32_sysret:
486         movq %rax,RAX(%rsp)
487 ia32_ret_from_sys_call:
488         CLEAR_RREGS
489         jmp int_ret_from_sys_call
490
491 ia32_tracesys:
492         SAVE_EXTRA_REGS
493         CLEAR_RREGS
494         movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */
495         movq %rsp,%rdi        /* &pt_regs -> arg1 */
496         call syscall_trace_enter
497         LOAD_ARGS32     /* reload args from stack in case ptrace changed it */
498         RESTORE_EXTRA_REGS
499         cmpq $(IA32_NR_syscalls-1),%rax
500         ja  int_ret_from_sys_call       /* ia32_tracesys has set RAX(%rsp) */
501         jmp ia32_do_call
502 END(ia32_syscall)
503
504 ia32_badsys:
505         movq $0,ORIG_RAX(%rsp)
506         movq $-ENOSYS,%rax
507         jmp ia32_sysret
508
509         CFI_ENDPROC
510         
511         .macro PTREGSCALL label, func
512         ALIGN
513 GLOBAL(\label)
514         leaq \func(%rip),%rax
515         jmp  ia32_ptregs_common 
516         .endm
517
518         CFI_STARTPROC32
519
520         PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn
521         PTREGSCALL stub32_sigreturn, sys32_sigreturn
522         PTREGSCALL stub32_execve, compat_sys_execve
523         PTREGSCALL stub32_execveat, compat_sys_execveat
524         PTREGSCALL stub32_fork, sys_fork
525         PTREGSCALL stub32_vfork, sys_vfork
526
527         ALIGN
528 GLOBAL(stub32_clone)
529         leaq sys_clone(%rip),%rax
530         mov     %r8, %rcx
531         jmp  ia32_ptregs_common 
532
533         ALIGN
534 ia32_ptregs_common:
535         CFI_ENDPROC
536         CFI_STARTPROC32 simple
537         CFI_SIGNAL_FRAME
538         CFI_DEF_CFA     rsp,SIZEOF_PTREGS
539         CFI_REL_OFFSET  rax,RAX
540         CFI_REL_OFFSET  rcx,RCX
541         CFI_REL_OFFSET  rdx,RDX
542         CFI_REL_OFFSET  rsi,RSI
543         CFI_REL_OFFSET  rdi,RDI
544         CFI_REL_OFFSET  rip,RIP
545 /*      CFI_REL_OFFSET  cs,CS*/
546 /*      CFI_REL_OFFSET  rflags,EFLAGS*/
547         CFI_REL_OFFSET  rsp,RSP
548 /*      CFI_REL_OFFSET  ss,SS*/
549         SAVE_EXTRA_REGS 8
550         call *%rax
551         RESTORE_EXTRA_REGS 8
552         ret
553         CFI_ENDPROC
554 END(ia32_ptregs_common)