csky: fixup abiv2 mmap(... O_SYNC) failed.
Subsystems (5)
[email protected]
maintainerPATCH 1/14 csky: fixup abiv2 mmap(... O_SYNC) failed.
From: Guo Ren <[email protected]>
Glibc function mmap(... O_SYNC) will make page to _PAGE_UNCACHE + _PAGE_SO and strong-order page couldn't support unalignment access. So remove _PAGE_SO from _PAGE_UNCACHE, also sync abiv1 with the macro of _PAGE_SO.
--- arch/csky/abiv1/inc/abi/pgtable-bits.h | 1 + arch/csky/abiv2/inc/abi/pgtable-bits.h | 2 +- arch/csky/mm/ioremap.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-)
arch/csky/abiv1/inc/abi/pgtable-bits.h +1 -0
@@ -26,6 +26,7 @@#define _PAGE_CACHE (3<<9)#define _PAGE_UNCACHE (2<<9) +#define _PAGE_SO _PAGE_UNCACHE#define _CACHE_MASK (7<<9)
arch/csky/abiv2/inc/abi/pgtable-bits.h +1 -1
@@ -32,6 +32,6 @@#define _CACHE_MASK _PAGE_CACHE#define _CACHE_CACHED (_PAGE_VALID | _PAGE_CACHE | _PAGE_BUF) -#define _CACHE_UNCACHED (_PAGE_VALID | _PAGE_SO) +#define _CACHE_UNCACHED (_PAGE_VALID)#endif /* __ASM_CSKY_PGTABLE_BITS_H */
arch/csky/mm/ioremap.c +1 -1
@@ -30,7 +30,7 @@ void __iomem *ioremap(phys_addr_t addr, size_t size) vaddr = (unsigned long )area->addr; prot =__pgprot (_PAGE_PRESENT | __READABLE | __WRITEABLE | - _PAGE_GLOBAL | _CACHE_UNCACHED); + _PAGE_GLOBAL | _CACHE_UNCACHED | _PAGE_SO);if (ioremap_page_range (vaddr, vaddr + size, addr, prot)) {free_vm_area (area);
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 2/14 csky: bugfix gdb coredump error.
From: Guo Ren <[email protected]>
In gdb/bfd elf32-csky.c, csky_elf_grok_prstatus() use fixed size of elf_prstatus. It's 148 for abiv1 and 220 for abiv2, the size is enough for coredump and no need full sizeof(struct pt_regs).
--- arch/csky/include/asm/elf.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/csky/include/asm/elf.h +6 -1
@@ -31,7 +31,12 @@ typedef unsigned long elf_greg_t;typedef struct user_fp elf_fpregset_t ; -#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) +/* +* In gdb/bfd elf32-csky.c, csky_elf_grok_prstatus() use fixed size of +* elf_prstatus. It's 148 for abiv1 and 220 for abiv2, the size is enough +* for coredump and no need full sizeof(struct pt_regs). +*/ +#define ELF_NGREG ((sizeof(struct pt_regs) / sizeof(elf_greg_t)) - 2)typedef elf_greg_t elf_gregset_t [ELF_NGREG ];
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 3/14 csky: fixup remove vdsp implement for kernel.
In reply to [email protected]From: Guo Ren <[email protected]>
The vr regs for vdsp only saved in task_switch not in every exception trap-in. The memcpy with vdsp instructions will destroy the vr regs for user space applications.
--- arch/csky/abiv2/memcpy.S | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
arch/csky/abiv2/memcpy.S +1 -7
@@ -27,13 +27,7 @@ ENTRY(memcpy) LABLE_ALIGN .L_len_larger_16bytes: -#if defined(__CSKY_VDSPV2__) - vldx.8 vr0, (r1), r19 - PRE_BNEZAD (r18) - addi r1, 16 - vstx.8 vr0, (r0), r19 - addi r0, 16 -#elif defined(__CK860__) +#if defined(__CK860__) ldw r3, (r1, 0) stw r3, (r0, 0) ldw r3, (r1, 4)
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 4/14 csky: remove syscall_exit_work
In reply to [email protected]From: Guo Ren <[email protected]>
Remove syscall_exit_work and union all to ret_from_exception.
--- arch/csky/kernel/entry.S | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
arch/csky/kernel/entry.S +4 -12
@@ -183,18 +183,10 @@ ENTRY(csky_systemcall) #endif stw a0, (sp, LSAVE_A0) /* Save return value */ - movi a0, 1 /* leave system call */ - mov a1, sp /* sp = pt_regs pointer */ - jbsr syscall_trace - -syscall_exit_work: - ld syscallid, (sp, LSAVE_PSR) - btsti syscallid, 31 - bt 2f - - jmpi resume_userspace - -2: RESTORE_ALL + movi a0, 1 /* leave system call */ + mov a1, sp /* right now, sp --> pt_regs */ + jbsr syscall_trace + br ret_from_exception ENTRY(ret_from_kernel_thread) jbsr schedule_tail
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 5/14 csky: fixup save hi,lo,dspcr regs in switch_stack.
In reply to [email protected]From: Guo Ren <[email protected]>
HI, LO, DSPCR registers are 807/810 related regs and no need for 610/860. All of the regs must be saved in pt_regs and switch_stack. This patch fixup saving dspcr reg in switch_stack and pt_regs.
--- arch/csky/abiv1/inc/abi/switch_context.h | 17 ++++++++++++++ arch/csky/abiv2/inc/abi/entry.h | 28 ++++++++++++++++++++--- arch/csky/abiv2/inc/abi/switch_context.h | 32 ++++++++++++++++++++++++++ arch/csky/include/asm/processor.h | 3 +-- arch/csky/include/uapi/asm/ptrace.h | 39 +------------------------------- arch/csky/kernel/asm-offsets.c | 2 -- arch/csky/kernel/entry.S | 22 ------------------ arch/csky/kernel/ptrace.c | 4 +++- 8 files changed, 79 insertions(+), 68 deletions(-) create mode 100644 arch/csky/abiv1/inc/abi/switch_context.h create mode 100644 arch/csky/abiv2/inc/abi/switch_context.h
arch/csky/abiv1/inc/abi/switch_context.h new file +17 -0
@@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ABI_CSKY_PTRACE_H +#define __ABI_CSKY_PTRACE_H + +struct switch_stack { +unsigned long r8; +unsigned long r9; +unsigned long r10; +unsigned long r11; +unsigned long r12; +unsigned long r13; +unsigned long r14; +unsigned long r15; +}; +#endif /* __ABI_CSKY_PTRACE_H */
arch/csky/abiv2/inc/abi/entry.h +25 -3
@@ -57,6 +57,8 @@ stw lr, (sp, 60) mflo lr stw lr, (sp, 64) + mfcr lr, cr14 + stw lr, (sp, 68) #endif subi sp, 80 .endm
@@ -77,6 +79,8 @@ mthi a0 ldw a0, (sp, 144) mtlo a0 + ldw a0, (sp, 148) + mtcr a0, cr14 #endif ldw a0, (sp, 24)
@@ -93,9 +97,9 @@ .endm .macro SAVE_SWITCH_STACK - subi sp, 64 + subi sp, 64 stm r4-r11, (sp) - stw r15, (sp, 32) + stw lr, (sp, 32) stw r16, (sp, 36) stw r17, (sp, 40) stw r26, (sp, 44)
@@ -103,11 +107,29 @@ stw r28, (sp, 52) stw r29, (sp, 56) stw r30, (sp, 60) +#ifdef CONFIG_CPU_HAS_HILO + subi sp, 16 + mfhi lr + stw lr, (sp, 0) + mflo lr + stw lr, (sp, 4) + mfcr lr, cr14 + stw lr, (sp, 8) +#endif .endm .macro RESTORE_SWITCH_STACK +#ifdef CONFIG_CPU_HAS_HILO + ldw lr, (sp, 0) + mthi lr + ldw lr, (sp, 4) + mtlo lr + ldw lr, (sp, 8) + mtcr lr, cr14 + addi sp, 16 +#endif ldm r4-r11, (sp) - ldw r15, (sp, 32) + ldw lr, (sp, 32) ldw r16, (sp, 36) ldw r17, (sp, 40) ldw r26, (sp, 44)
arch/csky/abiv2/inc/abi/switch_context.h new file +32 -0
@@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ABI_CSKY_PTRACE_H +#define __ABI_CSKY_PTRACE_H + +struct switch_stack { +#ifdef CONFIG_CPU_HAS_HILO +unsigned long rhi; +unsigned long rlo; +unsigned long cr14; +unsigned long pad; +#endif +unsigned long r4; +unsigned long r5; +unsigned long r6; +unsigned long r7; +unsigned long r8; +unsigned long r9; +unsigned long r10; +unsigned long r11; + +unsigned long r15; +unsigned long r16; +unsigned long r17; +unsigned long r26; +unsigned long r27; +unsigned long r28; +unsigned long r29; +unsigned long r30; +}; +#endif /* __ABI_CSKY_PTRACE_H */
arch/csky/include/asm/processor.h +1 -2
@@ -11,6 +11,7 @@#include <asm/cache.h> #include <abi/reg_ops.h> #include <abi/regdef.h> +#include <abi/switch_context.h> #ifdef CONFIG_CPU_HAS_FPU #include <abi/fpu.h> #endif
@@ -50,8 +51,6 @@ struct thread_struct {unsigned long ksp;/* kernel stack pointer */ unsigned long sr;/* saved status register */ unsigned long esp0;/* points to SR of stack frame */ -unsigned long hi; -unsigned long lo;/* Other stuff associated with the thread. */ unsigned long address;/* Last user fault */
arch/csky/include/uapi/asm/ptrace.h +1 -38
@@ -36,7 +36,7 @@ struct pt_regs {unsigned long rhi;unsigned long rlo; -unsigned long pad;/* reserved */ +unsigned long dcsr;#endif };
@@ -48,43 +48,6 @@ struct user_fp {unsigned long reserved; }; -/* -* Switch stack for switch_to after push pt_regs. -* -* ABI_CSKYV2: r4 ~ r11, r15 ~ r17, r26 ~ r30; -* ABI_CSKYV1: r8 ~ r14, r15; -*/ -struct switch_stack { -#if defined(__CSKYABIV2__) -unsigned long r4; -unsigned long r5; -unsigned long r6; -unsigned long r7; -unsigned long r8; -unsigned long r9; -unsigned long r10; -unsigned long r11; -#else -unsigned long r8; -unsigned long r9; -unsigned long r10; -unsigned long r11; -unsigned long r12; -unsigned long r13; -unsigned long r14; -#endif -unsigned long r15; -#if defined(__CSKYABIV2__) -unsigned long r16; -unsigned long r17; -unsigned long r26; -unsigned long r27; -unsigned long r28; -unsigned long r29; -unsigned long r30; -#endif -}; -#ifdef __KERNEL__#define PS_S 0x80000000/* Supervisor Mode */
arch/csky/kernel/asm-offsets.c +0 -2
@@ -24,8 +24,6 @@ int main(void) DEFINE(THREAD_FESR, offsetof(struct thread_struct, user_fp.fesr)); DEFINE(THREAD_FCR, offsetof(struct thread_struct, user_fp.fcr)); DEFINE(THREAD_FPREG, offsetof(struct thread_struct, user_fp.vr)); -DEFINE (THREAD_DSPHI , offsetof(struct thread_struct , hi)); -DEFINE (THREAD_DSPLO , offsetof(struct thread_struct , lo));/* offsets into the thread_info struct */ DEFINE (TINFO_FLAGS , offsetof(struct thread_info , flags));
arch/csky/kernel/entry.S +0 -22
@@ -346,34 +346,12 @@ ENTRY(__switch_to) stw sp, (a3, THREAD_KSP) -#ifdef CONFIG_CPU_HAS_HILO - lrw r10, THREAD_DSPHI - add r10, a3 - mfhi r6 - mflo r7 - stw r6, (r10, 0) /* THREAD_DSPHI */ - stw r7, (r10, 4) /* THREAD_DSPLO */ - mfcr r6, cr14 - stw r6, (r10, 8) /* THREAD_DSPCSR */ -#endif - /* Set up next process to run */ lrw a3, TASK_THREAD addu a3, a1 ldw sp, (a3, THREAD_KSP) /* Set next kernel sp */ -#ifdef CONFIG_CPU_HAS_HILO - lrw r10, THREAD_DSPHI - add r10, a3 - ldw r6, (r10, 8) /* THREAD_DSPCSR */ - mtcr r6, cr14 - ldw r6, (r10, 0) /* THREAD_DSPHI */ - ldw r7, (r10, 4) /* THREAD_DSPLO */ - mthi r6 - mtlo r7 -#endif - ldw a2, (a3, THREAD_SR) /* Set next PSR */ mtcr a2, psr
arch/csky/kernel/ptrace.c +3 -1
@@ -95,7 +95,9 @@ static int gpr_set(struct task_struct *target,return ret; regs.sr =task_pt_regs (target)->sr; - +#ifdef CONFIG_CPU_HAS_HILO + regs.dcsr =task_pt_regs (target)->dcsr; +#endif task_thread_info (target)->tp_value = regs.tls; *task_pt_regs (target) = regs;
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 7/14 csky: CPU-hotplug supported for SMP
In reply to [email protected]From: Guo Ren <[email protected]>
This is a simple implement of CPU-hotplug for power saving. CPU use wait instruction to enter power saving mode and waiting for IPI wakeup signal.
--- arch/csky/Kconfig | 9 ++++++ arch/csky/include/asm/smp.h | 4 +++ arch/csky/kernel/smp.c | 71 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 69 insertions(+), 15 deletions(-)
arch/csky/Kconfig +9 -0
@@ -198,6 +198,15 @@ config RAM_BASE hex "DRAM start addr (the same with memory-section in dts)" default 0x0 +config HOTPLUG_CPU + bool "Support for hot-pluggable CPUs" + select GENERIC_IRQ_MIGRATION + depends on SMP + help + Say Y here to allow turning CPUs off and on. CPUs can be + controlled through /sys/devices/system/cpu/cpu1/hotplug/target. + + Say N if you want to disable CPU hotplug. endmenu source "kernel/Kconfig.hz"
arch/csky/include/asm/smp.h +4 -0
@@ -21,6 +21,10 @@ void __init set_send_ipi(void (*func)(const struct cpumask *mask), int irq);#define raw_smp_processor_id () (current_thread_info()->cpu) +int __cpu_disable (void ); + +void __cpu_die (unsigned int cpu); +#endif /* CONFIG_SMP */ #endif /* __ASM_CSKY_SMP_H */
arch/csky/kernel/smp.c +56 -15
113 lines not on this page · raw message
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 8/14 csky: stacktrace supported.
In reply to [email protected]From: Guo Ren <[email protected]>
The gcc option "-mbacktrace" will push fp(r8),lr into stack and we could unwind the stack with:
fp = *fp lr = (unsigned int *)fp[1]
--- arch/csky/Kconfig | 3 ++ arch/csky/Makefile | 4 +++ arch/csky/include/asm/thread_info.h | 4 +++ arch/csky/kernel/Makefile | 1 + arch/csky/kernel/process.c | 29 +++++++++++-------- arch/csky/kernel/stacktrace.c | 57 +++++++++++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 arch/csky/kernel/stacktrace.c
arch/csky/Kconfig +3 -0
@@ -94,6 +94,9 @@ config MMU config RWSEM_GENERIC_SPINLOCK def_bool y +config STACKTRACE_SUPPORT + def_bool y + config TIME_LOW_RES def_bool y
arch/csky/Makefile +4 -0
@@ -47,6 +47,10 @@ ifeq ($(CSKYABI),abiv2) KBUILD_CFLAGS += -mno-stack-size endif +ifdef CONFIG_STACKTRACE +KBUILD_CFLAGS += -mbacktrace +endif + abidirs := $(patsubst %,arch/csky/%/,$(CSKYABI)) KBUILD_CFLAGS += $(patsubst %,-I$(srctree)/%inc,$(abidirs))
arch/csky/include/asm/thread_info.h +4 -0
@@ -10,6 +10,7 @@#include <asm/types.h> #include <asm/page.h> #include <asm/processor.h> +#include <abi/switch_context.h> struct thread_info {struct task_struct *task;
@@ -36,6 +37,9 @@ struct thread_info {#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) +#define thread_saved_fp (tsk) \ + ((unsigned long)(((struct switch_stack *)(tsk->thread.ksp))->r8)) +static inline struct thread_info *current_thread_info (void ) {unsigned long sp;
arch/csky/kernel/Makefile +1 -0
@@ -6,3 +6,4 @@ obj-y += process.o cpu-probe.o ptrace.o dumpstack.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_SMP) += smp.o +obj-$(CONFIG_STACKTRACE) += stacktrace.o
arch/csky/kernel/process.c +17 -12
@@ -93,26 +93,31 @@ int dump_task_regs(struct task_struct *tsk, elf_gregset_t *pr_regs)unsigned long get_wchan (struct task_struct *p) { -unsigned long esp, pc; -unsigned long stack_page; +unsigned long lr; +unsigned long *fp, *stack_start, *stack_end;int count =0 ;if (!p || p == current || p->state ==TASK_RUNNING )return 0 ; - stack_page = (unsigned long )p; - esp = p->thread.esp0; + stack_start = (unsigned long *)end_of_stack (p); + stack_end = (unsigned long *)(task_stack_page (p) +THREAD_SIZE ); + + fp = (unsigned long *)thread_saved_fp (p);do { -if (esp < stack_page+sizeof (struct task_struct ) || - esp >=8184 +stack_page) +if (fp < stack_start || fp > stack_end)return 0 ; -/*FIXME: There's may be error here!*/ - pc = ((unsigned long *)esp)[1 ]; -/* FIXME: This depends on the order of these functions. */ -if (!in_sched_functions (pc)) -return pc; - esp = *(unsigned long *) esp; +#ifdef CONFIG_STACKTRACE + lr = fp[1 ]; + fp = (unsigned long *)fp[0 ]; +#else + lr = *fp++; +#endif +if (!in_sched_functions (lr) && +__kernel_text_address (lr)) +return lr; }while (count++ <16 ); +return 0 ; }EXPORT_SYMBOL (get_wchan);
arch/csky/kernel/stacktrace.c new file +57 -0
57 lines not on this page · raw message
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 9/14 csky: optimize kernel panic print.
In reply to [email protected]From: Guo Ren <[email protected]>
Use STACKTRACE to optimize panic print more pretty and align registers printing.
--- arch/csky/kernel/dumpstack.c | 59 ++++++++++++++------------------------------ arch/csky/kernel/ptrace.c | 34 ++++++++++++++----------- arch/csky/mm/fault.c | 4 +-- 3 files changed, 41 insertions(+), 56 deletions(-)
arch/csky/kernel/dumpstack.c +19 -40
@@ -7,60 +7,39 @@ int kstack_depth_to_print = 48;void show_trace (unsigned long *stack) { -unsigned long *endstack; +unsigned long *stack_end; +unsigned long *stack_start; +unsigned long *fp;unsigned long addr; -int i; -pr_info ("Call Trace:\n" ); - addr = (unsigned long )stack +THREAD_SIZE -1 ; - endstack = (unsigned long *)(addr & -THREAD_SIZE ); - i =0 ; -while (stack +1 <= endstack) { - addr = *stack++; -/* -* If the address is either in the text segment of the -* kernel, or in the region which contains vmalloc'ed -* memory, it *may* be the address of a calling -* routine; if so, print it so that someone tracing -* down the cause of the crash will be able to figure -* out the call path that was taken. -*/ -if (__kernel_text_address (addr)) { -#ifndef CONFIG_KALLSYMS -if (i %5 ==0 ) -pr_cont ("\n " ); + addr = (unsigned long ) stack &THREAD_MASK ; + stack_start = (unsigned long *) addr; + stack_end = (unsigned long *) (addr +THREAD_SIZE ); + + fp = stack; +pr_info ("\nCall Trace:" ); + +while (fp > stack_start && fp < stack_end) { +#ifdef CONFIG_STACKTRACE + addr = fp[1 ]; + fp = (unsigned long *) fp[0 ]; +#else + addr = *fp++;#endif -pr_cont (" [<%08lx>] %pS\n" , addr, (void *)addr); - i++; - } +if (__kernel_text_address (addr)) +pr_cont ("\n[<%08lx>] %pS" , addr, (void *)addr); }pr_cont ("\n" ); }void show_stack (struct task_struct *task,unsigned long *stack) { -unsigned long *p; -unsigned long *endstack; -int i; -if (!stack) {if (task) - stack = (unsigned long *)task->thread.esp0; + stack = (unsigned long *)thread_saved_fp (task);else stack = (unsigned long *)&stack; } - endstack = (unsigned long *) - (((unsigned long )stack +THREAD_SIZE -1 ) & -THREAD_SIZE ); -pr_info ("Stack from %08lx:" , (unsigned long )stack); - p = stack; -for (i =0 ; i < kstack_depth_to_print; i++) { -if (p +1 > endstack) -break ; -if (i %8 ==0 ) -pr_cont ("\n " ); -pr_cont (" %08lx" , *p++); - } -pr_cont ("\n" );show_trace (stack); }
arch/csky/kernel/ptrace.c +20 -14
@@ -241,6 +241,7 @@ asmlinkage void syscall_trace(int why, struct pt_regs *regs) regs->regs[SYSTRACE_SAVENUM ] = saved_why; } +extern void show_stack (struct task_struct *task,unsigned long *stack);void show_regs (struct pt_regs *fp) {unsigned long *sp;
@@ -263,35 +264,37 @@ void show_regs(struct pt_regs *fp) (int) (((unsigned long) current) + 2 * PAGE_SIZE)); } -pr_info ("PC: 0x%08lx\n" , (long )fp->pc); +pr_info ("PC: 0x%08lx (%pS)\n" , (long )fp->pc, (void *)fp->pc); +pr_info ("LR: 0x%08lx (%pS)\n" , (long )fp->lr, (void *)fp->lr); +pr_info ("SP: 0x%08lx\n" , (long )fp);pr_info ("orig_a0: 0x%08lx\n" , fp->orig_a0);pr_info ("PSR: 0x%08lx\n" , (long )fp->sr); -pr_info ("a0: 0x%08lx a1: 0x%08lx a2: 0x%08lx a3: 0x%08lx\n" , - fp->a0, fp->a1, fp->a2, fp->a3); +pr_info (" a0: 0x%08lx a1: 0x%08lx a2: 0x%08lx a3: 0x%08lx\n" , + fp->a0, fp->a1, fp->a2, fp->a3);#if defined(__CSKYABIV2__) -pr_info ("r4: 0x%08lx r5: 0x%08lx r6: 0x%08lx r7: 0x%08lx\n" , +pr_info (" r4: 0x%08lx r5: 0x%08lx r6: 0x%08lx r7: 0x%08lx\n" , fp->regs[0 ], fp->regs[1 ], fp->regs[2 ], fp->regs[3 ]); -pr_info ("r8: 0x%08lx r9: 0x%08lx r10: 0x%08lx r11: 0x%08lx\n" , +pr_info (" r8: 0x%08lx r9: 0x%08lx r10: 0x%08lx r11: 0x%08lx\n" , fp->regs[4 ], fp->regs[5 ], fp->regs[6 ], fp->regs[7 ]); -pr_info ("r12 0x%08lx r13: 0x%08lx r15: 0x%08lx\n" , +pr_info ("r12: 0x%08lx r13: 0x%08lx r15: 0x%08lx\n" , fp->regs[8 ], fp->regs[9 ], fp->lr); -pr_info ("r16:0x%08lx r17: 0x%08lx r18: 0x%08lx r19: 0x%08lx\n" , +pr_info ("r16: 0x%08lx r17: 0x%08lx r18: 0x%08lx r19: 0x%08lx\n" , fp->exregs[0 ], fp->exregs[1 ], fp->exregs[2 ], fp->exregs[3 ]); -pr_info ("r20 0x%08lx r21: 0x%08lx r22: 0x%08lx r23: 0x%08lx\n" , +pr_info ("r20: 0x%08lx r21: 0x%08lx r22: 0x%08lx r23: 0x%08lx\n" , fp->exregs[4 ], fp->exregs[5 ], fp->exregs[6 ], fp->exregs[7 ]); -pr_info ("r24 0x%08lx r25: 0x%08lx r26: 0x%08lx r27: 0x%08lx\n" , +pr_info ("r24: 0x%08lx r25: 0x%08lx r26: 0x%08lx r27: 0x%08lx\n" , fp->exregs[8 ], fp->exregs[9 ], fp->exregs[10 ], fp->exregs[11 ]); -pr_info ("r28 0x%08lx r29: 0x%08lx r30: 0x%08lx tls: 0x%08lx\n" , +pr_info ("r28: 0x%08lx r29: 0x%08lx r30: 0x%08lx tls: 0x%08lx\n" , fp->exregs[12 ], fp->exregs[13 ], fp->exregs[14 ], fp->tls); -pr_info ("hi 0x%08lx lo: 0x%08lx\n" , +pr_info (" hi: 0x%08lx lo: 0x%08lx\n" , fp->rhi, fp->rlo);#else -pr_info ("r6: 0x%08lx r7: 0x%08lx r8: 0x%08lx r9: 0x%08lx\n" , +pr_info (" r6: 0x%08lx r7: 0x%08lx r8: 0x%08lx r9: 0x%08lx\n" , fp->regs[0 ], fp->regs[1 ], fp->regs[2 ], fp->regs[3 ]); -pr_info ("r10: 0x%08lx r11: 0x%08lx r12: 0x%08lx r13: 0x%08lx\n" , +pr_info ("r10: 0x%08lx r11: 0x%08lx r12: 0x%08lx r13: 0x%08lx\n" , fp->regs[4 ], fp->regs[5 ], fp->regs[6 ], fp->regs[7 ]); -pr_info ("r14 0x%08lx r1: 0x%08lx r15: 0x%08lx\n" , +pr_info ("r14: 0x%08lx r1: 0x%08lx r15: 0x%08lx\n" , fp->regs[8 ], fp->regs[9 ], fp->lr);#endif
@@ -313,4 +316,7 @@ void show_regs(struct pt_regs *fp)pr_cont ("%08x " , (int ) *sp++); }pr_cont ("\n" ); + +show_stack (NULL , (unsigned long *)fp->regs[4 ]); +return ; }
arch/csky/mm/fault.c +2 -2
@@ -188,8 +188,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,* terminate things with extreme prejudice. */ bust_spinlocks (1 ); -pr_alert ("Unable to %s at vaddr: %08lx, epc: %08lx\n" , - __func__, address, regs->pc); +pr_alert ("Unable to handle kernel paging request at virtual " +"address 0x%08lx, pc: 0x%08lx\n" , address, regs->pc);die_if_kernel ("Oops" , regs, write); out_of_memory:
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 10/14 csky: remove unused members in processor.h
In reply to [email protected]From: Guo Ren <[email protected]>
Cleanup struct cpuinfo_csky and struct thread_struct, remove all esp0 related code. We could get pt_regs from sp and backtrace could use fp in switch_stack.
--- arch/csky/include/asm/processor.h | 12 ------------ arch/csky/kernel/asm-offsets.c | 1 - arch/csky/kernel/entry.S | 12 ------------ arch/csky/kernel/ptrace.c | 4 ---- arch/csky/kernel/signal.c | 2 -- arch/csky/kernel/traps.c | 6 ------ arch/csky/mm/fault.c | 3 --- 7 files changed, 40 deletions(-)
arch/csky/include/asm/processor.h +0 -12
@@ -17,14 +17,7 @@#endif struct cpuinfo_csky { -unsigned long udelay_val;unsigned long asid_cache; -/* -* Capability and feature descriptor structure for CSKY CPU -*/ -unsigned long options; -unsigned int processor_id[4 ]; -unsigned int fpu_id; }__aligned(SMP_CACHE_BYTES) ;extern struct cpuinfo_csky cpu_data[];
@@ -50,11 +43,6 @@ extern struct cpuinfo_csky cpu_data[];struct thread_struct {unsigned long ksp;/* kernel stack pointer */ unsigned long sr;/* saved status register */ -unsigned long esp0;/* points to SR of stack frame */ - -/* Other stuff associated with the thread. */ -unsigned long address;/* Last user fault */ -unsigned long error_code;/* FPU regs */ struct user_fp __aligned(16) user_fp;
arch/csky/kernel/asm-offsets.c +0 -1
@@ -20,7 +20,6 @@ int main(void)/* offsets into the thread struct */ DEFINE (THREAD_KSP , offsetof(struct thread_struct , ksp));DEFINE (THREAD_SR , offsetof(struct thread_struct , sr)); -DEFINE (THREAD_ESP0 , offsetof(struct thread_struct , esp0)); DEFINE(THREAD_FESR, offsetof(struct thread_struct, user_fp.fesr)); DEFINE(THREAD_FCR, offsetof(struct thread_struct, user_fp.fcr)); DEFINE(THREAD_FPREG, offsetof(struct thread_struct, user_fp.vr));
arch/csky/kernel/entry.S +0 -12
@@ -122,16 +122,6 @@ ENTRY(csky_systemcall) psrset ee, ie - /* Stack frame for syscall, origin call set_esp0 */ - mov r12, sp - - bmaski r11, 13 - andn r12, r11 - bgeni r11, 9 - addi r11, 32 - addu r12, r11 - st sp, (r12, 0) - lrw r11, __NR_syscalls cmphs syscallid, r11 /* Check nr of syscall */ bt ret_from_exception
@@ -230,8 +220,6 @@ resume_userspace: 1: RESTORE_ALL exit_work: - mov a0, sp /* Stack address is arg[0] */ - jbsr set_esp0 /* Call C level */ btsti r8, TIF_NEED_RESCHED bt work_resched /* If thread_info->flag is empty, RESTORE_ALL */
arch/csky/kernel/ptrace.c +0 -4
@@ -50,15 +50,11 @@ static void singlestep_enable(struct task_struct *tsk)*/ void user_enable_single_step (struct task_struct *child) { -if (child->thread.esp0 ==0 ) -return ;singlestep_enable (child); }void user_disable_single_step (struct task_struct *child) { -if (child->thread.esp0 ==0 ) -return ;singlestep_disable (child); }
arch/csky/kernel/signal.c +0 -2
@@ -238,8 +238,6 @@ static void do_signal(struct pt_regs *regs, int syscall)if (!user_mode (regs))return ; - current->thread.esp0 = (unsigned long )regs; -/* * If we were from a system call, check for system call restarting... */
arch/csky/kernel/traps.c +0 -6
@@ -106,7 +106,6 @@ void buserr(struct pt_regs *regs)pr_err ("User mode Bus Error\n" );show_regs (regs); - current->thread.esp0 = (unsigned long ) regs;force_sig_fault (SIGSEGV ,0 , (void __user *)regs->pc, current); }
@@ -162,8 +161,3 @@ asmlinkage void trap_c(struct pt_regs *regs) }send_sig (sig, current,0 ); } - -asmlinkage void set_esp0(unsigned long ssp) -{ - current->thread.esp0 = ssp; -}
arch/csky/mm/fault.c +0 -3
@@ -172,8 +172,6 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write, bad_area_nosemaphore:/* User mode accesses just cause a SIGSEGV */ if (user_mode (regs)) { - tsk->thread.address = address; - tsk->thread.error_code = write;force_sig_fault (SIGSEGV , si_code, (void __user *)address, current);return ; }
@@ -207,6 +205,5 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,if (!user_mode (regs)) goto no_context; - tsk->thread.address = address;force_sig_fault (SIGBUS ,BUS_ADRERR , (void __user *)address, current); }
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 11/14 csky: basic ftrace supported
In reply to [email protected]From: Guo Ren <[email protected]>
When gcc with -pg, it'll add _mcount stub in every function. We need implement the _mcount in kernel and ftrace depends on stackstrace.
To do: call-graph, dynamic ftrace
--- arch/csky/Kconfig | 1 + arch/csky/abiv2/Makefile | 1 + arch/csky/abiv2/mcount.S | 24 ++++++++++++++++++++++++ arch/csky/include/asm/ftrace.h | 9 +++++++++ arch/csky/kernel/Makefile | 5 +++++ arch/csky/kernel/ftrace.c | 24 ++++++++++++++++++++++++ 6 files changed, 64 insertions(+) create mode 100644 arch/csky/abiv2/mcount.S create mode 100644 arch/csky/include/asm/ftrace.h create mode 100644 arch/csky/kernel/ftrace.c
arch/csky/Kconfig +1 -0
@@ -29,6 +29,7 @@ config CSKY select GENERIC_SCHED_CLOCK select GENERIC_SMP_IDLE_THREAD select HAVE_ARCH_TRACEHOOK + select HAVE_FUNCTION_TRACER select HAVE_GENERIC_DMA_COHERENT select HAVE_KERNEL_GZIP select HAVE_KERNEL_LZO
arch/csky/abiv2/Makefile +1 -0
@@ -8,3 +8,4 @@ obj-y += strcmp.o obj-y += strcpy.o obj-y += strlen.o obj-y += strksyms.o +obj-$(CONFIG_FUNCTION_TRACER) += mcount.o
arch/csky/abiv2/mcount.S new file +24 -0
@@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/linkage.h> + +ENTRY (_mcount) + subi sp, 20 + stw a0, (sp, 0) + stw a1, (sp, 4) + stw a2, (sp, 8) + stw a3, (sp, 12) + stw lr, (sp, 16) + mov a1, lr + ldw a0, (sp, 20) + jsri csky_mcount + ldw a0, (sp, 0) + ldw a1, (sp, 4) + ldw a2, (sp, 8) + ldw a3, (sp, 12) + ldw t1, (sp, 16) + ldw lr, (sp, 20) + addi sp, 24 + jmp t1 +END (_mcount)
arch/csky/include/asm/ftrace.h new file +9 -0
@@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_FTRACE_H +#define __ASM_CSKY_FTRACE_H + +extern void _mcount (unsigned long from_pc); + +#endif /* __ASM_CSKY_FTRACE_H */
arch/csky/kernel/Makefile +5 -0
@@ -6,4 +6,9 @@ obj-y += process.o cpu-probe.o ptrace.o dumpstack.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_SMP) += smp.o +obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o obj-$(CONFIG_STACKTRACE) += stacktrace.o + +ifdef CONFIG_FUNCTION_TRACER +CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE) +endif
arch/csky/kernel/ftrace.c new file +24 -0
@@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/ftrace.h> +#include <linux/uaccess.h> + +extern void (*ftrace_trace_function)(unsigned long ,unsigned long , +struct ftrace_ops *,struct pt_regs *); + + +noinline void __naked ftrace_stub(unsigned long ip, unsigned long parent_ip, +struct ftrace_ops *op,struct pt_regs *regs) +{ + asmvolatile ("\n" ); +} + +noinline void csky_mcount(unsigned long from_pc, unsigned long self_pc) +{ +if (ftrace_trace_function != ftrace_stub) +ftrace_trace_function (self_pc, from_pc,NULL ,NULL ); +} + +/* _mcount is defined in abi's mcount.S */ +EXPORT_SYMBOL (_mcount);
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 12/14 csky: ftrace call graph supported.
In reply to [email protected]From: Guo Ren <[email protected]>
With csky-gcc -pg -mbacktrace, ftrace call graph supported.
--- arch/csky/Kconfig | 1 + arch/csky/abiv2/mcount.S | 116 ++++++++++++++++++++++++++++++++++++++--- arch/csky/include/asm/ftrace.h | 6 ++- arch/csky/kernel/ftrace.c | 48 +++++++++++++---- 4 files changed, 151 insertions(+), 20 deletions(-)
arch/csky/Kconfig +1 -0
@@ -30,6 +30,7 @@ config CSKY select GENERIC_SMP_IDLE_THREAD select HAVE_ARCH_TRACEHOOK select HAVE_FUNCTION_TRACER + select HAVE_FUNCTION_GRAPH_TRACER select HAVE_GENERIC_DMA_COHERENT select HAVE_KERNEL_GZIP select HAVE_KERNEL_LZO
arch/csky/abiv2/mcount.S +108 -8
131 lines not on this page · raw message
arch/csky/include/asm/ftrace.h +5 -1
@@ -4,6 +4,10 @@#ifndef __ASM_CSKY_FTRACE_H#define __ASM_CSKY_FTRACE_H -extern void _mcount (unsigned long from_pc); +#define MCOUNT_INSN_SIZE 4 + +#define HAVE_FUNCTION_GRAPH_FP_TEST + +#define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR #endif /* __ASM_CSKY_FTRACE_H */
arch/csky/kernel/ftrace.c +37 -11
58 lines not on this page · raw message
Signature · 1 line
2.7.4
[email protected]
maintainerPATCH 14/14 csky: Add EM_CSKY_OLD 39
In reply to [email protected]From: Guo Ren <[email protected]>
C-SKY historically used 39, the same value as MCORE, from which the architecture was derived.
C-SKY binutils support both EM_CSKY and EM_CSKY_OLD, confirmed by binutils:include/elf/common.h
--- arch/csky/include/asm/elf.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/csky/include/asm/elf.h +3 -1
@@ -8,6 +8,7 @@#include <abi/regdef.h> #define ELF_ARCH EM_CSKY +#define EM_CSKY_OLD 39/* CSKY Relocations */ #define R_CSKY_NONE 0
@@ -43,7 +44,8 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG];/* * This is used to ensure we don't load something for the wrong architecture. */ -#define elf_check_arch (x) ((x)->e_machine == ELF_ARCH) +#define elf_check_arch (x) (((x)->e_machine == ELF_ARCH) || \ + ((x)->e_machine == EM_CSKY_OLD))/* * These are used to set parameters in the core dumps.
Signature · 1 line
2.7.4