Skip to contentSkip to conversation

x86_64: make string func definition work as intended

PATCH In review [email protected] 4 participants 5 messages May 1, 2005 – May 3, 2005 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 x86_64: make string func definition work as intended

From: Paolo 'Blaisorblade' Giarrusso <[email protected]>
CC: Andi Kleen <[email protected]>

In include/asm-x86_64/string.h there are such comments:

/* Use C out of line version for memcmp */ #define memcmp __builtin_memcmp
int memcmp(const void * cs,const void * ct,size_t count);

This would mean that if the compiler does not decide to use __builtin_memcmp, it emits a call to memcmp to be satisfied by the C out-of-line version in lib/string.c. What happens is that after preprocessing, in lib/string.i you may find the definition of "__builtin_strcmp".

Actually, by accident, in the object you will find the definition of strcmp and such (maybe a trick intended to redirect calls to __builtin_memcmp to the default memcmp when the definition is not expanded); however, this particular case is not a documented feature as far as I can see.

Also, the EXPORT_SYMBOL does not work, so it's duplicated in the arch.

I simply added some #undef to lib/string.c and removed the (now duplicated) exports in x86-64 and UML/x86_64 subarchs (the second ones are introduced by another patch I just posted for -mm).

I agree this can be a bit kludgy, so if you want add another solution.

---

 linux-2.6.12-paolo/arch/um/sys-x86_64/ksyms.c       |    3 ---
 linux-2.6.12-paolo/arch/x86_64/kernel/x8664_ksyms.c |   13 -------------
 linux-2.6.12-paolo/lib/string.c                     |    4 ++++
 3 files changed, 4 insertions(+), 16 deletions(-)

diff -puN include/asm-x86_64/string.h~x86_64-string-func include/asm-x86_64/string.h

lib/string.c renamed from lib/string.c~x86_64-string-func +4 -0
diff -puN lib/string.c~x86_64-string-func lib/string.c
@@ -65,6 +65,7 @@ EXPORT_SYMBOL(strnicmp);
  * @dest: Where to copy the string to
  * @src: Where to copy the string from
  */
+#undef strcpy
 char * strcpy(char * dest,const char *src)
 {
 	char *tmp = dest;
@@ -132,6 +133,7 @@ EXPORT_SYMBOL(strlcpy);
  * @dest: The string to be appended to
  * @src: The string to append to it
  */
+#undef strcat
 char * strcat(char * dest, const char * src)
 {
 	char *tmp = dest;
@@ -209,6 +211,7 @@ EXPORT_SYMBOL(strlcat);
  * @cs: One string
  * @ct: Another string
  */
+#undef strcmp
 int strcmp(const char * cs,const char * ct)
 {
 	register signed char __res;
@@ -514,6 +517,7 @@ EXPORT_SYMBOL(memmove);
  * @ct: Another area of memory
  * @count: The size of the area.
  */
+#undef memcmp
 int memcmp(const void * cs,const void * ct,size_t count)
 {
 	const unsigned char *su1, *su2;
arch/x86_64/kernel/x8664_ksyms.c renamed from arch/x86_64/kernel/x8664_ksyms.c~x86_64-string-func +0 -13
diff -puN arch/x86_64/kernel/x8664_ksyms.c~x86_64-string-func arch/x86_64/kernel/x8664_ksyms.c
@@ -139,35 +139,23 @@ EXPORT_SYMBOL_GPL(unset_nmi_callback);
 #undef memmove
 #undef memchr
 #undef strlen
-#undef strcpy
 #undef strncmp
 #undef strncpy
 #undef strchr	
-#undef strcmp 
-#undef strcpy 
-#undef strcat
-#undef memcmp
 
 extern void * memset(void *,int,__kernel_size_t);
 extern size_t strlen(const char *);
 extern void * memmove(void * dest,const void *src,size_t count);
-extern char * strcpy(char * dest,const char *src);
-extern int strcmp(const char * cs,const char * ct);
 extern void *memchr(const void *s, int c, size_t n);
 extern void * memcpy(void *,const void *,__kernel_size_t);
 extern void * __memcpy(void *,const void *,__kernel_size_t);
-extern char * strcat(char *, const char *);
-extern int memcmp(const void * cs,const void * ct,size_t count);
 
 EXPORT_SYMBOL(memset);
 EXPORT_SYMBOL(strlen);
 EXPORT_SYMBOL(memmove);
-EXPORT_SYMBOL(strcpy);
 EXPORT_SYMBOL(strncmp);
 EXPORT_SYMBOL(strncpy);
 EXPORT_SYMBOL(strchr);
-EXPORT_SYMBOL(strcmp);
-EXPORT_SYMBOL(strcat);
 EXPORT_SYMBOL(strncat);
 EXPORT_SYMBOL(memchr);
 EXPORT_SYMBOL(strrchr);
@@ -175,7 +163,6 @@ EXPORT_SYMBOL(strnlen);
 EXPORT_SYMBOL(memscan);
 EXPORT_SYMBOL(memcpy);
 EXPORT_SYMBOL(__memcpy);
-EXPORT_SYMBOL(memcmp);
 
 #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
 /* prototypes are wrong, these are assembly with custom calling functions */
arch/um/sys-x86_64/ksyms.c renamed from arch/um/sys-x86_64/ksyms.c~x86_64-string-func +0 -3
diff -puN arch/um/sys-x86_64/ksyms.c~x86_64-string-func arch/um/sys-x86_64/ksyms.c
@@ -14,9 +14,6 @@ EXPORT_SYMBOL(__up_wakeup);
 
 /*XXX: we need them because they would be exported by x86_64 */
 EXPORT_SYMBOL(__memcpy);
-EXPORT_SYMBOL(strcmp);
-EXPORT_SYMBOL(strcat);
-EXPORT_SYMBOL(strcpy);
 
 /* Networking helper routines. */
 /*EXPORT_SYMBOL(csum_partial_copy_from);

_

-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games.
Get your fingers limbered up and give it your best shot. 4 great events, 4 opportunities to win big! Highest score wins.NEC IT Guy Games. Play to win an NEC 61 plasma display. Visit http://www.necitguy.com/?r=20
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

#1 lore raw
Quoted 1 line

I agree this can be a bit kludgy, so if you want add another solution.

Patch is ok for me, but you have a good chance of having broken other archs too due to the string.c changes. Probably needs some testing.

-Andi

-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games.
Get your fingers limbered up and give it your best shot. 4 great events, 4 opportunities to win big! Highest score wins.NEC IT Guy Games. Play to win an NEC 61 plasma display. Visit http://www.necitguy.com/?r=20
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

A message that is not in the archive (sent off-list or not yet received): [email protected]

#3 lore raw

Setting the hardware clock together with the system one(was: Re: [patch 1/1] x86_64: make string func definition work as intended)

Quoted 4 lines · Adrian Bunk
Quoted 1 line · On Sun, May 01, 2005 at 09:08:51PM +0200, [email protected] wrote:

... ^^^^^^^^^^^^^^^^

Please correct the time settings on your computer.

I'm doing it by hand at every reboot. Just discovered this stupid Gentoo default setting:

# If you want to sync the system clock to the hardware clock during # shutdown, then say "yes" here.

CLOCK_SYSTOHC="no"

In other words, the kernel does not auto-adjusts the hardware clock? Well, that's not nice... (maybe only the Gentoo setting).

Regards.

Signature · 4 lines
Paolo Giarrusso, aka Blaisorblade
Skype user "PaoloGiarrusso"
Linux registered user n. 292729
http://www.user-mode-linux.org/~blaisorblade
#4 lore raw

Re: Setting the hardware clock together with the system one(was: Re: [patch 1/1] x86_64: make string func definition work as intended)

Quoted 8 lines · Blaisorblade
Quoted 4 lines · Adrian Bunk
Quoted 1 line · On Sun, May 01, 2005 at 09:08:51PM +0200, [email protected] wrote:

... ^^^^^^^^^^^^^^^^

Please correct the time settings on your computer.

I'm doing it by hand at every reboot. Just discovered this stupid Gentoo default setting:

Quoted 7 lines

# If you want to sync the system clock to the hardware clock during # shutdown, then say "yes" here.

CLOCK_SYSTOHC="no"

In other words, the kernel does not auto-adjusts the hardware clock? Well, that's not nice... (maybe only the Gentoo setting).

Besides such issues, it might also be an option to set the time using NTP information at boot time or (if network is started later) when starting your internet connection.

Quoted 1 line

Regards.

cu
Adrian

Signature · 4 lines
       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed
#5 lore raw
In reply to [email protected]
Quoted 12 lines · [email protected] wrote:

In include/asm-x86_64/string.h there are such comments:

/* Use C out of line version for memcmp */ #define memcmp __builtin_memcmp
int memcmp(const void * cs,const void * ct,size_t count);

This would mean that if the compiler does not decide to use __builtin_memcmp, it emits a call to memcmp to be satisfied by the C out-of-line version in lib/string.c. What happens is that after preprocessing, in lib/string.i you may find the definition of "__builtin_strcmp".

Quoted 6 lines

Actually, by accident, in the object you will find the definition of strcmp and such (maybe a trick intended to redirect calls to __builtin_memcmp to the default memcmp when the definition is not expanded); however, this particular case is not a documented feature as far as I can see.

Also, the EXPORT_SYMBOL does not work, so it's duplicated in the arch.

This breaks the x86 build. I guess the below is right.

You wanna check other architectures please?

arch/i386/kernel/i386_ksyms.c renamed from arch/i386/kernel/i386_ksyms.c~x86_64-make-string-func-definition-work-as-intended-fix +0 -4
diff -puN arch/i386/kernel/i386_ksyms.c~x86_64-make-string-func-definition-work-as-intended-fix arch/i386/kernel/i386_ksyms.c
@@ -169,10 +169,6 @@ EXPORT_SYMBOL(rtc_lock);
 EXPORT_SYMBOL_GPL(set_nmi_callback);
 EXPORT_SYMBOL_GPL(unset_nmi_callback);
 
-#undef memcmp
-extern int memcmp(const void *,const void *,__kernel_size_t);
-EXPORT_SYMBOL(memcmp);
-
 EXPORT_SYMBOL(register_die_notifier);
 #ifdef CONFIG_HAVE_DEC_LOCK
 EXPORT_SYMBOL(_atomic_dec_and_lock);

_

-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games.
Get your fingers limbered up and give it your best shot. 4 great events, 4 opportunities to win big! Highest score wins.NEC IT Guy Games. Play to win an NEC 61 plasma display. Visit http://www.necitguy.com/?r=20
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel