Problem nit asm/atomic.h unter SuSE 10.2



  • Hallo,
    ich arbeite seit ca. 1 Jahr an einem C-Programm unter SuSE 10.1.
    Es läuft als Maschinensteuerung seit ca. 8 Monaten.

    Jetzt habe ich mir SuSE 10.2 zugelegt und habe folgendes Problem:

    Auf das Nötigste reduziertes Beispiel-Programm 'tst.c'.

    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <linux/cdev.h>
    #include <asm/atomic.h>

    int main(void) {
    printf("OK\n");
    return 0;
    }

    gcc -o tst tst.c -Wall

    In file included from tst.c:5:
    /usr/include/asm/atomic.h: In function ‘atomic_add’:
    /usr/include/asm/atomic.h:48: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_sub’:
    /usr/include/asm/atomic.h:63: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_sub_and_test’:
    /usr/include/asm/atomic.h:82: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_inc’:
    /usr/include/asm/atomic.h:97: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_dec’:
    /usr/include/asm/atomic.h:110: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_dec_and_test’:
    /usr/include/asm/atomic.h:127: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_inc_and_test’:
    /usr/include/asm/atomic.h:146: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_add_negative’:
    /usr/include/asm/atomic.h:166: error: expected string literal before ‘LOCK_PREFIX’
    /usr/include/asm/atomic.h: In function ‘atomic_add_return’:
    /usr/include/asm/atomic.h:190: error: expected string literal before ‘LOCK_PREFIX’

    Was mache ich falsch ?. Unter SuSE 10.1 völlig problemlos.

    Danke



  • Sorry, wenn ich die verwendeten Header nicht kenne, aber mit diesem Code wird dir nur ein Hellseher helfen können - zeig doch mal die Datei, in der die Fehler gemeldet wurden.



  • Die Datei auf die sich die Fehlermeldung bezieht ist Headerdatei /usr/include/asm/atomic.h

    #ifndef __ARCH_I386_ATOMIC__
    #define __ARCH_I386_ATOMIC__

    #include <linux/compiler.h>
    #include <asm/processor.h>

    /*
    * Atomic operations that C can't guarantee us. Useful for
    * resource counting etc..
    */

    /*
    * Make sure gcc doesn't try to be clever and move things around
    * on us. We need to use _exactly_ the address the user gave us,
    * not some alias that contains the same information.
    */
    typedef struct { volatile int counter; } atomic_t;

    #define ATOMIC_INIT(i) { (i) }

    /**
    * atomic_read - read atomic variable
    * @v: pointer of type atomic_t
    *
    * Atomically reads the value of @v.
    */
    #define atomic_read(v) ((v)->counter)

    /**
    * atomic_set - set atomic variable
    * @v: pointer of type atomic_t
    * @i: required value
    *
    * Atomically sets the value of @v to @i.
    */
    #define atomic_set(v,i) (((v)->counter) = (i))

    /**
    * atomic_add - add integer to atomic variable
    * @i: integer value to add
    * @v: pointer of type atomic_t
    *
    * Atomically adds @i to @v.
    */
    static __inline__ void atomic_add(int i, atomic_t *v)
    {
    __asm__ __volatile__(
    LOCK_PREFIX "addl %1,%0"
    :"+m" (v->counter)
    :"ir" (i));
    }

    /**
    * atomic_sub - subtract the atomic variable
    * @i: integer value to subtract
    * @v: pointer of type atomic_t
    *
    * Atomically subtracts @i from @v.
    */
    static __inline__ void atomic_sub(int i, atomic_t *v)
    {
    __asm__ __volatile__(
    LOCK_PREFIX "subl %1,%0"
    :"+m" (v->counter)
    :"ir" (i));
    }

    /**
    * atomic_sub_and_test - subtract value from variable and test result
    * @i: integer value to subtract
    * @v: pointer of type atomic_t
    *
    * Atomically subtracts @i from @v and returns
    * true if the result is zero, or false for all
    * other cases.
    */
    static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
    {
    unsigned char c;

    __asm__ __volatile__(
    LOCK_PREFIX "subl %2,%0; sete %1"
    :"+m" (v->counter), "=qm" (c)
    :"ir" (i) : "memory");
    return c;
    }

    /**
    * atomic_inc - increment atomic variable
    * @v: pointer of type atomic_t
    *
    * Atomically increments @v by 1.
    */
    static __inline__ void atomic_inc(atomic_t *v)
    {
    __asm__ __volatile__(
    LOCK_PREFIX "incl %0"
    :"+m" (v->counter));
    }

    /**
    * atomic_dec - decrement atomic variable
    * @v: pointer of type atomic_t
    *
    * Atomically decrements @v by 1.
    */
    static __inline__ void atomic_dec(atomic_t *v)
    {
    __asm__ __volatile__(
    LOCK_PREFIX "decl %0"
    :"+m" (v->counter));
    }

    /**
    * atomic_dec_and_test - decrement and test
    * @v: pointer of type atomic_t
    *
    * Atomically decrements @v by 1 and
    * returns true if the result is 0, or false for all other
    * cases.
    */
    static __inline__ int atomic_dec_and_test(atomic_t *v)
    {
    unsigned char c;

    __asm__ __volatile__(
    LOCK_PREFIX "decl %0; sete %1"
    :"+m" (v->counter), "=qm" (c)
    : : "memory");
    return c != 0;
    }

    /**
    * atomic_inc_and_test - increment and test
    * @v: pointer of type atomic_t
    *
    * Atomically increments @v by 1
    * and returns true if the result is zero, or false for all
    * other cases.
    */
    static __inline__ int atomic_inc_and_test(atomic_t *v)
    {
    unsigned char c;

    __asm__ __volatile__(
    LOCK_PREFIX "incl %0; sete %1"
    :"+m" (v->counter), "=qm" (c)
    : : "memory");
    return c != 0;
    }

    /**
    * atomic_add_negative - add and test if negative
    * @v: pointer of type atomic_t
    * @i: integer value to add
    *
    * Atomically adds @i to @v and returns true
    * if the result is negative, or false when
    * result is greater than or equal to zero.
    */
    static __inline__ int atomic_add_negative(int i, atomic_t *v)
    {
    unsigned char c;

    __asm__ __volatile__(
    LOCK_PREFIX "addl %2,%0; sets %1"
    :"+m" (v->counter), "=qm" (c)
    :"ir" (i) : "memory");
    return c;
    }

    /**
    * atomic_add_return - add and return
    * @v: pointer of type atomic_t
    * @i: integer value to add
    *
    * Atomically adds @i to @v and returns @i + @v
    */
    static __inline__ int atomic_add_return(int i, atomic_t *v)
    {
    int __i;
    #ifdef CONFIG_M386
    unsigned long flags;
    if(unlikely(boot_cpu_data.x86==3))
    goto no_xadd;
    #endif
    /* Modern 486+ processor */
    __i = i;
    __asm__ __volatile__(
    LOCK_PREFIX "xaddl %0, %1;"
    :"=r"(i)
    :"m"(v->counter), "0"(i));
    return i + __i;

    #ifdef CONFIG_M386
    no_xadd: /* Legacy 386 processor */
    local_irq_save(flags);
    __i = atomic_read(v);
    atomic_set(v, i + __i);
    local_irq_restore(flags);
    return i + __i;
    #endif
    }

    static __inline__ int atomic_sub_return(int i, atomic_t *v)
    {
    return atomic_add_return(-i,v);
    }

    #define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
    #define atomic_xchg(v, new) (xchg(&((v)->counter), new))

    /**
    * atomic_add_unless - add unless the number is a given value
    * @v: pointer of type atomic_t
    * @a: the amount to add to v...
    * @u: ...unless v is equal to u.
    *
    * Atomically adds @a to @v, so long as it was not @u.
    * Returns non-zero if @v was not @u, and zero otherwise.
    */
    #define atomic_add_unless(v, a, u) \
    ({ \
    int c, old; \
    c = atomic_read(v); \
    for (;;) { \
    if (unlikely(c == (u))) \
    break; \
    old = atomic_cmpxchg((v), c, c + (a)); \
    if (likely(old == c)) \
    break; \
    c = old; \
    } \
    c != (u); \
    })
    #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)

    #define atomic_inc_return(v) (atomic_add_return(1,v))
    #define atomic_dec_return(v) (atomic_sub_return(1,v))

    /* These are x86-specific, used by some header files */
    #define atomic_clear_mask(mask, addr) \
    __asm__ __volatile__(LOCK_PREFIX "andl %0,%1" \
    : : "r" (~(mask)),"m" (*addr) : "memory")

    #define atomic_set_mask(mask, addr) \
    __asm__ __volatile__(LOCK_PREFIX "orl %0,%1" \
    : : "r" (mask),"m" (*(addr)) : "memory")

    /* Atomic operations are already serializing on x86 */
    #define smp_mb__before_atomic_dec() barrier()
    #define smp_mb__after_atomic_dec() barrier()
    #define smp_mb__before_atomic_inc() barrier()
    #define smp_mb__after_atomic_inc() barrier()

    #include <asm-generic/atomic.h>
    #endif



  • schonmal einen diff zwischen den beiden header dateien von SuSE 10.1 und SuSE 10.2 gemacht?



  • Bei SuSE 10.2 und SuSE 10.2 werden tatsächlich unterschiedliche /usr/include/asm/atomic.h benutzt.

    SuSE 10.2 Datei vom 20.09.2006, SuSE 10.1 vom 20.03.06

    Wird die ältere Datei eingebunden, dann funktioniert es.

    Ich habe allerdings kein gutes Gefühl, wenn ich einfach eine Headerdatei modifiziere / ersetze.

    Jedenfalls vielen Dank.



  • schmidtjan_48 schrieb:

    Bei SuSE 10.2 und SuSE 10.2 werden tatsächlich unterschiedliche /usr/include/asm/atomic.h benutzt.

    Ich habe allerdings kein gutes Gefühl, wenn ich einfach eine Headerdatei modifiziere / ersetze.

    Das kannst du auch nicht!
    Wenn du dir die Filelist des Kernels anschaust, wirst du sehen das die atomic.h im Kernel-Headers rpm enthalten ist. D.h. die Headerdatei muss zu deinem Kernel passen...
    Welche Kernel benutzt du denn und welche Header rpm hast du denn installiert?

    Greetz



  • Leider bin ich nicht in der Lage, deine Frage im Moment zu beantworten, da der SuSE 10.1-Rechner in der Firma steht und ich habe jetzt keinen Zugriff.

    Am Mittwoch kannst du es wissen.

    Für mich ich ist wichtig, dass ich zu Hause das Programm weiterentwickeln kann, und dazu ist die Kompilierung schon nicht schlecht. Laufen lassen kann ich das Programm ohnehin nicht, da ich zu Hause keine AD/DA-Karte installiert habe.

    mfg



  • schmidtjan_48 schrieb:

    Für mich ich ist wichtig, dass ich zu Hause das Programm weiterentwickeln kann, und dazu ist die Kompilierung schon nicht schlecht. Laufen lassen kann ich das Programm ohnehin nicht, da ich zu Hause keine AD/DA-Karte installiert habe.

    Aber so wie ich dich verstanden habe.. funktioniert es ja auf dem SuSe 10.2 nicht?
    Davon wäre die Versionen interessant... beim 10.1er läufts ja sowieso...

    also einfach mal:
    rpm -qa | grep -i kernel

    Ich vermute das du einen neueren Kernel als die Headerdateien auf dem SuSE 10.2 hast.

    Greetz



  • codefrag schrieb:
    also einfach mal:
    rpm -qa | grep -i kernel

    rpm -qa | grep -i kernel liefert:

    kernel-default-2.6.18.8-0.1
    kernel-source-2.6.18.8-0.1
    linux-kernel-headers-2.6.18.2-3

    Ich habe, um

    gcc -c ... -Wall

    ausführen zu können, die 10.1 - Headerdatei ins Arbeitsverzeichnis kopiert und mit #include "atomic.h" eingebunden, so kann ich mir Meldungen über Code-Fehler anzeigen lassen ohne erst alles was mit atomic.h zu tun hat vor der Kompilierung abzuschalten.



  • schmidtjan_48 schrieb:

    kernel-default-2.6.18.8-0.1
    kernel-source-2.6.18.8-0.1
    linux-kernel-headers-2.6.18.2-3

    Ich habe, um
    gcc -c ... -Wall
    ausführen zu können, die 10.1 - Headerdatei ins Arbeitsverzeichnis kopiert und mit #include "atomic.h" eingebunden, so kann ich mir Meldungen über Code-Fehler anzeigen lassen ohne erst alles was mit atomic.h zu tun hat vor der Kompilierung abzuschalten.

    Das ist klar, dass es dann funktioniert wenn du die 10.1 Headerdateien kopierst.
    Allerdings wie vermutet hast du eine andere kernel-header version als der Kernel selbst.

    Durch das kopieren der "alten 10.1" Headerdatei kannst du aber ungewünschte Effekt hervorrufen, die dann nicht mehr nachzuvollziehen sind.
    Am einfachsten ist es, du installierst/besorgst dir die passenden Pakete und dann sollte es auch unter 10.2 mit 10.2 Headern funktionieren.

    Auf deiner CD müssten eigentlich alle passenden Pakete vorhanden sein.. und kein Online Update fahren 🙂



  • Hi, codefrag

    Ich benutze seit 11 bis 13 Jahren SuSE-Linux.

    Erst mit der Version 10.2 hatte (habe) ich Probleme.

    1. Nach der Installation von der DVD ist mein DVD-Laufwerk (Installationslaufwerk) nicht mehr als DVD-Laufwerk erkannt worden.

    2. Bei der Wiederholung der Installation mit CD's stellte sich heraus dass CD 3 defekt war.

    3. Erneut Installation von der DVD.

    4. DVD-Laufwerk kann nicht mit kb3 gebrannte DVD's lesen, wohl aber CD's.

    5. Bildschirm wurde richtig erkannt, muss aber nach jedem booten neu justiert werden.

    6. Keine Möglichkeit kinternet zu starten, habe also eigenen script benutzt.

    7. Online-Update funktionierte nicht.

    Und paar Sachen mehr.

    Nachdem dann Online-Update ging, sind so viele Patches heruntergeladen worden, dass ich erstaunt war, als ich das System mit Erfolg booten konnte.

    So gesehen wundert mich nicht, wenn da etwas nicht passt.

    Deine Hilfe war jedenfalls sehr wertvoll, Vielen Dank

    😋



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten