Pergunta

Estamos trabalhando em um sistema operacional de brinquedo como uma atribuição para uma classe. Eu estou tendo alguns problemas com a escrita da função do kernel pânico.

Ele deve salvar todos os registros, chamar alguns printf-como função, em seguida, imprimir os registros salvos e travar a cpu. Agora é definida como uma macro:

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

_panic_context é uma variável global que contém registros salvos de um fio e mais algumas coisas. O problema é com SAVE_REGISTERS. É um macro definido em algum lugar em um arquivo de cabeçalho assembler, mas eu não sei como incluí-lo. #include simples no arquivo obviamente, não funciona. Eu tentei pesquisando e escrevendo engraçado e coisas desesperado (como #include nas cordas assembler :-)), mas nada ajudou. Você tem alguma idéia de como resolver isso?

Estamos usando GCC e de compilação para MIPS (corrida em um simulador :-))

edit: SAVE_REGISTERS é definido com .macro SAVE_REGISTERS .... Ele não pode estar em uma macro C, porque é usado em outros módulos de montagem. Eu não posso fazer um arquivo .S com ele, por causa do pânico tem que ser variádica. Ou pelo menos eu não poderia vir acima com alguma outra maneira de fazê-lo.

Foi útil?

Solução

Eu acho que você está mal-entendido como macros trabalhar. Eles se expandiram antes de qualquer outra compilação acontece. Você não pode usar asm para emitir algum código que contém uma macro porque a macro não será ampliada.

Em vez disso você pode tentar definir SAVE_REGISTERS como uma macro C que usa a instrução asm para construir o seu código de montagem:

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

então você pode fazer

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

Outras dicas

Eu não tenho um sistema MIPS em torno de mentir, mas na minha caixa x86 loonix Tentei #include e descobriu que # é o caractere de comentário, então eu tentei .include e que trabalhou assim que eu citei o nome do arquivo: .include "something.i".

Agora, se você tem arquivos de cabeçalho e uma infra-estrutura organizada para o código assembler, eu tenho que perguntar por que você quer fazer isso com asm em linha em primeiro lugar, no entanto. Porque não basta fazer uma .s real ou arquivo .S, inclua o arquivo de cabeçalho assembler, e torná-lo um módulo de primeira classe em seu sistema?

Eu vi pequenas obras-primas feitas com asm , mesmo em projetos que já tiveram um locore.S em sua Makefile, vai entender ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top