Hi Simon,
Thanks. See below,
Before I send v2, I'd like your feedbacks,
Le 15/05/26 06:43, Simon Glass a écrit :
> 1. Typo: 'thue' should be 'the'
ok for v2
> 2. If cmd/ubifs.c is the duplication this patch obsoletes, please
> either remove it in the same series or reword the motivation - as it
> stands the duplication is still in-tree after the patch, so the reader
> is left wondering whether 'load ubifs ...' is now the preferred entry
> point or whether ubifsload remains supported
I'll reword in v2's commit body. The point of this
patch is to make load ubifs <addr> <file> a first-class entry
point that routes through fs_set_blk_dev() like every other
fstype. ubifsload (cmd/ubifs.c) stays in-tree for backward
compatibility; removing (or change it to a preferred entry),
it is not the goal of this commit, but it seems to be a quick win.
>
> Please also spell out which user-visible commands get this new support
> ('load semihosting ...', 'load ubifs ...').
ok, v2's commit log will show them, per the following.
For instance, based on my records from today,
My board: NXP LX2160A, U-Boot 2026.04-00933-g0a14371fb76c with
OpenOCD attached using J-Link for SYS_OPEN / SYS_READ / SYS_FLEN / SYS_CLOSE
from
the host filesystem,
load semihosting
=> load semihosting - 0xc0000000 semihost-test.txt
76 bytes read in 835 ms (0 Bytes/s)
=> md.b 0xc0000000 80
c0000000: 53 65 6d 69 68 6f 73 74 69 6e 67 20 74 65 73 74 Semihosting test
c0000010: 20 66 69 6c 65 20 66 72 6f 6d 20 55 2d 42 6f 6f file from U-Boo
c0000020: 74 20 70 61 74 63 68 20 76 65 72 69 66 69 63 61 t patch verifica
c0000030: 74 69 6f 6e 20 2d 20 32 30 32 36 2d 30 35 2d 31 tion - 2026-05-1
c0000040: 37 54 31 35 3a 31 38 3a 34 33 5a 0a ef be ad de 7T15:18:43Z.....
size semihosting
=> size semihosting - semihost-test.txt
=> printenv filesize
filesize=4c
# OpenOCD debug logs
semihosting_common(): op=0x1 (OPEN), param=0xfbb37fe8
semihosting_common(): open('/tmp/semihost-test.txt')=12
semihosting_common(): op=0xc (FLEN), param=0xfbb37ff8
semihosting_common(): op=0x2 (CLOSE), param=0xfbb37ff8
ls semihosting : fs/semihostingfs.c does not registers ls hook in its
fstype_info, so fs_ls() has no work to do. OpenOCD's
log confirms no semihosting transaction was issued during
the ls attempts, as expected:
=> ls semihosting - .
=> ls semihosting - semihost-test.txt
(silent return, no error, no semihosting trap fired)
Without this patch all those commands fail in fs_set_blk_dev()
with
** Bad device specification semihosting **
before the FS layer is called.
For ubifs, it is code analysis only, I do not have hardware boards
to check.
>From the code review:
- fs/ubifs/ubifs.c:ubifs_set_blk_dev() takes (struct blk_desc *,
struct disk_partition *) and ignores both, it only checks the
global ubifs_mounted.
- The patched fs_set_blk_dev() dispatch path, for any fstype
whose null_dev_desc_ok flag is set, therefore feeds
ubifs_set_blk_dev() the NULLs it has been receiving
from cmd/ubifs.c all along. No new control flow through
fs/ubifs/ ; the patch only adds a second entry point with
identical preconditions.
Do you agree ?
The intended behaviour is that after ubi part ... + ubifsmount ...
have attached and mounted a volume,
load ubifs <addr> <file> and
ls ubifs <path>
shall work like every other <fstype> family.
I found those from code reviews, but it seems logic.
>> if (strcmp(info->name, ifname) != 0)
> if (strcmp(...))
I'll change to if (!strcmp(...)) in v2.
> Can you add a test for this, that loads via the new semihosting
> ifname? Do we need a doc/ update?
OK, for v2, I'll check to add both:
- test/py/tests/test_semihosting.py exercising load semihosting
+ comparing the loaded bytes via md.b against a host-staged
fixture. Should you have some test logics, I'll appreciate, I am
learning with uboot and uboot test frameowrk.
- a section in doc/usage/cmd/load.rst documenting the
ifname-routed null-block-device path and listing the fstypes
that opts into it (semihosting, ubifs).
For ubifs, since I cannot add hardware coverage, I'll try to wire
load ubifs into test/py/tests/test_ubifs.py alongside the
existing ubifsload invocations.
>
> BTW, what do you think of this 'desc being NULL' approach? We should
> perhaps improve it so that we can support non-block filesystems more
> generally.
You are right that the open-coded "treat NULL block_desc as the
null-device signal" reads as a bad layering.
Maybe, as an improvement fro v2: introduce a small
helper near fs_set_blk_dev_with_part() that names the convention
explicitly, so the dispatch site is one self-documenting line:
/*
* Some fstypes (semihosting, ubifs) have no underlying block
* device and ignore the block_desc argument of their set_blk_dev
* hook. The legacy commands (ubifsload, semihosting) just pass
* NULL; for load <iface> ... to behave the
* same, the dispatcher opts those fstypes in by name.
*/
static const struct fstype_info *
fs_lookup_null_dev_info(const char *ifname)
{
const struct fstype_info *info = fs_get_info_by_ifname(ifname);
return (info && info->null_dev_desc_ok) ? info : NULL;
}
...then the dispatch:
info = fs_lookup_null_dev_info(ifname);
if (info)
return info->set_blk_dev(NULL, NULL);
If you'd rather keep the dispatch open-coded with the shorter
if (!strcmp()) form you already pointed out, I'll just do that
and drop the helper; I believe it's a nice-to-have.
Your feedbacks are very welcomed and appreciated, I'll send the v2 asap.
Best regards,
Vincent