怎麼調試S12X微控制器的XGATE上的軟件

S12X MCU上有一個協處理器,嗯,一個準雙核處理器,但是之前都不會用,最近準備學習下怎麼使用它。於是乎開始研究官方文檔。

翻譯的資料是公開的,在這裏下載https://www.nxp.com/products/microcontrollers-and-processors/additional-processors-and-mcus/8-16-bit-mcus/16-bit-s12-and-s12x-mcus/ultra-reliable-s12xe-high-performance-automotive-and-industrial-microcontrollers:S12XE?tab=Documentation_Tab,我想應該不會有什麼版權問題,如涉及版權問題,請聯繫我刪除文章。另感謝NXP提供的學習資料。


Investigating XGATE Software Errors

XGATEV2 (S12X) Software Error Debugging Aid
by: Dirk Heisswolf
MCD Design
Munich, Germany

譯者注:譯者博客(http://blog.csdn.net/lin_strong),轉載請保留這條。此爲官方文檔AN3555的翻譯,僅供學習交流使用,請勿用於商業用途。

介紹

XGATE外設協處理器擁有一個名爲軟件錯誤探測(Software Error Detection)的安全特性。軟件錯誤探測特性使XGATE能探測到不應該在程序執行中出現的狀態(condition)。探測到這些狀態說明應用程序代碼有問題。

XGATE一探測到軟件錯誤狀態就會立即追蹤程序的執行並觸發CPU12X的中斷以進行糾錯行動。在典型的應用程序中,糾錯行動只會簡單地初始化並重啓系統。然而,在應用程序代碼的開發調試階段,我們會想要精確定位XGATE軟件錯誤。

這篇文檔會幫助你調查S12X設備上XGATE軟件的錯誤。文檔的第二部分討論了S12XE(和S12XF)產品家族。

注意:
這篇應用筆記描述的是寫這篇文檔時,出廠的S12X設備上的XGATE的行爲。其中描述了一些沒有在參考手冊中提到的行爲,這些行爲可能在以後的XGATE下無效。這篇文檔的目的是提供調試應用程序代碼的有用信息。不要將其當成XGATE的附加規範。

軟件錯誤探測特性

軟件錯誤探測是XGATE的一個安全特性。它提供了一個機制,這個機制會在XGATE被要求做非法行爲時停止程序執行並求助。
非法行爲由一個軟件錯誤狀態集定義(章節2.1)。軟件錯誤狀態包含那些不受MCU架構支持以及與MCU存儲器保護方案衝突的特性。軟件錯誤狀態根本不應該出現在應用程序中,我們認爲其表明軟件上的問題。
每當探測到了軟件錯誤狀態,XGATE會追蹤程序執行並執行兩個步驟:先觸發CPU12X的一箇中斷(章節 2.2),然後進入一個叫做special Software Error State的狀態(章節2.3)。
爲了使XGATE應用程序代碼的錯誤對系統造成的可能傷害最小化,XGATE會在探測到問題的瞬間追蹤代碼的執行。它不會終止當前指令的執行。
儘管從安全的角度來看,人們更想要在指令執行期間直接中斷程序的執行,但這樣卻會增加調試軟件錯誤時的複雜性。
指令會在它們指定的操作完成前被停止。實際執行完了哪一部分取決於XGATE模塊的實現。
當前有兩個修訂版:主要整合進S12X設備的XGATEV2以及S12XE MCU中XGATEV3(增強型XGATE)。這些版本在軟件錯誤探測特性的實現上有輕微的區別。這篇文檔討論了軟件錯誤的行爲,針對的是XGATEV2這個版本。

軟件錯誤狀況

不是每一個給予XGATE的指令都可以或應該被執行。那些調用未實現的硬件特性的指令無法產生有意義的輸出。那些與存儲器保護方案衝突的指令必須被阻止以保護數據一致性。章節 2.1.1和章節 2.1.2分別列出了這兩類軟件錯誤狀態的清單。圖 2中給出了所有狀態的總結。

未支持特性的調用

有四個軟件錯誤狀態表明使用了未支持的硬件特性:

  • 未定義的操作碼 — XGATE的指令集有許多未定義的操作碼。執行它們會導致軟件錯誤。圖 1列出了所有的非法XGATE指令。對於未來發行的XGATE,這個清單可能會由於其後加入新特性而減少。
    非法指令
    圖 1.非法指令
  • 訪問非對齊的字(對於奇地址的16bit訪問)
    S12X架構不允許XGATE對它的存儲器進行非對齊字的訪問。所以以下三種訪問都會導致軟件錯誤:
    — 從奇地址取操作碼
    — 從一個奇地址讀16位數據
    — 向一個奇地址寫16位數據
  • 未實現的內存地址
    在S12X設備上,如果MCU被加密並處於擴展模式下,可以隱藏Flash存儲器。訪問這些未實現的內存地址會觸發一個軟件錯誤。
  • 對Flash空間的寫訪問
    S12X設備上的flash存儲器不可以由XGATE通過寫非易失性存儲器的地址空間來編程。由於一般的應用程序代碼根本不會想要寫這些內存地址;如果企圖寫的話就會提交軟件錯誤。

存儲器保護方案的衝突

第二類軟件錯誤狀況是人爲的存儲器訪問限制。這是爲了最小化出錯的程序代碼可能造成的損害。S12X上實現了兩類存儲器保護。

  • 從寄存器地址空間執行的代碼 -
    每個S12X產品家族的XGATE都不允許從寄存器地址空間執行代碼。這有兩個原因。這是一個安全特性。由於從寄存器地址空間執行代碼通常不是一個好的實踐,它可以用於標識跑飛的代碼。這還是一個加密特性,用於阻止破解者訪問被加密的MCU的系統資源。
    XGATEV2的向量提取被看做操作碼提取。從寄存器空間提取一個向量會導致一個軟件錯誤。
  • 用戶定義的存儲器保護 -
    S12X MCUs提供了一個簡單的RAM寫保護方案。RAM被分爲三個區塊(section):一個CPU12X區塊、一個XGATE區塊和一個共享區塊。這些區塊間的邊界是可配置的(圖4)。XGATE如果想寫入S12X區塊的話,就會觸發一個軟件錯誤。

軟件錯誤狀態的總結
圖 2.軟件錯誤狀態的總結

軟件錯誤中斷

XGATE一探測到軟件錯誤狀況就會置位軟件錯誤中斷標誌位(XGSWEIF),這會觸發CPU12X的一個可屏蔽的中斷(通過設置CPU12X狀況碼寄存器的1bit來屏蔽)。這個中斷請求會一直維持到XGSWEIF標誌位在中斷服務例程中被清零。

Software Error State

如果XGATE由於一個軟件錯誤而追蹤代碼執行,它會進入Software Error State。這個state給應用程序代碼提供了一個機會來在恢復正常運行前記錄和修復問題(典型地會重啓應用)。XGATE會一直停留在這個state直到XGSWEIF標誌位被清零。離開Software Error State總是會結束當前的線程。

如這篇文檔中描述的(見第4節)XGATE軟件錯誤的調查必須在XGATE還在Software Error State時進行。

調試目標

爲了理解軟件錯誤發生的原因,需要了解以下信息:

  • 當發生問題時哪個通道正活躍?
  • 正在執行哪條指令或者取哪個向量?
  • 錯誤發生時正在取指令或向量的哪個週期?
  • 觸發了哪個軟件錯誤狀態?
  • 當發生錯誤時,RISC內核寄存器的狀態?

不幸的是,XGATE沒有任何方法來直接提供以上信息。但是它提供了足夠的信息來追蹤問題的發生。

只有有限個數的情景會導致軟件錯誤。其中每一個都會在軟件錯誤發生後在XGATE的寄存器內留下一個特徵簽名。

爲了調查軟件錯誤的原因,這些簽名被分解爲一個可觀測狀態的集合。必須一個接一個檢查這些狀態。如果相關的可觀測狀態不滿足的話,就可以排除對應的軟件錯誤情景了。如果只剩下一個可能的軟件錯誤情景,那這個排查過程就完成了。一旦確定了軟件錯誤情景,你就獲得了想要的調試信息。

XGATE典型地能提供足夠的信息來推斷錯誤發生前的狀態。但是,有少數情況會推斷出兩個可能的情景。這些情況下,需要根據應用程序代碼的上下文進行進一步的調查。

調查軟件錯誤

以下章節詳細解釋了發現一個XGATE軟件錯誤源頭的過程。

信息來源

用於調試S12X上XGATE軟件錯誤的信息可以從圖3中所示的18個寄存器中獲取。

調試S12X設備的信息來源
圖 3.調試S12X設備的信息來源

這些寄存器是:

  • XGATE的狀態和調試寄存器(XGCHID、XGVBR、CGPC、XGCCR、XGR7..XGR1)
    。它們提供了關於XGATE的RISC內核和當前指令狀態的信息。
  • MCU的Part ID寄存器(PARTIDH、PARTIDL)
    這個寄存器被用於確定設備上的XGATE的實現。
  • S12XMMC的RAM保護寄存器(RAMWPC、RAMXGU、RAMSHL、RAMSHU)
    這些寄存器確定了被保護的內存的範圍。
  • Mode寄存器和Flash加密寄存器(MODE、FSEC)
    要用這些寄存器來找出XGATE的內存映射圖中未映射的區域。

由於其中一些寄存器可以用來獲得相關的內存地址,爲了調查軟件錯誤,在調查期間一定要保證內存內容不變。

存儲器保護

如2.1節中所述,有兩類軟件錯誤狀態。第一類是“未支持特性的調用”(見2.1.1節),包括訪問地址映射中未映射的地址。在S12X設備上,只有一個情景下XGATE的地址映射中的某段地址範圍會未映射。如果MCU處於擴展模式下並被加密;Flash會因爲加密而被禁用。在這種情況下,訪問Flash地址會導致軟件錯誤狀態 2、5、7、9、10或15(見圖2)。

另一類軟件錯誤狀況是“存儲器保護方案的衝突”(見2.1.2節)。除了通常的限制外,從寄存器地址取操作碼和向量也是被禁止的。S12X設備提供了一個可配置的RAM寫保護方案。有三個寄存器(RAMXGU、RAMSHL和RAMSHU)用於設置兩個寫保護地址範圍的邊界。寫訪問這些地址會觸發軟件錯誤狀態 12或17(見圖2)。

圖 4闡述了S12X設備上所有的存儲器保護方案。

S12X設備上的XGATE內存保護
圖 4.S12X設備上的XGATE內存保護

可觀測狀態

當調查XGATE軟件錯誤時,有一個重要狀態集可以被直接從源寄存器(見4.1節)和MCU內存的當前內容中檢查。對於每一個軟件錯誤的原因,這些可觀測狀態都會有一個確定爲真的子集。如果這個子集中的一個狀態被證明爲假,那對應的原因就可以被排除了。

在S12X設備上,有31個與軟件錯誤調查相關的可觀測狀態。這些狀態被列在圖5中。





圖 5. 用於在S12X設備上調查軟件錯誤的可觀測狀態

軟件錯誤情景

會導致XGATE軟件錯誤的情景的數量很有限。它們可以被歸納爲22個情形。後面的章節描述了所有的情景並描述了怎麼辨識它們。這些是XGATE的RISC內核的週期的記號(見圖6)。

V — 向量提取:總是一個對齊字的讀取,持續至少一個RISC內核週期
P — 程序字提取:總是一個對齊字的讀取,持續至少一個RISC內核週期
r — 8位數據讀取:持續至少一個RISC內核週期
R — 16位數據讀取:持續至少一個RISC內核週期
w — 8位數據寫入:持續至少一個RISC內核週期
W — 16位數據寫入:持續至少一個RISC內核週期
A — 對齊週期:不進行寫入或讀取,持續零或一個RISC內核週期
f — 空閒週期:不進行寫入或讀取,持續至少一個RISC內核週期
特殊情況
PP/P — 分支:如果進入分支的話PP,否則P

圖 6.訪問細節記號

向量提取

XGATE的向量提取序列包含三次內存訪問:對線程起始地址的一次提取、對數據段指針的一次提取以及對首個指令的一次預提取。在向量提取序列間有四種可能的軟件錯誤情景。見圖7。這張表中的用灰體打印的可觀測狀態是冗餘的。


在向量提取序列間可能的軟件錯誤
圖 7.在向量提取序列間可能的軟件錯誤

非法指令

在S12X設備上,XGATEV2實際上有兩個修訂版。兩個在執行非法指令的方式上有輕微的區別。圖8展示了這兩個版本的行爲。以“L15Y”作爲結尾的掩碼集(PARTIDH寄存器讀取爲0xC4)是一個修訂版。剩下的所有S12X MCU的XGATE是另一個修訂版。

非法指令導致的軟件錯誤
圖 8.非法指令導致的軟件錯誤

在一個線性流中的操作碼預取

單週期指令(Single Cycle Instructions)是指所有耗費一個XGATE週期來執行的指令,如邏輯或算術運算。所有這些指令都會執行一個操作碼預取,如果指令位於地址0xFFFE處,操作碼預取就會發生在寄存器空間。圖9給出了這種情景的描述。

操作碼預取導致的軟件錯誤
圖 9.操作碼預取導致的軟件錯誤

有三個特殊指令需要在操作碼預期後有一個對齊週期(可選週期):SIF、SSEM和CSEM。由於對齊週期不會觸發軟件錯誤,這些操作可以當做單週期指令。

由單週期指令導致的軟件錯誤無法與由跳轉或分支到地址0x0000(4.4.4節)導致的軟件錯誤區分開來。可以基於應用程序上下文來確定錯誤原因。

分支和跳轉指令

分支和跳轉需要兩個XGATE總線週期。它們執行兩次取操作碼以在它們設置程序計數器爲新地址後填充RISC內核的指令隊列。
如果分支條件爲false的話,條件分支表現的就像單週期指令。在這種情況下,只會執行首個取操作碼週期,第二個被跳過了。
可能在這些週期中發生的軟件錯誤狀態被列在圖10中。這張表中打印爲灰色的可觀測狀況是冗餘的。

可能由跳轉或分支指令引起的軟件錯誤
圖 10.可能由跳轉或分支指令引起的軟件錯誤

1 如果分支條件爲false,則略過
2 僅用於JAL指令

到奇數地址的分支是不可能的,因爲分支偏移量指的是字的個數。只有JAL指令可能導致這個軟件錯誤狀態。

如果是在第二個週期探測到的軟件錯誤,那調試起來可能很麻煩。

在執行第二個 P-週期 前,程序計數器被更新爲緊跟目標地址的指令,這會給軟件錯誤調查帶來兩個問題。

  • 當前指令的地址丟失了。XGATE不能提供直接確定是哪條分支或跳轉指令導致了軟件錯誤的信息。
  • 分支或跳轉到地址0x0000會留下與從地址0xFFFE執行指令同樣的寄存器簽名。這兩個情景無法被清晰地區分。

在指令執行期間對程序計數器的更改實際上使得確定軟件錯誤狀況更加簡單了,因爲取操作符的關鍵地址可以直接通過(XGPC+2)得到。然而,準確找到導致問題的指令需要進一步調查。通常需要以下過程:

  • 所有可能導致問題的分支指令都可以通過code linting來找到。所有將程序流導向地址XGPC+2的分支指令都受到懷疑。爲了簡化這一步,所有指向寄存器地址的分支指令都應被排除。但是,這並不總能做到,因爲這些操作碼有可能出現在數據結構中。
  • 假設軟件錯誤是由一個JAL指令造成的,那麼返回地址(跟在JAL指令後的地址)會存儲在通用目的寄存器(XGR1..XGR7)之一中。
    可能觸發軟件錯誤的跳轉指令的清單可以通過遍歷通用目的寄存器得到。如果所有以下條件都滿足:
    — XGR*n* & 1 恆等於 0
    — XGR*n* > 0x0800
    — [XGR*n*-2] 恆等於 0x00F6 | (256* n)1
    那麼,位於地址XGR*n* - 2處的JAL R*n*指令就是嫌疑人之一。

任何進一步的調查都要檢查應用程序的代碼。

加載和存儲指令

所有的加載和存儲指令都要執行兩次總線訪問:一次預取操作碼和一次數據訪問。圖一中展示了可能由這些指令觸發的軟件錯誤狀態。

可能由加載或存儲指令引發的軟件錯誤(1)
可能由加載或存儲指令引發的軟件錯誤(2)
可能由加載或存儲指令引發的軟件錯誤(3)
可能由加載或存儲指令引發的軟件錯誤(4)

爲了調查數據訪問失敗的原因,數據地址需要通過操作碼和對應的通用目的寄存器來重建。這些寄存器(目的寄存器和自動遞增/遞減係數寄存器)在軟件錯誤發生時不會改變。

因爲目的寄存器和自動遞增/遞減係數寄存器在指令執行失敗時不會變化;數據地址以及軟件錯誤的原因就可以很明確地確定。

發現軟件錯誤的原因

S12X上有16種軟件錯誤狀態和31種可觀測狀態。爲了總覽它們的關係,我們在圖12中總結了上章節中的相關信息。每行是一種可觀測狀態,而每列是一種軟件錯誤情景。在一種情景下爲“真”的條件被標記爲“X”。

一旦可以認爲一個可觀測狀態爲“假”,那標記這一行的軟件錯誤狀態就都可以排除了。探測的目標就是通過迭代所有狀態(行),排除到只剩下一個情景(列)。當在狀態間迭代時,只需要檢查那些可以排除額外情景的狀態。那些冗餘的可以直接跳過。

在後面的“向量提取失敗”中展示了排除後留下兩種可能的軟件錯誤情景的情況。這種情況下就需要基於程序代碼進行進一步的調查。


圖 12.映射可觀測條件到軟件錯誤狀態

示例

下例示範了在S12X上的調查過程。

向量提取失敗

在這首個例子中,如果XGATE在Software Error State,可以讀到以下寄存器值。


圖 13.XGATE寄存器值

這些寄存器的值反映出條件16(見圖5)爲假。這已經足夠推論出軟件錯誤的原因了。


圖 14.探測到從寄存器地址的向量提取

通道0x38被觸發,XGATE試圖從寄存器地址提取首個向量。向量基寄存器(XGVBR)沒有指向正確的向量表。

非法操作碼

第二個例子中,如果XGATE在Software Error State,可以讀到以下寄存器值(圖15)。從RAM中可以讀到如圖16中的程序碼,我們假設CPU12X的錯誤handler沒有修改這些RAM地址。


圖 15.XGATE寄存器值


圖 16.XGATE代碼序列

只需要檢查六個可觀測狀態就能確定問題的原因。

在地址0x9238執行了非法指令0x0D。不需要檢查PARTID寄存器你就知道設備的掩碼號不是以“L15Y”結尾的。


圖 17.探測非法指令的執行

操作碼預提取失敗

下一個軟件錯誤稍微有點難辨別。如果XGATE在Software Error State,並且讀到如圖18的寄存器值以及如圖19的內存內容。我們假設CPU12X在調查軟件錯誤期間沒有修改XGATE的程序代碼。


圖 18. XGATE寄存器值


圖 19.XGATE代碼序列

遍歷可觀測狀態(見圖20)可以把9個錯誤條件縮小到兩個。兩個可能爲:

  • 在0xFFFE執行了一條指令然後從0x0000預提取一條操作符。
  • 執行了一個指向0x0000的Branch或者Jump指令。

31種狀態(見圖5)都沒有辦法區分出這兩個可能的原因,所以需要進一步的調查。

掃過XGATE的整個64KB地址都沒有發現指向0x0000的分支指令。

Jump(JAL)指令在通用目的寄存器(XGR1-XGR7)中留下了一個返回地址。看完這些寄存器我們發現:

  • XGR7和XGR6不包含有效的返回地址,因爲它們指向寄存器地址。
  • XGR5和XGR4包含奇數值,也不是有效的返回地址
  • XGR3、XGR2和XGR1指向有效的程序地址,但是在每個返回地址前沒有對應的JAL指令。

排除了Jump和Branch指令,我們確定問題是由於從0xFFFE執行一條指令而產生的。


圖 20.探測到兩個可能原因

失敗的寫訪問

最後一個例子中,觸發軟件錯誤後寄存器值如圖21。


圖 21.XGATE寄存器值

XGATE的程序計數器指向以下RAM內容(見圖22)。


圖 22. XGATE代碼序列

對照9個可觀測狀態(見圖23),可以看出軟件錯誤是由於一次非法的寫訪問造成的。程序計數器中的指令及對應通用目的寄存器表明,正想往0x4000寫入。這個地址位於Flash,滿足了軟件錯誤條件11。


圖 23. 探測到非法的寫訪問

參考文獻

  1. Datasheet to MC9S12XDP512, Freescale Semiconductor Inc., 2005.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章