Frage

Wir arbeiten an einem Spielzeug-Betriebssystem als Zuordnung für eine Klasse. Ich bin ein paar Probleme mit dem Schreiben der Kernel-Panik-Funktion.

Es sollte alle Register speichern, rufen einige printf-ähnliche Funktion, dann die gespeicherten Register drucken und die CPU zu stoppen. Im Moment ist es definiert als Makro:

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

_panic_context ist eine globale Variable, die gesicherten Register eines Threads enthält und etwas mehr Material. Das Problem ist mit SAVE_REGISTERS. Es ist ein Makro, irgendwo in einer Assembler-Header-Datei definiert, aber ich weiß nicht, wie es zu schließen. Einfache # include in der Datei offensichtlich nicht funktioniert. Ich habe versucht, googeln und Schreiben lustig und verzweifelt Sachen (wie # include in den Assembler Saiten :-)), aber nichts half. Haben Sie irgendwelche Ideen, wie diese zu lösen?

Wir sind mit GCC und kompilieren für MIPS (in einem Simulator :-) läuft)

edit: SAVE_REGISTERS mit .macro SAVE_REGISTERS definiert .... Es kann nicht in einem C-Makro, weil es in anderen Montagemodule verwendet wird. Ich kann keine .S-Datei mit ihm machen, weil Panik variadische sein muss. Oder zumindest konnte ich nicht mit anderem Weg, um es zu tun.

War es hilfreich?

Lösung

Ich glaube, du Missverständnis, wie Makros arbeiten. Sie erweitert erhalten, bevor andere Compilierung passiert. Sie können nicht asm verwenden einige Code zu emittieren, die ein Makro enthält, weil das Makro nie erweitert werden.

Stattdessen könnten Sie SAVE_REGISTERS als C-Makro versuchen zu definieren, die die asm Anweisung verwenden Ihren Assembler-Code zu erstellen:

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

dann können Sie tun,

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

Andere Tipps

Ich habe nicht ein MIPS-System herumliegen, aber auf meiner x86 loonix Box habe ich versucht, #include und entdecken, dass # ist das Kommentarzeichen, also versuche ich .include und das funktionierte, sobald ich die Dateinamen zitiert: .include "something.i".

Wenn Sie nun die Header-Dateien und eine organisierte Infrastruktur für die Assembler-Code haben, muss ich fragen, warum Sie diese mit Inline-asm in erster Linie tun wollen, though. Warum nicht einfach ein echte .s oder .S Datei machen, gehört die Assembler-Header-Datei, und macht es zu einem First-Class-Modul in Ihrem System?

Ich habe kleine Meisterwerke gesehen getan mit asm auch in Projekten, die bereits eine locore.S in ihrer Makefile hatten, go figure ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top