0
  +   5ˆl–äY>”ŠeJ‚ÆŸ¸ÓŠbÑ¿Ð549_‡5#˜¬WTßÁÏ %    5‰PNG

   IHDR         Ä´l;  ìIDATx½”ŒœQFÏ}£Ú¶mÛnãÚœl¬Ú¶Õvã2¬mÛ¶1ºÕzG±ß³ÎóUåÈN2UwohmÐÝD¡ ÒæÔ’î{"‚+÷^›>}Çš!=ëR8O&PEù•  €ÆÖÝ}òŽù›Ž­ù1¦Ø¹5½>…§ÏèœÓ¤ZÁÌy²§çì�7¨‚ªH–*P¡`fT)˜ùÐ¹Gs€˜°`Ÿ×ïîÔ¬¬¼ùì#O¶tá�A„î-Ë»ö�¼ïŽVTN^|È²D@H’çwÐ¯my•¨.OŒ1AA"±eb'ŠEF	Œ‘øÁñ«M\†Ø‰U°	±B�x(VÁ`$<HäÏ�"òj°~$‚¦(`õ(LpPò‹TÕèÁ ôjY%’ÅxÑ¶Sü¥žÙø4Ê¾tÅ‘Ž ò~AŒìI7Ù×ÆøógÿìöÖ™:ŒËâ,Ù\x� ˆßÝƒúfëð�x<Ãš)Un¸)~5Æùäå’æÿ±qê?:Z_¯hå½ê¶¿º<€
ªJ¸¼@úñ(uº¯óöýYu¾>\ØØsº�óñ´FT²ülQƒ�	ÈlV˜jG{;/ëãºÕ¦€@ÁØöL!àÁ_…ˆØ�ŸÁ™(à¼€'6õªj€ úÿ@çB    IEND®B`‚     7ˆÌÑ„Í6ËÁÏ ?÷     7/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __LINUX_UACCESS_H__
#define __LINUX_UACCESS_H__

#include <linux/fault-inject-usercopy.h>
#include <linux/instrumented.h>
#include <linux/minmax.h>
#include <linux/sched.h>
#include <linux/thread_info.h>

#include <asm/uaccess.h>

/*
 * Architectures that support memory tagging (assigning tags to memory regions,
 * embedding these tags into addresses that point to these memory regions, and
 * checking that the memory and the pointer tags match on memory accesses)
 * redefine this macro to strip tags from pointers.
 *
 * Passing down mm_struct allows to define untagging rules on per-process
 * basis.
 *
 * It's defined as noop for architectures that don't support memory tagging.
 */
#ifndef untagged_addr
#define untagged_addr(addr) (addr)
#endif

#ifndef untagged_addr_remote
#define untagged_addr_remote(mm, addr)	({		\
	mmap_assert_locked(mm);				\
	untagged_addr(addr);				\
})
#endif

#ifdef masked_user_access_begin
 #define can_do_masked_user_access() 1
#else
 #define can_do_masked_user_access() 0
 #define masked_user_access_begin(src) NULL
#endif

/*
 * Architectures should provide two primitives (raw_copy_{to,from}_user())
 * and get rid of their private instances of copy_{to,from}_user() and
 * __copy_{to,from}_user{,_inatomic}().
 *
 * raw_copy_{to,from}_user(to, from, size) should copy up to size bytes and
 * return the amount left to copy.  They should assume that access_ok() has
 * already been checked (and succeeded); they should *not* zero-pad anything.
 * No KASAN or object size checks either - those belong here.
 *
 * Both of these functions should attempt to copy size bytes starting at from
 * into the area starting at to.  They must not fetch or store anything
 * outside of those areas.  Return value must be between 0 (everything
 * copied successfully) and size (nothing copied).
 *
 * If raw_copy_{to,from}_user(to, from, size) returns N, size - N bytes starting
 * at to must become equal to the bytes fetched from the corresponding area
 * starting at from.  All data past to + size - N must be left unmodified.
 *
 * If copying succeeds, the return value must be 0.  If some data cannot be
 * fetched, it is permitted to copy less than had been fetched; the only
 * hard requirement is that not storing anything at all (i.e. returning size)
 * should happen only when nothing could be copied.  In other words, you don't
 * have to squeeze as much as possible - it is allowed, but not necessary.
 *
 * For raw_copy_from_user() to always points to kernel memory and no faults
 * on store should happen.  Interpretation of from is affected by set_fs().
 * For raw_copy_to_user() it's the other way round.
 *
 * Both can be inlined - it's up to architectures whether it wants to bother
 * with that.  They should not be used directly; they are used to implement
 * the 6 functions (copy_{to,from}_user(), __copy_{to,from}_user_inatomic())
 * that are used instead.  Out of those, __... ones are inlined.  Plain
 * copy_{to,from}_user() might or might not be inlined.  If you want them
 * inlined, have asm/uaccess.h define INLINE_COPY_{TO,FROM}_USER.
 *
 * NOTE: only copy_from_user() zero-pads the destination in case of short copy.
 * Neither __copy_from_user() nor __copy_from_user_inatomic() zero anything
 * at all; their callers absolutely must check the return value.
 *
 * Biarch ones should also provide raw_copy_in_user() - similar to the above,
 * bu