Commit 900e7bd2 authored by David Mosberger's avatar David Mosberger

ia64: If the compiler supports it, use attribute (model (small)) to

	tell the compiler that per-CPU variables can be addressed
	with "addl".

	On the simulator kernel, this saves about 2776 bytes in the
	kernel image.  On a zx1 kernel, it saves about 5593 bytes.
	As per-CPU variables are used more, these savings will
	increase, of course.
parent 0f4f7d24
int __attribute__ ((__model__ (__small__))) x;
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
# #
# Check whether linker can handle cross-segment @segrel(): # Check whether linker can handle cross-segment @segrel():
# #
CPPFLAGS=""
CC=$1 CC=$1
OBJDUMP=$2 OBJDUMP=$2
dir=$(dirname $0) dir=$(dirname $0)
...@@ -11,10 +12,17 @@ $CC -nostdlib -static -Wl,-T$dir/check-segrel.lds $dir/check-segrel.S -o $out ...@@ -11,10 +12,17 @@ $CC -nostdlib -static -Wl,-T$dir/check-segrel.lds $dir/check-segrel.S -o $out
res=$($OBJDUMP --full --section .rodata $out | fgrep 000 | cut -f3 -d' ') res=$($OBJDUMP --full --section .rodata $out | fgrep 000 | cut -f3 -d' ')
rm -f $out rm -f $out
if [ $res != 00000a00 ]; then if [ $res != 00000a00 ]; then
echo " -DHAVE_BUGGY_SEGREL" CPPFLAGS="$CPPFLAGS -DHAVE_BUGGY_SEGREL"
cat >&2 <<EOF cat >&2 <<EOF
warning: your linker cannot handle cross-segment segment-relative relocations. warning: your linker cannot handle cross-segment segment-relative relocations.
please upgrade to a newer version (it is safe to use this linker, but please upgrade to a newer version (it is safe to use this linker, but
the kernel will be bigger than strictly necessary). the kernel will be bigger than strictly necessary).
EOF EOF
fi fi
if ! $CC -c $dir/check-model.c -o $out | grep -q 'attribute directive ignored'
then
CPPFLAGS="$CPPFLAGS -DHAVE_MODEL_SMALL_ATTRIBUTE"
fi
rm -f $out
echo $CPPFLAGS
...@@ -16,11 +16,19 @@ ...@@ -16,11 +16,19 @@
#include <linux/threads.h> #include <linux/threads.h>
#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name #ifdef HAVE_MODEL_SMALL_ATTRIBUTE
# define __SMALL_ADDR_AREA __attribute__((__model__ (__small__)))
#else
# define __SMALL_ADDR_AREA
#endif
#define DECLARE_PER_CPU(type, name) \
extern __SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
/* Separate out the type, so (int[3], foo) works. */ /* Separate out the type, so (int[3], foo) works. */
#define DEFINE_PER_CPU(type, name) \ #define DEFINE_PER_CPU(type, name) \
__attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name __attribute__((__section__(".data.percpu"))) \
__SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
/* /*
* Pretty much a literal copy of asm-generic/percpu.h, except that percpu_modcopy() is an * Pretty much a literal copy of asm-generic/percpu.h, except that percpu_modcopy() is an
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment