2014-09-01 27 views
3

從內核源本次大會內嵌代碼片段我有這個下面的代碼片段爲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; }) 

而且,這上面的練習是關於PowerPC的模擬MSR寄存器的位?

任何人都可以幫助我究竟在做什麼嗎?

+0

編譯此程序並獲得解決宏的預處理器列表。這將更具可讀性。 – 2014-09-01 13:17:48

+0

這些宏確實使這一點難以閱讀。雖然我不會說PowerPC,但是這會不會更容易讀取/維護爲'#define mfspr(rn)({unsigned long rval; asm volatile(「mfspr%0,%c1」:「= r」( rval):「i」(rn)); rval;})'? – 2014-09-01 22:10:30

回答

6

mfspr宏生成一條asm指令mfspr,它將給定的特殊目的寄存器讀入由編譯器選擇的寄存器中,然後賦值給rval,因此成爲表達式的返回值。

正如評論所說,SPRN_IVOR32Interrupt Vector Offset Register 32,其內容因此被提取到ivor[0]

+0

謝謝@傑斯特,一個查詢,這整個練習是關於在PowerPC中模擬MSR寄存器? – 2014-09-01 18:38:38

+1

它不是在模擬任何東西,它只是提供了一種從C訪問寄存器的方法。 – Jester 2014-09-01 18:51:23