Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
step.c
Go to the documentation of this file.
1 /*
2  * x86 single-step support code, common to 32-bit and 64-bit.
3  */
4 #include <linux/sched.h>
5 #include <linux/mm.h>
6 #include <linux/ptrace.h>
7 #include <asm/desc.h>
8 
9 unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs)
10 {
11  unsigned long addr, seg;
12 
13  addr = regs->ip;
14  seg = regs->cs & 0xffff;
15  if (v8086_mode(regs)) {
16  addr = (addr & 0xffff) + (seg << 4);
17  return addr;
18  }
19 
20  /*
21  * We'll assume that the code segments in the GDT
22  * are all zero-based. That is largely true: the
23  * TLS segments are used for data, and the PNPBIOS
24  * and APM bios ones we just ignore here.
25  */
26  if ((seg & SEGMENT_TI_MASK) == SEGMENT_LDT) {
27  struct desc_struct *desc;
28  unsigned long base;
29 
30  seg &= ~7UL;
31 
32  mutex_lock(&child->mm->context.lock);
33  if (unlikely((seg >> 3) >= child->mm->context.size))
34  addr = -1L; /* bogus selector, access would fault */
35  else {
36  desc = child->mm->context.ldt + seg;
37  base = get_desc_base(desc);
38 
39  /* 16-bit code segment? */
40  if (!desc->d)
41  addr &= 0xffff;
42  addr += base;
43  }
44  mutex_unlock(&child->mm->context.lock);
45  }
46 
47  return addr;
48 }
49 
50 static int is_setting_trap_flag(struct task_struct *child, struct pt_regs *regs)
51 {
52  int i, copied;
53  unsigned char opcode[15];
54  unsigned long addr = convert_ip_to_linear(child, regs);
55 
56  copied = access_process_vm(child, addr, opcode, sizeof(opcode), 0);
57  for (i = 0; i < copied; i++) {
58  switch (opcode[i]) {
59  /* popf and iret */
60  case 0x9d: case 0xcf:
61  return 1;
62 
63  /* CHECKME: 64 65 */
64 
65  /* opcode and address size prefixes */
66  case 0x66: case 0x67:
67  continue;
68  /* irrelevant prefixes (segment overrides and repeats) */
69  case 0x26: case 0x2e:
70  case 0x36: case 0x3e:
71  case 0x64: case 0x65:
72  case 0xf0: case 0xf2: case 0xf3:
73  continue;
74 
75 #ifdef CONFIG_X86_64
76  case 0x40 ... 0x4f:
77  if (!user_64bit_mode(regs))
78  /* 32-bit mode: register increment */
79  return 0;
80  /* 64-bit mode: REX prefix */
81  continue;
82 #endif
83 
84  /* CHECKME: f2, f3 */
85 
86  /*
87  * pushf: NOTE! We should probably not let
88  * the user see the TF bit being set. But
89  * it's more pain than it's worth to avoid
90  * it, and a debugger could emulate this
91  * all in user space if it _really_ cares.
92  */
93  case 0x9c:
94  default:
95  return 0;
96  }
97  }
98  return 0;
99 }
100 
101 /*
102  * Enable single-stepping. Return nonzero if user mode is not using TF itself.
103  */
104 static int enable_single_step(struct task_struct *child)
105 {
106  struct pt_regs *regs = task_pt_regs(child);
107  unsigned long oflags;
108 
109  /*
110  * If we stepped into a sysenter/syscall insn, it trapped in
111  * kernel mode; do_debug() cleared TF and set TIF_SINGLESTEP.
112  * If user-mode had set TF itself, then it's still clear from
113  * do_debug() and we need to set it again to restore the user
114  * state so we don't wrongly set TIF_FORCED_TF below.
115  * If enable_single_step() was used last and that is what
116  * set TIF_SINGLESTEP, then both TF and TIF_FORCED_TF are
117  * already set and our bookkeeping is fine.
118  */
119  if (unlikely(test_tsk_thread_flag(child, TIF_SINGLESTEP)))
120  regs->flags |= X86_EFLAGS_TF;
121 
122  /*
123  * Always set TIF_SINGLESTEP - this guarantees that
124  * we single-step system calls etc.. This will also
125  * cause us to set TF when returning to user mode.
126  */
127  set_tsk_thread_flag(child, TIF_SINGLESTEP);
128 
129  oflags = regs->flags;
130 
131  /* Set TF on the kernel stack.. */
132  regs->flags |= X86_EFLAGS_TF;
133 
134  /*
135  * ..but if TF is changed by the instruction we will trace,
136  * don't mark it as being "us" that set it, so that we
137  * won't clear it by hand later.
138  *
139  * Note that if we don't actually execute the popf because
140  * of a signal arriving right now or suchlike, we will lose
141  * track of the fact that it really was "us" that set it.
142  */
143  if (is_setting_trap_flag(child, regs)) {
144  clear_tsk_thread_flag(child, TIF_FORCED_TF);
145  return 0;
146  }
147 
148  /*
149  * If TF was already set, check whether it was us who set it.
150  * If not, we should never attempt a block step.
151  */
152  if (oflags & X86_EFLAGS_TF)
153  return test_tsk_thread_flag(child, TIF_FORCED_TF);
154 
155  set_tsk_thread_flag(child, TIF_FORCED_TF);
156 
157  return 1;
158 }
159 
160 void set_task_blockstep(struct task_struct *task, bool on)
161 {
162  unsigned long debugctl;
163 
164  /*
165  * Ensure irq/preemption can't change debugctl in between.
166  * Note also that both TIF_BLOCKSTEP and debugctl should
167  * be changed atomically wrt preemption.
168  * FIXME: this means that set/clear TIF_BLOCKSTEP is simply
169  * wrong if task != current, SIGKILL can wakeup the stopped
170  * tracee and set/clear can play with the running task, this
171  * can confuse the next __switch_to_xtra().
172  */
174  debugctl = get_debugctlmsr();
175  if (on) {
176  debugctl |= DEBUGCTLMSR_BTF;
177  set_tsk_thread_flag(task, TIF_BLOCKSTEP);
178  } else {
179  debugctl &= ~DEBUGCTLMSR_BTF;
180  clear_tsk_thread_flag(task, TIF_BLOCKSTEP);
181  }
182  if (task == current)
183  update_debugctlmsr(debugctl);
185 }
186 
187 /*
188  * Enable single or block step.
189  */
190 static void enable_step(struct task_struct *child, bool block)
191 {
192  /*
193  * Make sure block stepping (BTF) is not enabled unless it should be.
194  * Note that we don't try to worry about any is_setting_trap_flag()
195  * instructions after the first when using block stepping.
196  * So no one should try to use debugger block stepping in a program
197  * that uses user-mode single stepping itself.
198  */
199  if (enable_single_step(child) && block)
200  set_task_blockstep(child, true);
201  else if (test_tsk_thread_flag(child, TIF_BLOCKSTEP))
202  set_task_blockstep(child, false);
203 }
204 
206 {
207  enable_step(child, 0);
208 }
209 
211 {
212  enable_step(child, 1);
213 }
214 
216 {
217  /*
218  * Make sure block stepping (BTF) is disabled.
219  */
220  if (test_tsk_thread_flag(child, TIF_BLOCKSTEP))
221  set_task_blockstep(child, false);
222 
223  /* Always clear TIF_SINGLESTEP... */
224  clear_tsk_thread_flag(child, TIF_SINGLESTEP);
225 
226  /* But touch TF only if it was set by us.. */
227  if (test_and_clear_tsk_thread_flag(child, TIF_FORCED_TF))
228  task_pt_regs(child)->flags &= ~X86_EFLAGS_TF;
229 }