41e20763886e0a321f9568d8ef99951bdeb4512d
[pandora-kernel.git] / arch / s390 / kernel / ptrace.c
1 /*
2  *  Ptrace user space interface.
3  *
4  *    Copyright IBM Corp. 1999,2010
5  *    Author(s): Denis Joseph Barrow
6  *               Martin Schwidefsky (schwidefsky@de.ibm.com)
7  */
8
9 #include <linux/kernel.h>
10 #include <linux/sched.h>
11 #include <linux/mm.h>
12 #include <linux/smp.h>
13 #include <linux/errno.h>
14 #include <linux/ptrace.h>
15 #include <linux/user.h>
16 #include <linux/security.h>
17 #include <linux/audit.h>
18 #include <linux/signal.h>
19 #include <linux/elf.h>
20 #include <linux/regset.h>
21 #include <linux/tracehook.h>
22 #include <linux/seccomp.h>
23 #include <trace/syscall.h>
24 #include <asm/compat.h>
25 #include <asm/segment.h>
26 #include <asm/page.h>
27 #include <asm/pgtable.h>
28 #include <asm/pgalloc.h>
29 #include <asm/system.h>
30 #include <asm/uaccess.h>
31 #include <asm/unistd.h>
32 #include "entry.h"
33
34 #ifdef CONFIG_COMPAT
35 #include "compat_ptrace.h"
36 #endif
37
38 #define CREATE_TRACE_POINTS
39 #include <trace/events/syscalls.h>
40
41 enum s390_regset {
42         REGSET_GENERAL,
43         REGSET_FP,
44         REGSET_LAST_BREAK,
45         REGSET_SYSTEM_CALL,
46         REGSET_GENERAL_EXTENDED,
47 };
48
49 void update_per_regs(struct task_struct *task)
50 {
51         struct pt_regs *regs = task_pt_regs(task);
52         struct thread_struct *thread = &task->thread;
53         struct per_regs old, new;
54
55         /* Copy user specified PER registers */
56         new.control = thread->per_user.control;
57         new.start = thread->per_user.start;
58         new.end = thread->per_user.end;
59
60         /* merge TIF_SINGLE_STEP into user specified PER registers. */
61         if (test_tsk_thread_flag(task, TIF_SINGLE_STEP)) {
62                 new.control |= PER_EVENT_IFETCH;
63                 new.start = 0;
64                 new.end = PSW_ADDR_INSN;
65         }
66
67         /* Take care of the PER enablement bit in the PSW. */
68         if (!(new.control & PER_EVENT_MASK)) {
69                 regs->psw.mask &= ~PSW_MASK_PER;
70                 return;
71         }
72         regs->psw.mask |= PSW_MASK_PER;
73         __ctl_store(old, 9, 11);
74         if (memcmp(&new, &old, sizeof(struct per_regs)) != 0)
75                 __ctl_load(new, 9, 11);
76 }
77
78 void user_enable_single_step(struct task_struct *task)
79 {
80         set_tsk_thread_flag(task, TIF_SINGLE_STEP);
81         if (task == current)
82                 update_per_regs(task);
83 }
84
85 void user_disable_single_step(struct task_struct *task)
86 {
87         clear_tsk_thread_flag(task, TIF_SINGLE_STEP);
88         if (task == current)
89                 update_per_regs(task);
90 }
91
92 /*
93  * Called by kernel/ptrace.c when detaching..
94  *
95  * Clear all debugging related fields.
96  */
97 void ptrace_disable(struct task_struct *task)
98 {
99         memset(&task->thread.per_user, 0, sizeof(task->thread.per_user));
100         memset(&task->thread.per_event, 0, sizeof(task->thread.per_event));
101         clear_tsk_thread_flag(task, TIF_SINGLE_STEP);
102         clear_tsk_thread_flag(task, TIF_PER_TRAP);
103 }
104
105 #ifndef CONFIG_64BIT
106 # define __ADDR_MASK 3
107 #else
108 # define __ADDR_MASK 7
109 #endif
110
111 static inline unsigned long __peek_user_per(struct task_struct *child,
112                                             addr_t addr)
113 {
114         struct per_struct_kernel *dummy = NULL;
115
116         if (addr == (addr_t) &dummy->cr9)
117                 /* Control bits of the active per set. */
118                 return test_thread_flag(TIF_SINGLE_STEP) ?
119                         PER_EVENT_IFETCH : child->thread.per_user.control;
120         else if (addr == (addr_t) &dummy->cr10)
121                 /* Start address of the active per set. */
122                 return test_thread_flag(TIF_SINGLE_STEP) ?
123                         0 : child->thread.per_user.start;
124         else if (addr == (addr_t) &dummy->cr11)
125                 /* End address of the active per set. */
126                 return test_thread_flag(TIF_SINGLE_STEP) ?
127                         PSW_ADDR_INSN : child->thread.per_user.end;
128         else if (addr == (addr_t) &dummy->bits)
129                 /* Single-step bit. */
130                 return test_thread_flag(TIF_SINGLE_STEP) ?
131                         (1UL << (BITS_PER_LONG - 1)) : 0;
132         else if (addr == (addr_t) &dummy->starting_addr)
133                 /* Start address of the user specified per set. */
134                 return child->thread.per_user.start;
135         else if (addr == (addr_t) &dummy->ending_addr)
136                 /* End address of the user specified per set. */
137                 return child->thread.per_user.end;
138         else if (addr == (addr_t) &dummy->perc_atmid)
139                 /* PER code, ATMID and AI of the last PER trap */
140                 return (unsigned long)
141                         child->thread.per_event.cause << (BITS_PER_LONG - 16);
142         else if (addr == (addr_t) &dummy->address)
143                 /* Address of the last PER trap */
144                 return child->thread.per_event.address;
145         else if (addr == (addr_t) &dummy->access_id)
146                 /* Access id of the last PER trap */
147                 return (unsigned long)
148                         child->thread.per_event.paid << (BITS_PER_LONG - 8);
149         return 0;
150 }
151
152 /*
153  * Read the word at offset addr from the user area of a process. The
154  * trouble here is that the information is littered over different
155  * locations. The process registers are found on the kernel stack,
156  * the floating point stuff and the trace settings are stored in
157  * the task structure. In addition the different structures in
158  * struct user contain pad bytes that should be read as zeroes.
159  * Lovely...
160  */
161 static unsigned long __peek_user(struct task_struct *child, addr_t addr)
162 {
163         struct user *dummy = NULL;
164         addr_t offset, tmp;
165
166         if (addr < (addr_t) &dummy->regs.acrs) {
167                 /*
168                  * psw and gprs are stored on the stack
169                  */
170                 tmp = *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr);
171                 if (addr == (addr_t) &dummy->regs.psw.mask)
172                         /* Return a clean psw mask. */
173                         tmp = psw_user_bits | (tmp & PSW_MASK_USER) |
174                                 PSW_MASK_EA | PSW_MASK_BA;
175
176         } else if (addr < (addr_t) &dummy->regs.orig_gpr2) {
177                 /*
178                  * access registers are stored in the thread structure
179                  */
180                 offset = addr - (addr_t) &dummy->regs.acrs;
181 #ifdef CONFIG_64BIT
182                 /*
183                  * Very special case: old & broken 64 bit gdb reading
184                  * from acrs[15]. Result is a 64 bit value. Read the
185                  * 32 bit acrs[15] value and shift it by 32. Sick...
186                  */
187                 if (addr == (addr_t) &dummy->regs.acrs[15])
188                         tmp = ((unsigned long) child->thread.acrs[15]) << 32;
189                 else
190 #endif
191                 tmp = *(addr_t *)((addr_t) &child->thread.acrs + offset);
192
193         } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
194                 /*
195                  * orig_gpr2 is stored on the kernel stack
196                  */
197                 tmp = (addr_t) task_pt_regs(child)->orig_gpr2;
198
199         } else if (addr < (addr_t) &dummy->regs.fp_regs) {
200                 /*
201                  * prevent reads of padding hole between
202                  * orig_gpr2 and fp_regs on s390.
203                  */
204                 tmp = 0;
205
206         } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
207                 /* 
208                  * floating point regs. are stored in the thread structure
209                  */
210                 offset = addr - (addr_t) &dummy->regs.fp_regs;
211                 tmp = *(addr_t *)((addr_t) &child->thread.fp_regs + offset);
212                 if (addr == (addr_t) &dummy->regs.fp_regs.fpc)
213                         tmp &= (unsigned long) FPC_VALID_MASK
214                                 << (BITS_PER_LONG - 32);
215
216         } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
217                 /*
218                  * Handle access to the per_info structure.
219                  */
220                 addr -= (addr_t) &dummy->regs.per_info;
221                 tmp = __peek_user_per(child, addr);
222
223         } else
224                 tmp = 0;
225
226         return tmp;
227 }
228
229 static int
230 peek_user(struct task_struct *child, addr_t addr, addr_t data)
231 {
232         addr_t tmp, mask;
233
234         /*
235          * Stupid gdb peeks/pokes the access registers in 64 bit with
236          * an alignment of 4. Programmers from hell...
237          */
238         mask = __ADDR_MASK;
239 #ifdef CONFIG_64BIT
240         if (addr >= (addr_t) &((struct user *) NULL)->regs.acrs &&
241             addr < (addr_t) &((struct user *) NULL)->regs.orig_gpr2)
242                 mask = 3;
243 #endif
244         if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
245                 return -EIO;
246
247         tmp = __peek_user(child, addr);
248         return put_user(tmp, (addr_t __user *) data);
249 }
250
251 static inline void __poke_user_per(struct task_struct *child,
252                                    addr_t addr, addr_t data)
253 {
254         struct per_struct_kernel *dummy = NULL;
255
256         /*
257          * There are only three fields in the per_info struct that the
258          * debugger user can write to.
259          * 1) cr9: the debugger wants to set a new PER event mask
260          * 2) starting_addr: the debugger wants to set a new starting
261          *    address to use with the PER event mask.
262          * 3) ending_addr: the debugger wants to set a new ending
263          *    address to use with the PER event mask.
264          * The user specified PER event mask and the start and end
265          * addresses are used only if single stepping is not in effect.
266          * Writes to any other field in per_info are ignored.
267          */
268         if (addr == (addr_t) &dummy->cr9)
269                 /* PER event mask of the user specified per set. */
270                 child->thread.per_user.control =
271                         data & (PER_EVENT_MASK | PER_CONTROL_MASK);
272         else if (addr == (addr_t) &dummy->starting_addr)
273                 /* Starting address of the user specified per set. */
274                 child->thread.per_user.start = data;
275         else if (addr == (addr_t) &dummy->ending_addr)
276                 /* Ending address of the user specified per set. */
277                 child->thread.per_user.end = data;
278 }
279
280 /*
281  * Write a word to the user area of a process at location addr. This
282  * operation does have an additional problem compared to peek_user.
283  * Stores to the program status word and on the floating point
284  * control register needs to get checked for validity.
285  */
286 static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
287 {
288         struct user *dummy = NULL;
289         addr_t offset, tmp;
290
291         if (addr < (addr_t) &dummy->regs.acrs) {
292                 /*
293                  * psw and gprs are stored on the stack
294                  */
295                 tmp = (data & ~PSW_MASK_USER) ^ psw_user_bits;
296                 if (addr == (addr_t) &dummy->regs.psw.mask &&
297 #ifdef CONFIG_COMPAT
298                     tmp != PSW_MASK_BA &&
299 #endif
300                     tmp != (PSW_MASK_EA | PSW_MASK_BA))
301                         /* Invalid psw mask. */
302                         return -EINVAL;
303 #ifndef CONFIG_64BIT
304                 if (addr == (addr_t) &dummy->regs.psw.addr)
305                         /* I'd like to reject addresses without the
306                            high order bit but older gdb's rely on it */
307                         data |= PSW_ADDR_AMODE;
308 #endif
309                 if (addr == (addr_t) &dummy->regs.psw.addr)
310                         /*
311                          * The debugger changed the instruction address,
312                          * reset system call restart, see signal.c:do_signal
313                          */
314                         task_thread_info(child)->system_call = 0;
315
316                 *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data;
317
318         } else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) {
319                 /*
320                  * access registers are stored in the thread structure
321                  */
322                 offset = addr - (addr_t) &dummy->regs.acrs;
323 #ifdef CONFIG_64BIT
324                 /*
325                  * Very special case: old & broken 64 bit gdb writing
326                  * to acrs[15] with a 64 bit value. Ignore the lower
327                  * half of the value and write the upper 32 bit to
328                  * acrs[15]. Sick...
329                  */
330                 if (addr == (addr_t) &dummy->regs.acrs[15])
331                         child->thread.acrs[15] = (unsigned int) (data >> 32);
332                 else
333 #endif
334                 *(addr_t *)((addr_t) &child->thread.acrs + offset) = data;
335
336         } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
337                 /*
338                  * orig_gpr2 is stored on the kernel stack
339                  */
340                 task_pt_regs(child)->orig_gpr2 = data;
341
342         } else if (addr < (addr_t) &dummy->regs.fp_regs) {
343                 /*
344                  * prevent writes of padding hole between
345                  * orig_gpr2 and fp_regs on s390.
346                  */
347                 return 0;
348
349         } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
350                 /*
351                  * floating point regs. are stored in the thread structure
352                  */
353                 if (addr == (addr_t) &dummy->regs.fp_regs.fpc &&
354                     (data & ~((unsigned long) FPC_VALID_MASK
355                               << (BITS_PER_LONG - 32))) != 0)
356                         return -EINVAL;
357                 offset = addr - (addr_t) &dummy->regs.fp_regs;
358                 *(addr_t *)((addr_t) &child->thread.fp_regs + offset) = data;
359
360         } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
361                 /*
362                  * Handle access to the per_info structure.
363                  */
364                 addr -= (addr_t) &dummy->regs.per_info;
365                 __poke_user_per(child, addr, data);
366
367         }
368
369         return 0;
370 }
371
372 static int poke_user(struct task_struct *child, addr_t addr, addr_t data)
373 {
374         addr_t mask;
375
376         /*
377          * Stupid gdb peeks/pokes the access registers in 64 bit with
378          * an alignment of 4. Programmers from hell indeed...
379          */
380         mask = __ADDR_MASK;
381 #ifdef CONFIG_64BIT
382         if (addr >= (addr_t) &((struct user *) NULL)->regs.acrs &&
383             addr < (addr_t) &((struct user *) NULL)->regs.orig_gpr2)
384                 mask = 3;
385 #endif
386         if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
387                 return -EIO;
388
389         return __poke_user(child, addr, data);
390 }
391
392 long arch_ptrace(struct task_struct *child, long request,
393                  unsigned long addr, unsigned long data)
394 {
395         ptrace_area parea; 
396         int copied, ret;
397
398         switch (request) {
399         case PTRACE_PEEKUSR:
400                 /* read the word at location addr in the USER area. */
401                 return peek_user(child, addr, data);
402
403         case PTRACE_POKEUSR:
404                 /* write the word at location addr in the USER area */
405                 return poke_user(child, addr, data);
406
407         case PTRACE_PEEKUSR_AREA:
408         case PTRACE_POKEUSR_AREA:
409                 if (copy_from_user(&parea, (void __force __user *) addr,
410                                                         sizeof(parea)))
411                         return -EFAULT;
412                 addr = parea.kernel_addr;
413                 data = parea.process_addr;
414                 copied = 0;
415                 while (copied < parea.len) {
416                         if (request == PTRACE_PEEKUSR_AREA)
417                                 ret = peek_user(child, addr, data);
418                         else {
419                                 addr_t utmp;
420                                 if (get_user(utmp,
421                                              (addr_t __force __user *) data))
422                                         return -EFAULT;
423                                 ret = poke_user(child, addr, utmp);
424                         }
425                         if (ret)
426                                 return ret;
427                         addr += sizeof(unsigned long);
428                         data += sizeof(unsigned long);
429                         copied += sizeof(unsigned long);
430                 }
431                 return 0;
432         case PTRACE_GET_LAST_BREAK:
433                 put_user(task_thread_info(child)->last_break,
434                          (unsigned long __user *) data);
435                 return 0;
436         default:
437                 /* Removing high order bit from addr (only for 31 bit). */
438                 addr &= PSW_ADDR_INSN;
439                 return ptrace_request(child, request, addr, data);
440         }
441 }
442
443 #ifdef CONFIG_COMPAT
444 /*
445  * Now the fun part starts... a 31 bit program running in the
446  * 31 bit emulation tracing another program. PTRACE_PEEKTEXT,
447  * PTRACE_PEEKDATA, PTRACE_POKETEXT and PTRACE_POKEDATA are easy
448  * to handle, the difference to the 64 bit versions of the requests
449  * is that the access is done in multiples of 4 byte instead of
450  * 8 bytes (sizeof(unsigned long) on 31/64 bit).
451  * The ugly part are PTRACE_PEEKUSR, PTRACE_PEEKUSR_AREA,
452  * PTRACE_POKEUSR and PTRACE_POKEUSR_AREA. If the traced program
453  * is a 31 bit program too, the content of struct user can be
454  * emulated. A 31 bit program peeking into the struct user of
455  * a 64 bit program is a no-no.
456  */
457
458 /*
459  * Same as peek_user_per but for a 31 bit program.
460  */
461 static inline __u32 __peek_user_per_compat(struct task_struct *child,
462                                            addr_t addr)
463 {
464         struct compat_per_struct_kernel *dummy32 = NULL;
465
466         if (addr == (addr_t) &dummy32->cr9)
467                 /* Control bits of the active per set. */
468                 return (__u32) test_thread_flag(TIF_SINGLE_STEP) ?
469                         PER_EVENT_IFETCH : child->thread.per_user.control;
470         else if (addr == (addr_t) &dummy32->cr10)
471                 /* Start address of the active per set. */
472                 return (__u32) test_thread_flag(TIF_SINGLE_STEP) ?
473                         0 : child->thread.per_user.start;
474         else if (addr == (addr_t) &dummy32->cr11)
475                 /* End address of the active per set. */
476                 return test_thread_flag(TIF_SINGLE_STEP) ?
477                         PSW32_ADDR_INSN : child->thread.per_user.end;
478         else if (addr == (addr_t) &dummy32->bits)
479                 /* Single-step bit. */
480                 return (__u32) test_thread_flag(TIF_SINGLE_STEP) ?
481                         0x80000000 : 0;
482         else if (addr == (addr_t) &dummy32->starting_addr)
483                 /* Start address of the user specified per set. */
484                 return (__u32) child->thread.per_user.start;
485         else if (addr == (addr_t) &dummy32->ending_addr)
486                 /* End address of the user specified per set. */
487                 return (__u32) child->thread.per_user.end;
488         else if (addr == (addr_t) &dummy32->perc_atmid)
489                 /* PER code, ATMID and AI of the last PER trap */
490                 return (__u32) child->thread.per_event.cause << 16;
491         else if (addr == (addr_t) &dummy32->address)
492                 /* Address of the last PER trap */
493                 return (__u32) child->thread.per_event.address;
494         else if (addr == (addr_t) &dummy32->access_id)
495                 /* Access id of the last PER trap */
496                 return (__u32) child->thread.per_event.paid << 24;
497         return 0;
498 }
499
500 /*
501  * Same as peek_user but for a 31 bit program.
502  */
503 static u32 __peek_user_compat(struct task_struct *child, addr_t addr)
504 {
505         struct compat_user *dummy32 = NULL;
506         addr_t offset;
507         __u32 tmp;
508
509         if (addr < (addr_t) &dummy32->regs.acrs) {
510                 struct pt_regs *regs = task_pt_regs(child);
511                 /*
512                  * psw and gprs are stored on the stack
513                  */
514                 if (addr == (addr_t) &dummy32->regs.psw.mask) {
515                         /* Fake a 31 bit psw mask. */
516                         tmp = (__u32)(regs->psw.mask >> 32);
517                         tmp = psw32_user_bits | (tmp & PSW32_MASK_USER);
518                 } else if (addr == (addr_t) &dummy32->regs.psw.addr) {
519                         /* Fake a 31 bit psw address. */
520                         tmp = (__u32) regs->psw.addr | PSW32_ADDR_AMODE;
521                 } else {
522                         /* gpr 0-15 */
523                         tmp = *(__u32 *)((addr_t) &regs->psw + addr*2 + 4);
524                 }
525         } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) {
526                 /*
527                  * access registers are stored in the thread structure
528                  */
529                 offset = addr - (addr_t) &dummy32->regs.acrs;
530                 tmp = *(__u32*)((addr_t) &child->thread.acrs + offset);
531
532         } else if (addr == (addr_t) (&dummy32->regs.orig_gpr2)) {
533                 /*
534                  * orig_gpr2 is stored on the kernel stack
535                  */
536                 tmp = *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4);
537
538         } else if (addr < (addr_t) &dummy32->regs.fp_regs) {
539                 /*
540                  * prevent reads of padding hole between
541                  * orig_gpr2 and fp_regs on s390.
542                  */
543                 tmp = 0;
544
545         } else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
546                 /*
547                  * floating point regs. are stored in the thread structure 
548                  */
549                 offset = addr - (addr_t) &dummy32->regs.fp_regs;
550                 tmp = *(__u32 *)((addr_t) &child->thread.fp_regs + offset);
551
552         } else if (addr < (addr_t) (&dummy32->regs.per_info + 1)) {
553                 /*
554                  * Handle access to the per_info structure.
555                  */
556                 addr -= (addr_t) &dummy32->regs.per_info;
557                 tmp = __peek_user_per_compat(child, addr);
558
559         } else
560                 tmp = 0;
561
562         return tmp;
563 }
564
565 static int peek_user_compat(struct task_struct *child,
566                             addr_t addr, addr_t data)
567 {
568         __u32 tmp;
569
570         if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user) - 3)
571                 return -EIO;
572
573         tmp = __peek_user_compat(child, addr);
574         return put_user(tmp, (__u32 __user *) data);
575 }
576
577 /*
578  * Same as poke_user_per but for a 31 bit program.
579  */
580 static inline void __poke_user_per_compat(struct task_struct *child,
581                                           addr_t addr, __u32 data)
582 {
583         struct compat_per_struct_kernel *dummy32 = NULL;
584
585         if (addr == (addr_t) &dummy32->cr9)
586                 /* PER event mask of the user specified per set. */
587                 child->thread.per_user.control =
588                         data & (PER_EVENT_MASK | PER_CONTROL_MASK);
589         else if (addr == (addr_t) &dummy32->starting_addr)
590                 /* Starting address of the user specified per set. */
591                 child->thread.per_user.start = data;
592         else if (addr == (addr_t) &dummy32->ending_addr)
593                 /* Ending address of the user specified per set. */
594                 child->thread.per_user.end = data;
595 }
596
597 /*
598  * Same as poke_user but for a 31 bit program.
599  */
600 static int __poke_user_compat(struct task_struct *child,
601                               addr_t addr, addr_t data)
602 {
603         struct compat_user *dummy32 = NULL;
604         __u32 tmp = (__u32) data;
605         addr_t offset;
606
607         if (addr < (addr_t) &dummy32->regs.acrs) {
608                 struct pt_regs *regs = task_pt_regs(child);
609                 /*
610                  * psw, gprs, acrs and orig_gpr2 are stored on the stack
611                  */
612                 if (addr == (addr_t) &dummy32->regs.psw.mask) {
613                         /* Build a 64 bit psw mask from 31 bit mask. */
614                         if ((tmp & ~PSW32_MASK_USER) != psw32_user_bits)
615                                 /* Invalid psw mask. */
616                                 return -EINVAL;
617                         regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
618                                 (__u64)(tmp & PSW32_MASK_USER) << 32;
619                 } else if (addr == (addr_t) &dummy32->regs.psw.addr) {
620                         /* Build a 64 bit psw address from 31 bit address. */
621                         regs->psw.addr = (__u64) tmp & PSW32_ADDR_INSN;
622                         /*
623                          * The debugger changed the instruction address,
624                          * reset system call restart, see signal.c:do_signal
625                          */
626                         task_thread_info(child)->system_call = 0;
627                 } else {
628                         /* gpr 0-15 */
629                         *(__u32*)((addr_t) &regs->psw + addr*2 + 4) = tmp;
630                 }
631         } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) {
632                 /*
633                  * access registers are stored in the thread structure
634                  */
635                 offset = addr - (addr_t) &dummy32->regs.acrs;
636                 *(__u32*)((addr_t) &child->thread.acrs + offset) = tmp;
637
638         } else if (addr == (addr_t) (&dummy32->regs.orig_gpr2)) {
639                 /*
640                  * orig_gpr2 is stored on the kernel stack
641                  */
642                 *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4) = tmp;
643
644         } else if (addr < (addr_t) &dummy32->regs.fp_regs) {
645                 /*
646                  * prevent writess of padding hole between
647                  * orig_gpr2 and fp_regs on s390.
648                  */
649                 return 0;
650
651         } else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
652                 /*
653                  * floating point regs. are stored in the thread structure 
654                  */
655                 if (addr == (addr_t) &dummy32->regs.fp_regs.fpc &&
656                     (tmp & ~FPC_VALID_MASK) != 0)
657                         /* Invalid floating point control. */
658                         return -EINVAL;
659                 offset = addr - (addr_t) &dummy32->regs.fp_regs;
660                 *(__u32 *)((addr_t) &child->thread.fp_regs + offset) = tmp;
661
662         } else if (addr < (addr_t) (&dummy32->regs.per_info + 1)) {
663                 /*
664                  * Handle access to the per_info structure.
665                  */
666                 addr -= (addr_t) &dummy32->regs.per_info;
667                 __poke_user_per_compat(child, addr, data);
668         }
669
670         return 0;
671 }
672
673 static int poke_user_compat(struct task_struct *child,
674                             addr_t addr, addr_t data)
675 {
676         if (!is_compat_task() || (addr & 3) ||
677             addr > sizeof(struct compat_user) - 3)
678                 return -EIO;
679
680         return __poke_user_compat(child, addr, data);
681 }
682
683 long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
684                         compat_ulong_t caddr, compat_ulong_t cdata)
685 {
686         unsigned long addr = caddr;
687         unsigned long data = cdata;
688         compat_ptrace_area parea;
689         int copied, ret;
690
691         switch (request) {
692         case PTRACE_PEEKUSR:
693                 /* read the word at location addr in the USER area. */
694                 return peek_user_compat(child, addr, data);
695
696         case PTRACE_POKEUSR:
697                 /* write the word at location addr in the USER area */
698                 return poke_user_compat(child, addr, data);
699
700         case PTRACE_PEEKUSR_AREA:
701         case PTRACE_POKEUSR_AREA:
702                 if (copy_from_user(&parea, (void __force __user *) addr,
703                                                         sizeof(parea)))
704                         return -EFAULT;
705                 addr = parea.kernel_addr;
706                 data = parea.process_addr;
707                 copied = 0;
708                 while (copied < parea.len) {
709                         if (request == PTRACE_PEEKUSR_AREA)
710                                 ret = peek_user_compat(child, addr, data);
711                         else {
712                                 __u32 utmp;
713                                 if (get_user(utmp,
714                                              (__u32 __force __user *) data))
715                                         return -EFAULT;
716                                 ret = poke_user_compat(child, addr, utmp);
717                         }
718                         if (ret)
719                                 return ret;
720                         addr += sizeof(unsigned int);
721                         data += sizeof(unsigned int);
722                         copied += sizeof(unsigned int);
723                 }
724                 return 0;
725         case PTRACE_GET_LAST_BREAK:
726                 put_user(task_thread_info(child)->last_break,
727                          (unsigned int __user *) data);
728                 return 0;
729         }
730         return compat_ptrace_request(child, request, addr, data);
731 }
732 #endif
733
734 asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
735 {
736         long ret = 0;
737
738         /* Do the secure computing check first. */
739         secure_computing(regs->gprs[2]);
740
741         /*
742          * The sysc_tracesys code in entry.S stored the system
743          * call number to gprs[2].
744          */
745         if (test_thread_flag(TIF_SYSCALL_TRACE) &&
746             (tracehook_report_syscall_entry(regs) ||
747              regs->gprs[2] >= NR_syscalls)) {
748                 /*
749                  * Tracing decided this syscall should not happen or the
750                  * debugger stored an invalid system call number. Skip
751                  * the system call and the system call restart handling.
752                  */
753                 clear_thread_flag(TIF_SYSCALL);
754                 ret = -1;
755         }
756
757         if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
758                 trace_sys_enter(regs, regs->gprs[2]);
759
760         if (unlikely(current->audit_context))
761                 audit_syscall_entry(is_compat_task() ?
762                                         AUDIT_ARCH_S390 : AUDIT_ARCH_S390X,
763                                     regs->gprs[2], regs->orig_gpr2,
764                                     regs->gprs[3], regs->gprs[4],
765                                     regs->gprs[5]);
766         return ret ?: regs->gprs[2];
767 }
768
769 asmlinkage void do_syscall_trace_exit(struct pt_regs *regs)
770 {
771         if (unlikely(current->audit_context))
772                 audit_syscall_exit(AUDITSC_RESULT(regs->gprs[2]),
773                                    regs->gprs[2]);
774
775         if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
776                 trace_sys_exit(regs, regs->gprs[2]);
777
778         if (test_thread_flag(TIF_SYSCALL_TRACE))
779                 tracehook_report_syscall_exit(regs, 0);
780 }
781
782 /*
783  * user_regset definitions.
784  */
785
786 static int s390_regs_get(struct task_struct *target,
787                          const struct user_regset *regset,
788                          unsigned int pos, unsigned int count,
789                          void *kbuf, void __user *ubuf)
790 {
791         if (target == current)
792                 save_access_regs(target->thread.acrs);
793
794         if (kbuf) {
795                 unsigned long *k = kbuf;
796                 while (count > 0) {
797                         *k++ = __peek_user(target, pos);
798                         count -= sizeof(*k);
799                         pos += sizeof(*k);
800                 }
801         } else {
802                 unsigned long __user *u = ubuf;
803                 while (count > 0) {
804                         if (__put_user(__peek_user(target, pos), u++))
805                                 return -EFAULT;
806                         count -= sizeof(*u);
807                         pos += sizeof(*u);
808                 }
809         }
810         return 0;
811 }
812
813 static int s390_regs_set(struct task_struct *target,
814                          const struct user_regset *regset,
815                          unsigned int pos, unsigned int count,
816                          const void *kbuf, const void __user *ubuf)
817 {
818         int rc = 0;
819
820         if (target == current)
821                 save_access_regs(target->thread.acrs);
822
823         if (kbuf) {
824                 const unsigned long *k = kbuf;
825                 while (count > 0 && !rc) {
826                         rc = __poke_user(target, pos, *k++);
827                         count -= sizeof(*k);
828                         pos += sizeof(*k);
829                 }
830         } else {
831                 const unsigned long  __user *u = ubuf;
832                 while (count > 0 && !rc) {
833                         unsigned long word;
834                         rc = __get_user(word, u++);
835                         if (rc)
836                                 break;
837                         rc = __poke_user(target, pos, word);
838                         count -= sizeof(*u);
839                         pos += sizeof(*u);
840                 }
841         }
842
843         if (rc == 0 && target == current)
844                 restore_access_regs(target->thread.acrs);
845
846         return rc;
847 }
848
849 static int s390_fpregs_get(struct task_struct *target,
850                            const struct user_regset *regset, unsigned int pos,
851                            unsigned int count, void *kbuf, void __user *ubuf)
852 {
853         if (target == current)
854                 save_fp_regs(&target->thread.fp_regs);
855
856         return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
857                                    &target->thread.fp_regs, 0, -1);
858 }
859
860 static int s390_fpregs_set(struct task_struct *target,
861                            const struct user_regset *regset, unsigned int pos,
862                            unsigned int count, const void *kbuf,
863                            const void __user *ubuf)
864 {
865         int rc = 0;
866
867         if (target == current)
868                 save_fp_regs(&target->thread.fp_regs);
869
870         /* If setting FPC, must validate it first. */
871         if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) {
872                 u32 fpc[2] = { target->thread.fp_regs.fpc, 0 };
873                 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &fpc,
874                                         0, offsetof(s390_fp_regs, fprs));
875                 if (rc)
876                         return rc;
877                 if ((fpc[0] & ~FPC_VALID_MASK) != 0 || fpc[1] != 0)
878                         return -EINVAL;
879                 target->thread.fp_regs.fpc = fpc[0];
880         }
881
882         if (rc == 0 && count > 0)
883                 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
884                                         target->thread.fp_regs.fprs,
885                                         offsetof(s390_fp_regs, fprs), -1);
886
887         if (rc == 0 && target == current)
888                 restore_fp_regs(&target->thread.fp_regs);
889
890         return rc;
891 }
892
893 #ifdef CONFIG_64BIT
894
895 static int s390_last_break_get(struct task_struct *target,
896                                const struct user_regset *regset,
897                                unsigned int pos, unsigned int count,
898                                void *kbuf, void __user *ubuf)
899 {
900         if (count > 0) {
901                 if (kbuf) {
902                         unsigned long *k = kbuf;
903                         *k = task_thread_info(target)->last_break;
904                 } else {
905                         unsigned long  __user *u = ubuf;
906                         if (__put_user(task_thread_info(target)->last_break, u))
907                                 return -EFAULT;
908                 }
909         }
910         return 0;
911 }
912
913 #endif
914
915 static int s390_system_call_get(struct task_struct *target,
916                                 const struct user_regset *regset,
917                                 unsigned int pos, unsigned int count,
918                                 void *kbuf, void __user *ubuf)
919 {
920         unsigned int *data = &task_thread_info(target)->system_call;
921         return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
922                                    data, 0, sizeof(unsigned int));
923 }
924
925 static int s390_system_call_set(struct task_struct *target,
926                                 const struct user_regset *regset,
927                                 unsigned int pos, unsigned int count,
928                                 const void *kbuf, const void __user *ubuf)
929 {
930         unsigned int *data = &task_thread_info(target)->system_call;
931         return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
932                                   data, 0, sizeof(unsigned int));
933 }
934
935 static const struct user_regset s390_regsets[] = {
936         [REGSET_GENERAL] = {
937                 .core_note_type = NT_PRSTATUS,
938                 .n = sizeof(s390_regs) / sizeof(long),
939                 .size = sizeof(long),
940                 .align = sizeof(long),
941                 .get = s390_regs_get,
942                 .set = s390_regs_set,
943         },
944         [REGSET_FP] = {
945                 .core_note_type = NT_PRFPREG,
946                 .n = sizeof(s390_fp_regs) / sizeof(long),
947                 .size = sizeof(long),
948                 .align = sizeof(long),
949                 .get = s390_fpregs_get,
950                 .set = s390_fpregs_set,
951         },
952 #ifdef CONFIG_64BIT
953         [REGSET_LAST_BREAK] = {
954                 .core_note_type = NT_S390_LAST_BREAK,
955                 .n = 1,
956                 .size = sizeof(long),
957                 .align = sizeof(long),
958                 .get = s390_last_break_get,
959         },
960 #endif
961         [REGSET_SYSTEM_CALL] = {
962                 .core_note_type = NT_S390_SYSTEM_CALL,
963                 .n = 1,
964                 .size = sizeof(unsigned int),
965                 .align = sizeof(unsigned int),
966                 .get = s390_system_call_get,
967                 .set = s390_system_call_set,
968         },
969 };
970
971 static const struct user_regset_view user_s390_view = {
972         .name = UTS_MACHINE,
973         .e_machine = EM_S390,
974         .regsets = s390_regsets,
975         .n = ARRAY_SIZE(s390_regsets)
976 };
977
978 #ifdef CONFIG_COMPAT
979 static int s390_compat_regs_get(struct task_struct *target,
980                                 const struct user_regset *regset,
981                                 unsigned int pos, unsigned int count,
982                                 void *kbuf, void __user *ubuf)
983 {
984         if (target == current)
985                 save_access_regs(target->thread.acrs);
986
987         if (kbuf) {
988                 compat_ulong_t *k = kbuf;
989                 while (count > 0) {
990                         *k++ = __peek_user_compat(target, pos);
991                         count -= sizeof(*k);
992                         pos += sizeof(*k);
993                 }
994         } else {
995                 compat_ulong_t __user *u = ubuf;
996                 while (count > 0) {
997                         if (__put_user(__peek_user_compat(target, pos), u++))
998                                 return -EFAULT;
999                         count -= sizeof(*u);
1000                         pos += sizeof(*u);
1001                 }
1002         }
1003         return 0;
1004 }
1005
1006 static int s390_compat_regs_set(struct task_struct *target,
1007                                 const struct user_regset *regset,
1008                                 unsigned int pos, unsigned int count,
1009                                 const void *kbuf, const void __user *ubuf)
1010 {
1011         int rc = 0;
1012
1013         if (target == current)
1014                 save_access_regs(target->thread.acrs);
1015
1016         if (kbuf) {
1017                 const compat_ulong_t *k = kbuf;
1018                 while (count > 0 && !rc) {
1019                         rc = __poke_user_compat(target, pos, *k++);
1020                         count -= sizeof(*k);
1021                         pos += sizeof(*k);
1022                 }
1023         } else {
1024                 const compat_ulong_t  __user *u = ubuf;
1025                 while (count > 0 && !rc) {
1026                         compat_ulong_t word;
1027                         rc = __get_user(word, u++);
1028                         if (rc)
1029                                 break;
1030                         rc = __poke_user_compat(target, pos, word);
1031                         count -= sizeof(*u);
1032                         pos += sizeof(*u);
1033                 }
1034         }
1035
1036         if (rc == 0 && target == current)
1037                 restore_access_regs(target->thread.acrs);
1038
1039         return rc;
1040 }
1041
1042 static int s390_compat_regs_high_get(struct task_struct *target,
1043                                      const struct user_regset *regset,
1044                                      unsigned int pos, unsigned int count,
1045                                      void *kbuf, void __user *ubuf)
1046 {
1047         compat_ulong_t *gprs_high;
1048
1049         gprs_high = (compat_ulong_t *)
1050                 &task_pt_regs(target)->gprs[pos / sizeof(compat_ulong_t)];
1051         if (kbuf) {
1052                 compat_ulong_t *k = kbuf;
1053                 while (count > 0) {
1054                         *k++ = *gprs_high;
1055                         gprs_high += 2;
1056                         count -= sizeof(*k);
1057                 }
1058         } else {
1059                 compat_ulong_t __user *u = ubuf;
1060                 while (count > 0) {
1061                         if (__put_user(*gprs_high, u++))
1062                                 return -EFAULT;
1063                         gprs_high += 2;
1064                         count -= sizeof(*u);
1065                 }
1066         }
1067         return 0;
1068 }
1069
1070 static int s390_compat_regs_high_set(struct task_struct *target,
1071                                      const struct user_regset *regset,
1072                                      unsigned int pos, unsigned int count,
1073                                      const void *kbuf, const void __user *ubuf)
1074 {
1075         compat_ulong_t *gprs_high;
1076         int rc = 0;
1077
1078         gprs_high = (compat_ulong_t *)
1079                 &task_pt_regs(target)->gprs[pos / sizeof(compat_ulong_t)];
1080         if (kbuf) {
1081                 const compat_ulong_t *k = kbuf;
1082                 while (count > 0) {
1083                         *gprs_high = *k++;
1084                         *gprs_high += 2;
1085                         count -= sizeof(*k);
1086                 }
1087         } else {
1088                 const compat_ulong_t  __user *u = ubuf;
1089                 while (count > 0 && !rc) {
1090                         unsigned long word;
1091                         rc = __get_user(word, u++);
1092                         if (rc)
1093                                 break;
1094                         *gprs_high = word;
1095                         *gprs_high += 2;
1096                         count -= sizeof(*u);
1097                 }
1098         }
1099
1100         return rc;
1101 }
1102
1103 static int s390_compat_last_break_get(struct task_struct *target,
1104                                       const struct user_regset *regset,
1105                                       unsigned int pos, unsigned int count,
1106                                       void *kbuf, void __user *ubuf)
1107 {
1108         compat_ulong_t last_break;
1109
1110         if (count > 0) {
1111                 last_break = task_thread_info(target)->last_break;
1112                 if (kbuf) {
1113                         unsigned long *k = kbuf;
1114                         *k = last_break;
1115                 } else {
1116                         unsigned long  __user *u = ubuf;
1117                         if (__put_user(last_break, u))
1118                                 return -EFAULT;
1119                 }
1120         }
1121         return 0;
1122 }
1123
1124 static const struct user_regset s390_compat_regsets[] = {
1125         [REGSET_GENERAL] = {
1126                 .core_note_type = NT_PRSTATUS,
1127                 .n = sizeof(s390_compat_regs) / sizeof(compat_long_t),
1128                 .size = sizeof(compat_long_t),
1129                 .align = sizeof(compat_long_t),
1130                 .get = s390_compat_regs_get,
1131                 .set = s390_compat_regs_set,
1132         },
1133         [REGSET_FP] = {
1134                 .core_note_type = NT_PRFPREG,
1135                 .n = sizeof(s390_fp_regs) / sizeof(compat_long_t),
1136                 .size = sizeof(compat_long_t),
1137                 .align = sizeof(compat_long_t),
1138                 .get = s390_fpregs_get,
1139                 .set = s390_fpregs_set,
1140         },
1141         [REGSET_LAST_BREAK] = {
1142                 .core_note_type = NT_S390_LAST_BREAK,
1143                 .n = 1,
1144                 .size = sizeof(long),
1145                 .align = sizeof(long),
1146                 .get = s390_compat_last_break_get,
1147         },
1148         [REGSET_SYSTEM_CALL] = {
1149                 .core_note_type = NT_S390_SYSTEM_CALL,
1150                 .n = 1,
1151                 .size = sizeof(compat_uint_t),
1152                 .align = sizeof(compat_uint_t),
1153                 .get = s390_system_call_get,
1154                 .set = s390_system_call_set,
1155         },
1156         [REGSET_GENERAL_EXTENDED] = {
1157                 .core_note_type = NT_S390_HIGH_GPRS,
1158                 .n = sizeof(s390_compat_regs_high) / sizeof(compat_long_t),
1159                 .size = sizeof(compat_long_t),
1160                 .align = sizeof(compat_long_t),
1161                 .get = s390_compat_regs_high_get,
1162                 .set = s390_compat_regs_high_set,
1163         },
1164 };
1165
1166 static const struct user_regset_view user_s390_compat_view = {
1167         .name = "s390",
1168         .e_machine = EM_S390,
1169         .regsets = s390_compat_regsets,
1170         .n = ARRAY_SIZE(s390_compat_regsets)
1171 };
1172 #endif
1173
1174 const struct user_regset_view *task_user_regset_view(struct task_struct *task)
1175 {
1176 #ifdef CONFIG_COMPAT
1177         if (test_tsk_thread_flag(task, TIF_31BIT))
1178                 return &user_s390_compat_view;
1179 #endif
1180         return &user_s390_view;
1181 }
1182
1183 static const char *gpr_names[NUM_GPRS] = {
1184         "r0", "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
1185         "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1186 };
1187
1188 unsigned long regs_get_register(struct pt_regs *regs, unsigned int offset)
1189 {
1190         if (offset >= NUM_GPRS)
1191                 return 0;
1192         return regs->gprs[offset];
1193 }
1194
1195 int regs_query_register_offset(const char *name)
1196 {
1197         unsigned long offset;
1198
1199         if (!name || *name != 'r')
1200                 return -EINVAL;
1201         if (strict_strtoul(name + 1, 10, &offset))
1202                 return -EINVAL;
1203         if (offset >= NUM_GPRS)
1204                 return -EINVAL;
1205         return offset;
1206 }
1207
1208 const char *regs_query_register_name(unsigned int offset)
1209 {
1210         if (offset >= NUM_GPRS)
1211                 return NULL;
1212         return gpr_names[offset];
1213 }
1214
1215 static int regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr)
1216 {
1217         unsigned long ksp = kernel_stack_pointer(regs);
1218
1219         return (addr & ~(THREAD_SIZE - 1)) == (ksp & ~(THREAD_SIZE - 1));
1220 }
1221
1222 /**
1223  * regs_get_kernel_stack_nth() - get Nth entry of the stack
1224  * @regs:pt_regs which contains kernel stack pointer.
1225  * @n:stack entry number.
1226  *
1227  * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
1228  * is specifined by @regs. If the @n th entry is NOT in the kernel stack,
1229  * this returns 0.
1230  */
1231 unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n)
1232 {
1233         unsigned long addr;
1234
1235         addr = kernel_stack_pointer(regs) + n * sizeof(long);
1236         if (!regs_within_kernel_stack(regs, addr))
1237                 return 0;
1238         return *(unsigned long *)addr;
1239 }