Fixed unaligned data checksumming in two ways (uncrc32c, flcksum)
Checksumming unaligned data during block compaction is surprisingly
tricky. We don't know if our data will be aligned until after
a potentially unbounded number lookups, we need to write data into our
pcache as we go to avoid unnecessary lookups, but if we end up unaligned
we need to revert our checksum to the checksum of the aligned data.
The way I see it there are 4 options:
1. Calculate the checksum after writing data into the block.
This is the most expensive option, requiring a full second read of
the data to calculate the checksum. It is simple though.
2. Do a pass over the btree to figure out alignment before writing.
This at least only reads metadata twice, so is more efficient than
the 1st option.
3. Keep track of the aligned checksum on each flush, falling back to the
last flushed checksum if we need to correct alignment.
This solution is flexible though requires some extra state to track
multiple checksums.
4. Leverage the math behind CRCs to run the CRC backwards when we
truncate for alignment.
This works, though a bit inefficiently, but is strictly tied to
CRC-related checksums.
By inefficient I mean that we would likely be limited to a bit-level
"uncrc32c". It's possible to create nibble/byte tables for uncrc32c,
but this adds significant code cost for a relatively uncritical
function.
I was hopeful that we could leverage the existing tables in both
functions, but unfortunately it doesn't work out like that. You could
scan the crc32c table to find the constant to reverse, but this
requires ~16*2 or ~256 operations vs "naive" ~8 operations per byte.
This commit implements both 3 and 4, defaulting to 4 unless
LFS_NO_UNCRC32C is defined.
The current lfs_uncrc32c implementation is a simple bit-level
implementation, but does allow for crc32c truncation without any extra
state.
code stack
before: 32044 2880
uncrc32c: 32108 (+0.2%) 2880 (+0.0%)
flcksum: 32132 (+0.3%) 2880 (+0.0%)
This commit is contained in:
+108
-54
@@ -2495,8 +2495,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// update each tag in permutation order
|
||||
for (unsigned j = 0; j < N; j++) {
|
||||
@@ -2783,8 +2785,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(-1, RM(UATTR(j+1)), 0, NULL())))
|
||||
@@ -2928,8 +2932,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(-1, RM(UATTR(j+1)), 0, NULL()))) => 0;
|
||||
@@ -3494,8 +3500,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// remove each tag in permutation order
|
||||
for (unsigned j = 0; j < N; j++) {
|
||||
@@ -5978,8 +5986,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// update each tag in permutation order
|
||||
for (unsigned j = 0; j < N*M; j++) {
|
||||
@@ -6121,8 +6131,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j/M, RM(UATTR((j%M)+1)), 0, NULL()))) => 0;
|
||||
@@ -6301,8 +6313,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// remove each tag in permutation order
|
||||
for (unsigned j = 0; j < N*M; j++) {
|
||||
@@ -7189,8 +7203,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j, RM, -1, NULL()))) => 0;
|
||||
@@ -7349,8 +7365,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j, RM, -1, NULL()))) => 0;
|
||||
@@ -7532,8 +7550,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j, RM, -1, NULL()))) => 0;
|
||||
@@ -7662,8 +7682,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j, RM, -1, NULL()))) => 0;
|
||||
@@ -8030,8 +8052,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// delete each rid in permutation order
|
||||
for (unsigned j = 0; j < N; j++) {
|
||||
@@ -8178,8 +8202,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// delete each rid in permutation order
|
||||
for (unsigned j = 0; j < N; j++) {
|
||||
@@ -10128,8 +10154,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, RM, +D, NULL()))) => 0;
|
||||
@@ -10255,8 +10283,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, GROW(REG), +D,
|
||||
@@ -10391,8 +10421,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, GROW(UATTR(1)), +D,
|
||||
@@ -10539,8 +10571,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, GROW, -D, NULL()))) => 0;
|
||||
@@ -10666,8 +10700,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, GROW(REG), -D,
|
||||
@@ -10802,8 +10838,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, GROW(UATTR(1)), -D,
|
||||
@@ -10949,8 +10987,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, RM, -W, NULL()))) => 0;
|
||||
@@ -11104,8 +11144,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
LFSR_ATTR(j*W+W-1, UATTR(1), 0,
|
||||
@@ -11712,8 +11754,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// remove with a wide tag
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
@@ -11849,8 +11893,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// replace with bitwise inverse
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
@@ -12079,8 +12125,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// remove with a wide tag
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
@@ -12225,8 +12273,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// replace with bitwise inverse
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
@@ -12456,8 +12506,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// remove with a wide tag
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
@@ -12595,8 +12647,10 @@ code = '''
|
||||
rbyd = backup_rbyd;
|
||||
lfs_bd_erase(&lfs, rbyd.blocks[0]) => 0;
|
||||
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0;
|
||||
rbyd.blocks[0], 0, backup_block, rbyd.eoff,
|
||||
NULL) => 0;
|
||||
lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false,
|
||||
NULL) => 0;
|
||||
|
||||
// replace with bitwise inverse
|
||||
lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTRS(
|
||||
|
||||
Reference in New Issue
Block a user