1 // SPDX-License-Identifier: GPL-2.0-only 1 2 #include <linux/export.h> 3 #include <linux/slab.h> 4 #include <linux/regset.h> 5 6 static int __regset_get(struct task_struct *ta 7 const struct user_regs 8 unsigned int size, 9 void **data) 10 { 11 void *p = *data, *to_free = NULL; 12 int res; 13 14 if (!regset->regset_get) 15 return -EOPNOTSUPP; 16 if (size > regset->n * regset->size) 17 size = regset->n * regset->siz 18 if (!p) { 19 to_free = p = kvzalloc(size, G 20 if (!p) 21 return -ENOMEM; 22 } 23 res = regset->regset_get(target, regse 24 (struct membuf){.p 25 if (res < 0) { 26 kvfree(to_free); 27 return res; 28 } 29 *data = p; 30 return size - res; 31 } 32 33 int regset_get(struct task_struct *target, 34 const struct user_regset *regse 35 unsigned int size, 36 void *data) 37 { 38 return __regset_get(target, regset, si 39 } 40 EXPORT_SYMBOL(regset_get); 41 42 int regset_get_alloc(struct task_struct *targe 43 const struct user_regset 44 unsigned int size, 45 void **data) 46 { 47 *data = NULL; 48 return __regset_get(target, regset, si 49 } 50 EXPORT_SYMBOL(regset_get_alloc); 51 52 /** 53 * copy_regset_to_user - fetch a thread's user 54 * @target: thread to be examined 55 * @view: &struct user_regset_view descr 56 * @setno: index in @view->regsets 57 * @offset: offset into the regset data, i 58 * @size: amount of data to copy, in byt 59 * @data: user-mode pointer to copy into 60 */ 61 int copy_regset_to_user(struct task_struct *ta 62 const struct user_regs 63 unsigned int setno, 64 unsigned int offset, u 65 void __user *data) 66 { 67 const struct user_regset *regset = &vi 68 void *buf; 69 int ret; 70 71 ret = regset_get_alloc(target, regset, 72 if (ret > 0) 73 ret = copy_to_user(data, buf, 74 kvfree(buf); 75 return ret; 76 } 77
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.