Merge tag 'xtensa-20180129' of git://github.com/jcmvbkbc/linux-xtensa
Pull Xtensa updates from Max Filippov: - add SSP support - add KASAN support - improvements to xtensa-specific assembly: - use ENTRY and ENDPROC consistently - clean up and unify word alignment macros - clean up and unify fixup marking - use 'call' instead of 'callx' where possible - various cleanups: - consiolidate kernel stack size related definitions - replace #ifdef'fed/commented out debug printk statements with pr_debug - use struct exc_table instead of flat array for exception handling data - build kernel with -mtext-section-literals; simplify xtensa linker script - fix futex_atomic_cmpxchg_inatomic() * tag 'xtensa-20180129' of git://github.com/jcmvbkbc/linux-xtensa: (21 commits) xtensa: fix futex_atomic_cmpxchg_inatomic xtensa: shut up gcc-8 warnings xtensa: print kernel sections info in mem_init xtensa: use generic strncpy_from_user with KASAN xtensa: use __memset in __xtensa_clear_user xtensa: add support for KASAN xtensa: move fixmap and kmap just above the KSEG xtensa: don't clear swapper_pg_dir in paging_init xtensa: extract init_kio xtensa: implement early_trap_init xtensa: clean up exception handling structure xtensa: clean up custom-controlled debug output xtensa: enable stack protector xtensa: print hardware config ID on startup xtensa: consolidate kernel stack size related definitions xtensa: clean up functions in assembly code xtensa: clean up word alignment macros in assembly code xtensa: clean up fixups in assembly code xtensa: use call instead of callx in assembly code xtensa: build kernel with text-section-literals ...
This commit is contained in:
@@ -17,9 +17,6 @@ obj-$(CONFIG_XTENSA_VARIANT_HAVE_PERF_EVENTS) += perf_event.o
|
||||
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
||||
obj-$(CONFIG_S32C1I_SELFTEST) += s32c1i_selftest.o
|
||||
|
||||
AFLAGS_head.o += -mtext-section-literals
|
||||
AFLAGS_mxhead.o += -mtext-section-literals
|
||||
|
||||
# In the Xtensa architecture, assembly generates literals which must always
|
||||
# precede the L32R instruction with a relative offset less than 256 kB.
|
||||
# Therefore, the .text and .literal section must be combined in parenthesis
|
||||
|
@@ -19,6 +19,7 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/current.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
|
||||
@@ -66,8 +67,6 @@
|
||||
#define INSN_T 24
|
||||
#define INSN_OP1 16
|
||||
|
||||
.macro __src_b r, w0, w1; src \r, \w0, \w1; .endm
|
||||
.macro __ssa8 r; ssa8b \r; .endm
|
||||
.macro __ssa8r r; ssa8l \r; .endm
|
||||
.macro __sh r, s; srl \r, \s; .endm
|
||||
.macro __sl r, s; sll \r, \s; .endm
|
||||
@@ -81,8 +80,6 @@
|
||||
#define INSN_T 4
|
||||
#define INSN_OP1 12
|
||||
|
||||
.macro __src_b r, w0, w1; src \r, \w1, \w0; .endm
|
||||
.macro __ssa8 r; ssa8l \r; .endm
|
||||
.macro __ssa8r r; ssa8b \r; .endm
|
||||
.macro __sh r, s; sll \r, \s; .endm
|
||||
.macro __sl r, s; srl \r, \s; .endm
|
||||
@@ -155,7 +152,7 @@
|
||||
* < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
|
||||
*/
|
||||
|
||||
|
||||
.literal_position
|
||||
ENTRY(fast_unaligned)
|
||||
|
||||
/* Note: We don't expect the address to be aligned on a word
|
||||
|
@@ -76,6 +76,9 @@ int main(void)
|
||||
DEFINE(TASK_PID, offsetof (struct task_struct, pid));
|
||||
DEFINE(TASK_THREAD, offsetof (struct task_struct, thread));
|
||||
DEFINE(TASK_THREAD_INFO, offsetof (struct task_struct, stack));
|
||||
#ifdef CONFIG_CC_STACKPROTECTOR
|
||||
DEFINE(TASK_STACK_CANARY, offsetof(struct task_struct, stack_canary));
|
||||
#endif
|
||||
DEFINE(TASK_STRUCT_SIZE, sizeof (struct task_struct));
|
||||
|
||||
/* offsets in thread_info struct */
|
||||
@@ -129,5 +132,18 @@ int main(void)
|
||||
offsetof(struct debug_table, icount_level_save));
|
||||
#endif
|
||||
|
||||
/* struct exc_table */
|
||||
DEFINE(EXC_TABLE_KSTK, offsetof(struct exc_table, kstk));
|
||||
DEFINE(EXC_TABLE_DOUBLE_SAVE, offsetof(struct exc_table, double_save));
|
||||
DEFINE(EXC_TABLE_FIXUP, offsetof(struct exc_table, fixup));
|
||||
DEFINE(EXC_TABLE_PARAM, offsetof(struct exc_table, fixup_param));
|
||||
DEFINE(EXC_TABLE_SYSCALL_SAVE,
|
||||
offsetof(struct exc_table, syscall_save));
|
||||
DEFINE(EXC_TABLE_FAST_USER,
|
||||
offsetof(struct exc_table, fast_user_handler));
|
||||
DEFINE(EXC_TABLE_FAST_KERNEL,
|
||||
offsetof(struct exc_table, fast_kernel_handler));
|
||||
DEFINE(EXC_TABLE_DEFAULT, offsetof(struct exc_table, default_handler));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -212,8 +212,7 @@ ENDPROC(coprocessor_restore)
|
||||
ENTRY(fast_coprocessor_double)
|
||||
|
||||
wsr a0, excsave1
|
||||
movi a0, unrecoverable_exception
|
||||
callx0 a0
|
||||
call0 unrecoverable_exception
|
||||
|
||||
ENDPROC(fast_coprocessor_double)
|
||||
|
||||
|
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/coprocessor.h>
|
||||
#include <asm/thread_info.h>
|
||||
@@ -125,6 +126,7 @@
|
||||
*
|
||||
* Note: _user_exception might be at an odd address. Don't use call0..call12
|
||||
*/
|
||||
.literal_position
|
||||
|
||||
ENTRY(user_exception)
|
||||
|
||||
@@ -475,8 +477,7 @@ common_exception_return:
|
||||
1:
|
||||
irq_save a2, a3
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
movi a4, trace_hardirqs_off
|
||||
callx4 a4
|
||||
call4 trace_hardirqs_off
|
||||
#endif
|
||||
|
||||
/* Jump if we are returning from kernel exceptions. */
|
||||
@@ -503,24 +504,20 @@ common_exception_return:
|
||||
/* Call do_signal() */
|
||||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
movi a4, trace_hardirqs_on
|
||||
callx4 a4
|
||||
call4 trace_hardirqs_on
|
||||
#endif
|
||||
rsil a2, 0
|
||||
movi a4, do_notify_resume # int do_notify_resume(struct pt_regs*)
|
||||
mov a6, a1
|
||||
callx4 a4
|
||||
call4 do_notify_resume # int do_notify_resume(struct pt_regs*)
|
||||
j 1b
|
||||
|
||||
3: /* Reschedule */
|
||||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
movi a4, trace_hardirqs_on
|
||||
callx4 a4
|
||||
call4 trace_hardirqs_on
|
||||
#endif
|
||||
rsil a2, 0
|
||||
movi a4, schedule # void schedule (void)
|
||||
callx4 a4
|
||||
call4 schedule # void schedule (void)
|
||||
j 1b
|
||||
|
||||
#ifdef CONFIG_PREEMPT
|
||||
@@ -531,8 +528,7 @@ common_exception_return:
|
||||
|
||||
l32i a4, a2, TI_PRE_COUNT
|
||||
bnez a4, 4f
|
||||
movi a4, preempt_schedule_irq
|
||||
callx4 a4
|
||||
call4 preempt_schedule_irq
|
||||
j 1b
|
||||
#endif
|
||||
|
||||
@@ -545,23 +541,20 @@ common_exception_return:
|
||||
5:
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
_bbci.l a4, TIF_DB_DISABLED, 7f
|
||||
movi a4, restore_dbreak
|
||||
callx4 a4
|
||||
call4 restore_dbreak
|
||||
7:
|
||||
#endif
|
||||
#ifdef CONFIG_DEBUG_TLB_SANITY
|
||||
l32i a4, a1, PT_DEPC
|
||||
bgeui a4, VALID_DOUBLE_EXCEPTION_ADDRESS, 4f
|
||||
movi a4, check_tlb_sanity
|
||||
callx4 a4
|
||||
call4 check_tlb_sanity
|
||||
#endif
|
||||
6:
|
||||
4:
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
extui a4, a3, PS_INTLEVEL_SHIFT, PS_INTLEVEL_WIDTH
|
||||
bgei a4, LOCKLEVEL, 1f
|
||||
movi a4, trace_hardirqs_on
|
||||
callx4 a4
|
||||
call4 trace_hardirqs_on
|
||||
1:
|
||||
#endif
|
||||
/* Restore optional registers. */
|
||||
@@ -777,6 +770,8 @@ ENDPROC(kernel_exception)
|
||||
* When we get here, a0 is trashed and saved to excsave[debuglevel]
|
||||
*/
|
||||
|
||||
.literal_position
|
||||
|
||||
ENTRY(debug_exception)
|
||||
|
||||
rsr a0, SREG_EPS + XCHAL_DEBUGLEVEL
|
||||
@@ -916,6 +911,8 @@ ENDPROC(debug_exception)
|
||||
unrecoverable_text:
|
||||
.ascii "Unrecoverable error in exception handler\0"
|
||||
|
||||
.literal_position
|
||||
|
||||
ENTRY(unrecoverable_exception)
|
||||
|
||||
movi a0, 1
|
||||
@@ -933,10 +930,8 @@ ENTRY(unrecoverable_exception)
|
||||
movi a0, 0
|
||||
addi a1, a1, PT_REGS_OFFSET
|
||||
|
||||
movi a4, panic
|
||||
movi a6, unrecoverable_text
|
||||
|
||||
callx4 a4
|
||||
call4 panic
|
||||
|
||||
1: j 1b
|
||||
|
||||
@@ -1073,8 +1068,7 @@ ENTRY(fast_syscall_unrecoverable)
|
||||
xsr a2, depc # restore a2, depc
|
||||
|
||||
wsr a0, excsave1
|
||||
movi a0, unrecoverable_exception
|
||||
callx0 a0
|
||||
call0 unrecoverable_exception
|
||||
|
||||
ENDPROC(fast_syscall_unrecoverable)
|
||||
|
||||
@@ -1101,33 +1095,12 @@ ENDPROC(fast_syscall_unrecoverable)
|
||||
* < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
|
||||
*
|
||||
* Note: we don't have to save a2; a2 holds the return value
|
||||
*
|
||||
* We use the two macros TRY and CATCH:
|
||||
*
|
||||
* TRY adds an entry to the __ex_table fixup table for the immediately
|
||||
* following instruction.
|
||||
*
|
||||
* CATCH catches any exception that occurred at one of the preceding TRY
|
||||
* statements and continues from there
|
||||
*
|
||||
* Usage TRY l32i a0, a1, 0
|
||||
* <other code>
|
||||
* done: rfe
|
||||
* CATCH <set return code>
|
||||
* j done
|
||||
*/
|
||||
|
||||
.literal_position
|
||||
|
||||
#ifdef CONFIG_FAST_SYSCALL_XTENSA
|
||||
|
||||
#define TRY \
|
||||
.section __ex_table, "a"; \
|
||||
.word 66f, 67f; \
|
||||
.text; \
|
||||
66:
|
||||
|
||||
#define CATCH \
|
||||
67:
|
||||
|
||||
ENTRY(fast_syscall_xtensa)
|
||||
|
||||
s32i a7, a2, PT_AREG7 # we need an additional register
|
||||
@@ -1141,9 +1114,9 @@ ENTRY(fast_syscall_xtensa)
|
||||
|
||||
.Lswp: /* Atomic compare and swap */
|
||||
|
||||
TRY l32i a0, a3, 0 # read old value
|
||||
EX(.Leac) l32i a0, a3, 0 # read old value
|
||||
bne a0, a4, 1f # same as old value? jump
|
||||
TRY s32i a5, a3, 0 # different, modify value
|
||||
EX(.Leac) s32i a5, a3, 0 # different, modify value
|
||||
l32i a7, a2, PT_AREG7 # restore a7
|
||||
l32i a0, a2, PT_AREG0 # restore a0
|
||||
movi a2, 1 # and return 1
|
||||
@@ -1156,12 +1129,12 @@ TRY s32i a5, a3, 0 # different, modify value
|
||||
|
||||
.Lnswp: /* Atomic set, add, and exg_add. */
|
||||
|
||||
TRY l32i a7, a3, 0 # orig
|
||||
EX(.Leac) l32i a7, a3, 0 # orig
|
||||
addi a6, a6, -SYS_XTENSA_ATOMIC_SET
|
||||
add a0, a4, a7 # + arg
|
||||
moveqz a0, a4, a6 # set
|
||||
addi a6, a6, SYS_XTENSA_ATOMIC_SET
|
||||
TRY s32i a0, a3, 0 # write new value
|
||||
EX(.Leac) s32i a0, a3, 0 # write new value
|
||||
|
||||
mov a0, a2
|
||||
mov a2, a7
|
||||
@@ -1169,7 +1142,6 @@ TRY s32i a0, a3, 0 # write new value
|
||||
l32i a0, a0, PT_AREG0 # restore a0
|
||||
rfe
|
||||
|
||||
CATCH
|
||||
.Leac: l32i a7, a2, PT_AREG7 # restore a7
|
||||
l32i a0, a2, PT_AREG0 # restore a0
|
||||
movi a2, -EFAULT
|
||||
@@ -1411,14 +1383,12 @@ ENTRY(fast_syscall_spill_registers)
|
||||
rsync
|
||||
|
||||
movi a6, SIGSEGV
|
||||
movi a4, do_exit
|
||||
callx4 a4
|
||||
call4 do_exit
|
||||
|
||||
/* shouldn't return, so panic */
|
||||
|
||||
wsr a0, excsave1
|
||||
movi a0, unrecoverable_exception
|
||||
callx0 a0 # should not return
|
||||
call0 unrecoverable_exception # should not return
|
||||
1: j 1b
|
||||
|
||||
|
||||
@@ -1564,8 +1534,8 @@ ENDPROC(fast_syscall_spill_registers)
|
||||
|
||||
ENTRY(fast_second_level_miss_double_kernel)
|
||||
|
||||
1: movi a0, unrecoverable_exception
|
||||
callx0 a0 # should not return
|
||||
1:
|
||||
call0 unrecoverable_exception # should not return
|
||||
1: j 1b
|
||||
|
||||
ENDPROC(fast_second_level_miss_double_kernel)
|
||||
@@ -1887,6 +1857,7 @@ ENDPROC(fast_store_prohibited)
|
||||
* void system_call (struct pt_regs* regs, int exccause)
|
||||
* a2 a3
|
||||
*/
|
||||
.literal_position
|
||||
|
||||
ENTRY(system_call)
|
||||
|
||||
@@ -1896,9 +1867,8 @@ ENTRY(system_call)
|
||||
|
||||
l32i a3, a2, PT_AREG2
|
||||
mov a6, a2
|
||||
movi a4, do_syscall_trace_enter
|
||||
s32i a3, a2, PT_SYSCALL
|
||||
callx4 a4
|
||||
call4 do_syscall_trace_enter
|
||||
mov a3, a6
|
||||
|
||||
/* syscall = sys_call_table[syscall_nr] */
|
||||
@@ -1930,9 +1900,8 @@ ENTRY(system_call)
|
||||
1: /* regs->areg[2] = return_value */
|
||||
|
||||
s32i a6, a2, PT_AREG2
|
||||
movi a4, do_syscall_trace_leave
|
||||
mov a6, a2
|
||||
callx4 a4
|
||||
call4 do_syscall_trace_leave
|
||||
retw
|
||||
|
||||
ENDPROC(system_call)
|
||||
@@ -2002,6 +1971,12 @@ ENTRY(_switch_to)
|
||||
s32i a1, a2, THREAD_SP # save stack pointer
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
|
||||
movi a6, __stack_chk_guard
|
||||
l32i a8, a3, TASK_STACK_CANARY
|
||||
s32i a8, a6, 0
|
||||
#endif
|
||||
|
||||
/* Disable ints while we manipulate the stack pointer. */
|
||||
|
||||
irq_save a14, a3
|
||||
@@ -2048,12 +2023,10 @@ ENTRY(ret_from_fork)
|
||||
/* void schedule_tail (struct task_struct *prev)
|
||||
* Note: prev is still in a6 (return value from fake call4 frame)
|
||||
*/
|
||||
movi a4, schedule_tail
|
||||
callx4 a4
|
||||
call4 schedule_tail
|
||||
|
||||
movi a4, do_syscall_trace_leave
|
||||
mov a6, a1
|
||||
callx4 a4
|
||||
call4 do_syscall_trace_leave
|
||||
|
||||
j common_exception_return
|
||||
|
||||
|
@@ -264,11 +264,8 @@ ENTRY(_startup)
|
||||
|
||||
/* init_arch kick-starts the linux kernel */
|
||||
|
||||
movi a4, init_arch
|
||||
callx4 a4
|
||||
|
||||
movi a4, start_kernel
|
||||
callx4 a4
|
||||
call4 init_arch
|
||||
call4 start_kernel
|
||||
|
||||
should_never_return:
|
||||
j should_never_return
|
||||
@@ -294,8 +291,7 @@ should_never_return:
|
||||
movi a6, 0
|
||||
wsr a6, excsave1
|
||||
|
||||
movi a4, secondary_start_kernel
|
||||
callx4 a4
|
||||
call4 secondary_start_kernel
|
||||
j should_never_return
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
@@ -22,8 +22,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/cache.h>
|
||||
|
||||
#undef DEBUG_RELOCATE
|
||||
|
||||
static int
|
||||
decode_calln_opcode (unsigned char *location)
|
||||
{
|
||||
@@ -58,10 +56,9 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||
unsigned char *location;
|
||||
uint32_t value;
|
||||
|
||||
#ifdef DEBUG_RELOCATE
|
||||
printk("Applying relocate section %u to %u\n", relsec,
|
||||
sechdrs[relsec].sh_info);
|
||||
#endif
|
||||
pr_debug("Applying relocate section %u to %u\n", relsec,
|
||||
sechdrs[relsec].sh_info);
|
||||
|
||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) {
|
||||
location = (char *)sechdrs[sechdrs[relsec].sh_info].sh_addr
|
||||
+ rela[i].r_offset;
|
||||
@@ -87,7 +84,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||
value -= ((unsigned long)location & -4) + 4;
|
||||
if ((value & 3) != 0 ||
|
||||
((value + (1 << 19)) >> 20) != 0) {
|
||||
printk("%s: relocation out of range, "
|
||||
pr_err("%s: relocation out of range, "
|
||||
"section %d reloc %d "
|
||||
"sym '%s'\n",
|
||||
mod->name, relsec, i,
|
||||
@@ -111,7 +108,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||
value -= (((unsigned long)location + 3) & -4);
|
||||
if ((value & 3) != 0 ||
|
||||
(signed int)value >> 18 != -1) {
|
||||
printk("%s: relocation out of range, "
|
||||
pr_err("%s: relocation out of range, "
|
||||
"section %d reloc %d "
|
||||
"sym '%s'\n",
|
||||
mod->name, relsec, i,
|
||||
@@ -156,7 +153,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||
case R_XTENSA_SLOT12_OP:
|
||||
case R_XTENSA_SLOT13_OP:
|
||||
case R_XTENSA_SLOT14_OP:
|
||||
printk("%s: unexpected FLIX relocation: %u\n",
|
||||
pr_err("%s: unexpected FLIX relocation: %u\n",
|
||||
mod->name,
|
||||
ELF32_R_TYPE(rela[i].r_info));
|
||||
return -ENOEXEC;
|
||||
@@ -176,13 +173,13 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||
case R_XTENSA_SLOT12_ALT:
|
||||
case R_XTENSA_SLOT13_ALT:
|
||||
case R_XTENSA_SLOT14_ALT:
|
||||
printk("%s: unexpected ALT relocation: %u\n",
|
||||
pr_err("%s: unexpected ALT relocation: %u\n",
|
||||
mod->name,
|
||||
ELF32_R_TYPE(rela[i].r_info));
|
||||
return -ENOEXEC;
|
||||
|
||||
default:
|
||||
printk("%s: unexpected relocation: %u\n",
|
||||
pr_err("%s: unexpected relocation: %u\n",
|
||||
mod->name,
|
||||
ELF32_R_TYPE(rela[i].r_info));
|
||||
return -ENOEXEC;
|
||||
|
@@ -29,14 +29,6 @@
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/platform.h>
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(x...) printk(x)
|
||||
#else
|
||||
#define DBG(x...)
|
||||
#endif
|
||||
|
||||
/* PCI Controller */
|
||||
|
||||
|
||||
@@ -101,8 +93,8 @@ pcibios_enable_resources(struct pci_dev *dev, int mask)
|
||||
for(idx=0; idx<6; idx++) {
|
||||
r = &dev->resource[idx];
|
||||
if (!r->start && r->end) {
|
||||
printk (KERN_ERR "PCI: Device %s not available because "
|
||||
"of resource collisions\n", pci_name(dev));
|
||||
pr_err("PCI: Device %s not available because "
|
||||
"of resource collisions\n", pci_name(dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
@@ -113,7 +105,7 @@ pcibios_enable_resources(struct pci_dev *dev, int mask)
|
||||
if (dev->resource[PCI_ROM_RESOURCE].start)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
if (cmd != old_cmd) {
|
||||
printk("PCI: Enabling device %s (%04x -> %04x)\n",
|
||||
pr_info("PCI: Enabling device %s (%04x -> %04x)\n",
|
||||
pci_name(dev), old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
@@ -144,8 +136,8 @@ static void __init pci_controller_apertures(struct pci_controller *pci_ctrl,
|
||||
res = &pci_ctrl->io_resource;
|
||||
if (!res->flags) {
|
||||
if (io_offset)
|
||||
printk (KERN_ERR "I/O resource not set for host"
|
||||
" bridge %d\n", pci_ctrl->index);
|
||||
pr_err("I/O resource not set for host bridge %d\n",
|
||||
pci_ctrl->index);
|
||||
res->start = 0;
|
||||
res->end = IO_SPACE_LIMIT;
|
||||
res->flags = IORESOURCE_IO;
|
||||
@@ -159,8 +151,8 @@ static void __init pci_controller_apertures(struct pci_controller *pci_ctrl,
|
||||
if (!res->flags) {
|
||||
if (i > 0)
|
||||
continue;
|
||||
printk(KERN_ERR "Memory resource not set for "
|
||||
"host bridge %d\n", pci_ctrl->index);
|
||||
pr_err("Memory resource not set for host bridge %d\n",
|
||||
pci_ctrl->index);
|
||||
res->start = 0;
|
||||
res->end = ~0U;
|
||||
res->flags = IORESOURCE_MEM;
|
||||
@@ -176,7 +168,7 @@ static int __init pcibios_init(void)
|
||||
struct pci_bus *bus;
|
||||
int next_busno = 0, ret;
|
||||
|
||||
printk("PCI: Probing PCI hardware\n");
|
||||
pr_info("PCI: Probing PCI hardware\n");
|
||||
|
||||
/* Scan all of the recorded PCI controllers. */
|
||||
for (pci_ctrl = pci_ctrl_head; pci_ctrl; pci_ctrl = pci_ctrl->next) {
|
||||
@@ -232,7 +224,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||
for (idx=0; idx<6; idx++) {
|
||||
r = &dev->resource[idx];
|
||||
if (!r->start && r->end) {
|
||||
printk(KERN_ERR "PCI: Device %s not available because "
|
||||
pr_err("PCI: Device %s not available because "
|
||||
"of resource collisions\n", pci_name(dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -242,8 +234,8 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
if (cmd != old_cmd) {
|
||||
printk("PCI: Enabling device %s (%04x -> %04x)\n",
|
||||
pci_name(dev), old_cmd, cmd);
|
||||
pr_info("PCI: Enabling device %s (%04x -> %04x)\n",
|
||||
pci_name(dev), old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
|
||||
|
@@ -58,6 +58,12 @@ void (*pm_power_off)(void) = NULL;
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
|
||||
#ifdef CONFIG_CC_STACKPROTECTOR
|
||||
#include <linux/stackprotector.h>
|
||||
unsigned long __stack_chk_guard __read_mostly;
|
||||
EXPORT_SYMBOL(__stack_chk_guard);
|
||||
#endif
|
||||
|
||||
#if XTENSA_HAVE_COPROCESSORS
|
||||
|
||||
void coprocessor_release_all(struct thread_info *ti)
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#endif
|
||||
|
||||
#include <asm/bootparam.h>
|
||||
#include <asm/kasan.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/processor.h>
|
||||
@@ -156,7 +157,7 @@ static int __init parse_bootparam(const bp_tag_t* tag)
|
||||
/* Boot parameters must start with a BP_TAG_FIRST tag. */
|
||||
|
||||
if (tag->id != BP_TAG_FIRST) {
|
||||
printk(KERN_WARNING "Invalid boot parameters!\n");
|
||||
pr_warn("Invalid boot parameters!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -165,15 +166,14 @@ static int __init parse_bootparam(const bp_tag_t* tag)
|
||||
/* Parse all tags. */
|
||||
|
||||
while (tag != NULL && tag->id != BP_TAG_LAST) {
|
||||
for (t = &__tagtable_begin; t < &__tagtable_end; t++) {
|
||||
for (t = &__tagtable_begin; t < &__tagtable_end; t++) {
|
||||
if (tag->id == t->tag) {
|
||||
t->parse(tag);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (t == &__tagtable_end)
|
||||
printk(KERN_WARNING "Ignoring tag "
|
||||
"0x%08x\n", tag->id);
|
||||
pr_warn("Ignoring tag 0x%08x\n", tag->id);
|
||||
tag = (bp_tag_t*)((unsigned long)(tag + 1) + tag->size);
|
||||
}
|
||||
|
||||
@@ -208,6 +208,8 @@ static int __init xtensa_dt_io_area(unsigned long node, const char *uname,
|
||||
/* round down to nearest 256MB boundary */
|
||||
xtensa_kio_paddr &= 0xf0000000;
|
||||
|
||||
init_kio();
|
||||
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
@@ -246,6 +248,14 @@ void __init early_init_devtree(void *params)
|
||||
|
||||
void __init init_arch(bp_tag_t *bp_start)
|
||||
{
|
||||
/* Initialize MMU. */
|
||||
|
||||
init_mmu();
|
||||
|
||||
/* Initialize initial KASAN shadow map */
|
||||
|
||||
kasan_early_init();
|
||||
|
||||
/* Parse boot parameters */
|
||||
|
||||
if (bp_start)
|
||||
@@ -263,10 +273,6 @@ void __init init_arch(bp_tag_t *bp_start)
|
||||
/* Early hook for platforms */
|
||||
|
||||
platform_init(bp_start);
|
||||
|
||||
/* Initialize MMU. */
|
||||
|
||||
init_mmu();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -277,13 +283,13 @@ extern char _end[];
|
||||
extern char _stext[];
|
||||
extern char _WindowVectors_text_start;
|
||||
extern char _WindowVectors_text_end;
|
||||
extern char _DebugInterruptVector_literal_start;
|
||||
extern char _DebugInterruptVector_text_start;
|
||||
extern char _DebugInterruptVector_text_end;
|
||||
extern char _KernelExceptionVector_literal_start;
|
||||
extern char _KernelExceptionVector_text_start;
|
||||
extern char _KernelExceptionVector_text_end;
|
||||
extern char _UserExceptionVector_literal_start;
|
||||
extern char _UserExceptionVector_text_start;
|
||||
extern char _UserExceptionVector_text_end;
|
||||
extern char _DoubleExceptionVector_literal_start;
|
||||
extern char _DoubleExceptionVector_text_start;
|
||||
extern char _DoubleExceptionVector_text_end;
|
||||
#if XCHAL_EXCM_LEVEL >= 2
|
||||
extern char _Level2InterruptVector_text_start;
|
||||
@@ -317,6 +323,13 @@ static inline int mem_reserve(unsigned long start, unsigned long end)
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
pr_info("config ID: %08x:%08x\n",
|
||||
get_sr(SREG_EPC), get_sr(SREG_EXCSAVE));
|
||||
if (get_sr(SREG_EPC) != XCHAL_HW_CONFIGID0 ||
|
||||
get_sr(SREG_EXCSAVE) != XCHAL_HW_CONFIGID1)
|
||||
pr_info("built for config ID: %08x:%08x\n",
|
||||
XCHAL_HW_CONFIGID0, XCHAL_HW_CONFIGID1);
|
||||
|
||||
*cmdline_p = command_line;
|
||||
platform_setup(cmdline_p);
|
||||
strlcpy(boot_command_line, *cmdline_p, COMMAND_LINE_SIZE);
|
||||
@@ -339,16 +352,16 @@ void __init setup_arch(char **cmdline_p)
|
||||
mem_reserve(__pa(&_WindowVectors_text_start),
|
||||
__pa(&_WindowVectors_text_end));
|
||||
|
||||
mem_reserve(__pa(&_DebugInterruptVector_literal_start),
|
||||
mem_reserve(__pa(&_DebugInterruptVector_text_start),
|
||||
__pa(&_DebugInterruptVector_text_end));
|
||||
|
||||
mem_reserve(__pa(&_KernelExceptionVector_literal_start),
|
||||
mem_reserve(__pa(&_KernelExceptionVector_text_start),
|
||||
__pa(&_KernelExceptionVector_text_end));
|
||||
|
||||
mem_reserve(__pa(&_UserExceptionVector_literal_start),
|
||||
mem_reserve(__pa(&_UserExceptionVector_text_start),
|
||||
__pa(&_UserExceptionVector_text_end));
|
||||
|
||||
mem_reserve(__pa(&_DoubleExceptionVector_literal_start),
|
||||
mem_reserve(__pa(&_DoubleExceptionVector_text_start),
|
||||
__pa(&_DoubleExceptionVector_text_end));
|
||||
|
||||
#if XCHAL_EXCM_LEVEL >= 2
|
||||
@@ -380,7 +393,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
#endif
|
||||
parse_early_param();
|
||||
bootmem_init();
|
||||
|
||||
kasan_init();
|
||||
unflatten_and_copy_device_tree();
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -582,12 +595,14 @@ c_show(struct seq_file *f, void *slot)
|
||||
"model\t\t: Xtensa " XCHAL_HW_VERSION_NAME "\n"
|
||||
"core ID\t\t: " XCHAL_CORE_ID "\n"
|
||||
"build ID\t: 0x%x\n"
|
||||
"config ID\t: %08x:%08x\n"
|
||||
"byte order\t: %s\n"
|
||||
"cpu MHz\t\t: %lu.%02lu\n"
|
||||
"bogomips\t: %lu.%02lu\n",
|
||||
num_online_cpus(),
|
||||
cpumask_pr_args(cpu_online_mask),
|
||||
XCHAL_BUILD_UNIQUE_ID,
|
||||
get_sr(SREG_EPC), get_sr(SREG_EXCSAVE),
|
||||
XCHAL_HAVE_BE ? "big" : "little",
|
||||
ccount_freq/1000000,
|
||||
(ccount_freq/10000) % 100,
|
||||
|
@@ -28,8 +28,6 @@
|
||||
#include <asm/coprocessor.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
#define DEBUG_SIG 0
|
||||
|
||||
extern struct task_struct *coproc_owners[];
|
||||
|
||||
struct rt_sigframe
|
||||
@@ -399,10 +397,8 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
||||
regs->areg[8] = (unsigned long) &frame->uc;
|
||||
regs->threadptr = tp;
|
||||
|
||||
#if DEBUG_SIG
|
||||
printk("SIG rt deliver (%s:%d): signal=%d sp=%p pc=%08x\n",
|
||||
current->comm, current->pid, sig, frame, regs->pc);
|
||||
#endif
|
||||
pr_debug("SIG rt deliver (%s:%d): signal=%d sp=%p pc=%08lx\n",
|
||||
current->comm, current->pid, sig, frame, regs->pc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/ratelimit.h>
|
||||
|
||||
#include <asm/stacktrace.h>
|
||||
#include <asm/ptrace.h>
|
||||
@@ -158,8 +159,7 @@ COPROCESSOR(7),
|
||||
* 2. it is a temporary memory buffer for the exception handlers.
|
||||
*/
|
||||
|
||||
DEFINE_PER_CPU(unsigned long, exc_table[EXC_TABLE_SIZE/4]);
|
||||
|
||||
DEFINE_PER_CPU(struct exc_table, exc_table);
|
||||
DEFINE_PER_CPU(struct debug_table, debug_table);
|
||||
|
||||
void die(const char*, struct pt_regs*, long);
|
||||
@@ -178,13 +178,14 @@ __die_if_kernel(const char *str, struct pt_regs *regs, long err)
|
||||
void do_unhandled(struct pt_regs *regs, unsigned long exccause)
|
||||
{
|
||||
__die_if_kernel("Caught unhandled exception - should not happen",
|
||||
regs, SIGKILL);
|
||||
regs, SIGKILL);
|
||||
|
||||
/* If in user mode, send SIGILL signal to current process */
|
||||
printk("Caught unhandled exception in '%s' "
|
||||
"(pid = %d, pc = %#010lx) - should not happen\n"
|
||||
"\tEXCCAUSE is %ld\n",
|
||||
current->comm, task_pid_nr(current), regs->pc, exccause);
|
||||
pr_info_ratelimited("Caught unhandled exception in '%s' "
|
||||
"(pid = %d, pc = %#010lx) - should not happen\n"
|
||||
"\tEXCCAUSE is %ld\n",
|
||||
current->comm, task_pid_nr(current), regs->pc,
|
||||
exccause);
|
||||
force_sig(SIGILL, current);
|
||||
}
|
||||
|
||||
@@ -305,8 +306,8 @@ do_illegal_instruction(struct pt_regs *regs)
|
||||
|
||||
/* If in user mode, send SIGILL signal to current process. */
|
||||
|
||||
printk("Illegal Instruction in '%s' (pid = %d, pc = %#010lx)\n",
|
||||
current->comm, task_pid_nr(current), regs->pc);
|
||||
pr_info_ratelimited("Illegal Instruction in '%s' (pid = %d, pc = %#010lx)\n",
|
||||
current->comm, task_pid_nr(current), regs->pc);
|
||||
force_sig(SIGILL, current);
|
||||
}
|
||||
|
||||
@@ -325,13 +326,14 @@ do_unaligned_user (struct pt_regs *regs)
|
||||
siginfo_t info;
|
||||
|
||||
__die_if_kernel("Unhandled unaligned exception in kernel",
|
||||
regs, SIGKILL);
|
||||
regs, SIGKILL);
|
||||
|
||||
current->thread.bad_vaddr = regs->excvaddr;
|
||||
current->thread.error_code = -3;
|
||||
printk("Unaligned memory access to %08lx in '%s' "
|
||||
"(pid = %d, pc = %#010lx)\n",
|
||||
regs->excvaddr, current->comm, task_pid_nr(current), regs->pc);
|
||||
pr_info_ratelimited("Unaligned memory access to %08lx in '%s' "
|
||||
"(pid = %d, pc = %#010lx)\n",
|
||||
regs->excvaddr, current->comm,
|
||||
task_pid_nr(current), regs->pc);
|
||||
info.si_signo = SIGBUS;
|
||||
info.si_errno = 0;
|
||||
info.si_code = BUS_ADRALN;
|
||||
@@ -365,28 +367,28 @@ do_debug(struct pt_regs *regs)
|
||||
}
|
||||
|
||||
|
||||
static void set_handler(int idx, void *handler)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
per_cpu(exc_table, cpu)[idx] = (unsigned long)handler;
|
||||
}
|
||||
#define set_handler(type, cause, handler) \
|
||||
do { \
|
||||
unsigned int cpu; \
|
||||
\
|
||||
for_each_possible_cpu(cpu) \
|
||||
per_cpu(exc_table, cpu).type[cause] = (handler);\
|
||||
} while (0)
|
||||
|
||||
/* Set exception C handler - for temporary use when probing exceptions */
|
||||
|
||||
void * __init trap_set_handler(int cause, void *handler)
|
||||
{
|
||||
void *previous = (void *)per_cpu(exc_table, 0)[
|
||||
EXC_TABLE_DEFAULT / 4 + cause];
|
||||
set_handler(EXC_TABLE_DEFAULT / 4 + cause, handler);
|
||||
void *previous = per_cpu(exc_table, 0).default_handler[cause];
|
||||
|
||||
set_handler(default_handler, cause, handler);
|
||||
return previous;
|
||||
}
|
||||
|
||||
|
||||
static void trap_init_excsave(void)
|
||||
{
|
||||
unsigned long excsave1 = (unsigned long)this_cpu_ptr(exc_table);
|
||||
unsigned long excsave1 = (unsigned long)this_cpu_ptr(&exc_table);
|
||||
__asm__ __volatile__("wsr %0, excsave1\n" : : "a" (excsave1));
|
||||
}
|
||||
|
||||
@@ -418,10 +420,10 @@ void __init trap_init(void)
|
||||
|
||||
/* Setup default vectors. */
|
||||
|
||||
for(i = 0; i < 64; i++) {
|
||||
set_handler(EXC_TABLE_FAST_USER/4 + i, user_exception);
|
||||
set_handler(EXC_TABLE_FAST_KERNEL/4 + i, kernel_exception);
|
||||
set_handler(EXC_TABLE_DEFAULT/4 + i, do_unhandled);
|
||||
for (i = 0; i < EXCCAUSE_N; i++) {
|
||||
set_handler(fast_user_handler, i, user_exception);
|
||||
set_handler(fast_kernel_handler, i, kernel_exception);
|
||||
set_handler(default_handler, i, do_unhandled);
|
||||
}
|
||||
|
||||
/* Setup specific handlers. */
|
||||
@@ -433,11 +435,11 @@ void __init trap_init(void)
|
||||
void *handler = dispatch_init_table[i].handler;
|
||||
|
||||
if (fast == 0)
|
||||
set_handler (EXC_TABLE_DEFAULT/4 + cause, handler);
|
||||
set_handler(default_handler, cause, handler);
|
||||
if (fast && fast & USER)
|
||||
set_handler (EXC_TABLE_FAST_USER/4 + cause, handler);
|
||||
set_handler(fast_user_handler, cause, handler);
|
||||
if (fast && fast & KRNL)
|
||||
set_handler (EXC_TABLE_FAST_KERNEL/4 + cause, handler);
|
||||
set_handler(fast_kernel_handler, cause, handler);
|
||||
}
|
||||
|
||||
/* Initialize EXCSAVE_1 to hold the address of the exception table. */
|
||||
|
@@ -205,9 +205,6 @@ ENDPROC(_KernelExceptionVector)
|
||||
*/
|
||||
|
||||
.section .DoubleExceptionVector.text, "ax"
|
||||
.begin literal_prefix .DoubleExceptionVector
|
||||
.globl _DoubleExceptionVector_WindowUnderflow
|
||||
.globl _DoubleExceptionVector_WindowOverflow
|
||||
|
||||
ENTRY(_DoubleExceptionVector)
|
||||
|
||||
@@ -217,8 +214,12 @@ ENTRY(_DoubleExceptionVector)
|
||||
/* Check for kernel double exception (usually fatal). */
|
||||
|
||||
rsr a2, ps
|
||||
_bbci.l a2, PS_UM_BIT, .Lksp
|
||||
_bbsi.l a2, PS_UM_BIT, 1f
|
||||
j .Lksp
|
||||
|
||||
.align 4
|
||||
.literal_position
|
||||
1:
|
||||
/* Check if we are currently handling a window exception. */
|
||||
/* Note: We don't need to indicate that we enter a critical section. */
|
||||
|
||||
@@ -304,8 +305,7 @@ _DoubleExceptionVector_WindowUnderflow:
|
||||
.Lunrecoverable:
|
||||
rsr a3, excsave1
|
||||
wsr a0, excsave1
|
||||
movi a0, unrecoverable_exception
|
||||
callx0 a0
|
||||
call0 unrecoverable_exception
|
||||
|
||||
.Lfixup:/* Check for a fixup handler or if we were in a critical section. */
|
||||
|
||||
@@ -475,11 +475,8 @@ _DoubleExceptionVector_handle_exception:
|
||||
rotw -3
|
||||
j 1b
|
||||
|
||||
|
||||
ENDPROC(_DoubleExceptionVector)
|
||||
|
||||
.end literal_prefix
|
||||
|
||||
.text
|
||||
/*
|
||||
* Fixup handler for TLB miss in double exception handler for window owerflow.
|
||||
@@ -508,6 +505,8 @@ ENDPROC(_DoubleExceptionVector)
|
||||
* a3: exctable, original value in excsave1
|
||||
*/
|
||||
|
||||
.literal_position
|
||||
|
||||
ENTRY(window_overflow_restore_a0_fixup)
|
||||
|
||||
rsr a0, ps
|
||||
|
@@ -45,24 +45,16 @@ jiffies = jiffies_64;
|
||||
LONG(sym ## _end); \
|
||||
LONG(LOADADDR(section))
|
||||
|
||||
/* Macro to define a section for a vector.
|
||||
*
|
||||
* Use of the MIN function catches the types of errors illustrated in
|
||||
* the following example:
|
||||
*
|
||||
* Assume the section .DoubleExceptionVector.literal is completely
|
||||
* full. Then a programmer adds code to .DoubleExceptionVector.text
|
||||
* that produces another literal. The final literal position will
|
||||
* overlay onto the first word of the adjacent code section
|
||||
* .DoubleExceptionVector.text. (In practice, the literals will
|
||||
* overwrite the code, and the first few instructions will be
|
||||
* garbage.)
|
||||
/*
|
||||
* Macro to define a section for a vector. When CONFIG_VECTORS_OFFSET is
|
||||
* defined code for every vector is located with other init data. At startup
|
||||
* time head.S copies code for every vector to its final position according
|
||||
* to description recorded in the corresponding RELOCATE_ENTRY.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_VECTORS_OFFSET
|
||||
#define SECTION_VECTOR(sym, section, addr, max_prevsec_size, prevsec) \
|
||||
section addr : AT((MIN(LOADADDR(prevsec) + max_prevsec_size, \
|
||||
LOADADDR(prevsec) + SIZEOF(prevsec)) + 3) & ~ 3) \
|
||||
#define SECTION_VECTOR(sym, section, addr, prevsec) \
|
||||
section addr : AT(((LOADADDR(prevsec) + SIZEOF(prevsec)) + 3) & ~ 3) \
|
||||
{ \
|
||||
. = ALIGN(4); \
|
||||
sym ## _start = ABSOLUTE(.); \
|
||||
@@ -112,26 +104,19 @@ SECTIONS
|
||||
#if XCHAL_EXCM_LEVEL >= 6
|
||||
SECTION_VECTOR (.Level6InterruptVector.text, INTLEVEL6_VECTOR_VADDR)
|
||||
#endif
|
||||
SECTION_VECTOR (.DebugInterruptVector.literal, DEBUG_VECTOR_VADDR - 4)
|
||||
SECTION_VECTOR (.DebugInterruptVector.text, DEBUG_VECTOR_VADDR)
|
||||
SECTION_VECTOR (.KernelExceptionVector.literal, KERNEL_VECTOR_VADDR - 4)
|
||||
SECTION_VECTOR (.KernelExceptionVector.text, KERNEL_VECTOR_VADDR)
|
||||
SECTION_VECTOR (.UserExceptionVector.literal, USER_VECTOR_VADDR - 4)
|
||||
SECTION_VECTOR (.UserExceptionVector.text, USER_VECTOR_VADDR)
|
||||
SECTION_VECTOR (.DoubleExceptionVector.literal, DOUBLEEXC_VECTOR_VADDR - 20)
|
||||
SECTION_VECTOR (.DoubleExceptionVector.text, DOUBLEEXC_VECTOR_VADDR)
|
||||
#endif
|
||||
|
||||
IRQENTRY_TEXT
|
||||
SOFTIRQENTRY_TEXT
|
||||
ENTRY_TEXT
|
||||
TEXT_TEXT
|
||||
VMLINUX_SYMBOL(__sched_text_start) = .;
|
||||
*(.sched.literal .sched.text)
|
||||
VMLINUX_SYMBOL(__sched_text_end) = .;
|
||||
VMLINUX_SYMBOL(__cpuidle_text_start) = .;
|
||||
*(.cpuidle.literal .cpuidle.text)
|
||||
VMLINUX_SYMBOL(__cpuidle_text_end) = .;
|
||||
VMLINUX_SYMBOL(__lock_text_start) = .;
|
||||
*(.spinlock.literal .spinlock.text)
|
||||
VMLINUX_SYMBOL(__lock_text_end) = .;
|
||||
SCHED_TEXT
|
||||
CPUIDLE_TEXT
|
||||
LOCK_TEXT
|
||||
|
||||
}
|
||||
_etext = .;
|
||||
@@ -196,8 +181,6 @@ SECTIONS
|
||||
.KernelExceptionVector.text);
|
||||
RELOCATE_ENTRY(_UserExceptionVector_text,
|
||||
.UserExceptionVector.text);
|
||||
RELOCATE_ENTRY(_DoubleExceptionVector_literal,
|
||||
.DoubleExceptionVector.literal);
|
||||
RELOCATE_ENTRY(_DoubleExceptionVector_text,
|
||||
.DoubleExceptionVector.text);
|
||||
RELOCATE_ENTRY(_DebugInterruptVector_text,
|
||||
@@ -230,25 +213,19 @@ SECTIONS
|
||||
|
||||
SECTION_VECTOR (_WindowVectors_text,
|
||||
.WindowVectors.text,
|
||||
WINDOW_VECTORS_VADDR, 4,
|
||||
WINDOW_VECTORS_VADDR,
|
||||
.dummy)
|
||||
SECTION_VECTOR (_DebugInterruptVector_literal,
|
||||
.DebugInterruptVector.literal,
|
||||
DEBUG_VECTOR_VADDR - 4,
|
||||
SIZEOF(.WindowVectors.text),
|
||||
.WindowVectors.text)
|
||||
SECTION_VECTOR (_DebugInterruptVector_text,
|
||||
.DebugInterruptVector.text,
|
||||
DEBUG_VECTOR_VADDR,
|
||||
4,
|
||||
.DebugInterruptVector.literal)
|
||||
.WindowVectors.text)
|
||||
#undef LAST
|
||||
#define LAST .DebugInterruptVector.text
|
||||
#if XCHAL_EXCM_LEVEL >= 2
|
||||
SECTION_VECTOR (_Level2InterruptVector_text,
|
||||
.Level2InterruptVector.text,
|
||||
INTLEVEL2_VECTOR_VADDR,
|
||||
SIZEOF(LAST), LAST)
|
||||
LAST)
|
||||
# undef LAST
|
||||
# define LAST .Level2InterruptVector.text
|
||||
#endif
|
||||
@@ -256,7 +233,7 @@ SECTIONS
|
||||
SECTION_VECTOR (_Level3InterruptVector_text,
|
||||
.Level3InterruptVector.text,
|
||||
INTLEVEL3_VECTOR_VADDR,
|
||||
SIZEOF(LAST), LAST)
|
||||
LAST)
|
||||
# undef LAST
|
||||
# define LAST .Level3InterruptVector.text
|
||||
#endif
|
||||
@@ -264,7 +241,7 @@ SECTIONS
|
||||
SECTION_VECTOR (_Level4InterruptVector_text,
|
||||
.Level4InterruptVector.text,
|
||||
INTLEVEL4_VECTOR_VADDR,
|
||||
SIZEOF(LAST), LAST)
|
||||
LAST)
|
||||
# undef LAST
|
||||
# define LAST .Level4InterruptVector.text
|
||||
#endif
|
||||
@@ -272,7 +249,7 @@ SECTIONS
|
||||
SECTION_VECTOR (_Level5InterruptVector_text,
|
||||
.Level5InterruptVector.text,
|
||||
INTLEVEL5_VECTOR_VADDR,
|
||||
SIZEOF(LAST), LAST)
|
||||
LAST)
|
||||
# undef LAST
|
||||
# define LAST .Level5InterruptVector.text
|
||||
#endif
|
||||
@@ -280,40 +257,23 @@ SECTIONS
|
||||
SECTION_VECTOR (_Level6InterruptVector_text,
|
||||
.Level6InterruptVector.text,
|
||||
INTLEVEL6_VECTOR_VADDR,
|
||||
SIZEOF(LAST), LAST)
|
||||
LAST)
|
||||
# undef LAST
|
||||
# define LAST .Level6InterruptVector.text
|
||||
#endif
|
||||
SECTION_VECTOR (_KernelExceptionVector_literal,
|
||||
.KernelExceptionVector.literal,
|
||||
KERNEL_VECTOR_VADDR - 4,
|
||||
SIZEOF(LAST), LAST)
|
||||
#undef LAST
|
||||
SECTION_VECTOR (_KernelExceptionVector_text,
|
||||
.KernelExceptionVector.text,
|
||||
KERNEL_VECTOR_VADDR,
|
||||
4,
|
||||
.KernelExceptionVector.literal)
|
||||
SECTION_VECTOR (_UserExceptionVector_literal,
|
||||
.UserExceptionVector.literal,
|
||||
USER_VECTOR_VADDR - 4,
|
||||
SIZEOF(.KernelExceptionVector.text),
|
||||
.KernelExceptionVector.text)
|
||||
LAST)
|
||||
#undef LAST
|
||||
SECTION_VECTOR (_UserExceptionVector_text,
|
||||
.UserExceptionVector.text,
|
||||
USER_VECTOR_VADDR,
|
||||
4,
|
||||
.UserExceptionVector.literal)
|
||||
SECTION_VECTOR (_DoubleExceptionVector_literal,
|
||||
.DoubleExceptionVector.literal,
|
||||
DOUBLEEXC_VECTOR_VADDR - 20,
|
||||
SIZEOF(.UserExceptionVector.text),
|
||||
.UserExceptionVector.text)
|
||||
.KernelExceptionVector.text)
|
||||
SECTION_VECTOR (_DoubleExceptionVector_text,
|
||||
.DoubleExceptionVector.text,
|
||||
DOUBLEEXC_VECTOR_VADDR,
|
||||
20,
|
||||
.DoubleExceptionVector.literal)
|
||||
.UserExceptionVector.text)
|
||||
|
||||
. = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3;
|
||||
|
||||
@@ -323,7 +283,6 @@ SECTIONS
|
||||
SECTION_VECTOR (_SecondaryResetVector_text,
|
||||
.SecondaryResetVector.text,
|
||||
RESET_VECTOR1_VADDR,
|
||||
SIZEOF(.DoubleExceptionVector.text),
|
||||
.DoubleExceptionVector.text)
|
||||
|
||||
. = LOADADDR(.SecondaryResetVector.text)+SIZEOF(.SecondaryResetVector.text);
|
||||
@@ -373,5 +332,4 @@ SECTIONS
|
||||
|
||||
/* Sections to be discarded */
|
||||
DISCARDS
|
||||
/DISCARD/ : { *(.exit.literal) }
|
||||
}
|
||||
|
@@ -41,7 +41,12 @@
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
EXPORT_SYMBOL(memmove);
|
||||
EXPORT_SYMBOL(__memset);
|
||||
EXPORT_SYMBOL(__memcpy);
|
||||
EXPORT_SYMBOL(__memmove);
|
||||
#ifndef CONFIG_GENERIC_STRNCPY_FROM_USER
|
||||
EXPORT_SYMBOL(__strncpy_user);
|
||||
#endif
|
||||
EXPORT_SYMBOL(clear_page);
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
|
Reference in New Issue
Block a user