47d632f9f8
Use direct load/store for the get_user/put_user. Previously, we would call out to a helper routine that would do the appropriate thing and then return, handling the possible exception internally. Now we inline the load or store, along with a "we succeeded" indication in a register; if the load or store faults, we write a "we failed" indication into the same register and then return to the following instruction. This is more efficient and gives us more compact code, as well as being more in line with what other architectures do. The special futex assembly source file for TILE-Gx also disappears in this change; we just use the same inlining idiom there as well, putting the appropriate atomic operations directly into futex_atomic_op_inuser() (and thus into the FUTEX_WAIT function). The underlying atomic copy_from_user, copy_to_user functions were renamed using the (cryptic) x86 convention as copy_from_user_ll and copy_to_user_ll. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
85 lines
2.6 KiB
C
85 lines
2.6 KiB
C
/*
|
|
* Copyright 2010 Tilera Corporation. All Rights Reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation, version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
|
|
* NON INFRINGEMENT. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* Exports from assembler code and from libtile-cc.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
|
|
/* arch/tile/lib/usercopy.S */
|
|
#include <linux/uaccess.h>
|
|
EXPORT_SYMBOL(strnlen_user_asm);
|
|
EXPORT_SYMBOL(strncpy_from_user_asm);
|
|
EXPORT_SYMBOL(clear_user_asm);
|
|
EXPORT_SYMBOL(flush_user_asm);
|
|
EXPORT_SYMBOL(inv_user_asm);
|
|
EXPORT_SYMBOL(finv_user_asm);
|
|
|
|
/* arch/tile/kernel/entry.S */
|
|
#include <linux/kernel.h>
|
|
#include <asm/processor.h>
|
|
EXPORT_SYMBOL(current_text_addr);
|
|
EXPORT_SYMBOL(dump_stack);
|
|
|
|
/* arch/tile/kernel/head.S */
|
|
EXPORT_SYMBOL(empty_zero_page);
|
|
|
|
/* arch/tile/lib/, various memcpy files */
|
|
EXPORT_SYMBOL(memcpy);
|
|
EXPORT_SYMBOL(__copy_to_user_inatomic);
|
|
EXPORT_SYMBOL(__copy_from_user_inatomic);
|
|
EXPORT_SYMBOL(__copy_from_user_zeroing);
|
|
#ifdef __tilegx__
|
|
EXPORT_SYMBOL(__copy_in_user_inatomic);
|
|
#endif
|
|
|
|
/* hypervisor glue */
|
|
#include <hv/hypervisor.h>
|
|
EXPORT_SYMBOL(hv_dev_open);
|
|
EXPORT_SYMBOL(hv_dev_pread);
|
|
EXPORT_SYMBOL(hv_dev_pwrite);
|
|
EXPORT_SYMBOL(hv_dev_preada);
|
|
EXPORT_SYMBOL(hv_dev_pwritea);
|
|
EXPORT_SYMBOL(hv_dev_poll);
|
|
EXPORT_SYMBOL(hv_dev_poll_cancel);
|
|
EXPORT_SYMBOL(hv_dev_close);
|
|
EXPORT_SYMBOL(hv_sysconf);
|
|
EXPORT_SYMBOL(hv_confstr);
|
|
|
|
/* libgcc.a */
|
|
uint32_t __udivsi3(uint32_t dividend, uint32_t divisor);
|
|
EXPORT_SYMBOL(__udivsi3);
|
|
int32_t __divsi3(int32_t dividend, int32_t divisor);
|
|
EXPORT_SYMBOL(__divsi3);
|
|
uint64_t __udivdi3(uint64_t dividend, uint64_t divisor);
|
|
EXPORT_SYMBOL(__udivdi3);
|
|
int64_t __divdi3(int64_t dividend, int64_t divisor);
|
|
EXPORT_SYMBOL(__divdi3);
|
|
uint32_t __umodsi3(uint32_t dividend, uint32_t divisor);
|
|
EXPORT_SYMBOL(__umodsi3);
|
|
int32_t __modsi3(int32_t dividend, int32_t divisor);
|
|
EXPORT_SYMBOL(__modsi3);
|
|
uint64_t __umoddi3(uint64_t dividend, uint64_t divisor);
|
|
EXPORT_SYMBOL(__umoddi3);
|
|
int64_t __moddi3(int64_t dividend, int64_t divisor);
|
|
EXPORT_SYMBOL(__moddi3);
|
|
#ifndef __tilegx__
|
|
int64_t __muldi3(int64_t, int64_t);
|
|
EXPORT_SYMBOL(__muldi3);
|
|
uint64_t __lshrdi3(uint64_t, unsigned int);
|
|
EXPORT_SYMBOL(__lshrdi3);
|
|
uint64_t __ashrdi3(uint64_t, unsigned int);
|
|
EXPORT_SYMBOL(__ashrdi3);
|
|
uint64_t __ashldi3(uint64_t, unsigned int);
|
|
EXPORT_SYMBOL(__ashldi3);
|
|
#endif
|