diff options
Diffstat (limited to 'arch/m32r/kernel')
-rw-r--r-- | arch/m32r/kernel/irq.c | 4 | ||||
-rw-r--r-- | arch/m32r/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/m32r/kernel/ptrace.c | 97 | ||||
-rw-r--r-- | arch/m32r/kernel/sys_m32r.c | 116 | ||||
-rw-r--r-- | arch/m32r/kernel/syscall_table.S | 2 |
5 files changed, 33 insertions, 188 deletions
diff --git a/arch/m32r/kernel/irq.c b/arch/m32r/kernel/irq.c index 8dfd31e87c4c..3c71f776872c 100644 --- a/arch/m32r/kernel/irq.c +++ b/arch/m32r/kernel/irq.c | |||
@@ -40,7 +40,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
40 | } | 40 | } |
41 | 41 | ||
42 | if (i < NR_IRQS) { | 42 | if (i < NR_IRQS) { |
43 | spin_lock_irqsave(&irq_desc[i].lock, flags); | 43 | raw_spin_lock_irqsave(&irq_desc[i].lock, flags); |
44 | action = irq_desc[i].action; | 44 | action = irq_desc[i].action; |
45 | if (!action) | 45 | if (!action) |
46 | goto skip; | 46 | goto skip; |
@@ -59,7 +59,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
59 | 59 | ||
60 | seq_putc(p, '\n'); | 60 | seq_putc(p, '\n'); |
61 | skip: | 61 | skip: |
62 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | 62 | raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); |
63 | } | 63 | } |
64 | return 0; | 64 | return 0; |
65 | } | 65 | } |
diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c index 67a01e1e4283..bc8c8c1511b2 100644 --- a/arch/m32r/kernel/process.c +++ b/arch/m32r/kernel/process.c | |||
@@ -21,10 +21,10 @@ | |||
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/fs.h> | 23 | #include <linux/fs.h> |
24 | #include <linux/slab.h> | ||
24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
25 | #include <linux/ptrace.h> | 26 | #include <linux/ptrace.h> |
26 | #include <linux/unistd.h> | 27 | #include <linux/unistd.h> |
27 | #include <linux/slab.h> | ||
28 | #include <linux/hardirq.h> | 28 | #include <linux/hardirq.h> |
29 | 29 | ||
30 | #include <asm/io.h> | 30 | #include <asm/io.h> |
diff --git a/arch/m32r/kernel/ptrace.c b/arch/m32r/kernel/ptrace.c index 98682bba0ed9..e555091eb97c 100644 --- a/arch/m32r/kernel/ptrace.c +++ b/arch/m32r/kernel/ptrace.c | |||
@@ -580,6 +580,35 @@ init_debug_traps(struct task_struct *child) | |||
580 | } | 580 | } |
581 | } | 581 | } |
582 | 582 | ||
583 | void user_enable_single_step(struct task_struct *child) | ||
584 | { | ||
585 | unsigned long next_pc; | ||
586 | unsigned long pc, insn; | ||
587 | |||
588 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
589 | |||
590 | /* Compute next pc. */ | ||
591 | pc = get_stack_long(child, PT_BPC); | ||
592 | |||
593 | if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) | ||
594 | != sizeof(insn)) | ||
595 | break; | ||
596 | |||
597 | compute_next_pc(insn, pc, &next_pc, child); | ||
598 | if (next_pc & 0x80000000) | ||
599 | break; | ||
600 | |||
601 | if (embed_debug_trap(child, next_pc)) | ||
602 | break; | ||
603 | |||
604 | invalidate_cache(); | ||
605 | } | ||
606 | |||
607 | void user_disable_single_step(struct task_struct *child) | ||
608 | { | ||
609 | unregister_all_debug_traps(child); | ||
610 | invalidate_cache(); | ||
611 | } | ||
583 | 612 | ||
584 | /* | 613 | /* |
585 | * Called by kernel/ptrace.c when detaching.. | 614 | * Called by kernel/ptrace.c when detaching.. |
@@ -630,74 +659,6 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
630 | ret = ptrace_write_user(child, addr, data); | 659 | ret = ptrace_write_user(child, addr, data); |
631 | break; | 660 | break; |
632 | 661 | ||
633 | /* | ||
634 | * continue/restart and stop at next (return from) syscall | ||
635 | */ | ||
636 | case PTRACE_SYSCALL: | ||
637 | case PTRACE_CONT: | ||
638 | ret = -EIO; | ||
639 | if (!valid_signal(data)) | ||
640 | break; | ||
641 | if (request == PTRACE_SYSCALL) | ||
642 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
643 | else | ||
644 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
645 | child->exit_code = data; | ||
646 | wake_up_process(child); | ||
647 | ret = 0; | ||
648 | break; | ||
649 | |||
650 | /* | ||
651 | * make the child exit. Best I can do is send it a sigkill. | ||
652 | * perhaps it should be put in the status that it wants to | ||
653 | * exit. | ||
654 | */ | ||
655 | case PTRACE_KILL: { | ||
656 | ret = 0; | ||
657 | unregister_all_debug_traps(child); | ||
658 | invalidate_cache(); | ||
659 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ | ||
660 | break; | ||
661 | child->exit_code = SIGKILL; | ||
662 | wake_up_process(child); | ||
663 | break; | ||
664 | } | ||
665 | |||
666 | /* | ||
667 | * execute single instruction. | ||
668 | */ | ||
669 | case PTRACE_SINGLESTEP: { | ||
670 | unsigned long next_pc; | ||
671 | unsigned long pc, insn; | ||
672 | |||
673 | ret = -EIO; | ||
674 | if (!valid_signal(data)) | ||
675 | break; | ||
676 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
677 | |||
678 | /* Compute next pc. */ | ||
679 | pc = get_stack_long(child, PT_BPC); | ||
680 | |||
681 | if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) | ||
682 | != sizeof(insn)) | ||
683 | break; | ||
684 | |||
685 | compute_next_pc(insn, pc, &next_pc, child); | ||
686 | if (next_pc & 0x80000000) | ||
687 | break; | ||
688 | |||
689 | if (embed_debug_trap(child, next_pc)) | ||
690 | break; | ||
691 | |||
692 | invalidate_cache(); | ||
693 | child->exit_code = data; | ||
694 | |||
695 | /* give it a chance to run. */ | ||
696 | wake_up_process(child); | ||
697 | ret = 0; | ||
698 | break; | ||
699 | } | ||
700 | |||
701 | case PTRACE_GETREGS: | 662 | case PTRACE_GETREGS: |
702 | ret = ptrace_getregs(child, (void __user *)data); | 663 | ret = ptrace_getregs(child, (void __user *)data); |
703 | break; | 664 | break; |
diff --git a/arch/m32r/kernel/sys_m32r.c b/arch/m32r/kernel/sys_m32r.c index 305ac852bbed..0a00f467edfa 100644 --- a/arch/m32r/kernel/sys_m32r.c +++ b/arch/m32r/kernel/sys_m32r.c | |||
@@ -76,122 +76,6 @@ asmlinkage int sys_tas(int __user *addr) | |||
76 | return oldval; | 76 | return oldval; |
77 | } | 77 | } |
78 | 78 | ||
79 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, | ||
80 | unsigned long prot, unsigned long flags, | ||
81 | unsigned long fd, unsigned long pgoff) | ||
82 | { | ||
83 | int error = -EBADF; | ||
84 | struct file *file = NULL; | ||
85 | |||
86 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | ||
87 | if (!(flags & MAP_ANONYMOUS)) { | ||
88 | file = fget(fd); | ||
89 | if (!file) | ||
90 | goto out; | ||
91 | } | ||
92 | |||
93 | down_write(¤t->mm->mmap_sem); | ||
94 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | ||
95 | up_write(¤t->mm->mmap_sem); | ||
96 | |||
97 | if (file) | ||
98 | fput(file); | ||
99 | out: | ||
100 | return error; | ||
101 | } | ||
102 | |||
103 | /* | ||
104 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. | ||
105 | * | ||
106 | * This is really horribly ugly. | ||
107 | */ | ||
108 | asmlinkage int sys_ipc(uint call, int first, int second, | ||
109 | int third, void __user *ptr, long fifth) | ||
110 | { | ||
111 | int version, ret; | ||
112 | |||
113 | version = call >> 16; /* hack for backward compatibility */ | ||
114 | call &= 0xffff; | ||
115 | |||
116 | switch (call) { | ||
117 | case SEMOP: | ||
118 | return sys_semtimedop(first, (struct sembuf __user *)ptr, | ||
119 | second, NULL); | ||
120 | case SEMTIMEDOP: | ||
121 | return sys_semtimedop(first, (struct sembuf __user *)ptr, | ||
122 | second, (const struct timespec __user *)fifth); | ||
123 | case SEMGET: | ||
124 | return sys_semget (first, second, third); | ||
125 | case SEMCTL: { | ||
126 | union semun fourth; | ||
127 | if (!ptr) | ||
128 | return -EINVAL; | ||
129 | if (get_user(fourth.__pad, (void __user * __user *) ptr)) | ||
130 | return -EFAULT; | ||
131 | return sys_semctl (first, second, third, fourth); | ||
132 | } | ||
133 | |||
134 | case MSGSND: | ||
135 | return sys_msgsnd (first, (struct msgbuf __user *) ptr, | ||
136 | second, third); | ||
137 | case MSGRCV: | ||
138 | switch (version) { | ||
139 | case 0: { | ||
140 | struct ipc_kludge tmp; | ||
141 | if (!ptr) | ||
142 | return -EINVAL; | ||
143 | |||
144 | if (copy_from_user(&tmp, | ||
145 | (struct ipc_kludge __user *) ptr, | ||
146 | sizeof (tmp))) | ||
147 | return -EFAULT; | ||
148 | return sys_msgrcv (first, tmp.msgp, second, | ||
149 | tmp.msgtyp, third); | ||
150 | } | ||
151 | default: | ||
152 | return sys_msgrcv (first, | ||
153 | (struct msgbuf __user *) ptr, | ||
154 | second, fifth, third); | ||
155 | } | ||
156 | case MSGGET: | ||
157 | return sys_msgget ((key_t) first, second); | ||
158 | case MSGCTL: | ||
159 | return sys_msgctl (first, second, | ||
160 | (struct msqid_ds __user *) ptr); | ||
161 | case SHMAT: { | ||
162 | ulong raddr; | ||
163 | |||
164 | if (!access_ok(VERIFY_WRITE, (ulong __user *) third, | ||
165 | sizeof(ulong))) | ||
166 | return -EFAULT; | ||
167 | ret = do_shmat (first, (char __user *) ptr, second, &raddr); | ||
168 | if (ret) | ||
169 | return ret; | ||
170 | return put_user (raddr, (ulong __user *) third); | ||
171 | } | ||
172 | case SHMDT: | ||
173 | return sys_shmdt ((char __user *)ptr); | ||
174 | case SHMGET: | ||
175 | return sys_shmget (first, second, third); | ||
176 | case SHMCTL: | ||
177 | return sys_shmctl (first, second, | ||
178 | (struct shmid_ds __user *) ptr); | ||
179 | default: | ||
180 | return -ENOSYS; | ||
181 | } | ||
182 | } | ||
183 | |||
184 | asmlinkage int sys_uname(struct old_utsname __user * name) | ||
185 | { | ||
186 | int err; | ||
187 | if (!name) | ||
188 | return -EFAULT; | ||
189 | down_read(&uts_sem); | ||
190 | err = copy_to_user(name, utsname(), sizeof (*name)); | ||
191 | up_read(&uts_sem); | ||
192 | return err?-EFAULT:0; | ||
193 | } | ||
194 | |||
195 | asmlinkage int sys_cacheflush(void *addr, int bytes, int cache) | 79 | asmlinkage int sys_cacheflush(void *addr, int bytes, int cache) |
196 | { | 80 | { |
197 | /* This should flush more selectively ... */ | 81 | /* This should flush more selectively ... */ |
diff --git a/arch/m32r/kernel/syscall_table.S b/arch/m32r/kernel/syscall_table.S index aa3bf4cfab37..60536e271233 100644 --- a/arch/m32r/kernel/syscall_table.S +++ b/arch/m32r/kernel/syscall_table.S | |||
@@ -191,7 +191,7 @@ ENTRY(sys_call_table) | |||
191 | .long sys_ni_syscall /* streams2 */ | 191 | .long sys_ni_syscall /* streams2 */ |
192 | .long sys_vfork /* 190 */ | 192 | .long sys_vfork /* 190 */ |
193 | .long sys_getrlimit | 193 | .long sys_getrlimit |
194 | .long sys_mmap2 | 194 | .long sys_mmap_pgoff |
195 | .long sys_truncate64 | 195 | .long sys_truncate64 |
196 | .long sys_ftruncate64 | 196 | .long sys_ftruncate64 |
197 | .long sys_stat64 /* 195 */ | 197 | .long sys_stat64 /* 195 */ |