| ubi_io_read#(PNUM, OFFSET, N0, N, PEBS; BUF; BITFLIPS, ERR) {if PNUM < # PEBS ∧ ¬ PEBS[PNUM].bad ∧ OFFSET + N ≤ PEB_SIZE ∧ N0 + N ≤ # BUF then {ERR := EIO; BITFLIPS := false; let TRIES = 0 in while ERR ≠ ESUCCESS ∧ TRIES ≤ UBI_READ_RETRIES do {/* (inv-io-read : invariant PNUM < # PEBS ∧ ¬ PEBS[PNUM].bad ∧ OFFSET + N ≤ PEB_SIZE ∧ N0 + N ≤ # BUF ∧ TRIES ≤ UBI_READ_RETRIES + 1 ∧ # BUF = # BUF` ∧ range=(BUF, 0, BUF`, 0, N0) ∧ range=(BUF, N0 + N, BUF`, N0 + N, # BUF` - N0 + N) ∧ (ERR = ESUCCESS ∨ ⌊ERR⌋ ) ∧ (ERR = ESUCCESS → subarray(BUF, N0, N) = subarray(PEBS[PNUM].data, OFFSET, N)) wfbound UBI_READ_RETRIES + 1 - TRIES) */; mtd_asm_read#(PNUM, OFFSET, N0, N, PEBS; BUF; BITFLIPS, ERR); if ERR ≠ ESUCCESS then debug#("ubi-io: failed to read from PEB " + PNUM.toString); TRIES := TRIES +1}} else abort } |