aboutsummaryrefslogtreecommitdiffstats
path: root/arch/xtensa/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/xtensa/kernel')
-rw-r--r--arch/xtensa/kernel/Makefile21
-rw-r--r--arch/xtensa/kernel/traps.c16
-rw-r--r--arch/xtensa/kernel/vmlinux.lds.S4
3 files changed, 33 insertions, 8 deletions
diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile
index 7419dbccf027..fe3186de6a33 100644
--- a/arch/xtensa/kernel/Makefile
+++ b/arch/xtensa/kernel/Makefile
@@ -4,15 +4,30 @@
4 4
5extra-y := head.o vmlinux.lds 5extra-y := head.o vmlinux.lds
6 6
7
8obj-y := align.o entry.o irq.o coprocessor.o process.o ptrace.o \ 7obj-y := align.o entry.o irq.o coprocessor.o process.o ptrace.o \
9 setup.o signal.o syscall.o time.o traps.o vectors.o platform.o \ 8 setup.o signal.o syscall.o time.o traps.o vectors.o platform.o \
10 pci-dma.o init_task.o io.o 9 pci-dma.o init_task.o io.o
11 10
12## windowspill.o
13
14obj-$(CONFIG_KGDB) += xtensa-stub.o 11obj-$(CONFIG_KGDB) += xtensa-stub.o
15obj-$(CONFIG_PCI) += pci.o 12obj-$(CONFIG_PCI) += pci.o
16obj-$(CONFIG_MODULES) += xtensa_ksyms.o module.o 13obj-$(CONFIG_MODULES) += xtensa_ksyms.o module.o
17 14
15# In the Xtensa architecture, assembly generates literals which must always
16# precede the L32R instruction with a relative offset less than 256 kB.
17# Therefore, the .text and .literal section must be combined in parenthesis
18# in the linker script, such as: *(.literal .text).
19#
20# We need to post-process the generated vmlinux.lds scripts to convert
21# *(xxx.text) to *(xxx.literal xxx.text) for the following text sections:
22# .text .ref.text .*init.text .*exit.text .text.*
23#
24# Replicate rules in scripts/Makefile.build
25
26sed-y = -e 's/(\(\.[a-z]*it\|\.ref\|\)\.text)/(\1.literal \1.text)/g' \
27 -e 's/(\(\.text\.[a-z]*\))/(\1.literal \1)/g'
28
29quiet_cmd__cpp_lds_S = LDS $@
30 cmd__cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ $< | sed $(sed-y) >$@
18 31
32$(obj)/vmlinux.lds: $(src)/vmlinux.lds.S FORCE
33 $(call if_changed_dep,_cpp_lds_S)
diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c
index 9f0b71189e94..ba9ab9349782 100644
--- a/arch/xtensa/kernel/traps.c
+++ b/arch/xtensa/kernel/traps.c
@@ -369,6 +369,18 @@ void show_regs(struct pt_regs * regs)
369 regs->syscall); 369 regs->syscall);
370} 370}
371 371
372static __always_inline unsigned long *stack_pointer(struct task_struct *task)
373{
374 unsigned long *sp;
375
376 if (!task || task == current)
377 __asm__ __volatile__ ("mov %0, a1\n" : "=a"(sp));
378 else
379 sp = (unsigned long *)task->thread.sp;
380
381 return sp;
382}
383
372void show_trace(struct task_struct *task, unsigned long *sp) 384void show_trace(struct task_struct *task, unsigned long *sp)
373{ 385{
374 unsigned long a0, a1, pc; 386 unsigned long a0, a1, pc;
@@ -377,7 +389,7 @@ void show_trace(struct task_struct *task, unsigned long *sp)
377 if (sp) 389 if (sp)
378 a1 = (unsigned long)sp; 390 a1 = (unsigned long)sp;
379 else 391 else
380 a1 = task->thread.sp; 392 a1 = (unsigned long)stack_pointer(task);
381 393
382 sp_start = a1 & ~(THREAD_SIZE-1); 394 sp_start = a1 & ~(THREAD_SIZE-1);
383 sp_end = sp_start + THREAD_SIZE; 395 sp_end = sp_start + THREAD_SIZE;
@@ -420,7 +432,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)
420 unsigned long *stack; 432 unsigned long *stack;
421 433
422 if (!sp) 434 if (!sp)
423 sp = (unsigned long *)task->thread.sp; 435 sp = stack_pointer(task);
424 stack = sp; 436 stack = sp;
425 437
426 printk("\nStack: "); 438 printk("\nStack: ");
diff --git a/arch/xtensa/kernel/vmlinux.lds.S b/arch/xtensa/kernel/vmlinux.lds.S
index 5accf51053da..41c159cd872f 100644
--- a/arch/xtensa/kernel/vmlinux.lds.S
+++ b/arch/xtensa/kernel/vmlinux.lds.S
@@ -87,7 +87,7 @@ SECTIONS
87 { 87 {
88 /* The HEAD_TEXT section must be the first section! */ 88 /* The HEAD_TEXT section must be the first section! */
89 HEAD_TEXT 89 HEAD_TEXT
90 *(.literal .text) 90 TEXT_TEXT
91 VMLINUX_SYMBOL(__sched_text_start) = .; 91 VMLINUX_SYMBOL(__sched_text_start) = .;
92 *(.sched.literal .sched.text) 92 *(.sched.literal .sched.text)
93 VMLINUX_SYMBOL(__sched_text_end) = .; 93 VMLINUX_SYMBOL(__sched_text_end) = .;
@@ -139,8 +139,6 @@ SECTIONS
139 __init_begin = .; 139 __init_begin = .;
140 .init.text : { 140 .init.text : {
141 _sinittext = .; 141 _sinittext = .;
142 *(.init.literal) *(.cpuinit.literal)
143 *(.devinit.literal) *(.meminit.literal)
144 INIT_TEXT 142 INIT_TEXT
145 _einittext = .; 143 _einittext = .;
146 } 144 }