2802880eaa
- primitive lfs_rbyd_fetch
- primitive lfs_rbyd_commit
- tag reading/progging and encoding machinery
The tag encoding scheme here uses pairs of leb128s, encoding either
a normal tag:
iiii iiiiiii iiiiiTT TTTTTTt ttttt0v
^--------^------^-^- 16-bit id
'------|-|- 8-bit type2
'-|- 6-bit type1
'- valid bit
llll lllllll lllllll lllllll lllllll
^- n-bit length
Or an alt pointer:
wwww wwwwwww wwwwwww wwwwwww wwwcd1v
^^^-^- 28-bit weight
'|-|- color bit
'-|- direction bit
'- valid bit
jjjj jjjjjjj jjjjjjj jjjjjjj jjjjjjj
^- n-bit jump
Note that two bits overlap the alt pointer dir/color encoding, this
is actually not a problem at all since some tags (crcs/fcrcs) don't
participate in the rbyd tree and can use these bits.
There's a number of benefits to using leb128s, which should probably
be written about, most notably is the abstraction of the device's
word-size. The "n-bits" above can be whatever word size works on the
device, trading off code-size for storage capabilities without breaking
compatibility with other devices. This will eventually be negotiated via
the superblock.
29 lines
539 B
TOML
29 lines
539 B
TOML
|
|
# Test this inner rbyd data-structure
|
|
|
|
[cases.rbyd_create]
|
|
in = 'lfs.c'
|
|
code = '''
|
|
lfs_t lfs;
|
|
lfs_init(&lfs, cfg) => 0;
|
|
|
|
lfs_rbyd_t rbyd = {
|
|
.block = 0,
|
|
.trunk = 0,
|
|
.noff = 0,
|
|
.rev = 1,
|
|
.crc = 0,
|
|
.count = 0,
|
|
.erased = true,
|
|
};
|
|
|
|
//lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0;
|
|
|
|
uint32_t data = 0xa5dfa5df;
|
|
lfs_rbyd_commit(&lfs, &rbyd,
|
|
LFS_MKRATTR(UATTR, 1, 0, &data, 4,
|
|
LFS_MKRATTR(UATTR, 2, 0, &data, 4,
|
|
NULL))) => 0;
|
|
|
|
'''
|