diff options
Diffstat (limited to 'arch/cris')
-rw-r--r-- | arch/cris/arch-v10/kernel/entry.S | 2 | ||||
-rw-r--r-- | arch/cris/arch-v10/kernel/ptrace.c | 51 | ||||
-rw-r--r-- | arch/cris/arch-v32/kernel/entry.S | 2 | ||||
-rw-r--r-- | arch/cris/arch-v32/kernel/ptrace.c | 109 | ||||
-rw-r--r-- | arch/cris/include/arch-v32/arch/ptrace.h | 1 | ||||
-rw-r--r-- | arch/cris/include/asm/pci.h | 8 | ||||
-rw-r--r-- | arch/cris/include/asm/unistd.h | 2 | ||||
-rw-r--r-- | arch/cris/kernel/sys_cris.c | 96 |
8 files changed, 35 insertions, 236 deletions
diff --git a/arch/cris/arch-v10/kernel/entry.S b/arch/cris/arch-v10/kernel/entry.S index c52bef39e250..0d6420d087fd 100644 --- a/arch/cris/arch-v10/kernel/entry.S +++ b/arch/cris/arch-v10/kernel/entry.S | |||
@@ -692,7 +692,7 @@ sys_call_table: | |||
692 | .long sys_swapon | 692 | .long sys_swapon |
693 | .long sys_reboot | 693 | .long sys_reboot |
694 | .long sys_old_readdir | 694 | .long sys_old_readdir |
695 | .long old_mmap /* 90 */ | 695 | .long sys_old_mmap /* 90 */ |
696 | .long sys_munmap | 696 | .long sys_munmap |
697 | .long sys_truncate | 697 | .long sys_truncate |
698 | .long sys_ftruncate | 698 | .long sys_ftruncate |
diff --git a/arch/cris/arch-v10/kernel/ptrace.c b/arch/cris/arch-v10/kernel/ptrace.c index ee505b2eb4db..e70c804e9377 100644 --- a/arch/cris/arch-v10/kernel/ptrace.c +++ b/arch/cris/arch-v10/kernel/ptrace.c | |||
@@ -127,57 +127,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
127 | ret = 0; | 127 | ret = 0; |
128 | break; | 128 | break; |
129 | 129 | ||
130 | case PTRACE_SYSCALL: | ||
131 | case PTRACE_CONT: | ||
132 | ret = -EIO; | ||
133 | |||
134 | if (!valid_signal(data)) | ||
135 | break; | ||
136 | |||
137 | if (request == PTRACE_SYSCALL) { | ||
138 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
139 | } | ||
140 | else { | ||
141 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
142 | } | ||
143 | |||
144 | child->exit_code = data; | ||
145 | |||
146 | /* TODO: make sure any pending breakpoint is killed */ | ||
147 | wake_up_process(child); | ||
148 | ret = 0; | ||
149 | |||
150 | break; | ||
151 | |||
152 | /* Make the child exit by sending it a sigkill. */ | ||
153 | case PTRACE_KILL: | ||
154 | ret = 0; | ||
155 | |||
156 | if (child->exit_state == EXIT_ZOMBIE) | ||
157 | break; | ||
158 | |||
159 | child->exit_code = SIGKILL; | ||
160 | |||
161 | /* TODO: make sure any pending breakpoint is killed */ | ||
162 | wake_up_process(child); | ||
163 | break; | ||
164 | |||
165 | /* Set the trap flag. */ | ||
166 | case PTRACE_SINGLESTEP: | ||
167 | ret = -EIO; | ||
168 | |||
169 | if (!valid_signal(data)) | ||
170 | break; | ||
171 | |||
172 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
173 | |||
174 | /* TODO: set some clever breakpoint mechanism... */ | ||
175 | |||
176 | child->exit_code = data; | ||
177 | wake_up_process(child); | ||
178 | ret = 0; | ||
179 | break; | ||
180 | |||
181 | /* Get all GP registers from the child. */ | 130 | /* Get all GP registers from the child. */ |
182 | case PTRACE_GETREGS: { | 131 | case PTRACE_GETREGS: { |
183 | int i; | 132 | int i; |
diff --git a/arch/cris/arch-v32/kernel/entry.S b/arch/cris/arch-v32/kernel/entry.S index 435b9671bd4b..1f39861eac8c 100644 --- a/arch/cris/arch-v32/kernel/entry.S +++ b/arch/cris/arch-v32/kernel/entry.S | |||
@@ -615,7 +615,7 @@ sys_call_table: | |||
615 | .long sys_swapon | 615 | .long sys_swapon |
616 | .long sys_reboot | 616 | .long sys_reboot |
617 | .long sys_old_readdir | 617 | .long sys_old_readdir |
618 | .long old_mmap /* 90 */ | 618 | .long sys_old_mmap /* 90 */ |
619 | .long sys_munmap | 619 | .long sys_munmap |
620 | .long sys_truncate | 620 | .long sys_truncate |
621 | .long sys_ftruncate | 621 | .long sys_ftruncate |
diff --git a/arch/cris/arch-v32/kernel/ptrace.c b/arch/cris/arch-v32/kernel/ptrace.c index dd401473f5b5..f4ebd1e7d0f5 100644 --- a/arch/cris/arch-v32/kernel/ptrace.c +++ b/arch/cris/arch-v32/kernel/ptrace.c | |||
@@ -78,6 +78,35 @@ int put_reg(struct task_struct *task, unsigned int regno, unsigned long data) | |||
78 | return 0; | 78 | return 0; |
79 | } | 79 | } |
80 | 80 | ||
81 | void user_enable_single_step(struct task_struct *child) | ||
82 | { | ||
83 | unsigned long tmp; | ||
84 | |||
85 | /* | ||
86 | * Set up SPC if not set already (in which case we have no other | ||
87 | * choice but to trust it). | ||
88 | */ | ||
89 | if (!get_reg(child, PT_SPC)) { | ||
90 | /* In case we're stopped in a delay slot. */ | ||
91 | tmp = get_reg(child, PT_ERP) & ~1; | ||
92 | put_reg(child, PT_SPC, tmp); | ||
93 | } | ||
94 | tmp = get_reg(child, PT_CCS) | SBIT_USER; | ||
95 | put_reg(child, PT_CCS, tmp); | ||
96 | } | ||
97 | |||
98 | void user_disable_single_step(struct task_struct *child) | ||
99 | { | ||
100 | put_reg(child, PT_SPC, 0); | ||
101 | |||
102 | if (!get_debugreg(child->pid, PT_BP_CTRL)) { | ||
103 | unsigned long tmp; | ||
104 | /* If no h/w bp configured, disable S bit. */ | ||
105 | tmp = get_reg(child, PT_CCS) & ~SBIT_USER; | ||
106 | put_reg(child, PT_CCS, tmp); | ||
107 | } | ||
108 | } | ||
109 | |||
81 | /* | 110 | /* |
82 | * Called by kernel/ptrace.c when detaching. | 111 | * Called by kernel/ptrace.c when detaching. |
83 | * | 112 | * |
@@ -89,8 +118,7 @@ ptrace_disable(struct task_struct *child) | |||
89 | unsigned long tmp; | 118 | unsigned long tmp; |
90 | 119 | ||
91 | /* Deconfigure SPC and S-bit. */ | 120 | /* Deconfigure SPC and S-bit. */ |
92 | tmp = get_reg(child, PT_CCS) & ~SBIT_USER; | 121 | user_disable_single_step(child); |
93 | put_reg(child, PT_CCS, tmp); | ||
94 | put_reg(child, PT_SPC, 0); | 122 | put_reg(child, PT_SPC, 0); |
95 | 123 | ||
96 | /* Deconfigure any watchpoints associated with the child. */ | 124 | /* Deconfigure any watchpoints associated with the child. */ |
@@ -169,83 +197,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
169 | ret = 0; | 197 | ret = 0; |
170 | break; | 198 | break; |
171 | 199 | ||
172 | case PTRACE_SYSCALL: | ||
173 | case PTRACE_CONT: | ||
174 | ret = -EIO; | ||
175 | |||
176 | if (!valid_signal(data)) | ||
177 | break; | ||
178 | |||
179 | /* Continue means no single-step. */ | ||
180 | put_reg(child, PT_SPC, 0); | ||
181 | |||
182 | if (!get_debugreg(child->pid, PT_BP_CTRL)) { | ||
183 | unsigned long tmp; | ||
184 | /* If no h/w bp configured, disable S bit. */ | ||
185 | tmp = get_reg(child, PT_CCS) & ~SBIT_USER; | ||
186 | put_reg(child, PT_CCS, tmp); | ||
187 | } | ||
188 | |||
189 | if (request == PTRACE_SYSCALL) { | ||
190 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
191 | } | ||
192 | else { | ||
193 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
194 | } | ||
195 | |||
196 | child->exit_code = data; | ||
197 | |||
198 | /* TODO: make sure any pending breakpoint is killed */ | ||
199 | wake_up_process(child); | ||
200 | ret = 0; | ||
201 | |||
202 | break; | ||
203 | |||
204 | /* Make the child exit by sending it a sigkill. */ | ||
205 | case PTRACE_KILL: | ||
206 | ret = 0; | ||
207 | |||
208 | if (child->exit_state == EXIT_ZOMBIE) | ||
209 | break; | ||
210 | |||
211 | child->exit_code = SIGKILL; | ||
212 | |||
213 | /* Deconfigure single-step and h/w bp. */ | ||
214 | ptrace_disable(child); | ||
215 | |||
216 | /* TODO: make sure any pending breakpoint is killed */ | ||
217 | wake_up_process(child); | ||
218 | break; | ||
219 | |||
220 | /* Set the trap flag. */ | ||
221 | case PTRACE_SINGLESTEP: { | ||
222 | unsigned long tmp; | ||
223 | ret = -EIO; | ||
224 | |||
225 | /* Set up SPC if not set already (in which case we have | ||
226 | no other choice but to trust it). */ | ||
227 | if (!get_reg(child, PT_SPC)) { | ||
228 | /* In case we're stopped in a delay slot. */ | ||
229 | tmp = get_reg(child, PT_ERP) & ~1; | ||
230 | put_reg(child, PT_SPC, tmp); | ||
231 | } | ||
232 | tmp = get_reg(child, PT_CCS) | SBIT_USER; | ||
233 | put_reg(child, PT_CCS, tmp); | ||
234 | |||
235 | if (!valid_signal(data)) | ||
236 | break; | ||
237 | |||
238 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
239 | |||
240 | /* TODO: set some clever breakpoint mechanism... */ | ||
241 | |||
242 | child->exit_code = data; | ||
243 | wake_up_process(child); | ||
244 | ret = 0; | ||
245 | break; | ||
246 | |||
247 | } | ||
248 | |||
249 | /* Get all GP registers from the child. */ | 200 | /* Get all GP registers from the child. */ |
250 | case PTRACE_GETREGS: { | 201 | case PTRACE_GETREGS: { |
251 | int i; | 202 | int i; |
diff --git a/arch/cris/include/arch-v32/arch/ptrace.h b/arch/cris/include/arch-v32/arch/ptrace.h index 41f4e8662bc2..ffca8d0f2e17 100644 --- a/arch/cris/include/arch-v32/arch/ptrace.h +++ b/arch/cris/include/arch-v32/arch/ptrace.h | |||
@@ -108,6 +108,7 @@ struct switch_stack { | |||
108 | 108 | ||
109 | #ifdef __KERNEL__ | 109 | #ifdef __KERNEL__ |
110 | 110 | ||
111 | #define arch_has_single_step() (1) | ||
111 | #define user_mode(regs) (((regs)->ccs & (1 << (U_CCS_BITNR + CCS_SHIFT))) != 0) | 112 | #define user_mode(regs) (((regs)->ccs & (1 << (U_CCS_BITNR + CCS_SHIFT))) != 0) |
112 | #define instruction_pointer(regs) ((regs)->erp) | 113 | #define instruction_pointer(regs) ((regs)->erp) |
113 | extern void show_regs(struct pt_regs *); | 114 | extern void show_regs(struct pt_regs *); |
diff --git a/arch/cris/include/asm/pci.h b/arch/cris/include/asm/pci.h index 730ce40fdd0f..9f1cd56da28c 100644 --- a/arch/cris/include/asm/pci.h +++ b/arch/cris/include/asm/pci.h | |||
@@ -44,14 +44,6 @@ struct pci_dev; | |||
44 | */ | 44 | */ |
45 | #define PCI_DMA_BUS_IS_PHYS (1) | 45 | #define PCI_DMA_BUS_IS_PHYS (1) |
46 | 46 | ||
47 | /* pci_unmap_{page,single} is a nop so... */ | ||
48 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) | ||
49 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) | ||
50 | #define pci_unmap_addr(PTR, ADDR_NAME) (0) | ||
51 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) | ||
52 | #define pci_unmap_len(PTR, LEN_NAME) (0) | ||
53 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) | ||
54 | |||
55 | #define HAVE_PCI_MMAP | 47 | #define HAVE_PCI_MMAP |
56 | extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | 48 | extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, |
57 | enum pci_mmap_state mmap_state, int write_combine); | 49 | enum pci_mmap_state mmap_state, int write_combine); |
diff --git a/arch/cris/include/asm/unistd.h b/arch/cris/include/asm/unistd.h index c17079388bb9..f6fad83b3a8c 100644 --- a/arch/cris/include/asm/unistd.h +++ b/arch/cris/include/asm/unistd.h | |||
@@ -352,6 +352,7 @@ | |||
352 | #define __ARCH_WANT_STAT64 | 352 | #define __ARCH_WANT_STAT64 |
353 | #define __ARCH_WANT_SYS_ALARM | 353 | #define __ARCH_WANT_SYS_ALARM |
354 | #define __ARCH_WANT_SYS_GETHOSTNAME | 354 | #define __ARCH_WANT_SYS_GETHOSTNAME |
355 | #define __ARCH_WANT_SYS_IPC | ||
355 | #define __ARCH_WANT_SYS_PAUSE | 356 | #define __ARCH_WANT_SYS_PAUSE |
356 | #define __ARCH_WANT_SYS_SGETMASK | 357 | #define __ARCH_WANT_SYS_SGETMASK |
357 | #define __ARCH_WANT_SYS_SIGNAL | 358 | #define __ARCH_WANT_SYS_SIGNAL |
@@ -364,6 +365,7 @@ | |||
364 | #define __ARCH_WANT_SYS_LLSEEK | 365 | #define __ARCH_WANT_SYS_LLSEEK |
365 | #define __ARCH_WANT_SYS_NICE | 366 | #define __ARCH_WANT_SYS_NICE |
366 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | 367 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT |
368 | #define __ARCH_WANT_SYS_OLD_MMAP | ||
367 | #define __ARCH_WANT_SYS_OLDUMOUNT | 369 | #define __ARCH_WANT_SYS_OLDUMOUNT |
368 | #define __ARCH_WANT_SYS_SIGPENDING | 370 | #define __ARCH_WANT_SYS_SIGPENDING |
369 | #define __ARCH_WANT_SYS_SIGPROCMASK | 371 | #define __ARCH_WANT_SYS_SIGPROCMASK |
diff --git a/arch/cris/kernel/sys_cris.c b/arch/cris/kernel/sys_cris.c index c2bbb1ac98a9..7aa036ec78ff 100644 --- a/arch/cris/kernel/sys_cris.c +++ b/arch/cris/kernel/sys_cris.c | |||
@@ -26,24 +26,6 @@ | |||
26 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
27 | #include <asm/segment.h> | 27 | #include <asm/segment.h> |
28 | 28 | ||
29 | asmlinkage unsigned long old_mmap(unsigned long __user *args) | ||
30 | { | ||
31 | unsigned long buffer[6]; | ||
32 | int err = -EFAULT; | ||
33 | |||
34 | if (copy_from_user(&buffer, args, sizeof(buffer))) | ||
35 | goto out; | ||
36 | |||
37 | err = -EINVAL; | ||
38 | if (buffer[5] & ~PAGE_MASK) /* verify that offset is on page boundary */ | ||
39 | goto out; | ||
40 | |||
41 | err = sys_mmap_pgoff(buffer[0], buffer[1], buffer[2], buffer[3], | ||
42 | buffer[4], buffer[5] >> PAGE_SHIFT); | ||
43 | out: | ||
44 | return err; | ||
45 | } | ||
46 | |||
47 | asmlinkage long | 29 | asmlinkage long |
48 | sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, | 30 | sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, |
49 | unsigned long flags, unsigned long fd, unsigned long pgoff) | 31 | unsigned long flags, unsigned long fd, unsigned long pgoff) |
@@ -51,81 +33,3 @@ sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, | |||
51 | /* bug(?): 8Kb pages here */ | 33 | /* bug(?): 8Kb pages here */ |
52 | return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); | 34 | return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); |
53 | } | 35 | } |
54 | |||
55 | /* | ||
56 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. | ||
57 | * | ||
58 | * This is really horribly ugly. (same as arch/i386) | ||
59 | */ | ||
60 | |||
61 | asmlinkage int sys_ipc (uint call, int first, int second, | ||
62 | int third, void __user *ptr, long fifth) | ||
63 | { | ||
64 | int version, ret; | ||
65 | |||
66 | version = call >> 16; /* hack for backward compatibility */ | ||
67 | call &= 0xffff; | ||
68 | |||
69 | switch (call) { | ||
70 | case SEMOP: | ||
71 | return sys_semtimedop (first, (struct sembuf __user *)ptr, second, NULL); | ||
72 | case SEMTIMEDOP: | ||
73 | return sys_semtimedop(first, (struct sembuf __user *)ptr, second, | ||
74 | (const struct timespec __user *)fifth); | ||
75 | |||
76 | case SEMGET: | ||
77 | return sys_semget (first, second, third); | ||
78 | case SEMCTL: { | ||
79 | union semun fourth; | ||
80 | if (!ptr) | ||
81 | return -EINVAL; | ||
82 | if (get_user(fourth.__pad, (void * __user *) ptr)) | ||
83 | return -EFAULT; | ||
84 | return sys_semctl (first, second, third, fourth); | ||
85 | } | ||
86 | |||
87 | case MSGSND: | ||
88 | return sys_msgsnd (first, (struct msgbuf __user *) ptr, | ||
89 | second, third); | ||
90 | case MSGRCV: | ||
91 | switch (version) { | ||
92 | case 0: { | ||
93 | struct ipc_kludge tmp; | ||
94 | if (!ptr) | ||
95 | return -EINVAL; | ||
96 | |||
97 | if (copy_from_user(&tmp, | ||
98 | (struct ipc_kludge __user *) ptr, | ||
99 | sizeof (tmp))) | ||
100 | return -EFAULT; | ||
101 | return sys_msgrcv (first, tmp.msgp, second, | ||
102 | tmp.msgtyp, third); | ||
103 | } | ||
104 | default: | ||
105 | return sys_msgrcv (first, | ||
106 | (struct msgbuf __user *) ptr, | ||
107 | second, fifth, third); | ||
108 | } | ||
109 | case MSGGET: | ||
110 | return sys_msgget ((key_t) first, second); | ||
111 | case MSGCTL: | ||
112 | return sys_msgctl (first, second, (struct msqid_ds __user *) ptr); | ||
113 | |||
114 | case SHMAT: { | ||
115 | ulong raddr; | ||
116 | ret = do_shmat (first, (char __user *) ptr, second, &raddr); | ||
117 | if (ret) | ||
118 | return ret; | ||
119 | return put_user (raddr, (ulong __user *) third); | ||
120 | } | ||
121 | case SHMDT: | ||
122 | return sys_shmdt ((char __user *)ptr); | ||
123 | case SHMGET: | ||
124 | return sys_shmget (first, second, third); | ||
125 | case SHMCTL: | ||
126 | return sys_shmctl (first, second, | ||
127 | (struct shmid_ds __user *) ptr); | ||
128 | default: | ||
129 | return -ENOSYS; | ||
130 | } | ||
131 | } | ||