So diff is not at home anymore... Maybe it should be polished more,
as #ifdef CHECK_ASM in smp.h is not nice (probably generating dummy asm_offsets.h
for check_asm pass), but after I looked at code generated by this patch and
by Tim's patch, I think that Tim's approach with moving in_interrupt() testing
out-of-line from asm/string.h is better.
Best regards,
Petr Vandrovec
vandrove@vc.cvut.cz
diff -urdN linux/arch/i386/Makefile linux/arch/i386/Makefile
--- linux/arch/i386/Makefile Fri Dec 29 22:07:19 2000
+++ linux/arch/i386/Makefile Wed Jan 3 10:07:10 2001
@@ -139,5 +139,8 @@
archmrproper:
-archdep:
+archdep: check_asm
@$(MAKEBOOT) dep
+
+check_asm:
+ $(MAKE) -C arch/i386/kernel check_asm
diff -urdN linux/arch/i386/kernel/Makefile linux/arch/i386/kernel/Makefile
--- linux/arch/i386/kernel/Makefile Fri Dec 29 22:35:47 2000
+++ linux/arch/i386/kernel/Makefile Wed Jan 3 10:32:20 2001
@@ -7,6 +7,8 @@
#
# Note 2! The CFLAGS definitions are now in the main makefile...
+SH := $(CONFIG_SHELL)
+
.S.o:
$(CC) $(AFLAGS) -traditional -c $< -o $*.o
@@ -40,5 +42,95 @@
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o
obj-$(CONFIG_X86_IO_APIC) += io_apic.o mpparse.o
obj-$(CONFIG_X86_VISWS_APIC) += visws_apic.o
+
+check_asm: dummy
+ @if [ ! -r $(HPATH)/asm/asm_offsets.h ] ; then \
+ touch $(HPATH)/asm/asm_offsets.h ; \
+ fi
+ @echo "/* Automatically generated. Do not edit. */" > asm_offsets.h
+ @echo "#ifndef __ASM_OFFSETS_H__" >> asm_offsets.h
+ @echo "#define __ASM_OFFSETS_H__" >> asm_offsets.h
+ @echo "" >> asm_offsets.h
+ @echo "#include <linux/config.h>" >> asm_offsets.h
+ @echo "" >> asm_offsets.h
+ @echo "#ifndef CONFIG_SMP" >> asm_offsets.h
+ @echo "" >> asm_offsets.h
+ @echo "#include <linux/config.h>" > tmp.c
+ @echo "#undef CONFIG_SMP" >> tmp.c
+ @echo "#include <linux/sched.h>" >> tmp.c
+ $(CPP) $(CPPFLAGS) tmp.c -o tmp.i
+ @echo "/* Automatically generated. Do not edit. */" > check_asm_data.c
+ @echo "#include <linux/config.h>" >> check_asm_data.c
+ @echo "#undef CONFIG_SMP" >> check_asm_data.c
+ @echo "#include <linux/sched.h>" >> check_asm_data.c
+ @echo "unsigned int check_asm_data[] = {" >> check_asm_data.c
+ $(SH) ./check_asm.sh -data task tmp.i check_asm_data.c
+ $(SH) ./check_asm.sh -data mm tmp.i check_asm_data.c
+ $(SH) ./check_asm.sh -data thread tmp.i check_asm_data.c
+ @echo '};' >> check_asm_data.c
+ $(CC) $(CFLAGS) -DCHECK_ASM -S -o check_asm_data.s check_asm_data.c
+ @echo "/* Automatically generated. Do not edit. */" > check_asm.c
+ @echo 'extern int printf(const char *fmt, ...);' >>check_asm.c
+ @echo "unsigned int check_asm_data[] = {" >> check_asm.c
+ $(SH) ./check_asm.sh -ints check_asm_data.s check_asm.c
+ @echo "};" >> check_asm.c
+ @echo 'int main(void) {' >> check_asm.c
+ @echo 'int i = 0;' >> check_asm.c
+ $(SH) ./check_asm.sh -printf task tmp.i check_asm.c
+ $(SH) ./check_asm.sh -printf mm tmp.i check_asm.c
+ $(SH) ./check_asm.sh -printf thread tmp.i check_asm.c
+ @echo 'return 0; }' >> check_asm.c
+ @rm -f tmp.[ci] check_asm_data.[cs]
+ $(HOSTCC) -o check_asm check_asm.c
+ ./check_asm >> asm_offsets.h
+ @rm -f check_asm check_asm.c
+ @echo "" >> asm_offsets.h
+ @echo "#else /* CONFIG_SMP */" >> asm_offsets.h
+ @echo "" >> asm_offsets.h
+ @echo "#include <linux/config.h>" > tmp.c
+ @echo "#undef CONFIG_SMP" >> tmp.c
+ @echo "#define CONFIG_SMP 1" >> tmp.c
+ @echo "#include <linux/sched.h>" >> tmp.c
+ $(CPP) $(CPPFLAGS) tmp.c -o tmp.i
+ @echo "/* Automatically generated. Do not edit. */" > check_asm_data.c
+ @echo "#include <linux/config.h>" >> check_asm_data.c
+ @echo "#undef CONFIG_SMP" >> check_asm_data.c
+ @echo "#define CONFIG_SMP 1" >> check_asm_data.c
+ @echo "#include <linux/sched.h>" >> check_asm_data.c
+ @echo "unsigned int check_asm_data[] = {" >> check_asm_data.c
+ $(SH) ./check_asm.sh -data task tmp.i check_asm_data.c
+ $(SH) ./check_asm.sh -data mm tmp.i check_asm_data.c
+ $(SH) ./check_asm.sh -data thread tmp.i check_asm_data.c
+ @echo '};' >> check_asm_data.c
+ $(CC) $(CFLAGS) -DCHECK_ASM -S -o check_asm_data.s check_asm_data.c
+ @echo "/* Automatically generated. Do not edit. */" > check_asm.c
+ @echo 'extern int printf(const char *fmt, ...);' >>check_asm.c
+ @echo "unsigned int check_asm_data[] = {" >> check_asm.c
+ $(SH) ./check_asm.sh -ints check_asm_data.s check_asm.c
+ @echo "};" >> check_asm.c
+ @echo 'int main(void) {' >> check_asm.c
+ @echo 'int i = 0;' >> check_asm.c
+ $(SH) ./check_asm.sh -printf task tmp.i check_asm.c
+ $(SH) ./check_asm.sh -printf mm tmp.i check_asm.c
+ $(SH) ./check_asm.sh -printf thread tmp.i check_asm.c
+ @echo 'return 0; }' >> check_asm.c
+ @rm -f tmp.[ci] check_asm_data.[cs]
+ $(HOSTCC) -o check_asm check_asm.c
+ ./check_asm >> asm_offsets.h
+ @rm -f check_asm check_asm.c
+ @echo "" >> asm_offsets.h
+ @echo "#endif /* CONFIG_SMP */" >> asm_offsets.h
+ @echo "" >> asm_offsets.h
+ @echo "#endif /* __ASM_OFFSETS_H__ */" >> asm_offsets.h
+ @if test -r $(HPATH)/asm/asm_offsets.h; then \
+ if cmp -s asm_offsets.h $(HPATH)/asm/asm_offsets.h; then \
+ echo $(HPATH)/asm/asm_offsets.h is unchanged; \
+ rm -f asm_offsets.h; \
+ else \
+ mv -f asm_offsets.h $(HPATH)/asm/asm_offsets.h; \
+ fi; \
+ else \
+ mv -f asm_offsets.h $(HPATH)/asm/asm_offsets.h; \
+ fi
include $(TOPDIR)/Rules.make
diff -urdN linux/arch/i386/kernel/check_asm.sh linux/arch/i386/kernel/check_asm.sh
--- linux/arch/i386/kernel/check_asm.sh Thu Jan 1 00:00:00 1970
+++ linux/arch/i386/kernel/check_asm.sh Wed Jan 3 10:07:10 2001
@@ -0,0 +1,20 @@
+#!/bin/sh
+case $1 in
+ -printf)
+ sed -n -e '/struct[ ]*'$2'_struct[ ]*{/,/};/p' < $3 | sed '/struct[ ]*'$2'_struct[ ]*{/d;/:[0-9]*[ ]*;/d;/^[ ]*$/d;/};/d;s/^[ ]*//;s/volatile[ ]*//;s/\(unsigned\|signed\|struct\|union\)[ ]*//;s/\(\[\|__attribute__\).*;[ ]*$//;s/(\*//;s/)(.*)//;s/;[ ]*$//;s/^[^ ]*[ ]*//;s/,/\
+/g' | sed 's/^[ *]*//;s/[ ]*$//;s/^.*$/printf ("#define AOFF_'$2'_\0 0x%08x\\n", check_asm_data[i++]); printf("#define ASIZ_'$2'_\0 0x%08x\\n", check_asm_data[i++]);/' >> $4
+ echo "printf (\"#define ASIZ_$2\\t0x%08x\\n\", check_asm_data[i++]);" >> $4
+ ;;
+ -data)
+ sed -n -e '/struct[ ]*'$2'_struct[ ]*{/,/};/p' < $3 | sed '/struct[ ]*'$2'_struct[ ]*{/d;/:[0-9]*[ ]*;/d;/^[ ]*$/d;/};/d;s/^[ ]*//;s/volatile[ ]*//;s/\(unsigned\|signed\|struct\|union\)[ ]*//;s/\(\[\|__attribute__\).*;[ ]*$//;s/(\*//;s/)(.*)//;s/;[ ]*$//;s/^[^ ]*[ ]*//;s/,/\
+/g' | sed 's/^[ *]*//;s/[ ]*$//;s/^.*$/ ((char *)\&((struct '$2'_struct *)0)->\0) - ((char *)((struct '$2'_struct *)0)), sizeof(((struct '$2'_struct *)0)->\0),/' >> $4
+ echo " sizeof(struct $2_struct)," >> $4
+ ;;
+ -ints)
+ sed -n -e '/check_asm_data:/,/\.size/p' <$2 | sed -e 's/check_asm_data://' -e 's/\.size.*//' -e 's/\.long[ ]\([0-9]*\)/\1,/' >>$3
+ ;;
+ *)
+ exit 1
+ ;;
+esac
+exit 0
diff -urdN linux/include/asm-i386/smp.h linux/include/asm-i386/smp.h
--- linux/include/asm-i386/smp.h Sun Dec 31 19:10:16 2000
+++ linux/include/asm-i386/smp.h Wed Jan 3 10:47:53 2001
@@ -25,6 +25,9 @@
#ifdef CONFIG_SMP
#ifndef ASSEMBLY
+#include <asm/current.h>
+#include <asm/asm_offsets.h>
+
/*
* Private routines/data
*/
@@ -75,7 +78,15 @@
* so this is correct in the x86 case.
*/
-#define smp_processor_id() (current->processor)
+/*
+ * During first check_asm pass no AOFF/ASIZ is defined. As no code is generated by
+ * check_asm pass, we can use just arbitrary value. Needed for 3DNow!(tm) copy.
+ */
+#ifdef CHECK_ASM
+#define smp_processor_id() 0
+#else
+#define smp_processor_id() (*(int*)(((unsigned char*)current) + AOFF_task_processor))
+#endif
extern __inline int hard_smp_processor_id(void)
{
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/