Skip to content
Snippets Groups Projects
Select Git revision
  • f1f0f330b1d0ac1bcc38d7c84d439f4fde341a9c
  • master default
  • b4/phy-realtek-clock-fix
  • b4/rk3576-rock4d-phy-timings
  • b4/dw-wdt-fix-initial-timeout
  • radxa-v6.1-vendor-kernel
  • b4/fusb302-race-condition-fix
  • b4/rk3576-rock4d-phy-handling-fixes
  • b4/rk3588-evb1-hdmi-rx
  • b4/rk3576-fix-fspi-pmdomain
  • b4/usbc-for-rock5bp
  • b4/rock5bp-for-upstream
  • rockchip-devel
  • rk3588-test
  • rk3588-test-vendor-cam
  • lf-6.6.y_6.6.23-2.0.0_var01-panfrost
  • rk3588-linked-clk-gate-for-upstream
  • rk3588-gpu-pwr-domain-for-upstream
  • rk3588-rock5b-usbc-for-upstream
  • rk3588-evb1-for-upstream
  • imx95-upstream-with-vendor-display-stack
  • v5.17
  • v5.17-rc8
  • v5.17-rc7
  • v5.17-rc6
  • v5.17-rc5
  • v5.17-rc4
  • v5.17-rc3
  • v5.17-rc2
  • v5.17-rc1
  • v5.16
  • v5.16-rc8
  • v5.16-rc7
  • v5.16-rc6
  • v5.16-rc5
  • v5.16-rc4
  • v5.16-rc3
  • v5.16-rc2
  • v5.16-rc1
  • v5.15
  • v5.15-rc7
41 results

jitterentropy.c

Blame
  • regset.c 1.85 KiB
    // 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;
    
    	if (!regset->regset_get)
    		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;
    	}
    	res = regset->regset_get(target, regset,
    			   (struct membuf){.p = p, .left = size});
    	if (res < 0) {
    		kfree(to_free);
    		return res;
    	}
    	*data = p;
    	return size - res;
    }
    
    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);
    
    /**
     * 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;
    }