• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* By Ross Biro 1/23/92 */
2 /*
3  * Pentium III FXSR, SSE support
4  *	Gareth Hughes <gareth@valinux.com>, May 2000
5  */
6 
7 #include <linux/kernel.h>
8 #include <linux/sched.h>
9 #include <linux/mm.h>
10 #include <linux/smp.h>
11 #include <linux/errno.h>
12 #include <linux/slab.h>
13 #include <linux/ptrace.h>
14 #include <linux/tracehook.h>
15 #include <linux/user.h>
16 #include <linux/elf.h>
17 #include <linux/security.h>
18 #include <linux/audit.h>
19 #include <linux/seccomp.h>
20 #include <linux/signal.h>
21 #include <linux/perf_event.h>
22 #include <linux/hw_breakpoint.h>
23 #include <linux/rcupdate.h>
24 #include <linux/export.h>
25 #include <linux/context_tracking.h>
26 #include <linux/nospec.h>
27 
28 #include <asm/uaccess.h>
29 #include <asm/pgtable.h>
30 #include <asm/processor.h>
31 #include <asm/fpu/internal.h>
32 #include <asm/fpu/signal.h>
33 #include <asm/fpu/regset.h>
34 #include <asm/debugreg.h>
35 #include <asm/ldt.h>
36 #include <asm/desc.h>
37 #include <asm/prctl.h>
38 #include <asm/proto.h>
39 #include <asm/hw_breakpoint.h>
40 #include <asm/traps.h>
41 #include <asm/syscall.h>
42 
43 #include "tls.h"
44 
45 enum x86_regset {
46 	REGSET_GENERAL,
47 	REGSET_FP,
48 	REGSET_XFP,
49 	REGSET_IOPERM64 = REGSET_XFP,
50 	REGSET_XSTATE,
51 	REGSET_TLS,
52 	REGSET_IOPERM32,
53 };
54 
55 struct pt_regs_offset {
56 	const char *name;
57 	int offset;
58 };
59 
60 #define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, r)}
61 #define REG_OFFSET_END {.name = NULL, .offset = 0}
62 
63 static const struct pt_regs_offset regoffset_table[] = {
64 #ifdef CONFIG_X86_64
65 	REG_OFFSET_NAME(r15),
66 	REG_OFFSET_NAME(r14),
67 	REG_OFFSET_NAME(r13),
68 	REG_OFFSET_NAME(r12),
69 	REG_OFFSET_NAME(r11),
70 	REG_OFFSET_NAME(r10),
71 	REG_OFFSET_NAME(r9),
72 	REG_OFFSET_NAME(r8),
73 #endif
74 	REG_OFFSET_NAME(bx),
75 	REG_OFFSET_NAME(cx),
76 	REG_OFFSET_NAME(dx),
77 	REG_OFFSET_NAME(si),
78 	REG_OFFSET_NAME(di),
79 	REG_OFFSET_NAME(bp),
80 	REG_OFFSET_NAME(ax),
81 #ifdef CONFIG_X86_32
82 	REG_OFFSET_NAME(ds),
83 	REG_OFFSET_NAME(es),
84 	REG_OFFSET_NAME(fs),
85 	REG_OFFSET_NAME(gs),
86 #endif
87 	REG_OFFSET_NAME(orig_ax),
88 	REG_OFFSET_NAME(ip),
89 	REG_OFFSET_NAME(cs),
90 	REG_OFFSET_NAME(flags),
91 	REG_OFFSET_NAME(sp),
92 	REG_OFFSET_NAME(ss),
93 	REG_OFFSET_END,
94 };
95 
96 /**
97  * regs_query_register_offset() - query register offset from its name
98  * @name:	the name of a register
99  *
100  * regs_query_register_offset() returns the offset of a register in struct
101  * pt_regs from its name. If the name is invalid, this returns -EINVAL;
102  */
regs_query_register_offset(const char * name)103 int regs_query_register_offset(const char *name)
104 {
105 	const struct pt_regs_offset *roff;
106 	for (roff = regoffset_table; roff->name != NULL; roff++)
107 		if (!strcmp(roff->name, name))
108 			return roff->offset;
109 	return -EINVAL;
110 }
111 
112 /**
113  * regs_query_register_name() - query register name from its offset
114  * @offset:	the offset of a register in struct pt_regs.
115  *
116  * regs_query_register_name() returns the name of a register from its
117  * offset in struct pt_regs. If the @offset is invalid, this returns NULL;
118  */
regs_query_register_name(unsigned int offset)119 const char *regs_query_register_name(unsigned int offset)
120 {
121 	const struct pt_regs_offset *roff;
122 	for (roff = regoffset_table; roff->name != NULL; roff++)
123 		if (roff->offset == offset)
124 			return roff->name;
125 	return NULL;
126 }
127 
128 static const int arg_offs_table[] = {
129 #ifdef CONFIG_X86_32
130 	[0] = offsetof(struct pt_regs, ax),
131 	[1] = offsetof(struct pt_regs, dx),
132 	[2] = offsetof(struct pt_regs, cx)
133 #else /* CONFIG_X86_64 */
134 	[0] = offsetof(struct pt_regs, di),
135 	[1] = offsetof(struct pt_regs, si),
136 	[2] = offsetof(struct pt_regs, dx),
137 	[3] = offsetof(struct pt_regs, cx),
138 	[4] = offsetof(struct pt_regs, r8),
139 	[5] = offsetof(struct pt_regs, r9)
140 #endif
141 };
142 
143 /*
144  * does not yet catch signals sent when the child dies.
145  * in exit.c or in signal.c.
146  */
147 
148 /*
149  * Determines which flags the user has access to [1 = access, 0 = no access].
150  */
151 #define FLAG_MASK_32		((unsigned long)			\
152 				 (X86_EFLAGS_CF | X86_EFLAGS_PF |	\
153 				  X86_EFLAGS_AF | X86_EFLAGS_ZF |	\
154 				  X86_EFLAGS_SF | X86_EFLAGS_TF |	\
155 				  X86_EFLAGS_DF | X86_EFLAGS_OF |	\
156 				  X86_EFLAGS_RF | X86_EFLAGS_AC))
157 
158 /*
159  * Determines whether a value may be installed in a segment register.
160  */
invalid_selector(u16 value)161 static inline bool invalid_selector(u16 value)
162 {
163 	return unlikely(value != 0 && (value & SEGMENT_RPL_MASK) != USER_RPL);
164 }
165 
166 #ifdef CONFIG_X86_32
167 
168 #define FLAG_MASK		FLAG_MASK_32
169 
170 /*
171  * X86_32 CPUs don't save ss and esp if the CPU is already in kernel mode
172  * when it traps.  The previous stack will be directly underneath the saved
173  * registers, and 'sp/ss' won't even have been saved. Thus the '&regs->sp'.
174  *
175  * Now, if the stack is empty, '&regs->sp' is out of range. In this
176  * case we try to take the previous stack. To always return a non-null
177  * stack pointer we fall back to regs as stack if no previous stack
178  * exists.
179  *
180  * This is valid only for kernel mode traps.
181  */
kernel_stack_pointer(struct pt_regs * regs)182 unsigned long kernel_stack_pointer(struct pt_regs *regs)
183 {
184 	unsigned long context = (unsigned long)regs & ~(THREAD_SIZE - 1);
185 	unsigned long sp = (unsigned long)&regs->sp;
186 	u32 *prev_esp;
187 
188 	if (context == (sp & ~(THREAD_SIZE - 1)))
189 		return sp;
190 
191 	prev_esp = (u32 *)(context);
192 	if (*prev_esp)
193 		return (unsigned long)*prev_esp;
194 
195 	return (unsigned long)regs;
196 }
197 EXPORT_SYMBOL_GPL(kernel_stack_pointer);
198 
pt_regs_access(struct pt_regs * regs,unsigned long regno)199 static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno)
200 {
201 	BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0);
202 	return &regs->bx + (regno >> 2);
203 }
204 
get_segment_reg(struct task_struct * task,unsigned long offset)205 static u16 get_segment_reg(struct task_struct *task, unsigned long offset)
206 {
207 	/*
208 	 * Returning the value truncates it to 16 bits.
209 	 */
210 	unsigned int retval;
211 	if (offset != offsetof(struct user_regs_struct, gs))
212 		retval = *pt_regs_access(task_pt_regs(task), offset);
213 	else {
214 		if (task == current)
215 			retval = get_user_gs(task_pt_regs(task));
216 		else
217 			retval = task_user_gs(task);
218 	}
219 	return retval;
220 }
221 
set_segment_reg(struct task_struct * task,unsigned long offset,u16 value)222 static int set_segment_reg(struct task_struct *task,
223 			   unsigned long offset, u16 value)
224 {
225 	/*
226 	 * The value argument was already truncated to 16 bits.
227 	 */
228 	if (invalid_selector(value))
229 		return -EIO;
230 
231 	/*
232 	 * For %cs and %ss we cannot permit a null selector.
233 	 * We can permit a bogus selector as long as it has USER_RPL.
234 	 * Null selectors are fine for other segment registers, but
235 	 * we will never get back to user mode with invalid %cs or %ss
236 	 * and will take the trap in iret instead.  Much code relies
237 	 * on user_mode() to distinguish a user trap frame (which can
238 	 * safely use invalid selectors) from a kernel trap frame.
239 	 */
240 	switch (offset) {
241 	case offsetof(struct user_regs_struct, cs):
242 	case offsetof(struct user_regs_struct, ss):
243 		if (unlikely(value == 0))
244 			return -EIO;
245 
246 	default:
247 		*pt_regs_access(task_pt_regs(task), offset) = value;
248 		break;
249 
250 	case offsetof(struct user_regs_struct, gs):
251 		if (task == current)
252 			set_user_gs(task_pt_regs(task), value);
253 		else
254 			task_user_gs(task) = value;
255 	}
256 
257 	return 0;
258 }
259 
260 #else  /* CONFIG_X86_64 */
261 
262 #define FLAG_MASK		(FLAG_MASK_32 | X86_EFLAGS_NT)
263 
pt_regs_access(struct pt_regs * regs,unsigned long offset)264 static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long offset)
265 {
266 	BUILD_BUG_ON(offsetof(struct pt_regs, r15) != 0);
267 	return &regs->r15 + (offset / sizeof(regs->r15));
268 }
269 
get_segment_reg(struct task_struct * task,unsigned long offset)270 static u16 get_segment_reg(struct task_struct *task, unsigned long offset)
271 {
272 	/*
273 	 * Returning the value truncates it to 16 bits.
274 	 */
275 	unsigned int seg;
276 
277 	switch (offset) {
278 	case offsetof(struct user_regs_struct, fs):
279 		if (task == current) {
280 			/* Older gas can't assemble movq %?s,%r?? */
281 			asm("movl %%fs,%0" : "=r" (seg));
282 			return seg;
283 		}
284 		return task->thread.fsindex;
285 	case offsetof(struct user_regs_struct, gs):
286 		if (task == current) {
287 			asm("movl %%gs,%0" : "=r" (seg));
288 			return seg;
289 		}
290 		return task->thread.gsindex;
291 	case offsetof(struct user_regs_struct, ds):
292 		if (task == current) {
293 			asm("movl %%ds,%0" : "=r" (seg));
294 			return seg;
295 		}
296 		return task->thread.ds;
297 	case offsetof(struct user_regs_struct, es):
298 		if (task == current) {
299 			asm("movl %%es,%0" : "=r" (seg));
300 			return seg;
301 		}
302 		return task->thread.es;
303 
304 	case offsetof(struct user_regs_struct, cs):
305 	case offsetof(struct user_regs_struct, ss):
306 		break;
307 	}
308 	return *pt_regs_access(task_pt_regs(task), offset);
309 }
310 
set_segment_reg(struct task_struct * task,unsigned long offset,u16 value)311 static int set_segment_reg(struct task_struct *task,
312 			   unsigned long offset, u16 value)
313 {
314 	/*
315 	 * The value argument was already truncated to 16 bits.
316 	 */
317 	if (invalid_selector(value))
318 		return -EIO;
319 
320 	switch (offset) {
321 	case offsetof(struct user_regs_struct,fs):
322 		/*
323 		 * If this is setting fs as for normal 64-bit use but
324 		 * setting fs_base has implicitly changed it, leave it.
325 		 */
326 		if ((value == FS_TLS_SEL && task->thread.fsindex == 0 &&
327 		     task->thread.fsbase != 0) ||
328 		    (value == 0 && task->thread.fsindex == FS_TLS_SEL &&
329 		     task->thread.fsbase == 0))
330 			break;
331 		task->thread.fsindex = value;
332 		if (task == current)
333 			loadsegment(fs, task->thread.fsindex);
334 		break;
335 	case offsetof(struct user_regs_struct,gs):
336 		/*
337 		 * If this is setting gs as for normal 64-bit use but
338 		 * setting gs_base has implicitly changed it, leave it.
339 		 */
340 		if ((value == GS_TLS_SEL && task->thread.gsindex == 0 &&
341 		     task->thread.gsbase != 0) ||
342 		    (value == 0 && task->thread.gsindex == GS_TLS_SEL &&
343 		     task->thread.gsbase == 0))
344 			break;
345 		task->thread.gsindex = value;
346 		if (task == current)
347 			load_gs_index(task->thread.gsindex);
348 		break;
349 	case offsetof(struct user_regs_struct,ds):
350 		task->thread.ds = value;
351 		if (task == current)
352 			loadsegment(ds, task->thread.ds);
353 		break;
354 	case offsetof(struct user_regs_struct,es):
355 		task->thread.es = value;
356 		if (task == current)
357 			loadsegment(es, task->thread.es);
358 		break;
359 
360 		/*
361 		 * Can't actually change these in 64-bit mode.
362 		 */
363 	case offsetof(struct user_regs_struct,cs):
364 		if (unlikely(value == 0))
365 			return -EIO;
366 		task_pt_regs(task)->cs = value;
367 		break;
368 	case offsetof(struct user_regs_struct,ss):
369 		if (unlikely(value == 0))
370 			return -EIO;
371 		task_pt_regs(task)->ss = value;
372 		break;
373 	}
374 
375 	return 0;
376 }
377 
378 #endif	/* CONFIG_X86_32 */
379 
get_flags(struct task_struct * task)380 static unsigned long get_flags(struct task_struct *task)
381 {
382 	unsigned long retval = task_pt_regs(task)->flags;
383 
384 	/*
385 	 * If the debugger set TF, hide it from the readout.
386 	 */
387 	if (test_tsk_thread_flag(task, TIF_FORCED_TF))
388 		retval &= ~X86_EFLAGS_TF;
389 
390 	return retval;
391 }
392 
set_flags(struct task_struct * task,unsigned long value)393 static int set_flags(struct task_struct *task, unsigned long value)
394 {
395 	struct pt_regs *regs = task_pt_regs(task);
396 
397 	/*
398 	 * If the user value contains TF, mark that
399 	 * it was not "us" (the debugger) that set it.
400 	 * If not, make sure it stays set if we had.
401 	 */
402 	if (value & X86_EFLAGS_TF)
403 		clear_tsk_thread_flag(task, TIF_FORCED_TF);
404 	else if (test_tsk_thread_flag(task, TIF_FORCED_TF))
405 		value |= X86_EFLAGS_TF;
406 
407 	regs->flags = (regs->flags & ~FLAG_MASK) | (value & FLAG_MASK);
408 
409 	return 0;
410 }
411 
putreg(struct task_struct * child,unsigned long offset,unsigned long value)412 static int putreg(struct task_struct *child,
413 		  unsigned long offset, unsigned long value)
414 {
415 	switch (offset) {
416 	case offsetof(struct user_regs_struct, cs):
417 	case offsetof(struct user_regs_struct, ds):
418 	case offsetof(struct user_regs_struct, es):
419 	case offsetof(struct user_regs_struct, fs):
420 	case offsetof(struct user_regs_struct, gs):
421 	case offsetof(struct user_regs_struct, ss):
422 		return set_segment_reg(child, offset, value);
423 
424 	case offsetof(struct user_regs_struct, flags):
425 		return set_flags(child, value);
426 
427 #ifdef CONFIG_X86_64
428 	case offsetof(struct user_regs_struct,fs_base):
429 		if (value >= TASK_SIZE_OF(child))
430 			return -EIO;
431 		/*
432 		 * When changing the segment base, use do_arch_prctl
433 		 * to set either thread.fsbase or thread.fsindex and the
434 		 * corresponding GDT slot.
435 		 */
436 		if (child->thread.fsbase != value)
437 			return do_arch_prctl(child, ARCH_SET_FS, value);
438 		return 0;
439 	case offsetof(struct user_regs_struct,gs_base):
440 		/*
441 		 * Exactly the same here as the %fs handling above.
442 		 */
443 		if (value >= TASK_SIZE_OF(child))
444 			return -EIO;
445 		if (child->thread.gsbase != value)
446 			return do_arch_prctl(child, ARCH_SET_GS, value);
447 		return 0;
448 #endif
449 	}
450 
451 	*pt_regs_access(task_pt_regs(child), offset) = value;
452 	return 0;
453 }
454 
getreg(struct task_struct * task,unsigned long offset)455 static unsigned long getreg(struct task_struct *task, unsigned long offset)
456 {
457 	switch (offset) {
458 	case offsetof(struct user_regs_struct, cs):
459 	case offsetof(struct user_regs_struct, ds):
460 	case offsetof(struct user_regs_struct, es):
461 	case offsetof(struct user_regs_struct, fs):
462 	case offsetof(struct user_regs_struct, gs):
463 	case offsetof(struct user_regs_struct, ss):
464 		return get_segment_reg(task, offset);
465 
466 	case offsetof(struct user_regs_struct, flags):
467 		return get_flags(task);
468 
469 #ifdef CONFIG_X86_64
470 	case offsetof(struct user_regs_struct, fs_base): {
471 		/*
472 		 * do_arch_prctl may have used a GDT slot instead of
473 		 * the MSR.  To userland, it appears the same either
474 		 * way, except the %fs segment selector might not be 0.
475 		 */
476 		unsigned int seg = task->thread.fsindex;
477 		if (task->thread.fsbase != 0)
478 			return task->thread.fsbase;
479 		if (task == current)
480 			asm("movl %%fs,%0" : "=r" (seg));
481 		if (seg != FS_TLS_SEL)
482 			return 0;
483 		return get_desc_base(&task->thread.tls_array[FS_TLS]);
484 	}
485 	case offsetof(struct user_regs_struct, gs_base): {
486 		/*
487 		 * Exactly the same here as the %fs handling above.
488 		 */
489 		unsigned int seg = task->thread.gsindex;
490 		if (task->thread.gsbase != 0)
491 			return task->thread.gsbase;
492 		if (task == current)
493 			asm("movl %%gs,%0" : "=r" (seg));
494 		if (seg != GS_TLS_SEL)
495 			return 0;
496 		return get_desc_base(&task->thread.tls_array[GS_TLS]);
497 	}
498 #endif
499 	}
500 
501 	return *pt_regs_access(task_pt_regs(task), offset);
502 }
503 
genregs_get(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,void * kbuf,void __user * ubuf)504 static int genregs_get(struct task_struct *target,
505 		       const struct user_regset *regset,
506 		       unsigned int pos, unsigned int count,
507 		       void *kbuf, void __user *ubuf)
508 {
509 	if (kbuf) {
510 		unsigned long *k = kbuf;
511 		while (count >= sizeof(*k)) {
512 			*k++ = getreg(target, pos);
513 			count -= sizeof(*k);
514 			pos += sizeof(*k);
515 		}
516 	} else {
517 		unsigned long __user *u = ubuf;
518 		while (count >= sizeof(*u)) {
519 			if (__put_user(getreg(target, pos), u++))
520 				return -EFAULT;
521 			count -= sizeof(*u);
522 			pos += sizeof(*u);
523 		}
524 	}
525 
526 	return 0;
527 }
528 
genregs_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)529 static int genregs_set(struct task_struct *target,
530 		       const struct user_regset *regset,
531 		       unsigned int pos, unsigned int count,
532 		       const void *kbuf, const void __user *ubuf)
533 {
534 	int ret = 0;
535 	if (kbuf) {
536 		const unsigned long *k = kbuf;
537 		while (count >= sizeof(*k) && !ret) {
538 			ret = putreg(target, pos, *k++);
539 			count -= sizeof(*k);
540 			pos += sizeof(*k);
541 		}
542 	} else {
543 		const unsigned long  __user *u = ubuf;
544 		while (count >= sizeof(*u) && !ret) {
545 			unsigned long word;
546 			ret = __get_user(word, u++);
547 			if (ret)
548 				break;
549 			ret = putreg(target, pos, word);
550 			count -= sizeof(*u);
551 			pos += sizeof(*u);
552 		}
553 	}
554 	return ret;
555 }
556 
ptrace_triggered(struct perf_event * bp,struct perf_sample_data * data,struct pt_regs * regs)557 static void ptrace_triggered(struct perf_event *bp,
558 			     struct perf_sample_data *data,
559 			     struct pt_regs *regs)
560 {
561 	int i;
562 	struct thread_struct *thread = &(current->thread);
563 
564 	/*
565 	 * Store in the virtual DR6 register the fact that the breakpoint
566 	 * was hit so the thread's debugger will see it.
567 	 */
568 	for (i = 0; i < HBP_NUM; i++) {
569 		if (thread->ptrace_bps[i] == bp)
570 			break;
571 	}
572 
573 	thread->debugreg6 |= (DR_TRAP0 << i);
574 }
575 
576 /*
577  * Walk through every ptrace breakpoints for this thread and
578  * build the dr7 value on top of their attributes.
579  *
580  */
ptrace_get_dr7(struct perf_event * bp[])581 static unsigned long ptrace_get_dr7(struct perf_event *bp[])
582 {
583 	int i;
584 	int dr7 = 0;
585 	struct arch_hw_breakpoint *info;
586 
587 	for (i = 0; i < HBP_NUM; i++) {
588 		if (bp[i] && !bp[i]->attr.disabled) {
589 			info = counter_arch_bp(bp[i]);
590 			dr7 |= encode_dr7(i, info->len, info->type);
591 		}
592 	}
593 
594 	return dr7;
595 }
596 
ptrace_fill_bp_fields(struct perf_event_attr * attr,int len,int type,bool disabled)597 static int ptrace_fill_bp_fields(struct perf_event_attr *attr,
598 					int len, int type, bool disabled)
599 {
600 	int err, bp_len, bp_type;
601 
602 	err = arch_bp_generic_fields(len, type, &bp_len, &bp_type);
603 	if (!err) {
604 		attr->bp_len = bp_len;
605 		attr->bp_type = bp_type;
606 		attr->disabled = disabled;
607 	}
608 
609 	return err;
610 }
611 
612 static struct perf_event *
ptrace_register_breakpoint(struct task_struct * tsk,int len,int type,unsigned long addr,bool disabled)613 ptrace_register_breakpoint(struct task_struct *tsk, int len, int type,
614 				unsigned long addr, bool disabled)
615 {
616 	struct perf_event_attr attr;
617 	int err;
618 
619 	ptrace_breakpoint_init(&attr);
620 	attr.bp_addr = addr;
621 
622 	err = ptrace_fill_bp_fields(&attr, len, type, disabled);
623 	if (err)
624 		return ERR_PTR(err);
625 
626 	return register_user_hw_breakpoint(&attr, ptrace_triggered,
627 						 NULL, tsk);
628 }
629 
ptrace_modify_breakpoint(struct perf_event * bp,int len,int type,int disabled)630 static int ptrace_modify_breakpoint(struct perf_event *bp, int len, int type,
631 					int disabled)
632 {
633 	struct perf_event_attr attr = bp->attr;
634 	int err;
635 
636 	err = ptrace_fill_bp_fields(&attr, len, type, disabled);
637 	if (err)
638 		return err;
639 
640 	return modify_user_hw_breakpoint(bp, &attr);
641 }
642 
643 /*
644  * Handle ptrace writes to debug register 7.
645  */
ptrace_write_dr7(struct task_struct * tsk,unsigned long data)646 static int ptrace_write_dr7(struct task_struct *tsk, unsigned long data)
647 {
648 	struct thread_struct *thread = &tsk->thread;
649 	unsigned long old_dr7;
650 	bool second_pass = false;
651 	int i, rc, ret = 0;
652 
653 	data &= ~DR_CONTROL_RESERVED;
654 	old_dr7 = ptrace_get_dr7(thread->ptrace_bps);
655 
656 restore:
657 	rc = 0;
658 	for (i = 0; i < HBP_NUM; i++) {
659 		unsigned len, type;
660 		bool disabled = !decode_dr7(data, i, &len, &type);
661 		struct perf_event *bp = thread->ptrace_bps[i];
662 
663 		if (!bp) {
664 			if (disabled)
665 				continue;
666 
667 			bp = ptrace_register_breakpoint(tsk,
668 					len, type, 0, disabled);
669 			if (IS_ERR(bp)) {
670 				rc = PTR_ERR(bp);
671 				break;
672 			}
673 
674 			thread->ptrace_bps[i] = bp;
675 			continue;
676 		}
677 
678 		rc = ptrace_modify_breakpoint(bp, len, type, disabled);
679 		if (rc)
680 			break;
681 	}
682 
683 	/* Restore if the first pass failed, second_pass shouldn't fail. */
684 	if (rc && !WARN_ON(second_pass)) {
685 		ret = rc;
686 		data = old_dr7;
687 		second_pass = true;
688 		goto restore;
689 	}
690 
691 	return ret;
692 }
693 
694 /*
695  * Handle PTRACE_PEEKUSR calls for the debug register area.
696  */
ptrace_get_debugreg(struct task_struct * tsk,int n)697 static unsigned long ptrace_get_debugreg(struct task_struct *tsk, int n)
698 {
699 	struct thread_struct *thread = &tsk->thread;
700 	unsigned long val = 0;
701 
702 	if (n < HBP_NUM) {
703 		int index = array_index_nospec(n, HBP_NUM);
704 		struct perf_event *bp = thread->ptrace_bps[index];
705 
706 		if (bp)
707 			val = bp->hw.info.address;
708 	} else if (n == 6) {
709 		val = thread->debugreg6;
710 	} else if (n == 7) {
711 		val = thread->ptrace_dr7;
712 	}
713 	return val;
714 }
715 
ptrace_set_breakpoint_addr(struct task_struct * tsk,int nr,unsigned long addr)716 static int ptrace_set_breakpoint_addr(struct task_struct *tsk, int nr,
717 				      unsigned long addr)
718 {
719 	struct thread_struct *t = &tsk->thread;
720 	struct perf_event *bp = t->ptrace_bps[nr];
721 	int err = 0;
722 
723 	if (!bp) {
724 		/*
725 		 * Put stub len and type to create an inactive but correct bp.
726 		 *
727 		 * CHECKME: the previous code returned -EIO if the addr wasn't
728 		 * a valid task virtual addr. The new one will return -EINVAL in
729 		 *  this case.
730 		 * -EINVAL may be what we want for in-kernel breakpoints users,
731 		 * but -EIO looks better for ptrace, since we refuse a register
732 		 * writing for the user. And anyway this is the previous
733 		 * behaviour.
734 		 */
735 		bp = ptrace_register_breakpoint(tsk,
736 				X86_BREAKPOINT_LEN_1, X86_BREAKPOINT_WRITE,
737 				addr, true);
738 		if (IS_ERR(bp))
739 			err = PTR_ERR(bp);
740 		else
741 			t->ptrace_bps[nr] = bp;
742 	} else {
743 		struct perf_event_attr attr = bp->attr;
744 
745 		attr.bp_addr = addr;
746 		err = modify_user_hw_breakpoint(bp, &attr);
747 	}
748 
749 	return err;
750 }
751 
752 /*
753  * Handle PTRACE_POKEUSR calls for the debug register area.
754  */
ptrace_set_debugreg(struct task_struct * tsk,int n,unsigned long val)755 static int ptrace_set_debugreg(struct task_struct *tsk, int n,
756 			       unsigned long val)
757 {
758 	struct thread_struct *thread = &tsk->thread;
759 	/* There are no DR4 or DR5 registers */
760 	int rc = -EIO;
761 
762 	if (n < HBP_NUM) {
763 		rc = ptrace_set_breakpoint_addr(tsk, n, val);
764 	} else if (n == 6) {
765 		thread->debugreg6 = val;
766 		rc = 0;
767 	} else if (n == 7) {
768 		rc = ptrace_write_dr7(tsk, val);
769 		if (!rc)
770 			thread->ptrace_dr7 = val;
771 	}
772 	return rc;
773 }
774 
775 /*
776  * These access the current or another (stopped) task's io permission
777  * bitmap for debugging or core dump.
778  */
ioperm_active(struct task_struct * target,const struct user_regset * regset)779 static int ioperm_active(struct task_struct *target,
780 			 const struct user_regset *regset)
781 {
782 	return target->thread.io_bitmap_max / regset->size;
783 }
784 
ioperm_get(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,void * kbuf,void __user * ubuf)785 static int ioperm_get(struct task_struct *target,
786 		      const struct user_regset *regset,
787 		      unsigned int pos, unsigned int count,
788 		      void *kbuf, void __user *ubuf)
789 {
790 	if (!target->thread.io_bitmap_ptr)
791 		return -ENXIO;
792 
793 	return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
794 				   target->thread.io_bitmap_ptr,
795 				   0, IO_BITMAP_BYTES);
796 }
797 
798 /*
799  * Called by kernel/ptrace.c when detaching..
800  *
801  * Make sure the single step bit is not set.
802  */
ptrace_disable(struct task_struct * child)803 void ptrace_disable(struct task_struct *child)
804 {
805 	user_disable_single_step(child);
806 #ifdef TIF_SYSCALL_EMU
807 	clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
808 #endif
809 }
810 
811 #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
812 static const struct user_regset_view user_x86_32_view; /* Initialized below. */
813 #endif
814 
arch_ptrace(struct task_struct * child,long request,unsigned long addr,unsigned long data)815 long arch_ptrace(struct task_struct *child, long request,
816 		 unsigned long addr, unsigned long data)
817 {
818 	int ret;
819 	unsigned long __user *datap = (unsigned long __user *)data;
820 
821 	switch (request) {
822 	/* read the word at location addr in the USER area. */
823 	case PTRACE_PEEKUSR: {
824 		unsigned long tmp;
825 
826 		ret = -EIO;
827 		if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user))
828 			break;
829 
830 		tmp = 0;  /* Default return condition */
831 		if (addr < sizeof(struct user_regs_struct))
832 			tmp = getreg(child, addr);
833 		else if (addr >= offsetof(struct user, u_debugreg[0]) &&
834 			 addr <= offsetof(struct user, u_debugreg[7])) {
835 			addr -= offsetof(struct user, u_debugreg[0]);
836 			tmp = ptrace_get_debugreg(child, addr / sizeof(data));
837 		}
838 		ret = put_user(tmp, datap);
839 		break;
840 	}
841 
842 	case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
843 		ret = -EIO;
844 		if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user))
845 			break;
846 
847 		if (addr < sizeof(struct user_regs_struct))
848 			ret = putreg(child, addr, data);
849 		else if (addr >= offsetof(struct user, u_debugreg[0]) &&
850 			 addr <= offsetof(struct user, u_debugreg[7])) {
851 			addr -= offsetof(struct user, u_debugreg[0]);
852 			ret = ptrace_set_debugreg(child,
853 						  addr / sizeof(data), data);
854 		}
855 		break;
856 
857 	case PTRACE_GETREGS:	/* Get all gp regs from the child. */
858 		return copy_regset_to_user(child,
859 					   task_user_regset_view(current),
860 					   REGSET_GENERAL,
861 					   0, sizeof(struct user_regs_struct),
862 					   datap);
863 
864 	case PTRACE_SETREGS:	/* Set all gp regs in the child. */
865 		return copy_regset_from_user(child,
866 					     task_user_regset_view(current),
867 					     REGSET_GENERAL,
868 					     0, sizeof(struct user_regs_struct),
869 					     datap);
870 
871 	case PTRACE_GETFPREGS:	/* Get the child FPU state. */
872 		return copy_regset_to_user(child,
873 					   task_user_regset_view(current),
874 					   REGSET_FP,
875 					   0, sizeof(struct user_i387_struct),
876 					   datap);
877 
878 	case PTRACE_SETFPREGS:	/* Set the child FPU state. */
879 		return copy_regset_from_user(child,
880 					     task_user_regset_view(current),
881 					     REGSET_FP,
882 					     0, sizeof(struct user_i387_struct),
883 					     datap);
884 
885 #ifdef CONFIG_X86_32
886 	case PTRACE_GETFPXREGS:	/* Get the child extended FPU state. */
887 		return copy_regset_to_user(child, &user_x86_32_view,
888 					   REGSET_XFP,
889 					   0, sizeof(struct user_fxsr_struct),
890 					   datap) ? -EIO : 0;
891 
892 	case PTRACE_SETFPXREGS:	/* Set the child extended FPU state. */
893 		return copy_regset_from_user(child, &user_x86_32_view,
894 					     REGSET_XFP,
895 					     0, sizeof(struct user_fxsr_struct),
896 					     datap) ? -EIO : 0;
897 #endif
898 
899 #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
900 	case PTRACE_GET_THREAD_AREA:
901 		if ((int) addr < 0)
902 			return -EIO;
903 		ret = do_get_thread_area(child, addr,
904 					(struct user_desc __user *)data);
905 		break;
906 
907 	case PTRACE_SET_THREAD_AREA:
908 		if ((int) addr < 0)
909 			return -EIO;
910 		ret = do_set_thread_area(child, addr,
911 					(struct user_desc __user *)data, 0);
912 		break;
913 #endif
914 
915 #ifdef CONFIG_X86_64
916 		/* normal 64bit interface to access TLS data.
917 		   Works just like arch_prctl, except that the arguments
918 		   are reversed. */
919 	case PTRACE_ARCH_PRCTL:
920 		ret = do_arch_prctl(child, data, addr);
921 		break;
922 #endif
923 
924 	default:
925 		ret = ptrace_request(child, request, addr, data);
926 		break;
927 	}
928 
929 	return ret;
930 }
931 
932 #ifdef CONFIG_IA32_EMULATION
933 
934 #include <linux/compat.h>
935 #include <linux/syscalls.h>
936 #include <asm/ia32.h>
937 #include <asm/user32.h>
938 
939 #define R32(l,q)							\
940 	case offsetof(struct user32, regs.l):				\
941 		regs->q = value; break
942 
943 #define SEG32(rs)							\
944 	case offsetof(struct user32, regs.rs):				\
945 		return set_segment_reg(child,				\
946 				       offsetof(struct user_regs_struct, rs), \
947 				       value);				\
948 		break
949 
putreg32(struct task_struct * child,unsigned regno,u32 value)950 static int putreg32(struct task_struct *child, unsigned regno, u32 value)
951 {
952 	struct pt_regs *regs = task_pt_regs(child);
953 
954 	switch (regno) {
955 
956 	SEG32(cs);
957 	SEG32(ds);
958 	SEG32(es);
959 	SEG32(fs);
960 	SEG32(gs);
961 	SEG32(ss);
962 
963 	R32(ebx, bx);
964 	R32(ecx, cx);
965 	R32(edx, dx);
966 	R32(edi, di);
967 	R32(esi, si);
968 	R32(ebp, bp);
969 	R32(eax, ax);
970 	R32(eip, ip);
971 	R32(esp, sp);
972 
973 	case offsetof(struct user32, regs.orig_eax):
974 		/*
975 		 * A 32-bit debugger setting orig_eax means to restore
976 		 * the state of the task restarting a 32-bit syscall.
977 		 * Make sure we interpret the -ERESTART* codes correctly
978 		 * in case the task is not actually still sitting at the
979 		 * exit from a 32-bit syscall with TS_COMPAT still set.
980 		 */
981 		regs->orig_ax = value;
982 		if (syscall_get_nr(child, regs) >= 0)
983 			task_thread_info(child)->status |= TS_COMPAT;
984 		break;
985 
986 	case offsetof(struct user32, regs.eflags):
987 		return set_flags(child, value);
988 
989 	case offsetof(struct user32, u_debugreg[0]) ...
990 		offsetof(struct user32, u_debugreg[7]):
991 		regno -= offsetof(struct user32, u_debugreg[0]);
992 		return ptrace_set_debugreg(child, regno / 4, value);
993 
994 	default:
995 		if (regno > sizeof(struct user32) || (regno & 3))
996 			return -EIO;
997 
998 		/*
999 		 * Other dummy fields in the virtual user structure
1000 		 * are ignored
1001 		 */
1002 		break;
1003 	}
1004 	return 0;
1005 }
1006 
1007 #undef R32
1008 #undef SEG32
1009 
1010 #define R32(l,q)							\
1011 	case offsetof(struct user32, regs.l):				\
1012 		*val = regs->q; break
1013 
1014 #define SEG32(rs)							\
1015 	case offsetof(struct user32, regs.rs):				\
1016 		*val = get_segment_reg(child,				\
1017 				       offsetof(struct user_regs_struct, rs)); \
1018 		break
1019 
getreg32(struct task_struct * child,unsigned regno,u32 * val)1020 static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
1021 {
1022 	struct pt_regs *regs = task_pt_regs(child);
1023 
1024 	switch (regno) {
1025 
1026 	SEG32(ds);
1027 	SEG32(es);
1028 	SEG32(fs);
1029 	SEG32(gs);
1030 
1031 	R32(cs, cs);
1032 	R32(ss, ss);
1033 	R32(ebx, bx);
1034 	R32(ecx, cx);
1035 	R32(edx, dx);
1036 	R32(edi, di);
1037 	R32(esi, si);
1038 	R32(ebp, bp);
1039 	R32(eax, ax);
1040 	R32(orig_eax, orig_ax);
1041 	R32(eip, ip);
1042 	R32(esp, sp);
1043 
1044 	case offsetof(struct user32, regs.eflags):
1045 		*val = get_flags(child);
1046 		break;
1047 
1048 	case offsetof(struct user32, u_debugreg[0]) ...
1049 		offsetof(struct user32, u_debugreg[7]):
1050 		regno -= offsetof(struct user32, u_debugreg[0]);
1051 		*val = ptrace_get_debugreg(child, regno / 4);
1052 		break;
1053 
1054 	default:
1055 		if (regno > sizeof(struct user32) || (regno & 3))
1056 			return -EIO;
1057 
1058 		/*
1059 		 * Other dummy fields in the virtual user structure
1060 		 * are ignored
1061 		 */
1062 		*val = 0;
1063 		break;
1064 	}
1065 	return 0;
1066 }
1067 
1068 #undef R32
1069 #undef SEG32
1070 
genregs32_get(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,void * kbuf,void __user * ubuf)1071 static int genregs32_get(struct task_struct *target,
1072 			 const struct user_regset *regset,
1073 			 unsigned int pos, unsigned int count,
1074 			 void *kbuf, void __user *ubuf)
1075 {
1076 	if (kbuf) {
1077 		compat_ulong_t *k = kbuf;
1078 		while (count >= sizeof(*k)) {
1079 			getreg32(target, pos, k++);
1080 			count -= sizeof(*k);
1081 			pos += sizeof(*k);
1082 		}
1083 	} else {
1084 		compat_ulong_t __user *u = ubuf;
1085 		while (count >= sizeof(*u)) {
1086 			compat_ulong_t word;
1087 			getreg32(target, pos, &word);
1088 			if (__put_user(word, u++))
1089 				return -EFAULT;
1090 			count -= sizeof(*u);
1091 			pos += sizeof(*u);
1092 		}
1093 	}
1094 
1095 	return 0;
1096 }
1097 
genregs32_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)1098 static int genregs32_set(struct task_struct *target,
1099 			 const struct user_regset *regset,
1100 			 unsigned int pos, unsigned int count,
1101 			 const void *kbuf, const void __user *ubuf)
1102 {
1103 	int ret = 0;
1104 	if (kbuf) {
1105 		const compat_ulong_t *k = kbuf;
1106 		while (count >= sizeof(*k) && !ret) {
1107 			ret = putreg32(target, pos, *k++);
1108 			count -= sizeof(*k);
1109 			pos += sizeof(*k);
1110 		}
1111 	} else {
1112 		const compat_ulong_t __user *u = ubuf;
1113 		while (count >= sizeof(*u) && !ret) {
1114 			compat_ulong_t word;
1115 			ret = __get_user(word, u++);
1116 			if (ret)
1117 				break;
1118 			ret = putreg32(target, pos, word);
1119 			count -= sizeof(*u);
1120 			pos += sizeof(*u);
1121 		}
1122 	}
1123 	return ret;
1124 }
1125 
ia32_arch_ptrace(struct task_struct * child,compat_long_t request,compat_ulong_t caddr,compat_ulong_t cdata)1126 static long ia32_arch_ptrace(struct task_struct *child, compat_long_t request,
1127 			     compat_ulong_t caddr, compat_ulong_t cdata)
1128 {
1129 	unsigned long addr = caddr;
1130 	unsigned long data = cdata;
1131 	void __user *datap = compat_ptr(data);
1132 	int ret;
1133 	__u32 val;
1134 
1135 	switch (request) {
1136 	case PTRACE_PEEKUSR:
1137 		ret = getreg32(child, addr, &val);
1138 		if (ret == 0)
1139 			ret = put_user(val, (__u32 __user *)datap);
1140 		break;
1141 
1142 	case PTRACE_POKEUSR:
1143 		ret = putreg32(child, addr, data);
1144 		break;
1145 
1146 	case PTRACE_GETREGS:	/* Get all gp regs from the child. */
1147 		return copy_regset_to_user(child, &user_x86_32_view,
1148 					   REGSET_GENERAL,
1149 					   0, sizeof(struct user_regs_struct32),
1150 					   datap);
1151 
1152 	case PTRACE_SETREGS:	/* Set all gp regs in the child. */
1153 		return copy_regset_from_user(child, &user_x86_32_view,
1154 					     REGSET_GENERAL, 0,
1155 					     sizeof(struct user_regs_struct32),
1156 					     datap);
1157 
1158 	case PTRACE_GETFPREGS:	/* Get the child FPU state. */
1159 		return copy_regset_to_user(child, &user_x86_32_view,
1160 					   REGSET_FP, 0,
1161 					   sizeof(struct user_i387_ia32_struct),
1162 					   datap);
1163 
1164 	case PTRACE_SETFPREGS:	/* Set the child FPU state. */
1165 		return copy_regset_from_user(
1166 			child, &user_x86_32_view, REGSET_FP,
1167 			0, sizeof(struct user_i387_ia32_struct), datap);
1168 
1169 	case PTRACE_GETFPXREGS:	/* Get the child extended FPU state. */
1170 		return copy_regset_to_user(child, &user_x86_32_view,
1171 					   REGSET_XFP, 0,
1172 					   sizeof(struct user32_fxsr_struct),
1173 					   datap);
1174 
1175 	case PTRACE_SETFPXREGS:	/* Set the child extended FPU state. */
1176 		return copy_regset_from_user(child, &user_x86_32_view,
1177 					     REGSET_XFP, 0,
1178 					     sizeof(struct user32_fxsr_struct),
1179 					     datap);
1180 
1181 	case PTRACE_GET_THREAD_AREA:
1182 	case PTRACE_SET_THREAD_AREA:
1183 		return arch_ptrace(child, request, addr, data);
1184 
1185 	default:
1186 		return compat_ptrace_request(child, request, addr, data);
1187 	}
1188 
1189 	return ret;
1190 }
1191 #endif /* CONFIG_IA32_EMULATION */
1192 
1193 #ifdef CONFIG_X86_X32_ABI
x32_arch_ptrace(struct task_struct * child,compat_long_t request,compat_ulong_t caddr,compat_ulong_t cdata)1194 static long x32_arch_ptrace(struct task_struct *child,
1195 			    compat_long_t request, compat_ulong_t caddr,
1196 			    compat_ulong_t cdata)
1197 {
1198 	unsigned long addr = caddr;
1199 	unsigned long data = cdata;
1200 	void __user *datap = compat_ptr(data);
1201 	int ret;
1202 
1203 	switch (request) {
1204 	/* Read 32bits at location addr in the USER area.  Only allow
1205 	   to return the lower 32bits of segment and debug registers.  */
1206 	case PTRACE_PEEKUSR: {
1207 		u32 tmp;
1208 
1209 		ret = -EIO;
1210 		if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user) ||
1211 		    addr < offsetof(struct user_regs_struct, cs))
1212 			break;
1213 
1214 		tmp = 0;  /* Default return condition */
1215 		if (addr < sizeof(struct user_regs_struct))
1216 			tmp = getreg(child, addr);
1217 		else if (addr >= offsetof(struct user, u_debugreg[0]) &&
1218 			 addr <= offsetof(struct user, u_debugreg[7])) {
1219 			addr -= offsetof(struct user, u_debugreg[0]);
1220 			tmp = ptrace_get_debugreg(child, addr / sizeof(data));
1221 		}
1222 		ret = put_user(tmp, (__u32 __user *)datap);
1223 		break;
1224 	}
1225 
1226 	/* Write the word at location addr in the USER area.  Only allow
1227 	   to update segment and debug registers with the upper 32bits
1228 	   zero-extended. */
1229 	case PTRACE_POKEUSR:
1230 		ret = -EIO;
1231 		if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user) ||
1232 		    addr < offsetof(struct user_regs_struct, cs))
1233 			break;
1234 
1235 		if (addr < sizeof(struct user_regs_struct))
1236 			ret = putreg(child, addr, data);
1237 		else if (addr >= offsetof(struct user, u_debugreg[0]) &&
1238 			 addr <= offsetof(struct user, u_debugreg[7])) {
1239 			addr -= offsetof(struct user, u_debugreg[0]);
1240 			ret = ptrace_set_debugreg(child,
1241 						  addr / sizeof(data), data);
1242 		}
1243 		break;
1244 
1245 	case PTRACE_GETREGS:	/* Get all gp regs from the child. */
1246 		return copy_regset_to_user(child,
1247 					   task_user_regset_view(current),
1248 					   REGSET_GENERAL,
1249 					   0, sizeof(struct user_regs_struct),
1250 					   datap);
1251 
1252 	case PTRACE_SETREGS:	/* Set all gp regs in the child. */
1253 		return copy_regset_from_user(child,
1254 					     task_user_regset_view(current),
1255 					     REGSET_GENERAL,
1256 					     0, sizeof(struct user_regs_struct),
1257 					     datap);
1258 
1259 	case PTRACE_GETFPREGS:	/* Get the child FPU state. */
1260 		return copy_regset_to_user(child,
1261 					   task_user_regset_view(current),
1262 					   REGSET_FP,
1263 					   0, sizeof(struct user_i387_struct),
1264 					   datap);
1265 
1266 	case PTRACE_SETFPREGS:	/* Set the child FPU state. */
1267 		return copy_regset_from_user(child,
1268 					     task_user_regset_view(current),
1269 					     REGSET_FP,
1270 					     0, sizeof(struct user_i387_struct),
1271 					     datap);
1272 
1273 	default:
1274 		return compat_ptrace_request(child, request, addr, data);
1275 	}
1276 
1277 	return ret;
1278 }
1279 #endif
1280 
1281 #ifdef CONFIG_COMPAT
compat_arch_ptrace(struct task_struct * child,compat_long_t request,compat_ulong_t caddr,compat_ulong_t cdata)1282 long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
1283 			compat_ulong_t caddr, compat_ulong_t cdata)
1284 {
1285 #ifdef CONFIG_X86_X32_ABI
1286 	if (!is_ia32_task())
1287 		return x32_arch_ptrace(child, request, caddr, cdata);
1288 #endif
1289 #ifdef CONFIG_IA32_EMULATION
1290 	return ia32_arch_ptrace(child, request, caddr, cdata);
1291 #else
1292 	return 0;
1293 #endif
1294 }
1295 #endif	/* CONFIG_COMPAT */
1296 
1297 #ifdef CONFIG_X86_64
1298 
1299 static struct user_regset x86_64_regsets[] __read_mostly = {
1300 	[REGSET_GENERAL] = {
1301 		.core_note_type = NT_PRSTATUS,
1302 		.n = sizeof(struct user_regs_struct) / sizeof(long),
1303 		.size = sizeof(long), .align = sizeof(long),
1304 		.get = genregs_get, .set = genregs_set
1305 	},
1306 	[REGSET_FP] = {
1307 		.core_note_type = NT_PRFPREG,
1308 		.n = sizeof(struct user_i387_struct) / sizeof(long),
1309 		.size = sizeof(long), .align = sizeof(long),
1310 		.active = regset_xregset_fpregs_active, .get = xfpregs_get, .set = xfpregs_set
1311 	},
1312 	[REGSET_XSTATE] = {
1313 		.core_note_type = NT_X86_XSTATE,
1314 		.size = sizeof(u64), .align = sizeof(u64),
1315 		.active = xstateregs_active, .get = xstateregs_get,
1316 		.set = xstateregs_set
1317 	},
1318 	[REGSET_IOPERM64] = {
1319 		.core_note_type = NT_386_IOPERM,
1320 		.n = IO_BITMAP_LONGS,
1321 		.size = sizeof(long), .align = sizeof(long),
1322 		.active = ioperm_active, .get = ioperm_get
1323 	},
1324 };
1325 
1326 static const struct user_regset_view user_x86_64_view = {
1327 	.name = "x86_64", .e_machine = EM_X86_64,
1328 	.regsets = x86_64_regsets, .n = ARRAY_SIZE(x86_64_regsets)
1329 };
1330 
1331 #else  /* CONFIG_X86_32 */
1332 
1333 #define user_regs_struct32	user_regs_struct
1334 #define genregs32_get		genregs_get
1335 #define genregs32_set		genregs_set
1336 
1337 #endif	/* CONFIG_X86_64 */
1338 
1339 #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
1340 static struct user_regset x86_32_regsets[] __read_mostly = {
1341 	[REGSET_GENERAL] = {
1342 		.core_note_type = NT_PRSTATUS,
1343 		.n = sizeof(struct user_regs_struct32) / sizeof(u32),
1344 		.size = sizeof(u32), .align = sizeof(u32),
1345 		.get = genregs32_get, .set = genregs32_set
1346 	},
1347 	[REGSET_FP] = {
1348 		.core_note_type = NT_PRFPREG,
1349 		.n = sizeof(struct user_i387_ia32_struct) / sizeof(u32),
1350 		.size = sizeof(u32), .align = sizeof(u32),
1351 		.active = regset_fpregs_active, .get = fpregs_get, .set = fpregs_set
1352 	},
1353 	[REGSET_XFP] = {
1354 		.core_note_type = NT_PRXFPREG,
1355 		.n = sizeof(struct user32_fxsr_struct) / sizeof(u32),
1356 		.size = sizeof(u32), .align = sizeof(u32),
1357 		.active = regset_xregset_fpregs_active, .get = xfpregs_get, .set = xfpregs_set
1358 	},
1359 	[REGSET_XSTATE] = {
1360 		.core_note_type = NT_X86_XSTATE,
1361 		.size = sizeof(u64), .align = sizeof(u64),
1362 		.active = xstateregs_active, .get = xstateregs_get,
1363 		.set = xstateregs_set
1364 	},
1365 	[REGSET_TLS] = {
1366 		.core_note_type = NT_386_TLS,
1367 		.n = GDT_ENTRY_TLS_ENTRIES, .bias = GDT_ENTRY_TLS_MIN,
1368 		.size = sizeof(struct user_desc),
1369 		.align = sizeof(struct user_desc),
1370 		.active = regset_tls_active,
1371 		.get = regset_tls_get, .set = regset_tls_set
1372 	},
1373 	[REGSET_IOPERM32] = {
1374 		.core_note_type = NT_386_IOPERM,
1375 		.n = IO_BITMAP_BYTES / sizeof(u32),
1376 		.size = sizeof(u32), .align = sizeof(u32),
1377 		.active = ioperm_active, .get = ioperm_get
1378 	},
1379 };
1380 
1381 static const struct user_regset_view user_x86_32_view = {
1382 	.name = "i386", .e_machine = EM_386,
1383 	.regsets = x86_32_regsets, .n = ARRAY_SIZE(x86_32_regsets)
1384 };
1385 #endif
1386 
1387 /*
1388  * This represents bytes 464..511 in the memory layout exported through
1389  * the REGSET_XSTATE interface.
1390  */
1391 u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
1392 
update_regset_xstate_info(unsigned int size,u64 xstate_mask)1393 void update_regset_xstate_info(unsigned int size, u64 xstate_mask)
1394 {
1395 #ifdef CONFIG_X86_64
1396 	x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64);
1397 #endif
1398 #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
1399 	x86_32_regsets[REGSET_XSTATE].n = size / sizeof(u64);
1400 #endif
1401 	xstate_fx_sw_bytes[USER_XSTATE_XCR0_WORD] = xstate_mask;
1402 }
1403 
task_user_regset_view(struct task_struct * task)1404 const struct user_regset_view *task_user_regset_view(struct task_struct *task)
1405 {
1406 #ifdef CONFIG_IA32_EMULATION
1407 	if (test_tsk_thread_flag(task, TIF_IA32))
1408 #endif
1409 #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
1410 		return &user_x86_32_view;
1411 #endif
1412 #ifdef CONFIG_X86_64
1413 	return &user_x86_64_view;
1414 #endif
1415 }
1416 
fill_sigtrap_info(struct task_struct * tsk,struct pt_regs * regs,int error_code,int si_code,struct siginfo * info)1417 static void fill_sigtrap_info(struct task_struct *tsk,
1418 				struct pt_regs *regs,
1419 				int error_code, int si_code,
1420 				struct siginfo *info)
1421 {
1422 	tsk->thread.trap_nr = X86_TRAP_DB;
1423 	tsk->thread.error_code = error_code;
1424 
1425 	memset(info, 0, sizeof(*info));
1426 	info->si_signo = SIGTRAP;
1427 	info->si_code = si_code;
1428 	info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL;
1429 }
1430 
user_single_step_siginfo(struct task_struct * tsk,struct pt_regs * regs,struct siginfo * info)1431 void user_single_step_siginfo(struct task_struct *tsk,
1432 				struct pt_regs *regs,
1433 				struct siginfo *info)
1434 {
1435 	fill_sigtrap_info(tsk, regs, 0, TRAP_BRKPT, info);
1436 }
1437 
send_sigtrap(struct task_struct * tsk,struct pt_regs * regs,int error_code,int si_code)1438 void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
1439 					 int error_code, int si_code)
1440 {
1441 	struct siginfo info;
1442 
1443 	fill_sigtrap_info(tsk, regs, error_code, si_code, &info);
1444 	/* Send us the fake SIGTRAP */
1445 	force_sig_info(SIGTRAP, &info, tsk);
1446 }
1447