Pregunta

Estamos trabajando en un sistema operativo de juguete como una asignación para una clase. Estoy teniendo algunos problemas con la escritura de la función de pánico del kernel.

Debe guardar todos los registros, llamar a alguna función similar a printf, luego imprimir los registros guardados y detener la CPU. En este momento se define como 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 es una variable global que contiene registros guardados de un hilo y algunas cosas más. El problema es con SAVE_REGISTERS . Es una macro definida en algún lugar de un archivo de encabezado de ensamblador, pero no sé cómo incluirla. El simple #incluir en el archivo obviamente no funciona. He intentado buscar en Google y escribir cosas divertidas y desesperadas (como #incluir en las cadenas del ensamblador :-)) pero nada ayudó. ¿Tienes alguna idea de cómo resolver esto?

Estamos usando GCC y compilamos para MIPS (ejecutándose en un simulador :-))

editar: SAVE_REGISTERS se define con .macro SAVE_REGISTERS .... No puede estar en una macro C, porque se usa en otros módulos de ensamblaje. No puedo hacer un archivo .S con él, porque el pánico tiene que ser variable. O al menos no se me ocurrió ninguna otra forma de hacerlo.

¿Fue útil?

Solución

Creo que no entiendes cómo funcionan las macros. Se expanden antes de que ocurra cualquier otra compilación. No puede usar asm para emitir algún código que contenga una macro porque esa macro nunca se expandirá.

En su lugar, puede intentar definir SAVE_REGISTERS como una macro C que utiliza la instrucción asm para construir su código de ensamblaje:

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

entonces puedes hacer

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

Otros consejos

No tengo un sistema MIPS, pero en mi caja x86 loonix probé #include y descubrí que # es el carácter del comentario, así que intenté .include y funcionó tan pronto como puse el nombre del archivo: .include " something.i " .

Ahora, si tiene archivos de encabezado y una infraestructura organizada para el código de ensamblador, tengo que preguntarme por qué quiere hacer esto con asm en línea en primer lugar. ¿Por qué no crear un archivo .s o .S real, incluir el archivo de encabezado del ensamblador y convertirlo en un módulo de primera clase en su sistema?

He visto pequeñas obras maestras realizadas con asm incluso en proyectos que ya tenían un locore.S en su Makefile , imagínense. ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top