Blame view
kernel/regset.c
1.85 KB
b4e9c9549 introduction of r... |
1 2 3 4 5 6 7 8 9 10 11 12 |
// SPDX-License-Identifier: GPL-2.0-only #include <linux/export.h> #include <linux/slab.h> #include <linux/regset.h> static int __regset_get(struct task_struct *target, const struct user_regset *regset, unsigned int size, void **data) { void *p = *data, *to_free = NULL; int res; |
1e6986c9d regset: kill ->get() |
13 |
if (!regset->regset_get) |
b4e9c9549 introduction of r... |
14 15 16 17 18 19 20 21 |
return -EOPNOTSUPP; if (size > regset->n * regset->size) size = regset->n * regset->size; if (!p) { to_free = p = kzalloc(size, GFP_KERNEL); if (!p) return -ENOMEM; } |
1e6986c9d regset: kill ->get() |
22 23 24 |
res = regset->regset_get(target, regset, (struct membuf){.p = p, .left = size}); if (res < 0) { |
b4e9c9549 introduction of r... |
25 26 27 28 |
kfree(to_free); return res; } *data = p; |
1e6986c9d regset: kill ->get() |
29 |
return size - res; |
b4e9c9549 introduction of r... |
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
} int regset_get(struct task_struct *target, const struct user_regset *regset, unsigned int size, void *data) { return __regset_get(target, regset, size, &data); } EXPORT_SYMBOL(regset_get); int regset_get_alloc(struct task_struct *target, const struct user_regset *regset, unsigned int size, void **data) { *data = NULL; return __regset_get(target, regset, size, data); } EXPORT_SYMBOL(regset_get_alloc); |
dc12d7968 copy_regset_to_us... |
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
/** * copy_regset_to_user - fetch a thread's user_regset data into user memory * @target: thread to be examined * @view: &struct user_regset_view describing user thread machine state * @setno: index in @view->regsets * @offset: offset into the regset data, in bytes * @size: amount of data to copy, in bytes * @data: user-mode pointer to copy into */ int copy_regset_to_user(struct task_struct *target, const struct user_regset_view *view, unsigned int setno, unsigned int offset, unsigned int size, void __user *data) { const struct user_regset *regset = &view->regsets[setno]; void *buf; int ret; ret = regset_get_alloc(target, regset, size, &buf); if (ret > 0) ret = copy_to_user(data, buf, ret) ? -EFAULT : 0; kfree(buf); return ret; } |