cregit-Linux how code gets into the kernel

Release 4.14 arch/parisc/include/asm/futex.h

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_PARISC_FUTEX_H

#define _ASM_PARISC_FUTEX_H

#ifdef __KERNEL__

#include <linux/futex.h>
#include <linux/uaccess.h>
#include <asm/atomic.h>
#include <asm/errno.h>

/* The following has to match the LWS code in syscall.S.  We have
   sixteen four-word locks. */


static inline void _futex_spin_lock_irqsave(u32 __user *uaddr, unsigned long int *flags) { extern u32 lws_lock_start[]; long index = ((long)uaddr & 0xf0) >> 2; arch_spinlock_t *s = (arch_spinlock_t *)&lws_lock_start[index]; local_irq_save(*flags); arch_spin_lock(s); }

Contributors

PersonTokensPropCommitsCommitProp
John David Anglin62100.00%1100.00%
Total62100.00%1100.00%


static inline void _futex_spin_unlock_irqrestore(u32 __user *uaddr, unsigned long int *flags) { extern u32 lws_lock_start[]; long index = ((long)uaddr & 0xf0) >> 2; arch_spinlock_t *s = (arch_spinlock_t *)&lws_lock_start[index]; arch_spin_unlock(s); local_irq_restore(*flags); }

Contributors

PersonTokensPropCommitsCommitProp
John David Anglin62100.00%1100.00%
Total62100.00%1100.00%


static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr) { unsigned long int flags; int oldval, ret; u32 tmp; _futex_spin_lock_irqsave(uaddr, &flags); pagefault_disable(); ret = -EFAULT; if (unlikely(get_user(oldval, uaddr) != 0)) goto out_pagefault_enable; ret = 0; tmp = oldval; switch (op) { case FUTEX_OP_SET: tmp = oparg; break; case FUTEX_OP_ADD: tmp += oparg; break; case FUTEX_OP_OR: tmp |= oparg; break; case FUTEX_OP_ANDN: tmp &= ~oparg; break; case FUTEX_OP_XOR: tmp ^= oparg; break; default: ret = -ENOSYS; } if (ret == 0 && unlikely(put_user(tmp, uaddr) != 0)) ret = -EFAULT; out_pagefault_enable: pagefault_enable(); _futex_spin_unlock_irqrestore(uaddr, &flags); if (!ret) *oval = oldval; return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Carlos O'Donell Jr9855.06%233.33%
John David Anglin6737.64%233.33%
Jiri Slaby126.74%116.67%
Michel Lespinasse10.56%116.67%
Total178100.00%6100.00%


static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, u32 newval) { u32 val; unsigned long flags; /* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is * our gateway page, and causes no end of trouble... */ if (uaccess_kernel() && !uaddr) return -EFAULT; if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) return -EFAULT; /* HPPA has no cmpxchg in hardware and therefore the * best we can do here is use an array of locks. The * lock selected is based on a hash of the userspace * address. This should scale to a couple of CPUs. */ _futex_spin_lock_irqsave(uaddr, &flags); if (unlikely(get_user(val, uaddr) != 0)) { _futex_spin_unlock_irqrestore(uaddr, &flags); return -EFAULT; } if (val == oldval && unlikely(put_user(newval, uaddr) != 0)) { _futex_spin_unlock_irqrestore(uaddr, &flags); return -EFAULT; } *uval = val; _futex_spin_unlock_irqrestore(uaddr, &flags); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Carlos O'Donell Jr7047.95%225.00%
John David Anglin4631.51%225.00%
Michel Lespinasse1711.64%225.00%
Kyle McMartin128.22%112.50%
Al Viro10.68%112.50%
Total146100.00%8100.00%

#endif /*__KERNEL__*/ #endif /*_ASM_PARISC_FUTEX_H*/

Overall Contributors

PersonTokensPropCommitsCommitProp
John David Anglin23849.90%216.67%
Carlos O'Donell Jr18338.36%216.67%
Michel Lespinasse183.77%216.67%
Kyle McMartin142.94%18.33%
Jiri Slaby122.52%18.33%
Jakub Jelínek81.68%18.33%
Jeff Dike20.42%18.33%
Al Viro10.21%18.33%
Greg Kroah-Hartman10.21%18.33%
Total477100.00%12100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.