diff options
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/.gitignore | 1 | ||||
-rw-r--r-- | arch/arm/kernel/calls.S | 10 | ||||
-rw-r--r-- | arch/arm/kernel/machine_kexec.c | 2 | ||||
-rw-r--r-- | arch/arm/kernel/setup.c | 13 | ||||
-rw-r--r-- | arch/arm/kernel/traps.c | 31 |
5 files changed, 41 insertions, 16 deletions
diff --git a/arch/arm/kernel/.gitignore b/arch/arm/kernel/.gitignore new file mode 100644 index 000000000000..c5f676c3c224 --- /dev/null +++ b/arch/arm/kernel/.gitignore | |||
@@ -0,0 +1 @@ | |||
vmlinux.lds | |||
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 30a67a5a40a8..09a061cb7838 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -262,10 +262,10 @@ | |||
262 | /* 250 */ CALL(sys_epoll_create) | 262 | /* 250 */ CALL(sys_epoll_create) |
263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) | 263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) |
264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) | 264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) |
265 | CALL(sys_remap_file_pages) | 265 | CALL(sys_remap_file_pages) |
266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ | 266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ |
267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ | 267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ |
268 | CALL(sys_set_tid_address) | 268 | CALL(sys_set_tid_address) |
269 | CALL(sys_timer_create) | 269 | CALL(sys_timer_create) |
270 | CALL(sys_timer_settime) | 270 | CALL(sys_timer_settime) |
271 | CALL(sys_timer_gettime) | 271 | CALL(sys_timer_gettime) |
@@ -364,6 +364,12 @@ | |||
364 | CALL(sys_fallocate) | 364 | CALL(sys_fallocate) |
365 | CALL(sys_timerfd_settime) | 365 | CALL(sys_timerfd_settime) |
366 | CALL(sys_timerfd_gettime) | 366 | CALL(sys_timerfd_gettime) |
367 | /* 355 */ CALL(sys_signalfd4) | ||
368 | CALL(sys_eventfd2) | ||
369 | CALL(sys_epoll_create1) | ||
370 | CALL(sys_dup3) | ||
371 | CALL(sys_pipe2) | ||
372 | /* 360 */ CALL(sys_inotify_init1) | ||
367 | #ifndef syscalls_counted | 373 | #ifndef syscalls_counted |
368 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 374 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
369 | #define syscalls_counted | 375 | #define syscalls_counted |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index db8f54a3451f..fae5beb3c3d6 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -71,7 +71,7 @@ void machine_kexec(struct kimage *image) | |||
71 | 71 | ||
72 | 72 | ||
73 | flush_icache_range((unsigned long) reboot_code_buffer, | 73 | flush_icache_range((unsigned long) reboot_code_buffer, |
74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
75 | printk(KERN_INFO "Bye!\n"); | 75 | printk(KERN_INFO "Bye!\n"); |
76 | 76 | ||
77 | cpu_proc_fin(); | 77 | cpu_proc_fin(); |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 38f0e7940a13..2ca7038b67a7 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -81,6 +81,8 @@ EXPORT_SYMBOL(system_serial_high); | |||
81 | unsigned int elf_hwcap; | 81 | unsigned int elf_hwcap; |
82 | EXPORT_SYMBOL(elf_hwcap); | 82 | EXPORT_SYMBOL(elf_hwcap); |
83 | 83 | ||
84 | unsigned long __initdata vmalloc_reserve = 128 << 20; | ||
85 | |||
84 | 86 | ||
85 | #ifdef MULTI_CPU | 87 | #ifdef MULTI_CPU |
86 | struct processor processor; | 88 | struct processor processor; |
@@ -501,6 +503,17 @@ static void __init early_mem(char **p) | |||
501 | __early_param("mem=", early_mem); | 503 | __early_param("mem=", early_mem); |
502 | 504 | ||
503 | /* | 505 | /* |
506 | * vmalloc=size forces the vmalloc area to be exactly 'size' | ||
507 | * bytes. This can be used to increase (or decrease) the vmalloc | ||
508 | * area - the default is 128m. | ||
509 | */ | ||
510 | static void __init early_vmalloc(char **arg) | ||
511 | { | ||
512 | vmalloc_reserve = memparse(*arg, arg); | ||
513 | } | ||
514 | __early_param("vmalloc=", early_vmalloc); | ||
515 | |||
516 | /* | ||
504 | * Initial parsing of the command line. | 517 | * Initial parsing of the command line. |
505 | */ | 518 | */ |
506 | static void __init parse_cmdline(char **cmdline_p, char *from) | 519 | static void __init parse_cmdline(char **cmdline_p, char *from) |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 7277aef83098..872f1f8fbb57 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -288,14 +288,28 @@ void unregister_undef_hook(struct undef_hook *hook) | |||
288 | spin_unlock_irqrestore(&undef_lock, flags); | 288 | spin_unlock_irqrestore(&undef_lock, flags); |
289 | } | 289 | } |
290 | 290 | ||
291 | static int call_undef_hook(struct pt_regs *regs, unsigned int instr) | ||
292 | { | ||
293 | struct undef_hook *hook; | ||
294 | unsigned long flags; | ||
295 | int (*fn)(struct pt_regs *regs, unsigned int instr) = NULL; | ||
296 | |||
297 | spin_lock_irqsave(&undef_lock, flags); | ||
298 | list_for_each_entry(hook, &undef_hook, node) | ||
299 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
300 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) | ||
301 | fn = hook->fn; | ||
302 | spin_unlock_irqrestore(&undef_lock, flags); | ||
303 | |||
304 | return fn ? fn(regs, instr) : 1; | ||
305 | } | ||
306 | |||
291 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | 307 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) |
292 | { | 308 | { |
293 | unsigned int correction = thumb_mode(regs) ? 2 : 4; | 309 | unsigned int correction = thumb_mode(regs) ? 2 : 4; |
294 | unsigned int instr; | 310 | unsigned int instr; |
295 | struct undef_hook *hook; | ||
296 | siginfo_t info; | 311 | siginfo_t info; |
297 | void __user *pc; | 312 | void __user *pc; |
298 | unsigned long flags; | ||
299 | 313 | ||
300 | /* | 314 | /* |
301 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, | 315 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, |
@@ -325,17 +339,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
325 | } | 339 | } |
326 | #endif | 340 | #endif |
327 | 341 | ||
328 | spin_lock_irqsave(&undef_lock, flags); | 342 | if (call_undef_hook(regs, instr) == 0) |
329 | list_for_each_entry(hook, &undef_hook, node) { | 343 | return; |
330 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
331 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { | ||
332 | if (hook->fn(regs, instr) == 0) { | ||
333 | spin_unlock_irqrestore(&undef_lock, flags); | ||
334 | return; | ||
335 | } | ||
336 | } | ||
337 | } | ||
338 | spin_unlock_irqrestore(&undef_lock, flags); | ||
339 | 344 | ||
340 | #ifdef CONFIG_DEBUG_USER | 345 | #ifdef CONFIG_DEBUG_USER |
341 | if (user_debug & UDBG_UNDEFINED) { | 346 | if (user_debug & UDBG_UNDEFINED) { |