x86/asm changes for v4.10
Subsystems (14)
Linus,
Please pull the latest x86-asm-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-asm-for-linus
# HEAD: 53938ee427bf27525a63721b7e25d86b8f31f161 scripts/decode_stacktrace.sh: Fix address line detection on x86
The main changes in this development cycle were:
- A large number of call stack dumping/printing improvements: higher robustness, better cross-context dumping, improved output, etc. (Josh Poimboeuf)
- vDSO getcpu() performance improvement for future Intel CPUs with the RDPID instruction (Andy Lutomirski)
- Add two new Intel AVX512 features and the CPUID support infrastructure for it:
AVX512IFMA and AVX512VBMI. (Gayatri Kammela, He Chen)
- More copy-user unification (Borislav Petkov)
- Entry code assembly macro simplifications (Alexander Kuleshov)
- vDSO C/R support improvements (Dmitry Safonov)
- Misc fixes and cleanups (Borislav Petkov, Paul Bolle)
out-of-topic modifications in x86-asm-for-linus:
--------------------------------------------------
kernel/sysctl.c # 0ee1dd9f5e7e: x86/dumpstack: Remove raw st mm/page_alloc.c # adb1fe9ae2ee: mm/page_alloc: Remove kernel scripts/decode_stacktrace.sh # 53938ee427bf: scripts/decode_stacktrace.sh scripts/faddr2line # efdb4167e676: scripts/faddr2line: Fix "siz
tools/testing/selftests/x86/Makefile# 3200ca806942: selftests/x86: Add test_vdso tools/testing/selftests/x86/test_vdso.c# 3200ca806942: selftests/x86: Add test_vdso
Thanks,
Ingo
------------------>
Alexander Kuleshov (3):
x86/entry/64: Remove unused 'addskip' parameter of the ALLOC_PT_GPREGS_ON_STACK macro entry/64: Remove unused ZERO_EXTRA_REGS macro
x86/entry64: Remove unused audit related macros
Andy Lutomirski (2):
x86/vdso: Use RDPID in preference to LSL when available selftests/x86: Add test_vdso to test getcpu()
Borislav Petkov (2):
x86/copy_user: Unify the code by removing the 64-bit asm _copy_*_user() variants x86/boot/64: Use defines for page size
Dmitry Safonov (2):
x86/prctl/uapi: Remove #ifdef for CHECKPOINT_RESTORE x86/vdso: Set vDSO pointer only after success
Gayatri Kammela (1):
x86/cpufeatures: Enable new AVX512 cpu features
He Chen (2):
x86/cpuid: Cleanup cpuid_regs definitions x86/cpuid: Provide get_scattered_cpuid_leaf()
Josh Poimboeuf (26):
x86/entry/32, x86/boot/32: Use local labels
x86/entry/32: Rename 'error_code' to 'common_exception' x86/entry/32: Fix the end of the stack for newly forked tasks x86/boot/32: Fix the end of the stack for idle tasks x86/boot/smp/32: Fix initial idle stack location on 32-bit kernels x86/boot/64: Use a common function for starting CPUs x86/boot/64: Put a real return address on the idle task stack x86/boot: Fix the end of the stack for idle tasks x86/boot: Move the _stext marker to before the boot code x86/entry/unwind: Create stack frames for saved interrupt registers x86/unwind: Create stack frames for saved syscall registers x86/dumpstack: Print stack identifier on its own line x86/dumpstack: Print any pt_regs found on the stack x86/dumpstack: Fix duplicate RIP address display in __show_regs() x86/dumpstack: Print orig_ax in __show_regs() scripts/faddr2line: Fix "size mismatch" error x86/dumpstack: Remove kernel text addresses from stack dump x86/dumpstack: Remove raw stack dump
mm/page_alloc: Remove kernel address exposure in free_reserved_area() x86/unwind: Warn on bad frame pointer
x86/dumpstack: Warn on stack recursion
x86/unwind: Detect bad stack return address
x86/unwind: Ensure stack grows down
x86/dumpstack: Handle NULL stack pointer in show_trace_log_lvl() x86/dumpstack: Make stack name tags more comprehensible scripts/decode_stacktrace.sh: Fix address line detection on x86
Paul Bolle (2):
x86/decoder: Use stdout if insn decoder test is successful x86/decoder: Use stderr if insn sanity test fails
Documentation/kernel-parameters.txt | 3 - Documentation/sysctl/kernel.txt | 8 -- Documentation/x86/x86_64/boot-options.txt | 4 - arch/x86/entry/calling.h | 33 ++++-- arch/x86/entry/entry_32.S | 141 +++++++++++++++++--------- arch/x86/entry/entry_64.S | 16 ++- arch/x86/entry/vdso/vma.c | 10 +- arch/x86/events/intel/pt.c | 45 ++++----- arch/x86/include/asm/cpufeatures.h | 3 + arch/x86/include/asm/kdebug.h | 1 - arch/x86/include/asm/processor.h | 14 +++ arch/x86/include/asm/stacktrace.h | 8 +- arch/x86/include/asm/unwind.h | 16 ++- arch/x86/include/asm/vgtod.h | 7 +- arch/x86/include/uapi/asm/prctl.h | 8 +- arch/x86/kernel/cpu/scattered.c | 57 +++++++---- arch/x86/kernel/cpuid.c | 4 - arch/x86/kernel/dumpstack.c | 68 ++++++------- arch/x86/kernel/dumpstack_32.c | 56 +++-------- arch/x86/kernel/dumpstack_64.c | 79 +++------------ arch/x86/kernel/fpu/xstate.c | 2 + arch/x86/kernel/head_32.S | 49 +++++---- arch/x86/kernel/head_64.S | 52 +++++----- arch/x86/kernel/process_32.c | 7 +- arch/x86/kernel/process_64.c | 13 ++- arch/x86/kernel/smpboot.c | 4 +- arch/x86/kernel/unwind_frame.c | 161 ++++++++++++++++++++++++++++-- arch/x86/kernel/vmlinux.lds.S | 2 +- arch/x86/lib/copy_user_64.S | 47 --------- arch/x86/lib/usercopy.c | 49 +++++++++ arch/x86/lib/usercopy_32.c | 49 --------- arch/x86/mm/fault.c | 3 +- arch/x86/platform/uv/uv_nmi.c | 4 +- arch/x86/tools/insn_sanity.c | 3 +- arch/x86/tools/test_get_len.c | 2 +- kernel/sysctl.c | 7 -- mm/page_alloc.c | 4 +- scripts/decode_stacktrace.sh | 3 +- scripts/faddr2line | 33 +++--- tools/testing/selftests/x86/Makefile | 2 +- tools/testing/selftests/x86/test_vdso.c | 123 +++++++++++++++++++++++ 41 files changed, 703 insertions(+), 497 deletions(-) create mode 100644 tools/testing/selftests/x86/test_vdso.c
Documentation/kernel-parameters.txt +0 -3
@@ -1958,9 +1958,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted. kmemcheck=2 (one-shot mode) Default: 2 (one-shot mode) - kstack=N [X86] Print N words from the kernel stack - in oops dumps. - kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs. Default is 0 (don't ignore, but inject #GP)
Documentation/sysctl/kernel.txt +0 -8
@@ -40,7 +40,6 @@ Currently, these files might (depending on your configuration) - hung_task_warnings - kexec_load_disabled - kptr_restrict -- kstack_depth_to_print [ X86 only ] - l2cr [ PPC only ] - modprobe ==> Documentation/debugging-modules.txt - modules_disabled
@@ -395,13 +394,6 @@ When kptr_restrict is set to (2), kernel pointers printed using ============================================================== -kstack_depth_to_print: (X86 only) - -Controls the number of words to print when dumping the raw -kernel stack. - -============================================================== - l2cr: (PPC only) This flag controls the L2 cache of G3 processor boards. If
Documentation/x86/x86_64/boot-options.txt +0 -4
@@ -277,10 +277,6 @@ IOMMU (input/output memory management unit) space might stop working. Use this option if you have devices that are accessed from userspace directly on some PCI host bridge. -Debugging - - kstack=N Print N words from the kernel stack in oops dumps. - Miscellaneous nogbpages
arch/x86/entry/calling.h +22 -11
@@ -90,8 +90,8 @@ For 32-bit we have the following conventions - kernel is built with#define SIZEOF_PTREGS 21*8 - .macro ALLOC_PT_GPREGS_ON_STACK addskip=0 - addq $-(15*8+\addskip), %rsp + .macro ALLOC_PT_GPREGS_ON_STACK + addq $-(15*8), %rsp .endm .macro SAVE_C_REGS_HELPER offset=0 rax=1 rcx=1 r8910=1 r11=1
@@ -147,15 +147,6 @@ For 32-bit we have the following conventions - kernel is built with movq 5*8+\offset(%rsp), %rbx .endm - .macro ZERO_EXTRA_REGS - xorl %r15d, %r15d - xorl %r14d, %r14d - xorl %r13d, %r13d - xorl %r12d, %r12d - xorl %ebp, %ebp - xorl %ebx, %ebx - .endm - .macro RESTORE_C_REGS_HELPER rstor_rax=1, rstor_rcx=1, rstor_r11=1, rstor_r8910=1, rstor_rdx=1 .if \rstor_r11 movq 6*8(%rsp), %r11
@@ -201,6 +192,26 @@ For 32-bit we have the following conventions - kernel is built with .byte 0xf1 .endm +/* +* This is a sneaky trick to help the unwinder find pt_regs on the stack. The +* frame pointer is replaced with an encoded pointer to pt_regs. The encoding +* is just setting the LSB, which makes it an invalid stack address and is also +* a signal to the unwinder that it's a pt_regs pointer in disguise. +* +* NOTE: This macro must be used *after* SAVE_EXTRA_REGS because it corrupts +* the original rbp. +*/ +.macro ENCODE_FRAME_POINTER ptregs_offset=0 +#ifdef CONFIG_FRAME_POINTER + .if \ptregs_offset + leaq \ptregs_offset(%rsp), %rbp + .else + mov %rsp, %rbp + .endif + orq $0x1, %rbp +#endif +.endm + #endif /* CONFIG_X86_64 *//*
arch/x86/entry/entry_32.S +93 -48
439 lines not on this page · raw message
arch/x86/entry/entry_64.S +7 -9
@@ -38,12 +38,6 @@ #include <asm/export.h> #include <linux/err.h> -/* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this. */ -#include <linux/elf-em.h> -#define AUDIT_ARCH_X86_64 (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) -#define __AUDIT_ARCH_64BIT 0x80000000 -#define __AUDIT_ARCH_LE 0x40000000 - .code64 .section .entry.text, "ax"
@@ -469,6 +463,7 @@ END(irq_entries_start) ALLOC_PT_GPREGS_ON_STACK SAVE_C_REGS SAVE_EXTRA_REGS + ENCODE_FRAME_POINTER testb $3, CS(%rsp) jz 1f
@@ -985,6 +980,7 @@ ENTRY(xen_failsafe_callback) ALLOC_PT_GPREGS_ON_STACK SAVE_C_REGS SAVE_EXTRA_REGS + ENCODE_FRAME_POINTER jmp error_exit END(xen_failsafe_callback)
@@ -1028,6 +1024,7 @@ ENTRY(paranoid_entry) cld SAVE_C_REGS 8 SAVE_EXTRA_REGS 8 + ENCODE_FRAME_POINTER 8 movl $1, %ebx movl $MSR_GS_BASE, %ecx rdmsr
@@ -1075,6 +1072,7 @@ ENTRY(error_entry) cld SAVE_C_REGS 8 SAVE_EXTRA_REGS 8 + ENCODE_FRAME_POINTER 8 xorl %ebx, %ebx testb $3, CS+8(%rsp) jz .Lerror_kernelspace
@@ -1257,6 +1255,7 @@ ENTRY(nmi) pushq %r13 /* pt_regs->r13 */ pushq %r14 /* pt_regs->r14 */ pushq %r15 /* pt_regs->r15 */ + ENCODE_FRAME_POINTER /* * At this point we no longer need to worry about stack damage
@@ -1270,11 +1269,10 @@ ENTRY(nmi) /* * Return back to user mode. We must *not* do the normal exit - * work, because we don't want to enable interrupts. Fortunately, - * do_nmi doesn't modify pt_regs. + * work, because we don't want to enable interrupts. */ SWAPGS - jmp restore_c_regs_and_iret + jmp restore_regs_and_iret .Lnmi_from_kernel: /*
arch/x86/entry/vdso/vma.c +3 -7
@@ -161,8 +161,6 @@ static int map_vdso(const struct vdso_image *image, unsigned long addr) } text_start = addr - image->sym_vvar_start; - current->mm->context.vdso = (void __user *)text_start; - current->mm->context.vdso_image = image;/* * MAYWRITE to allow gdb to COW and set breakpoints
@@ -189,14 +187,12 @@ static int map_vdso(const struct vdso_image *image, unsigned long addr)if (IS_ERR (vma)) { ret =PTR_ERR (vma);do_munmap (mm, text_start, image->size); + }else { + current->mm->context.vdso = (void __user *)text_start; + current->mm->context.vdso_image = image; } up_fail: -if (ret) { - current->mm->context.vdso =NULL ; - current->mm->context.vdso_image =NULL ; - } -up_write (&mm->mmap_sem);return ret; }
arch/x86/events/intel/pt.c +19 -26
63 lines not on this page · raw message
arch/x86/include/asm/cpufeatures.h +3 -0
@@ -226,6 +226,7 @@#define X86_FEATURE_RDSEED ( 9*32+18)/* The RDSEED instruction */ #define X86_FEATURE_ADX ( 9*32+19)/* The ADCX and ADOX instructions */ #define X86_FEATURE_SMAP ( 9*32+20)/* Supervisor Mode Access Prevention */ +#define X86_FEATURE_AVX512IFMA ( 9*32+21)/* AVX-512 Integer Fused Multiply-Add instructions */ #define X86_FEATURE_CLFLUSHOPT ( 9*32+23)/* CLFLUSHOPT instruction */ #define X86_FEATURE_CLWB ( 9*32+24)/* CLWB instruction */ #define X86_FEATURE_AVX512PF ( 9*32+26)/* AVX-512 Prefetch */
@@ -279,8 +280,10 @@#define X86_FEATURE_AVIC (15*32+13)/* Virtual Interrupt Controller */ /* Intel-defined CPU features, CPUID level 0x00000007:0 (ecx), word 16 */ +#define X86_FEATURE_AVX512VBMI (16*32+ 1)/* AVX512 Vector Bit Manipulation instructions*/ #define X86_FEATURE_PKU (16*32+ 3)/* Protection Keys for Userspace */ #define X86_FEATURE_OSPKE (16*32+ 4)/* OS Protection Keys Enable */ +#define X86_FEATURE_RDPID (16*32+ 22)/* RDPID instruction */ /* AMD-defined CPU features, CPUID level 0x80000007 (ebx), word 17 */ #define X86_FEATURE_OVERFLOW_RECOV (17*32+0)/* MCA overflow recovery support */
arch/x86/include/asm/kdebug.h +0 -1
@@ -21,7 +21,6 @@ enum die_val { DIE_NMIUNKNOWN, }; -extern void printk_address (unsigned long address);extern void die (const char *,struct pt_regs *,long );extern int __must_check __die (const char *,struct pt_regs *,long );extern void show_stack_regs (struct pt_regs *regs);
arch/x86/include/asm/processor.h +14 -0
@@ -137,6 +137,17 @@ struct cpuinfo_x86 {u32 microcode; }; +struct cpuid_regs { +u32 eax, ebx, ecx, edx; +}; + +enum cpuid_regs_idx { +CPUID_EAX =0 , +CPUID_EBX , +CPUID_ECX , +CPUID_EDX , +}; +#define X86_VENDOR_INTEL 0#define X86_VENDOR_CYRIX 1#define X86_VENDOR_AMD 2
@@ -178,6 +189,9 @@ extern void identify_secondary_cpu(struct cpuinfo_x86 *);extern void print_cpu_info (struct cpuinfo_x86 *);void print_cpu_msr (struct cpuinfo_x86 *);extern void init_scattered_cpuid_features (struct cpuinfo_x86 *c); +extern u32 get_scattered_cpuid_leaf (unsigned int level, +unsigned int sub_leaf, +enum cpuid_regs_idx reg);extern unsigned int init_intel_cacheinfo (struct cpuinfo_x86 *c);extern void init_amd_cacheinfo (struct cpuinfo_x86 *c);
arch/x86/include/asm/stacktrace.h +1 -7
@@ -30,8 +30,7 @@ bool in_task_stack(unsigned long *stack, struct task_struct *task,int get_stack_info (unsigned long *stack,struct task_struct *task,struct stack_info *info,unsigned long *visit_mask); -void stack_type_str (enum stack_type type,const char **begin, -const char **end); +const char *stack_type_name (enum stack_type type);static inline bool on_stack (struct stack_info *info,void *addr,size_t len) {
@@ -43,8 +42,6 @@ static inline bool on_stack(struct stack_info *info, void *addr, size_t len) addr + len > begin && addr + len <= end); } -extern int kstack_depth_to_print; -#ifdef CONFIG_X86_32 #define STACKSLOTS_PER_LINE 8#else
@@ -86,9 +83,6 @@ get_stack_pointer(struct task_struct *task, struct pt_regs *regs)void show_trace_log_lvl (struct task_struct *task,struct pt_regs *regs,unsigned long *stack,char *log_lvl); -void show_stack_log_lvl (struct task_struct *task,struct pt_regs *regs, -unsigned long *sp,char *log_lvl); -extern unsigned int code_bytes;/* The form of the top of the frame on the stack */
arch/x86/include/asm/unwind.h +15 -1
@@ -13,6 +13,7 @@ struct unwind_state {int graph_idx;#ifdef CONFIG_FRAME_POINTER unsigned long *bp; +struct pt_regs *regs;#else unsigned long *sp;#endif
@@ -47,7 +48,15 @@ unsigned long *unwind_get_return_address_ptr(struct unwind_state *state)if (unwind_done (state))return NULL ; - return state->bp + 1; + return state->regs ? &state->regs->ip : state->bp + 1; +} + +static inline struct pt_regs *unwind_get_entry_regs (struct unwind_state *state) +{ +if (unwind_done (state)) +return NULL ; + +return state->regs; }#else /* !CONFIG_FRAME_POINTER */
@@ -58,6 +67,11 @@ unsigned long *unwind_get_return_address_ptr(struct unwind_state *state)return NULL ; } +static inline struct pt_regs *unwind_get_entry_regs (struct unwind_state *state) +{ +return NULL ; +} +#endif /* CONFIG_FRAME_POINTER */ #endif /* _ASM_X86_UNWIND_H */
arch/x86/include/asm/vgtod.h +6 -1
@@ -89,8 +89,13 @@ static inline unsigned int __getcpu(void)* works on all CPUs. This is volatile so that it orders * correctly wrt barrier() and to keep gcc from cleverly * hoisting it out of the calling function. +* +* If RDPID is available, use it. */ - asmvolatile ("lsl %1,%0" :"=r" (p) :"r" (__PER_CPU_SEG)); +alternative_io ("lsl %[p],%[seg]" , +".byte 0xf3,0x0f,0xc7,0xf8" ,/* RDPID %eax/rax */ + X86_FEATURE_RDPID, + [p] "=a" (p), [seg] "r" (__PER_CPU_SEG)); return p; }
arch/x86/include/uapi/asm/prctl.h +3 -5
@@ -6,10 +6,8 @@#define ARCH_GET_FS 0x1003#define ARCH_GET_GS 0x1004 -#ifdef CONFIG_CHECKPOINT_RESTORE -# define ARCH_MAP_VDSO_X32 0x2001 -# define ARCH_MAP_VDSO_32 0x2002 -# define ARCH_MAP_VDSO_64 0x2003 -#endif +#define ARCH_MAP_VDSO_X32 0x2001 +#define ARCH_MAP_VDSO_32 0x2002 +#define ARCH_MAP_VDSO_64 0x2003#endif /* _ASM_X86_PRCTL_H */
arch/x86/kernel/cpu/scattered.c +38 -19
77 lines not on this page · raw message
arch/x86/kernel/cpuid.c +0 -4
@@ -46,10 +46,6 @@static struct class *cpuid_class; -struct cpuid_regs { -u32 eax, ebx, ecx, edx; -}; -static void cpuid_smp_cpuid (void *cmd_block) {struct cpuid_regs *cmd = (struct cpuid_regs *)cmd_block;
arch/x86/kernel/dumpstack.c +28 -40
136 lines not on this page · raw message
arch/x86/kernel/dumpstack_32.c +12 -44
82 lines not on this page · raw message
arch/x86/kernel/dumpstack_64.c +12 -67
107 lines not on this page · raw message
arch/x86/kernel/fpu/xstate.c +2 -0
@@ -65,6 +65,7 @@ void fpu__xstate_clear_all_cpu_caps(void)setup_clear_cpu_cap (X86_FEATURE_AVX );setup_clear_cpu_cap (X86_FEATURE_AVX2 );setup_clear_cpu_cap (X86_FEATURE_AVX512F ); +setup_clear_cpu_cap (X86_FEATURE_AVX512IFMA );setup_clear_cpu_cap (X86_FEATURE_AVX512PF );setup_clear_cpu_cap (X86_FEATURE_AVX512ER );setup_clear_cpu_cap (X86_FEATURE_AVX512CD );
@@ -73,6 +74,7 @@ void fpu__xstate_clear_all_cpu_caps(void)setup_clear_cpu_cap (X86_FEATURE_AVX512VL );setup_clear_cpu_cap (X86_FEATURE_MPX );setup_clear_cpu_cap (X86_FEATURE_XGETBV1 ); +setup_clear_cpu_cap (X86_FEATURE_AVX512VBMI );setup_clear_cpu_cap (X86_FEATURE_PKU );setup_clear_cpu_cap (X86_FEATURE_AVX512_4VNNIW );setup_clear_cpu_cap (X86_FEATURE_AVX512_4FMAPS );
arch/x86/kernel/head_32.S +29 -20
159 lines not on this page · raw message
arch/x86/kernel/head_64.S +26 -26
106 lines not on this page · raw message
arch/x86/kernel/process_32.c +3 -4
@@ -72,10 +72,9 @@ void __show_regs(struct pt_regs *regs, int all)savesegment (gs, gs); } -printk (KERN_DEFAULT "EIP: %04x:[<%08lx>] EFLAGS: %08lx CPU: %d\n" , - (u16 )regs->cs, regs->ip, regs->flags, -smp_processor_id ()); -print_symbol ("EIP is at %s\n" , regs->ip); +printk (KERN_DEFAULT "EIP: %pS\n" , (void *)regs->ip); +printk (KERN_DEFAULT "EFLAGS: %08lx CPU: %d\n" , regs->flags, +smp_processor_id ());printk (KERN_DEFAULT "EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n" , regs->ax, regs->bx, regs->cx, regs->dx);
arch/x86/kernel/process_64.c +9 -4
@@ -61,10 +61,15 @@ void __show_regs(struct pt_regs *regs, int all)unsigned int fsindex, gsindex;unsigned int ds, cs, es; -printk (KERN_DEFAULT "RIP: %04lx:[<%016lx>] " , regs->cs &0xffff , regs->ip); -printk_address (regs->ip); -printk (KERN_DEFAULT "RSP: %04lx:%016lx EFLAGS: %08lx\n" , regs->ss, - regs->sp, regs->flags); +printk (KERN_DEFAULT "RIP: %04lx:%pS\n" , regs->cs &0xffff , + (void *)regs->ip); +printk (KERN_DEFAULT "RSP: %04lx:%016lx EFLAGS: %08lx" , regs->ss, + regs->sp, regs->flags); +if (regs->orig_ax !=-1 ) +pr_cont (" ORIG_RAX: %016lx\n" , regs->orig_ax); +else +pr_cont ("\n" ); +printk (KERN_DEFAULT "RAX: %016lx RBX: %016lx RCX: %016lx\n" , regs->ax, regs->bx, regs->cx); printk(KERN_DEFAULT "RDX: %016lx RSI: %016lx RDI: %016lx\n",
arch/x86/kernel/smpboot.c +1 -3
@@ -964,9 +964,7 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)int cpu0_nmi_registered =0 ;unsigned long timeout; - idle->thread.sp = (unsigned long ) (((struct pt_regs *) - (THREAD_SIZE +task_stack_page (idle))) -1 ); - + idle->thread.sp = (unsigned long )task_pt_regs (idle); early_gdt_descr.address = (unsigned long )get_cpu_gdt_table (cpu); initial_code = (unsigned long )start_secondary; initial_stack = idle->thread.sp;
arch/x86/kernel/unwind_frame.c +152 -9
203 lines not on this page · raw message
arch/x86/kernel/vmlinux.lds.S +1 -1
@@ -91,10 +91,10 @@ SECTIONS /* Text and read-only data */ .text : AT(ADDR(.text) - LOAD_OFFSET) { _text = .; + _stext = .; /* bootstrapping code */ HEAD_TEXT . = ALIGN(8); - _stext = .; TEXT_TEXT SCHED_TEXT CPUIDLE_TEXT
arch/x86/lib/copy_user_64.S +0 -47
53 lines not on this page · raw message
arch/x86/lib/usercopy.c +49 -0
52 lines not on this page · raw message
arch/x86/lib/usercopy_32.c +0 -49
52 lines not on this page · raw message
arch/x86/mm/fault.c +1 -2
@@ -679,8 +679,7 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code,printk (KERN_CONT "paging request" );printk (KERN_CONT " at %p\n" , (void *) address); -printk (KERN_ALERT "IP:" ); -printk_address (regs->ip); +printk (KERN_ALERT "IP: %pS\n" , (void *)regs->ip);dump_pagetable (address); }
arch/x86/platform/uv/uv_nmi.c +2 -2
@@ -387,8 +387,8 @@ static void uv_nmi_dump_cpu_ip_hdr(void)/* Dump Instruction Pointer info */ static void uv_nmi_dump_cpu_ip (int cpu,struct pt_regs *regs) { -pr_info ("UV: %4d %6d %-32.32s " , cpu, current->pid, current->comm); -printk_address (regs->ip); +pr_info ("UV: %4d %6d %-32.32s %pS" , + cpu, current->pid, current->comm, (void *)regs->ip); }/*
arch/x86/tools/insn_sanity.c +2 -1
@@ -269,7 +269,8 @@ int main(int argc, char **argv) insns++; } - fprintf(stdout, "%s: %s: decoded and checked %d %s instructions with %d errors (seed:0x%x)\n", + fprintf((errors) ? stderr : stdout, + "%s: %s: decoded and checked %d %s instructions with %d errors (seed:0x%x)\n", prog, (errors) ? "Failure" : "Success", insns,
arch/x86/tools/test_get_len.c +1 -1
@@ -167,7 +167,7 @@ int main(int argc, char **argv)fprintf (stderr,"Warning: decoded and checked %d" " instructions with %d warnings\n" , insns, warnings); else - fprintf(stderr, "Succeed: decoded and checked %d" + fprintf(stdout, "Success: decoded and checked %d" " instructions\n", insns);return 0 ; }
kernel/sysctl.c +0 -7
@@ -990,13 +990,6 @@ static struct ctl_table kern_table[] = { .proc_handler = proc_dointvec, }, { - .procname = "kstack_depth_to_print", - .data = &kstack_depth_to_print, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec, - }, - { .procname = "io_delay_type", .data = &io_delay_type, .maxlen = sizeof(int),
mm/page_alloc.c +2 -2
@@ -6399,8 +6399,8 @@ unsigned long free_reserved_area(void *start, void *end, int poison, char *s) }if (pages && s) -pr_info ("Freeing %s memory: %ldK (%p - %p)\n" , - s, pages << (PAGE_SHIFT -10 ), start, end); +pr_info ("Freeing %s memory: %ldK\n" , + s, pages << (PAGE_SHIFT -10 ));return pages; }
scripts/decode_stacktrace.sh +2 -1
@@ -139,7 +139,8 @@ handle_line() { while read line; do # Let's see if we have an address in the line - if [[ $line =~ \[\<([^]]+)\>\] ]]; then + if [[ $line =~ \[\<([^]]+)\>\] ]] || + [[ $line =~ [^+\ ]+\+0x[0-9a-f]+/0x[0-9a-f]+ ]]; then # Translate address to line numbers handle_line "$line" # Is it a code line?
scripts/faddr2line +21 -12
@@ -105,9 +105,18 @@ __faddr2line() { # In rare cases there might be duplicates. while read symbol; do local fields=($symbol) - local sym_base=0x${fields[1]} - local sym_size=${fields[2]} - local sym_type=${fields[3]} + local sym_base=0x${fields[0]} + local sym_type=${fields[1]} + local sym_end=0x${fields[3]} + + # calculate the size + local sym_size=$(($sym_end - $sym_base)) + if [[ -z $sym_size ]] || [[ $sym_size -le 0 ]]; then + warn "bad symbol size: base: $sym_base end: $sym_end" + DONE=1 + return + fi + sym_size=0x$(printf %x $sym_size) # calculate the address local addr=$(($sym_base + $offset))
@@ -116,26 +125,26 @@ __faddr2line() { DONE=1 return fi - local hexaddr=0x$(printf %x $addr) + addr=0x$(printf %x $addr) # weed out non-function symbols - if [[ $sym_type != "FUNC" ]]; then + if [[ $sym_type != t ]] && [[ $sym_type != T ]]; then [[ $print_warnings = 1 ]] && - echo "skipping $func address at $hexaddr due to non-function symbol" + echo "skipping $func address at $addr due to non-function symbol of type '$sym_type'" continue fi # if the user provided a size, make sure it matches the symbol's size if [[ -n $size ]] && [[ $size -ne $sym_size ]]; then [[ $print_warnings = 1 ]] && - echo "skipping $func address at $hexaddr due to size mismatch ($size != $sym_size)" + echo "skipping $func address at $addr due to size mismatch ($size != $sym_size)" continue; fi # make sure the provided offset is within the symbol's range if [[ $offset -gt $sym_size ]]; then [[ $print_warnings = 1 ]] && - echo "skipping $func address at $hexaddr due to size mismatch ($offset > $sym_size)" + echo "skipping $func address at $addr due to size mismatch ($offset > $sym_size)" continue fi
@@ -143,12 +152,12 @@ __faddr2line() { [[ $FIRST = 0 ]] && echo FIRST=0 - local hexsize=0x$(printf %x $sym_size) - echo "$func+$offset/$hexsize:" - addr2line -fpie $objfile $hexaddr | sed "s; $dir_prefix\(\./\)*; ;" + # pass real address to addr2line + echo "$func+$offset/$sym_size:" + addr2line -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;" DONE=1 - done < <(readelf -sW $objfile | awk -v f=$func '$8 == f {print}') + done < <(nm -n $objfile | awk -v fn=$func '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, $1 }') } [[ $# -lt 2 ]] && usage
tools/testing/selftests/x86/Makefile +1 -1
@@ -6,7 +6,7 @@ include ../lib.mk TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt ptrace_syscall test_mremap_vdso \ check_initial_reg_state sigreturn ldt_gdt iopl \ - protection_keys + protection_keys test_vdso TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault test_syscall_vdso unwind_vdso \ test_FCMOV test_FCOMI test_FISTTP \ vdso_restorer
tools/testing/selftests/x86/test_vdso.c new file +123 -0
123 lines not on this page · raw message