regset.c (7717cb9bdd0421faa432a4e0d499fdba6e2394c8) regset.c (1e6986c9db21265bac1435a344b4446c51a3f4d8)
1// SPDX-License-Identifier: GPL-2.0-only
2#include <linux/export.h>
3#include <linux/slab.h>
4#include <linux/regset.h>
5
6static int __regset_get(struct task_struct *target,
7 const struct user_regset *regset,
8 unsigned int size,
9 void **data)
10{
11 void *p = *data, *to_free = NULL;
12 int res;
13
1// SPDX-License-Identifier: GPL-2.0-only
2#include <linux/export.h>
3#include <linux/slab.h>
4#include <linux/regset.h>
5
6static int __regset_get(struct task_struct *target,
7 const struct user_regset *regset,
8 unsigned int size,
9 void **data)
10{
11 void *p = *data, *to_free = NULL;
12 int res;
13
14 if (!regset->get && !regset->regset_get)
14 if (!regset->regset_get)
15 return -EOPNOTSUPP;
16 if (size > regset->n * regset->size)
17 size = regset->n * regset->size;
18 if (!p) {
19 to_free = p = kzalloc(size, GFP_KERNEL);
20 if (!p)
21 return -ENOMEM;
22 }
15 return -EOPNOTSUPP;
16 if (size > regset->n * regset->size)
17 size = regset->n * regset->size;
18 if (!p) {
19 to_free = p = kzalloc(size, GFP_KERNEL);
20 if (!p)
21 return -ENOMEM;
22 }
23 if (regset->regset_get) {
24 res = regset->regset_get(target, regset,
25 (struct membuf){.p = p, .left = size});
26 if (res < 0) {
27 kfree(to_free);
28 return res;
29 }
30 *data = p;
31 return size - res;
32 }
33 res = regset->get(target, regset, 0, size, p, NULL);
34 if (unlikely(res < 0)) {
23 res = regset->regset_get(target, regset,
24 (struct membuf){.p = p, .left = size});
25 if (res < 0) {
35 kfree(to_free);
36 return res;
37 }
38 *data = p;
26 kfree(to_free);
27 return res;
28 }
29 *data = p;
39 if (regset->get_size) { // arm64-only kludge, will go away
40 unsigned max_size = regset->get_size(target, regset);
41 if (size > max_size)
42 size = max_size;
43 }
44 return size;
30 return size - res;
45}
46
47int regset_get(struct task_struct *target,
48 const struct user_regset *regset,
49 unsigned int size,
50 void *data)
51{
52 return __regset_get(target, regset, size, &data);

--- 38 unchanged lines hidden ---
31}
32
33int regset_get(struct task_struct *target,
34 const struct user_regset *regset,
35 unsigned int size,
36 void *data)
37{
38 return __regset_get(target, regset, size, &data);

--- 38 unchanged lines hidden ---