aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/regset.h
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-01-30 07:31:44 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:31:44 -0500
commitbdf88217b70dbb18c4ee27a6c497286e040a6705 (patch)
tree79909bf3ef3f778f63c8cb2d5d22cd1d22a18c86 /include/linux/regset.h
parent0ddc9cc8fdfe3df7a90557e66069e3da2c584725 (diff)
x86: user_regset header
The new header <linux/regset.h> defines the types struct user_regset and struct user_regset_view, with some associated declarations. This new set of interfaces will become the standard way for arch code to expose user-mode machine-specific state. A single set of entry points into arch code can do all the low-level work in one place to fill the needs of core dumps, ptrace, and any other user-mode debugging facilities that might come along in the future. For existing arch code to adapt to the user_regset interfaces, each arch can work from the code it already has to support core files and ptrace. The formats you want for user_regset are the core file formats. The only wrinkle in adapting old ptrace implementation code as user_regset get and set functions is that these functions can be called on current as well as on another task_struct that is stopped and switched out as for ptrace. For some kinds of machine state, you may have to load it directly from CPU registers or otherwise differently for current than for another thread. (Your core dump support already handles this in elf_core_copy_regs for current and elf_core_copy_task_regs for other tasks, so just check there.) The set function should also be made to work on current in case that entails some special cases, though this was never required before for ptrace. Adding this flexibility covers the arch needs to open the door to more sophisticated new debugging facilities that don't always need to context-switch to do every little thing. The copyin/copyout helper functions (in a later patch) relieve the arch code of most of the cumbersome details of the flexible get/set interfaces. Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/regset.h')
-rw-r--r--include/linux/regset.h206
1 files changed, 206 insertions, 0 deletions
diff --git a/include/linux/regset.h b/include/linux/regset.h
new file mode 100644
index 000000000000..85d0fb0a014d
--- /dev/null
+++ b/include/linux/regset.h
@@ -0,0 +1,206 @@
1/*
2 * User-mode machine state access
3 *
4 * Copyright (C) 2007 Red Hat, Inc. All rights reserved.
5 *
6 * This copyrighted material is made available to anyone wishing to use,
7 * modify, copy, or redistribute it subject to the terms and conditions
8 * of the GNU General Public License v.2.
9 *
10 * Red Hat Author: Roland McGrath.
11 */
12
13#ifndef _LINUX_REGSET_H
14#define _LINUX_REGSET_H 1
15
16#include <linux/compiler.h>
17#include <linux/types.h>
18struct task_struct;
19struct user_regset;
20
21
22/**
23 * user_regset_active_fn - type of @active function in &struct user_regset
24 * @target: thread being examined
25 * @regset: regset being examined
26 *
27 * Return -%ENODEV if not available on the hardware found.
28 * Return %0 if no interesting state in this thread.
29 * Return >%0 number of @size units of interesting state.
30 * Any get call fetching state beyond that number will
31 * see the default initialization state for this data,
32 * so a caller that knows what the default state is need
33 * not copy it all out.
34 * This call is optional; the pointer is %NULL if there
35 * is no inexpensive check to yield a value < @n.
36 */
37typedef int user_regset_active_fn(struct task_struct *target,
38 const struct user_regset *regset);
39
40/**
41 * user_regset_get_fn - type of @get function in &struct user_regset
42 * @target: thread being examined
43 * @regset: regset being examined
44 * @pos: offset into the regset data to access, in bytes
45 * @count: amount of data to copy, in bytes
46 * @kbuf: if not %NULL, a kernel-space pointer to copy into
47 * @ubuf: if @kbuf is %NULL, a user-space pointer to copy into
48 *
49 * Fetch register values. Return %0 on success; -%EIO or -%ENODEV
50 * are usual failure returns. The @pos and @count values are in
51 * bytes, but must be properly aligned. If @kbuf is non-null, that
52 * buffer is used and @ubuf is ignored. If @kbuf is %NULL, then
53 * ubuf gives a userland pointer to access directly, and an -%EFAULT
54 * return value is possible.
55 */
56typedef int user_regset_get_fn(struct task_struct *target,
57 const struct user_regset *regset,
58 unsigned int pos, unsigned int count,
59 void *kbuf, void __user *ubuf);
60
61/**
62 * user_regset_set_fn - type of @set function in &struct user_regset
63 * @target: thread being examined
64 * @regset: regset being examined
65 * @pos: offset into the regset data to access, in bytes
66 * @count: amount of data to copy, in bytes
67 * @kbuf: if not %NULL, a kernel-space pointer to copy from
68 * @ubuf: if @kbuf is %NULL, a user-space pointer to copy from
69 *
70 * Store register values. Return %0 on success; -%EIO or -%ENODEV
71 * are usual failure returns. The @pos and @count values are in
72 * bytes, but must be properly aligned. If @kbuf is non-null, that
73 * buffer is used and @ubuf is ignored. If @kbuf is %NULL, then
74 * ubuf gives a userland pointer to access directly, and an -%EFAULT
75 * return value is possible.
76 */
77typedef int user_regset_set_fn(struct task_struct *target,
78 const struct user_regset *regset,
79 unsigned int pos, unsigned int count,
80 const void *kbuf, const void __user *ubuf);
81
82/**
83 * user_regset_writeback_fn - type of @writeback function in &struct user_regset
84 * @target: thread being examined
85 * @regset: regset being examined
86 * @immediate: zero if writeback at completion of next context switch is OK
87 *
88 * This call is optional; usually the pointer is %NULL. When
89 * provided, there is some user memory associated with this regset's
90 * hardware, such as memory backing cached register data on register
91 * window machines; the regset's data controls what user memory is
92 * used (e.g. via the stack pointer value).
93 *
94 * Write register data back to user memory. If the @immediate flag
95 * is nonzero, it must be written to the user memory so uaccess or
96 * access_process_vm() can see it when this call returns; if zero,
97 * then it must be written back by the time the task completes a
98 * context switch (as synchronized with wait_task_inactive()).
99 * Return %0 on success or if there was nothing to do, -%EFAULT for
100 * a memory problem (bad stack pointer or whatever), or -%EIO for a
101 * hardware problem.
102 */
103typedef int user_regset_writeback_fn(struct task_struct *target,
104 const struct user_regset *regset,
105 int immediate);
106
107/**
108 * struct user_regset - accessible thread CPU state
109 * @n: Number of slots (registers).
110 * @size: Size in bytes of a slot (register).
111 * @align: Required alignment, in bytes.
112 * @bias: Bias from natural indexing.
113 * @core_note_type: ELF note @n_type value used in core dumps.
114 * @get: Function to fetch values.
115 * @set: Function to store values.
116 * @active: Function to report if regset is active, or %NULL.
117 * @writeback: Function to write data back to user memory, or %NULL.
118 *
119 * This data structure describes a machine resource we call a register set.
120 * This is part of the state of an individual thread, not necessarily
121 * actual CPU registers per se. A register set consists of a number of
122 * similar slots, given by @n. Each slot is @size bytes, and aligned to
123 * @align bytes (which is at least @size).
124 *
125 * These functions must be called only on the current thread or on a
126 * thread that is in %TASK_STOPPED or %TASK_TRACED state, that we are
127 * guaranteed will not be woken up and return to user mode, and that we
128 * have called wait_task_inactive() on. (The target thread always might
129 * wake up for SIGKILL while these functions are working, in which case
130 * that thread's user_regset state might be scrambled.)
131 *
132 * The @pos argument must be aligned according to @align; the @count
133 * argument must be a multiple of @size. These functions are not
134 * responsible for checking for invalid arguments.
135 *
136 * When there is a natural value to use as an index, @bias gives the
137 * difference between the natural index and the slot index for the
138 * register set. For example, x86 GDT segment descriptors form a regset;
139 * the segment selector produces a natural index, but only a subset of
140 * that index space is available as a regset (the TLS slots); subtracting
141 * @bias from a segment selector index value computes the regset slot.
142 *
143 * If nonzero, @core_note_type gives the n_type field (NT_* value)
144 * of the core file note in which this regset's data appears.
145 * NT_PRSTATUS is a special case in that the regset data starts at
146 * offsetof(struct elf_prstatus, pr_reg) into the note data; that is
147 * part of the per-machine ELF formats userland knows about. In
148 * other cases, the core file note contains exactly the whole regset
149 * (@n * @size) and nothing else. The core file note is normally
150 * omitted when there is an @active function and it returns zero.
151 */
152struct user_regset {
153 user_regset_get_fn *get;
154 user_regset_set_fn *set;
155 user_regset_active_fn *active;
156 user_regset_writeback_fn *writeback;
157 unsigned int n;
158 unsigned int size;
159 unsigned int align;
160 unsigned int bias;
161 unsigned int core_note_type;
162};
163
164/**
165 * struct user_regset_view - available regsets
166 * @name: Identifier, e.g. UTS_MACHINE string.
167 * @regsets: Array of @n regsets available in this view.
168 * @n: Number of elements in @regsets.
169 * @e_machine: ELF header @e_machine %EM_* value written in core dumps.
170 * @e_flags: ELF header @e_flags value written in core dumps.
171 * @ei_osabi: ELF header @e_ident[%EI_OSABI] value written in core dumps.
172 *
173 * A regset view is a collection of regsets (&struct user_regset,
174 * above). This describes all the state of a thread that can be seen
175 * from a given architecture/ABI environment. More than one view might
176 * refer to the same &struct user_regset, or more than one regset
177 * might refer to the same machine-specific state in the thread. For
178 * example, a 32-bit thread's state could be examined from the 32-bit
179 * view or from the 64-bit view. Either method reaches the same thread
180 * register state, doing appropriate widening or truncation.
181 */
182struct user_regset_view {
183 const char *name;
184 const struct user_regset *regsets;
185 unsigned int n;
186 u32 e_flags;
187 u16 e_machine;
188 u8 ei_osabi;
189};
190
191/*
192 * This is documented here rather than at the definition sites because its
193 * implementation is machine-dependent but its interface is universal.
194 */
195/**
196 * task_user_regset_view - Return the process's native regset view.
197 * @tsk: a thread of the process in question
198 *
199 * Return the &struct user_regset_view that is native for the given process.
200 * For example, what it would access when it called ptrace().
201 * Throughout the life of the process, this only changes at exec.
202 */
203const struct user_regset_view *task_user_regset_view(struct task_struct *tsk);
204
205
206#endif /* <linux/regset.h> */