In the next patch we're going to allow machines to override the __delay() implementation at runtime so they can implement a timer based __delay() routine. It's easier to do this using C, so lets write udelay and friends in C. We lose the #if 0 code, which according to Russell is used "to make the delay loop more stable and predictable on older CPUs" (see http://article.gmane.org/gmane.linux.kernel/888867 for more info). We shouldn't be too worried though, since the next patch adds functionality to allow a machine to set the __delay() loop themselves, therefore allowing machines to resurrect the commented out code if they need it. bloat-o-meter shows an increase of 12 bytes. Further inspection of the assembly shows GCC copying the loops_per_jiffy pointer and the magic HZ value to the ends of __const_udelay() and _delay() thus contributing an extra 4 and 8 bytes of data to each function. These two values weren't taken into account in the delay.S version since they weren't part of the function in nm's eyes. This means we only really gained an extra 4 bytes due to GCC's decision to duplicate the loops_per_jiffy pointer in __const_udelay. $ scripts/bloat-o-meter vmlinux.orig vmlinux.new add/remove: 0/0 grow/shrink: 2/0 up/down: 12/0 (12) function old new delta __udelay 48 56 +8 __const_udelay 40 44 +4 Change-Id: Ibfaab52d0f5e09471571be082232db04726d5532 Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Reviewed-by: Saravana Kannan <skannan@codeaurora.org> (cherry picked from commit 8d5868d8205d10a0a8e423f53e9cc9bb3e9d1a34) Conflicts: arch/arm/kernel/armksyms.c arch/arm/lib/delay.S
160 lines
3.7 KiB
C
160 lines
3.7 KiB
C
/*
|
|
* linux/arch/arm/kernel/armksyms.c
|
|
*
|
|
* Copyright (C) 2000 Russell King
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#include <linux/export.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/string.h>
|
|
#include <linux/cryptohash.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/in6.h>
|
|
#include <linux/syscalls.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/io.h>
|
|
|
|
#include <asm/checksum.h>
|
|
#include <asm/ftrace.h>
|
|
|
|
/*
|
|
* libgcc functions - functions that are used internally by the
|
|
* compiler... (prototypes are not correct though, but that
|
|
* doesn't really matter since they're not versioned).
|
|
*/
|
|
extern void __ashldi3(void);
|
|
extern void __ashrdi3(void);
|
|
extern void __divsi3(void);
|
|
extern void __lshrdi3(void);
|
|
extern void __modsi3(void);
|
|
extern void __muldi3(void);
|
|
extern void __ucmpdi2(void);
|
|
extern void __udivsi3(void);
|
|
extern void __umodsi3(void);
|
|
extern void __do_div64(void);
|
|
|
|
extern void __aeabi_idiv(void);
|
|
extern void __aeabi_idivmod(void);
|
|
extern void __aeabi_lasr(void);
|
|
extern void __aeabi_llsl(void);
|
|
extern void __aeabi_llsr(void);
|
|
extern void __aeabi_lmul(void);
|
|
extern void __aeabi_uidiv(void);
|
|
extern void __aeabi_uidivmod(void);
|
|
extern void __aeabi_ulcmp(void);
|
|
|
|
extern void fpundefinstr(void);
|
|
|
|
/* networking */
|
|
EXPORT_SYMBOL(csum_partial);
|
|
EXPORT_SYMBOL(csum_partial_copy_from_user);
|
|
EXPORT_SYMBOL(csum_partial_copy_nocheck);
|
|
EXPORT_SYMBOL(__csum_ipv6_magic);
|
|
|
|
/* io */
|
|
#ifndef __raw_readsb
|
|
EXPORT_SYMBOL(__raw_readsb);
|
|
#endif
|
|
#ifndef __raw_readsw
|
|
EXPORT_SYMBOL(__raw_readsw);
|
|
#endif
|
|
#ifndef __raw_readsl
|
|
EXPORT_SYMBOL(__raw_readsl);
|
|
#endif
|
|
#ifndef __raw_writesb
|
|
EXPORT_SYMBOL(__raw_writesb);
|
|
#endif
|
|
#ifndef __raw_writesw
|
|
EXPORT_SYMBOL(__raw_writesw);
|
|
#endif
|
|
#ifndef __raw_writesl
|
|
EXPORT_SYMBOL(__raw_writesl);
|
|
#endif
|
|
|
|
/* string / mem functions */
|
|
EXPORT_SYMBOL(strchr);
|
|
EXPORT_SYMBOL(strrchr);
|
|
EXPORT_SYMBOL(memset);
|
|
EXPORT_SYMBOL(memcpy);
|
|
EXPORT_SYMBOL(memmove);
|
|
EXPORT_SYMBOL(memchr);
|
|
EXPORT_SYMBOL(__memzero);
|
|
|
|
/* user mem (segment) */
|
|
EXPORT_SYMBOL(__strnlen_user);
|
|
EXPORT_SYMBOL(__strncpy_from_user);
|
|
|
|
#ifdef CONFIG_MMU
|
|
EXPORT_SYMBOL(copy_page);
|
|
|
|
EXPORT_SYMBOL(__copy_from_user);
|
|
EXPORT_SYMBOL(__copy_to_user);
|
|
EXPORT_SYMBOL(__clear_user);
|
|
|
|
EXPORT_SYMBOL(__get_user_1);
|
|
EXPORT_SYMBOL(__get_user_2);
|
|
EXPORT_SYMBOL(__get_user_4);
|
|
|
|
EXPORT_SYMBOL(__put_user_1);
|
|
EXPORT_SYMBOL(__put_user_2);
|
|
EXPORT_SYMBOL(__put_user_4);
|
|
EXPORT_SYMBOL(__put_user_8);
|
|
#endif
|
|
|
|
/* gcc lib functions */
|
|
EXPORT_SYMBOL(__ashldi3);
|
|
EXPORT_SYMBOL(__ashrdi3);
|
|
EXPORT_SYMBOL(__divsi3);
|
|
EXPORT_SYMBOL(__lshrdi3);
|
|
EXPORT_SYMBOL(__modsi3);
|
|
EXPORT_SYMBOL(__muldi3);
|
|
EXPORT_SYMBOL(__ucmpdi2);
|
|
EXPORT_SYMBOL(__udivsi3);
|
|
EXPORT_SYMBOL(__umodsi3);
|
|
EXPORT_SYMBOL(__do_div64);
|
|
|
|
#ifdef CONFIG_AEABI
|
|
EXPORT_SYMBOL(__aeabi_idiv);
|
|
EXPORT_SYMBOL(__aeabi_idivmod);
|
|
EXPORT_SYMBOL(__aeabi_lasr);
|
|
EXPORT_SYMBOL(__aeabi_llsl);
|
|
EXPORT_SYMBOL(__aeabi_llsr);
|
|
EXPORT_SYMBOL(__aeabi_lmul);
|
|
EXPORT_SYMBOL(__aeabi_uidiv);
|
|
EXPORT_SYMBOL(__aeabi_uidivmod);
|
|
EXPORT_SYMBOL(__aeabi_ulcmp);
|
|
#endif
|
|
|
|
/* bitops */
|
|
EXPORT_SYMBOL(_set_bit);
|
|
EXPORT_SYMBOL(_test_and_set_bit);
|
|
EXPORT_SYMBOL(_clear_bit);
|
|
EXPORT_SYMBOL(_test_and_clear_bit);
|
|
EXPORT_SYMBOL(_change_bit);
|
|
EXPORT_SYMBOL(_test_and_change_bit);
|
|
EXPORT_SYMBOL(_find_first_zero_bit_le);
|
|
EXPORT_SYMBOL(_find_next_zero_bit_le);
|
|
EXPORT_SYMBOL(_find_first_bit_le);
|
|
EXPORT_SYMBOL(_find_next_bit_le);
|
|
|
|
#ifdef __ARMEB__
|
|
EXPORT_SYMBOL(_find_first_zero_bit_be);
|
|
EXPORT_SYMBOL(_find_next_zero_bit_be);
|
|
EXPORT_SYMBOL(_find_first_bit_be);
|
|
EXPORT_SYMBOL(_find_next_bit_be);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
#ifdef CONFIG_OLD_MCOUNT
|
|
EXPORT_SYMBOL(mcount);
|
|
#endif
|
|
EXPORT_SYMBOL(__gnu_mcount_nc);
|
|
#endif
|
|
|
|
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
|
|
EXPORT_SYMBOL(__pv_phys_offset);
|
|
#endif
|