Вопрос

Мы работаем над игрушечной операционной системой в качестве задания для класса.У меня возникли некоторые проблемы с написанием функции паники ядра.

Он должен сохранить все регистры, вызвать какую-нибудь функцию, подобную printf, затем распечатать сохраненные регистры и остановить процессор.Прямо сейчас он определен как макрос:

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

_panic_context это глобальная переменная, которая содержит сохраненные регистры потока и еще кое-что.Проблема заключается в том, что SAVE_REGISTERS.Это макрос, определенный где-то в заголовочном файле ассемблера, но я не знаю, как его включить.Простое #включить в файл, очевидно, не работает.Я пробовал гуглить и писать смешные и отчаянные вещи (например, #include в строках ассемблера :-) ), но ничего не помогло.У вас есть какие-нибудь идеи, как это решить?

Мы используем GCC и компилируем для MIPS (запускаем в симуляторе :-) )

Редактировать:SAVE_REGISTERS определяется с помощью .macro SAVE_REGISTERS....Это не может быть в макросе C, потому что оно используется в других модулях сборки.Я не могу создать с его помощью файл .S, потому что panic должен быть переменным.Или, по крайней мере, я не мог придумать никакого другого способа сделать это.

Это было полезно?

Решение

Я думаю, вы неправильно понимаете, как работают макросы.Они расширяются до того, как произойдет какая-либо другая компиляция.Вы не можете использовать asm выдать некоторый код, содержащий макрос, потому что этот макрос никогда не будет расширен.

Вместо этого вы могли бы попробовать определить SAVE_REGISTERS в качестве макроса C, который использует asm инструкция по созданию вашего ассемблерного кода:

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

тогда вы можете сделать

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

Другие советы

У меня нет системы MIPS, но на моей коробке loonix для x86 я попробовал #include и обнаружил , что # является символом комментария, поэтому я попробовал .include и это сработало, как только я процитировал имя файла: .include "something.i".

Теперь, если у вас есть заголовочные файлы и организованная инфраструктура для кода на ассемблере, я должен задаться вопросом, почему вы вообще хотите сделать это с помощью встроенного asm.Почему бы просто не сделать настоящий .s или .S файл, включите файл заголовка assembler и сделайте его первоклассным модулем в вашей системе?

Я видел маленькие шедевры, сделанные с asm даже в проектах, которые уже имели locore.S в их Makefile, пойди разберись...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top