<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TC3xx芯片的Endinit功能詳解

832065824 ? 來源:汽車電子嵌入式 ? 2023-11-27 09:23 ? 次閱讀

前言

為了提供系統的安全性能,TC3xx上一些重要的寄存器都受Endinit保護,不能直接修改。如果想要修改這些重要寄存器,就需要先按特定步驟解鎖Endinit,然后才能修改這些重要的寄存器的值,最后還要上鎖Endinit。那什么是Endinit功能了? -- 本文就來詳細解鎖TC3xx芯片的Endinit機制。

Note: 第1到5章節都是關于Endinit的概念介紹,如果感覺比較枯燥可以先從第6章節的實際應用開始閱讀。

縮略詞

簡寫 全稱
Endinit End of initialization
WDTCPUyCON0 CPUy WDT Control Register 0
WDTSSR Safety WDT Status Register

注:本文章引用了一些第三方工具和文檔,若有侵權,請聯系作者刪除!

正文

1.功能概述

在系統或應用程序的初始化過程中,通常只對一些寄存器進行一次編程(programmed only once)。 在正常應用程序運行期間修改此類寄存器可能會嚴重影響模塊或整個系統的整體運行。

雖然 Supervisor Mode 和 Access Protection 方案提供了一定級別的保護,防止意外修改,但它們可能不足以防止對系統關鍵注冊器的所有意外訪問。

為這類寄存器提供了額外的保護,稱為 Endinit (“Endoff initialization”)。 Endinit 是一種寫保護方案,它只允許在特定時間進行寫入,并使受此功能保護的寄存器的意外修改幾乎不可能實現。

Endinit 功能由每個 WDT 控制寄存器中包含的 ENDINIT 位組成。 通過 Endinit 保護的寄存器決定是否啟用寫入。 只有當相應的 ENDINIT =0 且主管模式處于活動狀態時,才會啟用寫入。 如果這種情況不正確,則寫入嘗試將被放棄,在這種情況下,寄存器內容將不會被修改。

為了獲得最高的穩定性,寫入 ENDINIT 位將受到 WDT 中實施的高度安全的訪問保護方案的保護。 這是一個復雜的過程,幾乎不可能無意中修改 ENDINIT bits。 此外,每次軟件通過清除相應的 ENDINIT 位來打開對關鍵寄存器的訪問時,每個 WDT 都會啟動超時序列來監視 ENDINIT 位的修改。 如果超時時間在相應的 ENDINIT 位再次設置之前結束,則假定軟件出現故障,并生成看門狗故障響應。

以下各節介紹了 WDT 的訪問保護方案和 Endinit 超時操作。 在每個模塊 (包括 SCU 本身) 的寄存器概覽表中,通過每個 Endinit 類型保護的寄存器在描述寫入訪問的列中標識,如下所示:

“ CEy” - CPU 關鍵寄存器。 僅當 CPUy WDT ENDINIT=0 (y=CPU number) 時可寫。也就是,只有把要要訪問這個寄存器的CPU的ENDINIT設為0后,這個寄存器才能被這個CPU寫訪問(也就是解鎖WDTCPUyCON0.ENDINIT)。

“ E ” - 系統關鍵寄存器 - 任何 (一個或多個) CPUy 看門狗計時器 ENDINIT=0 或 EICON0.ENDINIT=0 時可寫。也就是,任意一個CPU的ENDINIT設為0后,所有CPU都可以對這個寄存器進行寫訪問。

“ SE ” - 安全關鍵寄存器 - 僅當安全監控計時器 ENDINIT=0 或 SEICON0.ENDINIT=0 時才可寫入。也就是,Safety Watchdog的ENDINIT設為0后,Safety EndInit的保護就解除了,所有CPU都可以對這個寄存器進行寫訪問(也就是解鎖WDTSCON0.ENDINIT)。

以上都不是 - 隨時都可以訪問

圖 1顯示了解鎖各種 ENDINIT 寫保護模式的選項。

08a24cd8-8cb8-11ee-939d-92fbcf53809c.png

Figure 1: ENDINIT Control Registers

Note: ENDINIT 位的清除需要一些時間。 在清除 ENDINIT 位后訪問受 Endinit 保護的寄存器必須僅在 ENDINIT 位真正被清除時進行。 作為一種解決方案, ENDINIT 位應在 ENDINIT位 清除后第一次訪問受 Endinit 保護的寄存器之前被讀回一次。

2.WDTxCON0 的密碼訪問(Password Access toWDTxCON0)

為了解鎖WDTxCON0(x=CPUy and y=CPU number, or S)寄存器并修改WDTxCON0寄存器,必須往WDTxCON0寄存器中寫入正確的密碼(password)。軟件必須事先知道正確的密碼,或者在運行時計算密碼。 每個監視程序計時器(Watch)的密碼 (x=CPUy 和 y=CPU 編號,或 S) 可以不同,以便提供獨立的監視程序功能程序流,以具有獨立的監視程序功能。

安全監視器密碼寄存器(Safety Watchdog password register)WDTSCON0 受通用 SCU 保護,該保護方案只允許配置的masters具有寫入訪問權限。

特定于 CPU 的監視程序密碼寄存器(CPU-specific Watchdog password) WDTCPUyCON0 單獨受到保護,因此它們只能由相應的 CPUy 寫入。

在安全應用程序中可以使用看門狗來提供恢復時間,在此期間軟件可能會嘗試從安全警報警告中恢復。 為確保 CPU 故障不允許忽略故障,提供了一個選項,用于在安全管理單元 (SMU) 處于故障狀態時防止看門狗解鎖。 此選項可由位 WDTxCON1.UR 啟用。

如果密碼有效且 SMU 狀態滿足 WDTxSR.US 位的要求,則一旦密碼訪問完成, WDTxCON0 將被解鎖。 解鎖條件將由 WDTxCON0.LCK = 0 指示。 為了確保正確的服務順序(servicing sequence),只有在訪問之前設置了 WDTxCON0.LCK 位時才允許密碼訪問。

如果在密碼訪問期間向 WDTxCON0 寫入了不正確的密碼值,則存在看門狗訪問錯誤情況。 位 WDTxSR.AE 已設置,并向安全管理單元 (SMU) 發送警報請求。 14 位用戶可定義密碼 WDTxCON0.PW 提供了其他選項,用于根據應用程序的需要調整密碼要求。 例如,它可用于檢測意外的軟件循環,或監視例程的執行順序。

下表 匯總了密碼的要求。 有多種選擇,下文將更詳細地介紹這些選擇

Table 1:Password Access Bit Pattern Requirements

08bc3a12-8cb8-11ee-939d-92fbcf53809c.png

2.1 Static Password

在靜態密碼模式 (WDTxSR.PAL=0) 中,密碼只能通過有效的“修改訪問”進行更改。 密碼訪問(Password Access)的設計使其不可能簡單的讀取寄存器并重寫寄存器。 在重新寫入之前,某些密碼讀取位必須反向 (切換)。 這可以防止簡單的故障通過簡單的讀 / 寫序列意外解鎖 WDT。

2.2 Automatic Password Sequencing

如果啟用了自動密碼排序 (WDTxSR.PA=1) ,則每次檢查密碼后,密碼會自動更改 (即Password Access or Check Access)。 預期的下一個密碼遵循基于具有特征多項式 x14+X13+x12+x2+1 的 14 位斐波那契(Fibonacci) LFSR (Linear Feedback Shift Register) 的pseudorandom sequence。 修改訪問權限還可以提供初始密碼 (或后續手動密碼更新)。

08db0f64-8cb8-11ee-939d-92fbcf53809c.png

Figure 2: Password Sequencing LFSR

2.3 Time-Independent Pasword

如果未啟用時間檢查 (WDTxSR.TCS=0) ,則 WDTxCON0 寄存器的 REL 字段必須在密碼訪問期間使用現有的重新加載值重新寫入。

2.4 Time Check Password

如果啟用時間檢查 (WDTxSR.TCS=1) , WDTxCON0 寄存器的 REL 字段必須使用當前 WDT 計數值的反向 (位翻轉) 估計值寫入。 此估計的可接受誤差幅度 (在 WDT 時鐘周期內) 由 WDTxSR.TCT 的值指定。 如果寫入的估計值超出 WDTxSR.TIM +/- WDTxSR.TCT 范圍,則 SMU 回發出Alarm報警。 此機制可以檢查自上次 WDT 重新啟動以來已過的程序執行時間。 請注意,當 WDT 以超時模式運行 (訪問受 ENDINIT 保護的寄存器后) 時,密碼或檢查訪問仍需要時間檢查比較。

3. WDTxCON0的檢查訪問(Check Access to WDTxCON0

Check Access 與 Password Access 相同,只不過鎖位(lockbit)未被清除,因此不允許后續的“修改訪問”。 如果滿足寫入數據要求,“檢查訪問”不會觸發 SMU 警報請求。 只有在設置了 LCK 位時才能執行檢查訪問。

此類訪問用于 WDT 服務之間的中間檢查點。 這可以用于任務序列或執行時間監控 (例如,與時間戳計數檢查功能或序列密碼結合使用)。

Table 2: Check Access Bit Pattern Requirements

08f0f8e2-8cb8-11ee-939d-92fbcf53809c.png

如果在檢查訪問期間向 WDTxCON0 寫入了不正確的值 (x=CPUy and y=CPU number, or S) ,則存在看門狗訪問錯誤情況。 位 WDTxSR.AE 已設置,并向安全管理單元 (SMU) 發送警報請求。

4. WDTxCON0的修改訪問(Modify Access to WDTxCON0

如果密碼訪問(Password Access)成功解鎖 WDTxCON0 (x=CPUy and y=CPU number, or S) ,則以接下來的WDTxCON0 的寫入訪問可以對其進行修改。 但是,這種訪問也必須滿足某些要求才能被接受并被視為有效。 表 3列出了所需的位模式(bit patterns)。 如果訪問不遵循這些規則,則會檢測到監視程序訪問錯誤情況,設置位 WDTxSR.AE ,并向安全管理單元 (SMU) 發送警報請求。 修改訪問完成后,將再次設置 WDTxCON0.LCK ,自動重新鎖定 WDTxCON0。 在重新修改寄存器之前,必須再次執行有效的密碼訪問。

Table 3: Modify Access Bit Pattern Requirements

090ff8b4-8cb8-11ee-939d-92fbcf53809c.png

5. 訪問受Endinit保護的寄存器

如果在運行期間需要對受 Endinit 保護的寄存器進行寫入訪問,則可以在有限的時間內臨時重新啟用寫入訪問。 提供了兩種選擇:

通過 WDT 刷新重新啟用對受 ENDINIT 保護的寄存器的訪問

無需 WDT 刷新即可重新啟用對 ENDINIT 保護的寄存器的訪問

為了獲得調試支持, Cerberus 模塊可以覆蓋所有 WDT 的所有 ENDINIT 控件,以簡化調試流程。 如果設置了 CBS_OSTATE.ENIDIS位 ,則所有 ENDINIT 保護都將被禁用,而不管 WDT 配置的當前狀態如何。 如果清除了 CBS_OSTATE.ENIDIS ,則完整的ENDINIT控制位于 WDT 內。

5.1 通過WDT訪問Endinit保護的寄存器

要重新啟用訪問(修改受Endinit保護的寄存器),必須先使用有效的密碼訪問解鎖 WDTxCON0。 在隨后的有效修改訪問中,可以清除 ENDINIT。解鎖WDTxCON0且清除ENDINT后, 就能再次打開對受 Endinit 保護的寄存器的訪問。 注意,當 WDTxCON0 解鎖時, WDT 會自動切換到超時模式。 因此,訪問窗口有時間限制。 超時模式僅在重新設置 ENDINIT 后終止,需要另一個有效密碼和有效的 WDTxCON0 修改訪問權限。

5.2 不通過WDT訪問Endinit保護的寄存器

在某些應用中,可能不使用 WDT ,并將被禁用 (WDTxSR.DS =1) ,盡管不建議這樣做。

在其他應用程序中,可能會使用 WDT 時間戳功能,刷新之間的 WDT 訪問將是不可取的。

在這種情況下,仍然可以使用 ENDINIT 全球控制寄存器 (EICONx) 來臨時訪問受 Endinit 保護的寄存器。

6. Endinit實際應用

6.1 Endinit需求及場景介紹

需求:在ECU上電后需要在Startup階段關閉看門狗,也就是配置WDTxCON1(x標識CPU0-5)的DR位域。但是,WDTxCON1寄存器是受Endinit保護的。所以,在修改前我們需要解鎖Endinit,修改完WDTxCON1寄存器后再上鎖Endinit。

092a8cce-8cb8-11ee-939d-92fbcf53809c.png

09427212-8cb8-11ee-939d-92fbcf53809c.png

分析1:因為CBS_OSTATE.ENIDIS只有在Debug模式下通過Cerverus module來Disable(置位CBS_OSTATE.ENIDIS),所以上電的時候因為CBS_OSTATE.ENIDIS是被Cleared的。

所以,能夠通過WDT模塊解鎖Endinit功能。參考第5章節兩種解鎖Endinit的方式。

分析2:WDTSSR寄存器的Reset值是0xFFFC 0010,則WDTSSR.PAS為0,WDTSSR.TCU為0。

095542de-8cb8-11ee-939d-92fbcf53809c.png

09723d12-8cb8-11ee-939d-92fbcf53809c.png

所以,使用static password來解鎖Endinit.參考2.1和2.2章節的static password和Automatic Psassword 。

分析3:我們通過配置WDTSCON0寄存器來解鎖Endinit.

09927974-8cb8-11ee-939d-92fbcf53809c.png

6.2 Endinit解鎖

解鎖流程,參考Table 1.

Example: 解鎖CPU0的Endinit.

#define WDT_WDTSCON0_ADDR    0xF0036024u
 
 
#define STARTUP_CLR_WDTLCK_WDTHPW27       (0xFFFFFF01u)
 
#define STARTUP_SET_WDTHPW27                      (0xF0u)
 
#define STARTUP_SET_ENDINIT                      (0x01u)
 
#define STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT       (0xFFFFFFF0u)
 
#define STARTUP_SET_WDTLCK                       (0x02u)
 
#define STARTUP_SET_WDTLCK_ENDINIT               (0x03u)
 
 
void UnlockEndinit_Core0(void)
 
{
 
  volatile uint32 WDTCON0_Register_Value;
 
  volatile uint32 *WDTCON0_Address;
 
  WDTCON0_Address = WDT_WDTSCON0_ADDR;
 
 
  /*
   * Create password and send to WDTSCON0
   */
 
  WDTCON0_Register_Value = *WDTCON0_Address;
 
  /* Clear WDTSCON0.LCK, WDTSCON0.PW[2:7]*/
 
  WDTCON0_Register_Value &= STARTUP_CLR_WDTLCK_WDTHPW27;
 
  /* Set WDTSCON0.PW[2:7] to 0xF */
 
  WDTCON0_Register_Value |= STARTUP_SET_WDTHPW27;
 
  /* Written 1 to WDTSCON0.ENDINIT for password access */
 
  WDTCON0_Register_Value |= STARTUP_SET_ENDINIT;
 
  *WDTCON0_Address = WDTCON0_Register_Value;  
 
  /*
   * Set the bit ENDINIT to 1 or 0 to allow access to registers of WDT_CON1 e.g.
   */
 
 
  /* Clear WDTSCON0.PW[2:7], WDTSCON0.LCK, WDTSCON0.ENDINIT  */
 
  WDTCON0_Register_Value &= STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT;
 
  /* WDTSCON0.PW[2:7]=0, WDTSCON0.LCK=1, WDTSCON0.ENDINIT=0 */
 
  WDTCON0_Register_Value |= STARTUP_SET_WDTLCK;
 
  *WDTCON0_Address = WDTCON0_Register_Value;
 
  WDTCON0_Register_Value = *WDTCON0_Address;
 
}

6.3 Endinit上鎖

上鎖流程,參考Table 3.

Example: 上鎖CPU0的Endinit.

void LockEndinit_Core0(void)
 
{
  volatile uint32 WDTCON0_Register_Value;
 
  volatile uint32 *WDTCON0_Address;
 
  WDTCON0_Address = WDT_WDTSCON0_ADDR;
 
  /*
   * Create password and send to WDTSCON0
   */
 
  WDTCON0_Register_Value = *WDTCON0_Address;
 
  /* ClearWDTSCON0.LCK, WDTSCON0.PW[2:7]*/
 
  WDTCON0_Register_Value &= STARTUP_CLR_WDTLCK_WDTHPW27;
 
  /* set WDTSCON0.PW[2:7] to 0xF */
 
  WDTCON0_Register_Value |= STARTUP_SET_WDTHPW27;
 
  /* Write 1 to ENDINIT for password access */
 
  WDTCON0_Register_Value |= STARTUP_SET_ENDINIT;
 
  *WDTCON0_Address = WDTCON0_Register_Value;     /* modify access to WDTSCON0 */
 
  /*
   * Set the bit ENDINIT to 1 or 0 to allow access to registers of WDT_CON1 .e.g.
   */
 
  /* Clear WDTSCON0.PW[2:7], WDTSCON0.LCK, WDTSCON0.ENDINIT  */
 
  WDTCON0_Register_Value &= STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT;
 
  /* WDTSCON0.PW[2:7]={0}, WDTSCON0.LCK=1, WDTSCON0.ENDINIT=1 */
 
  WDTCON0_Register_Value |= STARTUP_SET_WDTLCK_ENDINIT;
 
  *WDTCON0_Address = WDTCON0_Register_Value;
 
  WDTCON0_Register_Value = *WDTCON0_Address;
 
}

7. 總結

為了提供系統的安全性,TC3xx芯片提供了Endinit機制來保護一些特殊的寄存器。在修改這些特殊寄存器的時候需要先解鎖Endinit, 在解鎖Endinit時需要考慮使用static靜態還是automatic自動密碼機制以及是否使用超時機制等。確定了解鎖Endinit的類型后,就可以按照特定的步驟來解鎖Endinit,然后按照UnlockEndinit àmodify protected register àLockEndinit的步驟來修改特殊寄存器即可。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    447

    文章

    47984

    瀏覽量

    410345
  • 寄存器
    +關注

    關注

    30

    文章

    5091

    瀏覽量

    117908
  • 應用程序
    +關注

    關注

    37

    文章

    3144

    瀏覽量

    56559

原文標題:TC3xx芯片的Endinit功能詳解

文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    TC3xx芯片時鐘系統的鎖相環PLL詳解

    中的Tick數就是基于模塊時鐘的)。本系列文章就來詳細介紹TC3xx芯片的時鐘系統及其具體配置。本文為TC3xx芯片時鐘系統的鎖相環PLL詳解
    的頭像 發表于 12-01 09:37 ?908次閱讀
    <b class='flag-5'>TC3xx</b><b class='flag-5'>芯片</b>時鐘系統的鎖相環PLL<b class='flag-5'>詳解</b>

    AURIX? TC3XX如何暫時僅啟用/禁用CAN中斷?

    你我使用的是 AURIX? TC3XX。 在 CAN ISR 處理期間,如何暫時僅啟用/禁用 CAN 中斷?
    發表于 01-18 06:47

    TC3xx SCR功耗應該怎么評估?

    TC3xx SCR處于70kHz active狀態,以及CAN WAKE UP也處于active,Tricore都掉電了,這個時候功耗是多少呢?SCR中不同的組件激活狀態下,功耗應該怎么評估,有沒有
    發表于 01-19 08:28

    tc3xx休眠時mcu pin可以是高阻態嗎?如何設置?

    tc3xx,休眠時mcu pin可以是高阻態嗎?如何設置?
    發表于 01-19 08:26

    TC3XX寄存器讀寫時間過長怎么解決?

    我目前在做TC3XX底層代碼優化,經過之前多次測試目前可以確定該系列芯片對單個寄存器地址的讀寫耗時超過100us。請問對于寄存器讀寫耗時你們官方有沒有確切的文件說明?還有就是既然寄存器讀寫時間那么長100M的外設總線時鐘是否有意義?
    發表于 01-25 06:56

    TC3xx系列怎么禁用trap?

    目前在TC3xx調試flash讀寫功能,單獨運行flash相關功能沒有問題,但將flash相關功能集成到工程中。操作pflash就會進入trap中,查看了一些帖子說是要禁掉trap?請
    發表于 01-31 06:21

    TC3xx系列是否支持RTC功能?

    請教各位,TC3xx系列芯片是否支持RTC功能,目前要記錄snapshot的時間點(年月日時分秒)。
    發表于 02-02 07:53

    GCC和TASKING有什么區別?應該為AURIX? TC3xx選擇什么?

    GCC 和 TASKING 有什么區別? 我應該為 AURIX? TC3xx 選擇什么? 這將如何影響代碼的運行?
    發表于 03-01 10:09

    TC3xx的HSM中有沒有單調計數器?

    你好, 我看到 OPTIGA 有單調計數器,但我在 TC3xx 的 HSM 中確實找不到單調計數器。 能否確認TC3xx的HSM中沒有單調計數器?
    發表于 03-05 07:56

    AUTOSAR MCAL-基于Infineon TC3xx芯片的ADC模塊

    ADC模塊的配置,和芯片特性強相關的地方還是有很多地方(AUTOSAR MCAL標準定義的配置項都是一樣的),本文將詳細介紹基于Infineon TC3xx芯片MCAL_ADC模塊特有的一些配置
    的頭像 發表于 01-29 16:45 ?6443次閱讀

    AURIX? TC3xx NVM是非易失性存儲器學習筆記

    TC3xx芯片最多有6個內核,每個核有自己的私有的Memory以及共有的Memory。
    發表于 06-19 09:09 ?3597次閱讀
    AURIX? <b class='flag-5'>TC3xx</b> NVM是非易失性存儲器學習筆記

    TC3xx芯片的Trap功能詳解

    前面介紹了TC3xx一系列的功能與特性,看起來感覺高大上,但是總有一種空中樓閣的感覺:這些復雜的架構、特性、功能在平時好像也用不到呀?
    的頭像 發表于 07-03 09:13 ?3054次閱讀
    <b class='flag-5'>TC3xx</b><b class='flag-5'>芯片</b>的Trap<b class='flag-5'>功能</b><b class='flag-5'>詳解</b>

    TC3xx芯片DMU介紹

    AUTOSAR架構圖下的Fls模塊對上(Fee)模塊提供統一的標準接口,但是具體的實現因不同的芯片而不一樣,Infineon公司的Fls模塊通過操作TC3xx芯片的DMU模塊實現Fls的功能
    的頭像 發表于 08-31 14:10 ?936次閱讀
    <b class='flag-5'>TC3xx</b><b class='flag-5'>芯片</b>DMU介紹

    TC3xx芯片的MPU功能詳解

    在前面的文章文章中我們介紹了RH850-U2A的內存保護單元(MPU),了解了MPU的概念以及在RH850-U2A上的具體使用流程,但是對于TC3xx系列
    的頭像 發表于 09-19 11:42 ?1072次閱讀
    <b class='flag-5'>TC3xx</b><b class='flag-5'>芯片</b>的MPU<b class='flag-5'>功能</b><b class='flag-5'>詳解</b>

    深入解析TC3xx芯片中的SMU模塊應用

    TC3xx芯片是德國英飛凌半導體公司推出的汽車級處理器芯片系列,其中的SMU(System Management Unit)模塊是其重要組成部分之一。SMU模塊在TC3xx
    的頭像 發表于 03-01 18:08 ?595次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>