diff options
Diffstat (limited to 'arch/m68k/kernel')
-rw-r--r-- | arch/m68k/kernel/.gitignore | 1 | ||||
-rw-r--r-- | arch/m68k/kernel/entry.S | 4 | ||||
-rw-r--r-- | arch/m68k/kernel/setup.c | 11 | ||||
-rw-r--r-- | arch/m68k/kernel/signal.c | 15 | ||||
-rw-r--r-- | arch/m68k/kernel/vmlinux-sun3.lds | 1 |
5 files changed, 24 insertions, 8 deletions
diff --git a/arch/m68k/kernel/.gitignore b/arch/m68k/kernel/.gitignore new file mode 100644 index 000000000000..c5f676c3c224 --- /dev/null +++ b/arch/m68k/kernel/.gitignore | |||
@@ -0,0 +1 @@ | |||
vmlinux.lds | |||
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index f28404d9a2bc..5c332f2b9b83 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S | |||
@@ -424,7 +424,7 @@ resume: | |||
424 | .data | 424 | .data |
425 | ALIGN | 425 | ALIGN |
426 | sys_call_table: | 426 | sys_call_table: |
427 | .long sys_ni_syscall /* 0 - old "setup()" system call*/ | 427 | .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ |
428 | .long sys_exit | 428 | .long sys_exit |
429 | .long sys_fork | 429 | .long sys_fork |
430 | .long sys_read | 430 | .long sys_read |
@@ -513,7 +513,7 @@ sys_call_table: | |||
513 | .long sys_uselib | 513 | .long sys_uselib |
514 | .long sys_swapon | 514 | .long sys_swapon |
515 | .long sys_reboot | 515 | .long sys_reboot |
516 | .long old_readdir | 516 | .long sys_old_readdir |
517 | .long old_mmap /* 90 */ | 517 | .long old_mmap /* 90 */ |
518 | .long sys_munmap | 518 | .long sys_munmap |
519 | .long sys_truncate | 519 | .long sys_truncate |
diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c index 4d97bd2bd573..303730afb1c9 100644 --- a/arch/m68k/kernel/setup.c +++ b/arch/m68k/kernel/setup.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/initrd.h> | 26 | #include <linux/initrd.h> |
27 | 27 | ||
28 | #include <asm/bootinfo.h> | 28 | #include <asm/bootinfo.h> |
29 | #include <asm/sections.h> | ||
29 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
30 | #include <asm/fpu.h> | 31 | #include <asm/fpu.h> |
31 | #include <asm/irq.h> | 32 | #include <asm/irq.h> |
@@ -62,7 +63,6 @@ EXPORT_SYMBOL(vme_brdtype); | |||
62 | int m68k_is040or060; | 63 | int m68k_is040or060; |
63 | EXPORT_SYMBOL(m68k_is040or060); | 64 | EXPORT_SYMBOL(m68k_is040or060); |
64 | 65 | ||
65 | extern int end; | ||
66 | extern unsigned long availmem; | 66 | extern unsigned long availmem; |
67 | 67 | ||
68 | int m68k_num_memory; | 68 | int m68k_num_memory; |
@@ -215,11 +215,10 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) | |||
215 | 215 | ||
216 | void __init setup_arch(char **cmdline_p) | 216 | void __init setup_arch(char **cmdline_p) |
217 | { | 217 | { |
218 | extern int _etext, _edata, _end; | ||
219 | int i; | 218 | int i; |
220 | 219 | ||
221 | /* The bootinfo is located right after the kernel bss */ | 220 | /* The bootinfo is located right after the kernel bss */ |
222 | m68k_parse_bootinfo((const struct bi_record *)&_end); | 221 | m68k_parse_bootinfo((const struct bi_record *)_end); |
223 | 222 | ||
224 | if (CPU_IS_040) | 223 | if (CPU_IS_040) |
225 | m68k_is040or060 = 4; | 224 | m68k_is040or060 = 4; |
@@ -252,9 +251,9 @@ void __init setup_arch(char **cmdline_p) | |||
252 | } | 251 | } |
253 | 252 | ||
254 | init_mm.start_code = PAGE_OFFSET; | 253 | init_mm.start_code = PAGE_OFFSET; |
255 | init_mm.end_code = (unsigned long) &_etext; | 254 | init_mm.end_code = (unsigned long)_etext; |
256 | init_mm.end_data = (unsigned long) &_edata; | 255 | init_mm.end_data = (unsigned long)_edata; |
257 | init_mm.brk = (unsigned long) &_end; | 256 | init_mm.brk = (unsigned long)_end; |
258 | 257 | ||
259 | *cmdline_p = m68k_command_line; | 258 | *cmdline_p = m68k_command_line; |
260 | memcpy(boot_command_line, *cmdline_p, CL_SIZE); | 259 | memcpy(boot_command_line, *cmdline_p, CL_SIZE); |
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index f9af893cd289..de2d05ddd86d 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c | |||
@@ -326,6 +326,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u | |||
326 | struct sigcontext context; | 326 | struct sigcontext context; |
327 | int err; | 327 | int err; |
328 | 328 | ||
329 | /* Always make any pending restarted system calls return -EINTR */ | ||
330 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
331 | |||
329 | /* get previous context */ | 332 | /* get previous context */ |
330 | if (copy_from_user(&context, usc, sizeof(context))) | 333 | if (copy_from_user(&context, usc, sizeof(context))) |
331 | goto badframe; | 334 | goto badframe; |
@@ -411,6 +414,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, | |||
411 | unsigned long usp; | 414 | unsigned long usp; |
412 | int err; | 415 | int err; |
413 | 416 | ||
417 | /* Always make any pending restarted system calls return -EINTR */ | ||
418 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
419 | |||
414 | err = __get_user(temp, &uc->uc_mcontext.version); | 420 | err = __get_user(temp, &uc->uc_mcontext.version); |
415 | if (temp != MCONTEXT_VERSION) | 421 | if (temp != MCONTEXT_VERSION) |
416 | goto badframe; | 422 | goto badframe; |
@@ -937,6 +943,15 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) | |||
937 | regs->d0 = -EINTR; | 943 | regs->d0 = -EINTR; |
938 | break; | 944 | break; |
939 | 945 | ||
946 | case -ERESTART_RESTARTBLOCK: | ||
947 | if (!has_handler) { | ||
948 | regs->d0 = __NR_restart_syscall; | ||
949 | regs->pc -= 2; | ||
950 | break; | ||
951 | } | ||
952 | regs->d0 = -EINTR; | ||
953 | break; | ||
954 | |||
940 | case -ERESTARTSYS: | 955 | case -ERESTARTSYS: |
941 | if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { | 956 | if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { |
942 | regs->d0 = -EINTR; | 957 | regs->d0 = -EINTR; |
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds index 8a4919e4d36a..d9368c0709ba 100644 --- a/arch/m68k/kernel/vmlinux-sun3.lds +++ b/arch/m68k/kernel/vmlinux-sun3.lds | |||
@@ -33,6 +33,7 @@ SECTIONS | |||
33 | } :data | 33 | } :data |
34 | /* End of data goes *here* so that freeing init code works properly. */ | 34 | /* End of data goes *here* so that freeing init code works properly. */ |
35 | _edata = .; | 35 | _edata = .; |
36 | NOTES | ||
36 | 37 | ||
37 | /* will be freed after init */ | 38 | /* will be freed after init */ |
38 | . = ALIGN(PAGE_SIZE); /* Init code and data */ | 39 | . = ALIGN(PAGE_SIZE); /* Init code and data */ |