404

[ Avaa Bypassed ]




Upload:

Command:

botdev@3.145.11.190: ~ $
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * uaccess.h: User space memore access functions.
 *
 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
 * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
 */
#ifndef _ASM_UACCESS_H
#define _ASM_UACCESS_H

#include <linux/compiler.h>
#include <linux/string.h>

#include <asm/processor.h>

#define ARCH_HAS_SORT_EXTABLE
#define ARCH_HAS_SEARCH_EXTABLE

/* Sparc is not segmented, however we need to be able to fool access_ok()
 * when doing system calls from kernel mode legitimately.
 *
 * "For historical reasons, these macros are grossly misnamed." -Linus
 */

#define KERNEL_DS   ((mm_segment_t) { 0 })
#define USER_DS     ((mm_segment_t) { -1 })

#define get_ds()	(KERNEL_DS)
#define get_fs()	(current->thread.current_ds)
#define set_fs(val)	((current->thread.current_ds) = (val))

#define segment_eq(a, b) ((a).seg == (b).seg)

/* We have there a nice not-mapped page at PAGE_OFFSET - PAGE_SIZE, so that this test
 * can be fairly lightweight.
 * No one can read/write anything from userland in the kernel space by setting
 * large size and address near to PAGE_OFFSET - a fault will break his intentions.
 */
#define __user_ok(addr, size) ({ (void)(size); (addr) < STACK_TOP; })
#define __kernel_ok (uaccess_kernel())
#define __access_ok(addr, size) (__user_ok((addr) & get_fs().seg, (size)))
#define access_ok(type, addr, size) \
	({ (void)(type); __access_ok((unsigned long)(addr), size); })

/*
 * The exception table consists of pairs of addresses: the first is the
 * address of an instruction that is allowed to fault, and the second is
 * the address at which the program should continue.  No registers are
 * modified, so it is entirely up to the continuation code to figure out
 * what to do.
 *
 * All the routines below use bits of fixup code that are out of line
 * with the main instruction path.  This means when everything is well,
 * we don't even have to jump over them.  Further, they do not intrude
 * on our cache or tlb entries.
 *
 * There is a special way how to put a range of potentially faulting
 * insns (like twenty ldd/std's with now intervening other instructions)
 * You specify address of first in insn and 0 in fixup and in the next
 * exception_table_entry you specify last potentially faulting insn + 1
 * and in fixup the routine which should handle the fault.
 * That fixup code will get
 * (faulting_insn_address - first_insn_in_the_range_address)/4
 * in %g2 (ie. index of the faulting instruction in the range).
 */

struct exception_table_entry
{
        unsigned long insn, fixup;
};

/* Returns 0 if exception not found and fixup otherwise.  */
unsigned long search_extables_range(unsigned long addr, unsigned long *g2);

/* Uh, these should become the main single-value transfer routines..
 * They automatically use the right size if we just have the right
 * pointer type..
 *
 * This gets kind of ugly. We want to return _two_ values in "get_user()"
 * and yet we don't want to do any pointers, because that is too much
 * of a performance impact. Thus we have a few rather ugly macros here,
 * and hide all the ugliness from the user.
 */
#define put_user(x, ptr) ({ \
	unsigned long __pu_addr = (unsigned long)(ptr); \
	__chk_user_ptr(ptr); \
	__put_user_check((__typeof__(*(ptr)))(x), __pu_addr, sizeof(*(ptr))); \
})

#define get_user(x, ptr) ({ \
	unsigned long __gu_addr = (unsigned long)(ptr); \
	__chk_user_ptr(ptr); \
	__get_user_check((x), __gu_addr, sizeof(*(ptr)), __typeof__(*(ptr))); \
})

/*
 * The "__xxx" versions do not do address space checking, useful when
 * doing multiple accesses to the same area (the user has to do the
 * checks by hand with "access_ok()")
 */
#define __put_user(x, ptr) \
	__put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
#define __get_user(x, ptr) \
    __get_user_nocheck((x), (ptr), sizeof(*(ptr)), __typeof__(*(ptr)))

struct __large_struct { unsigned long buf[100]; };
#define __m(x) ((struct __large_struct __user *)(x))

#define __put_user_check(x, addr, size) ({ \
	register int __pu_ret; \
	if (__access_ok(addr, size)) { \
		switch (size) { \
		case 1: \
			__put_user_asm(x, b, addr, __pu_ret); \
			break; \
		case 2: \
			__put_user_asm(x, h, addr, __pu_ret); \
			break; \
		case 4: \
			__put_user_asm(x, , addr, __pu_ret); \
			break; \
		case 8: \
			__put_user_asm(x, d, addr, __pu_ret); \
			break; \
		default: \
			__pu_ret = __put_user_bad(); \
			break; \
		} \
	} else { \
		__pu_ret = -EFAULT; \
	} \
	__pu_ret; \
})

#define __put_user_nocheck(x, addr, size) ({			\
	register int __pu_ret;					\
	switch (size) {						\
	case 1: __put_user_asm(x, b, addr, __pu_ret); break;	\
	case 2: __put_user_asm(x, h, addr, __pu_ret); break;	\
	case 4: __put_user_asm(x, , addr, __pu_ret); break;	\
	case 8: __put_user_asm(x, d, addr, __pu_ret); break;	\
	default: __pu_ret = __put_user_bad(); break;		\
	} \
	__pu_ret; \
})

#define __put_user_asm(x, size, addr, ret)				\
__asm__ __volatile__(							\
		"/* Put user asm, inline. */\n"				\
	"1:\t"	"st"#size " %1, %2\n\t"					\
		"clr	%0\n"						\
	"2:\n\n\t"							\
		".section .fixup,#alloc,#execinstr\n\t"			\
		".align	4\n"						\
	"3:\n\t"							\
		"b	2b\n\t"						\
		" mov	%3, %0\n\t"					\
		".previous\n\n\t"					\
		".section __ex_table,#alloc\n\t"			\
		".align	4\n\t"						\
		".word	1b, 3b\n\t"					\
		".previous\n\n\t"					\
	       : "=&r" (ret) : "r" (x), "m" (*__m(addr)),		\
		 "i" (-EFAULT))

int __put_user_bad(void);

#define __get_user_check(x, addr, size, type) ({ \
	register int __gu_ret; \
	register unsigned long __gu_val; \
	if (__access_ok(addr, size)) { \
		switch (size) { \
		case 1: \
			 __get_user_asm(__gu_val, ub, addr, __gu_ret); \
			break; \
		case 2: \
			__get_user_asm(__gu_val, uh, addr, __gu_ret); \
			break; \
		case 4: \
			__get_user_asm(__gu_val, , addr, __gu_ret); \
			break; \
		case 8: \
			__get_user_asm(__gu_val, d, addr, __gu_ret); \
			break; \
		default: \
			__gu_val = 0; \
			__gu_ret = __get_user_bad(); \
			break; \
		} \
	 } else { \
		 __gu_val = 0; \
		 __gu_ret = -EFAULT; \
	} \
	x = (__force type) __gu_val; \
	__gu_ret; \
})

#define __get_user_nocheck(x, addr, size, type) ({			\
	register int __gu_ret;						\
	register unsigned long __gu_val;				\
	switch (size) {							\
	case 1: __get_user_asm(__gu_val, ub, addr, __gu_ret); break;	\
	case 2: __get_user_asm(__gu_val, uh, addr, __gu_ret); break;	\
	case 4: __get_user_asm(__gu_val, , addr, __gu_ret); break;	\
	case 8: __get_user_asm(__gu_val, d, addr, __gu_ret); break;	\
	default:							\
		__gu_val = 0;						\
		__gu_ret = __get_user_bad();				\
		break;							\
	}								\
	x = (__force type) __gu_val;					\
	__gu_ret;							\
})

#define __get_user_asm(x, size, addr, ret)				\
__asm__ __volatile__(							\
		"/* Get user asm, inline. */\n"				\
	"1:\t"	"ld"#size " %2, %1\n\t"					\
		"clr	%0\n"						\
	"2:\n\n\t"							\
		".section .fixup,#alloc,#execinstr\n\t"			\
		".align	4\n"						\
	"3:\n\t"							\
		"clr	%1\n\t"						\
		"b	2b\n\t"						\
		" mov	%3, %0\n\n\t"					\
		".previous\n\t"						\
		".section __ex_table,#alloc\n\t"			\
		".align	4\n\t"						\
		".word	1b, 3b\n\n\t"					\
		".previous\n\t"						\
	       : "=&r" (ret), "=&r" (x) : "m" (*__m(addr)),		\
		 "i" (-EFAULT))

int __get_user_bad(void);

unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size);

static inline unsigned long raw_copy_to_user(void __user *to, const void *from, unsigned long n)
{
	return __copy_user(to, (__force void __user *) from, n);
}

static inline unsigned long raw_copy_from_user(void *to, const void __user *from, unsigned long n)
{
	return __copy_user((__force void __user *) to, from, n);
}

#define INLINE_COPY_FROM_USER
#define INLINE_COPY_TO_USER

static inline unsigned long __clear_user(void __user *addr, unsigned long size)
{
	unsigned long ret;

	__asm__ __volatile__ (
		".section __ex_table,#alloc\n\t"
		".align 4\n\t"
		".word 1f,3\n\t"
		".previous\n\t"
		"mov %2, %%o1\n"
		"1:\n\t"
		"call __bzero\n\t"
		" mov %1, %%o0\n\t"
		"mov %%o0, %0\n"
		: "=r" (ret) : "r" (addr), "r" (size) :
		"o0", "o1", "o2", "o3", "o4", "o5", "o7",
		"g1", "g2", "g3", "g4", "g5", "g7", "cc");

	return ret;
}

static inline unsigned long clear_user(void __user *addr, unsigned long n)
{
	if (n && __access_ok((unsigned long) addr, n))
		return __clear_user(addr, n);
	else
		return n;
}

__must_check long strnlen_user(const char __user *str, long n);

#endif /* _ASM_UACCESS_H */

Filemanager

Name Type Size Permission Actions
Kbuild File 491 B 0644
agp.h File 434 B 0644
apb.h File 1.06 KB 0644
asm-offsets.h File 35 B 0644
asm-prototypes.h File 727 B 0644
asm.h File 1.08 KB 0644
asmmacro.h File 1.16 KB 0644
atomic.h File 219 B 0644
atomic_32.h File 2.26 KB 0644
atomic_64.h File 3.34 KB 0644
auxio.h File 310 B 0644
auxio_32.h File 2.55 KB 0644
auxio_64.h File 3.18 KB 0644
backoff.h File 2.7 KB 0644
barrier.h File 223 B 0644
barrier_32.h File 160 B 0644
barrier_64.h File 1.96 KB 0644
bbc.h File 9.76 KB 0644
bitext.h File 631 B 0644
bitops.h File 219 B 0644
bitops_32.h File 2.79 KB 0644
bitops_64.h File 1.64 KB 0644
btext.h File 145 B 0644
bug.h File 588 B 0644
bugs.h File 404 B 0644
cache.h File 649 B 0644
cacheflush.h File 373 B 0644
cacheflush_32.h File 1.97 KB 0644
cacheflush_64.h File 2.56 KB 0644
cachetlb_32.h File 882 B 0644
chafsr.h File 9.48 KB 0644
checksum.h File 227 B 0644
checksum_32.h File 6.81 KB 0644
checksum_64.h File 4.4 KB 0644
chmctrl.h File 7.91 KB 0644
clock.h File 231 B 0644
clocksource.h File 407 B 0644
cmpxchg.h File 223 B 0644
cmpxchg_32.h File 2.4 KB 0644
cmpxchg_64.h File 5.13 KB 0644
compat.h File 6.45 KB 0644
compat_signal.h File 565 B 0644
contregs.h File 1.9 KB 0644
cpu_type.h File 579 B 0644
cpudata.h File 378 B 0644
cpudata_32.h File 729 B 0644
cpudata_64.h File 1.13 KB 0644
current.h File 991 B 0644
dcr.h File 728 B 0644
dcu.h File 1.48 KB 0644
delay.h File 215 B 0644
delay_32.h File 907 B 0644
delay_64.h File 403 B 0644
device.h File 565 B 0644
dma-mapping.h File 632 B 0644
dma.h File 6.6 KB 0644
ebus_dma.h File 1.07 KB 0644
ecc.h File 4.34 KB 0644
eeprom.h File 254 B 0644
elf.h File 207 B 0644
elf_32.h File 3.19 KB 0644
elf_64.h File 6.47 KB 0644
estate.h File 2.23 KB 0644
extable_64.h File 727 B 0644
fb.h File 680 B 0644
fbio.h File 2.26 KB 0644
fhc.h File 4.43 KB 0644
floppy.h File 219 B 0644
floppy_32.h File 9.74 KB 0644
floppy_64.h File 18.83 KB 0644
fpumacro.h File 710 B 0644
ftrace.h File 800 B 0644
futex.h File 215 B 0644
futex_32.h File 82 B 0644
futex_64.h File 2.15 KB 0644
hardirq.h File 223 B 0644
hardirq_32.h File 334 B 0644
hardirq_64.h File 417 B 0644
head.h File 211 B 0644
head_32.h File 2.56 KB 0644
head_64.h File 2.13 KB 0644
hibernate.h File 421 B 0644
highmem.h File 2.02 KB 0644
hugetlb.h File 2.09 KB 0644
hvtramp.h File 782 B 0644
hw_irq.h File 88 B 0644
hypervisor.h File 110.71 KB 0644
ide.h File 2.19 KB 0644
idprom.h File 656 B 0644
intr_queue.h File 794 B 0644
io-unit.h File 2.41 KB 0644
io.h File 620 B 0644
io_32.h File 3.51 KB 0644
io_64.h File 10.66 KB 0644
ioctls.h File 358 B 0644
iommu.h File 215 B 0644
iommu_32.h File 5.73 KB 0644
iommu_64.h File 2.43 KB 0644
irq.h File 207 B 0644
irq_32.h File 526 B 0644
irq_64.h File 3.06 KB 0644
irqflags.h File 227 B 0644
irqflags_32.h File 1.03 KB 0644
irqflags_64.h File 1.91 KB 0644
jump_label.h File 1.01 KB 0644
kdebug.h File 219 B 0644
kdebug_32.h File 1.99 KB 0644
kdebug_64.h File 393 B 0644
kgdb.h File 1014 B 0644
kmap_types.h File 233 B 0644
kprobes.h File 1.41 KB 0644
ldc.h File 4.37 KB 0644
leon.h File 7.37 KB 0644
leon_amba.h File 8.09 KB 0644
leon_pci.h File 512 B 0644
lsu.h File 1.04 KB 0644
machines.h File 1.5 KB 0644
mbus.h File 2.93 KB 0644
mc146818rtc.h File 298 B 0644
mc146818rtc_32.h File 699 B 0644
mc146818rtc_64.h File 689 B 0644
mdesc.h File 2.99 KB 0644
memctrl.h File 311 B 0644
mman.h File 304 B 0644
mmu.h File 207 B 0644
mmu_32.h File 209 B 0644
mmu_64.h File 3.14 KB 0644
mmu_context.h File 239 B 0644
mmu_context_32.h File 1.07 KB 0644
mmu_context_64.h File 4.15 KB 0644
mmzone.h File 393 B 0644
msi.h File 774 B 0644
mxcc.h File 4.33 KB 0644
nmi.h File 354 B 0644
ns87303.h File 3.22 KB 0644
obio.h File 6.26 KB 0644
openprom.h File 7.3 KB 0644
oplib.h File 215 B 0644
oplib_32.h File 5.92 KB 0644
oplib_64.h File 8.12 KB 0644
page.h File 274 B 0644
page_32.h File 3.91 KB 0644
page_64.h File 4.49 KB 0644
parport.h File 5.68 KB 0644
pbm.h File 1.47 KB 0644
pci.h File 207 B 0644
pci_32.h File 1.09 KB 0644
pci_64.h File 1.49 KB 0644
pcic.h File 5.77 KB 0644
pcr.h File 1.85 KB 0644
percpu.h File 219 B 0644
percpu_32.h File 168 B 0644
percpu_64.h File 515 B 0644
perf_event.h File 802 B 0644
pgalloc.h File 223 B 0644
pgalloc_32.h File 1.91 KB 0644
pgalloc_64.h File 2.85 KB 0644
pgtable.h File 223 B 0644
pgtable_32.h File 11.35 KB 0644
pgtable_64.h File 30.71 KB 0644
pgtsrmmu.h File 6.05 KB 0644
pil.h File 1.08 KB 0644
processor.h File 231 B 0644
processor_32.h File 3.13 KB 0644
processor_64.h File 7.58 KB 0644
prom.h File 2.02 KB 0644
psr.h File 1.38 KB 0644
ptrace.h File 4.19 KB 0644
qrwlock.h File 205 B 0644
qspinlock.h File 215 B 0644
ross.h File 5.52 KB 0644
sbi.h File 3.34 KB 0644
scratchpad.h File 547 B 0644
seccomp.h File 225 B 0644
sections.h File 289 B 0644
setup.h File 1.52 KB 0644
sfafsr.h File 3.14 KB 0644
sfp-machine.h File 239 B 0644
sfp-machine_32.h File 6.79 KB 0644
sfp-machine_64.h File 3.1 KB 0644
shmparam.h File 227 B 0644
shmparam_32.h File 253 B 0644
shmparam_64.h File 306 B 0644
sigcontext.h File 2.55 KB 0644
signal.h File 835 B 0644
smp.h File 207 B 0644
smp_32.h File 3.29 KB 0644
smp_64.h File 1.84 KB 0644
sparsemem.h File 349 B 0644
spinlock.h File 227 B 0644
spinlock_32.h File 4.22 KB 0644
spinlock_64.h File 409 B 0644
spinlock_types.h File 549 B 0644
spitfire.h File 9.73 KB 0644
stacktrace.h File 166 B 0644
starfire.h File 418 B 0644
string.h File 1.13 KB 0644
string_32.h File 405 B 0644
string_64.h File 505 B 0644
sunbpp.h File 3.27 KB 0644
swift.h File 3.07 KB 0644
switch_to.h File 231 B 0644
switch_to_32.h File 3.53 KB 0644
switch_to_64.h File 2.58 KB 0644
syscall.h File 3.41 KB 0644
syscalls.h File 307 B 0644
termbits.h File 198 B 0644
termios.h File 4.94 KB 0644
thread_info.h File 239 B 0644
thread_info_32.h File 3.66 KB 0644
thread_info_64.h File 7.84 KB 0644
timer.h File 215 B 0644
timer_32.h File 1.18 KB 0644
timer_64.h File 2.37 KB 0644
timex.h File 215 B 0644
timex_32.h File 266 B 0644
timex_64.h File 423 B 0644
tlb.h File 207 B 0644
tlb_32.h File 520 B 0644
tlb_64.h File 913 B 0644
tlbflush.h File 227 B 0644
tlbflush_32.h File 621 B 0644
tlbflush_64.h File 1.73 KB 0644
topology.h File 227 B 0644
topology_32.h File 170 B 0644
topology_64.h File 1.51 KB 0644
trap_block.h File 6.51 KB 0644
traps.h File 577 B 0644
tsb.h File 12.17 KB 0644
tsunami.h File 1.85 KB 0644
ttable.h File 20.08 KB 0644
turbosparc.h File 3.78 KB 0644
uaccess.h File 363 B 0644
uaccess_32.h File 8.31 KB 0644
uaccess_64.h File 6.05 KB 0644
unaligned.h File 339 B 0644
unistd.h File 1.37 KB 0644
upa.h File 3.72 KB 0644
uprobes.h File 1.86 KB 0644
user.h File 102 B 0644
vaddrs.h File 2.02 KB 0644
vdso.h File 662 B 0644
vga.h File 964 B 0644
viking.h File 8.14 KB 0644
vio.h File 11.81 KB 0644
visasm.h File 1.51 KB 0644
vvar.h File 1.52 KB 0644
winmacro.h File 4.66 KB 0644
xor.h File 207 B 0644
xor_32.h File 7.31 KB 0644
xor_64.h File 2.5 KB 0644