簡體   English   中英

如何驗證使用frama-c Eva插件或WP-RTE讀/寫硬件存儲器映射寄存器(mmio)的代碼?

[英]How to validate code that read/write to hardware memory mapped registers (mmio) with frama-c Eva plugin or WP-RTE?

我找到的最接近的答案可能與Eva插件的-absolute-valid-range相關,但是它是什么? 我是否必須提出讀/寫ACSL謂詞進行虛擬讀/寫操作?

示例代碼:

#include <stdint.h>

#define BASE_ADDR 0x0e000000
#define BASE_LIMIT 0x0e001000
#define TEST_REG 0x10

/*@ requires BASE_ADDR <= addr < BASE_LIMIT;
  @ assigns \nothing;
 */
static inline uint32_t mmio_read32(volatile uintptr_t addr)
{
    volatile uint32_t *ptr = (volatile uint32_t *)addr;
    return *ptr;
}
/*@
  @ requires 0 <= offset <= 0x1000;
  @ assigns \nothing;
 */
static inline uint32_t read32(uintptr_t offset)
{
    return mmio_read32((uintptr_t)BASE_ADDR + offset);
}

void main(){
    uint32_t test;
    test = read32(TEST_REG);
    return;
}

Frama-c命令和輸出:

[frama -absolute-valid-range 0x0e000000-0x0e001000 -wp mmio2.c
[kernel] Parsing mmio2.c (with preprocessing)
[wp] Warning: Missing RTE guards
[wp] 6 goals scheduled
[wp] [Alt-Ergo] Goal typed_read32_call_mmio_read32_pre : Unknown (Qed:4ms) (51ms)
[wp] Proved goals:    5 / 6
   Qed:             5
   Alt-Ergo:        0  (unknown: 1)][1]

如何釋放目標“typed_read32_call_mmio_read32_pre”或這是預期的?

證明失敗的事實與兩個獨立的問題有關,但它們都與使用絕對地址無關。

首先,由於mmio_read32的參數被標記為volatile ,WP認為它的值可以是任何值。 特別是,在評估addr時,已知在offset上做出的假設都不成立。 您可以通過查看生成的目標在GUI中看到(進入底部的WP目標選項卡,然后雙擊Script冒號和失敗的證明嘗試的行):

Goal Instance of 'Pre-condition'
 (call 'mmio_read32'):
Assume {
  Type: is_uint32(offset_0).
  (* Pre-condition *)
  Have: (0 <= offset_0) /\ (offset_0 <= 4095).
}
Prove: (234881024 <= w) /\ (w_1 <= 234885119).

ww_1對應於對addr的volatile內容的兩次讀訪問。 我不確定你是否真的希望addr參數是volatile (而不是指向volatile位置的非易失volatile指針),因為這需要一個非常奇怪的執行環境。

假設volatile限定符不應該出現在addr的聲明中,剩下的問題是read32offset的約束太弱了:它應該讀取帶有嚴格不等式的offset < 0x1000 (或者mmio_read32的前提條件是非嚴格的,但這又是不常見的)。

關於物理地址和易失性的初始問題,在ACSL中(參見本手冊第2.12.1節),您有一個特定的volatile子句,允許您指定(C,通常為ghost)函數來表示對volatile位置的讀寫訪問。 不幸的是,目前只能通過非公開分發的插件訪問這些子句。

我擔心如果你想在物理地址上使用WP代碼,你確實需要使用編碼(例如,使用適當大小的ghost數組),和/或使用適當的函數模擬易失性訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM