Question

Nous travaillons sur un système d’exploitation de jouets en tant qu’affectation pour une classe. J'ai des problèmes avec l'écriture de la fonction de panique du noyau.

Il convient de sauvegarder tous les registres, d’appeler une fonction semblable à printf, puis d’imprimer les registres sauvegardés et d’arrêter le processeur. À l'heure actuelle, il est défini comme une macro:

#define panic(...) \
    do{ \
        asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \
        _panic_printk(&_panic_context, __VA_ARGS__); \
    while(0)

_panic_context est une variable globale qui contient des registres sauvegardés d'un fil et d'autres éléments. Le problème concerne SAVE_REGISTERS . C'est une macro définie quelque part dans un fichier d'en-tête d'assembleur, mais je ne sais pas comment l'inclure. La simple #include dans le fichier ne fonctionne évidemment pas. J'ai essayé de googler et d'écrire des trucs drôles et désespérés (comme #include dans les chaînes d'assembleur :-)) mais rien n'y fait. Avez-vous des idées pour résoudre ce problème?

Nous utilisons GCC et compilons pour MIPS (s'exécutant dans un simulateur :-))

modifier: SAVE_REGISTERS est défini avec .macro SAVE_REGISTERS .... Cela ne peut pas être dans une macro C, car il est utilisé dans d'autres modules d'assemblage. Je ne peux pas créer de fichier .S avec, car la panique doit être variadique. Ou du moins je ne pouvais pas trouver un autre moyen de le faire.

Était-ce utile?

La solution

Je pense que vous comprenez mal le fonctionnement des macros. Ils sont développés avant toute autre compilation. Vous ne pouvez pas utiliser asm pour émettre du code contenant une macro, car celle-ci ne sera jamais développée.

Vous pouvez plutôt essayer de définir SAVE_REGISTERS en tant que macro C qui utilise l'instruction asm pour générer votre code d'assemblage:

#define SAVE_REGISTERS(x) \
   asm volatile ("movx ax, %1", ...);

alors vous pouvez faire

#define panic(...) \
do { \
    SAVE_REGISTERS(_panic_context); \
    _panic_printk(&_panic_context, __VA_ARGS__); \
} while(0);

Autres conseils

Je n'ai pas de système MIPS, mais sur ma boîte loonix x86, j'ai essayé #include et découvert que # est le caractère de commentaire, j'ai donc .include et cela a fonctionné dès que j'ai cité le nom du fichier: .include "quelque chose.i" .

Maintenant, si vous avez des fichiers d’en-tête et une infrastructure organisée pour le code assembleur, je me demande bien pourquoi vous voulez le faire avec inline asm en premier lieu. Pourquoi ne pas créer un vrai fichier .s ou .S , inclure le fichier d’en-tête de l’assembleur et en faire un module de première classe dans votre système?

J'ai déjà vu de petits chefs-d'œuvre réalisés avec asm , même dans des projets contenant déjà un locore.S dans leur Makefile . ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top