Декодирование этого фрагмента встроенного кода сборки на PowerPc

У меня есть приведенный ниже фрагмент кода из исходного кода ядра для PowerPc.

#define SPRN_IVOR32     0x210   /* Interrupt Vector Offset Register 32 */

unsigned long ivor[3];
ivor[0] = mfspr(SPRN_IVOR32);

#define __stringify_1(x)        #x
#define __stringify(x)          __stringify_1(x)

#define mfspr(rn)       ({unsigned long rval; \
                    asm volatile("mfspr %0," __stringify(rn) \
                            : "=r" (rval)); rval; })

Кроме того, в приведенном выше упражнении речь идет об эмуляции битов регистра MSR в PowerPc?

Может ли кто-нибудь помочь мне в том, что именно мы здесь делаем?


person Amit Singh Tomar    schedule 01.09.2014    source источник
comment
Скомпилируйте эту программу и получите листинг препроцессора с разрешенными макросами. Это будет более читабельно.   -  person Alex F    schedule 01.09.2014
comment
Макросы делают это немного сложнее для чтения. Хотя я не говорю на PowerPC, не будет ли это несколько легче читать/обслуживать как #define mfspr(rn) ({unsigned long rval; asm volatile("mfspr %0,%c1" : "=r" (rval) : "i" (rn)); rval; })?   -  person David Wohlferd    schedule 02.09.2014


Ответы (1)


Макрос mfspr генерирует ассемблерную инструкцию mfspr, которая считывает данный регистр специального назначения в регистр, выбранный компилятором, который затем присваивается rval, следовательно, становится возвращаемым значением выражения.

Как говорится в комментарии, SPRN_IVOR32 - это Interrupt Vector Offset Register 32, содержимое которого таким образом извлекается в ivor[0].

person Jester    schedule 01.09.2014
comment
Спасибо @Jester, один вопрос, все это упражнение посвящено эмуляции регистра MSR в PowerPC? - person Amit Singh Tomar; 01.09.2014
comment
Он ничего не эмулирует, он просто предоставляет способ доступа к регистру из C. - person Jester; 01.09.2014