Domanda

Stiamo lavorando su un sistema operativo giocattolo come compito per una classe. Ho qualche problema con la scrittura della funzione di panico del kernel.

Dovrebbe salvare tutti i registri, chiamare alcune funzioni simili a printf, quindi stampare i registri salvati e arrestare la CPU. In questo momento è definito come una macro:

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

_panic_context è una variabile globale che contiene i registri salvati di un thread e altre cose. Il problema è con SAVE_REGISTERS . È una macro definita da qualche parte in un file di intestazione dell'assemblatore, ma non so come includerla. La semplice #include nel file ovviamente non funziona. Ho provato a cercare su Google e scrivere cose divertenti e disperate (come #include nelle stringhe degli assemblatori :-)) ma niente mi ha aiutato. Hai qualche idea su come risolverlo?

Stiamo usando GCC e compiliamo per MIPS (in esecuzione in un simulatore :-))

modifica: SAVE_REGISTERS è definito con .macro SAVE_REGISTERS .... Non può essere in una macro C, perché viene utilizzato in altri moduli di assemblaggio. Non riesco a creare un file .S con esso, perché il panico deve essere variadico. O almeno non riuscivo a trovare un altro modo per farlo.

È stato utile?

Soluzione

Penso che tu abbia frainteso il modo in cui funzionano le macro. Si espandono prima che avvenga qualsiasi altra compilazione. Non puoi usare asm per emettere del codice che contiene una macro perché quella macro non verrà mai espansa.

Invece potresti provare a definire SAVE_REGISTERS come una macro C che utilizza l'istruzione asm per creare il tuo codice assembly:

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

allora puoi farlo

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

Altri suggerimenti

Non ho un sistema MIPS in giro, ma sulla mia scatola loonix x86 ho provato #include e ho scoperto che # è il carattere del commento, quindi ho provato .include e ha funzionato non appena ho citato il nome del file: .include " qualcosa.i " .

Ora, se hai file di intestazione e un'infrastruttura organizzata per il codice assembler, devo chiedermi perché, in primo luogo, vuoi farlo con inline asm. Perché non creare semplicemente un vero .s o .S , includere il file header dell'assemblatore e renderlo un modulo di prima classe nel tuo sistema?

Ho visto piccoli capolavori realizzati con asm anche in progetti che avevano già un locore.S nel loro Makefile , vai a capire. ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top