diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst index b5e4320..408f87d 100644 --- a/Documentation/user/booting-linux.rst +++ b/Documentation/user/booting-linux.rst @@ -212,6 +212,12 @@ When on barebox the SD card shows up as ``mmc1`` then this entry can be booted with ``boot mmc1`` or with setting ``global.boot.default`` to ``mmc1``. +``machine-id`` is an optional key. If ``global.boot.machine_id`` variable is set to +non-empty value, then barebox accepts only Bootloader Spec entries with ``machine-id`` +key. In case if value of global variable and Bootloader Spec key match each other, +barebox will choose the boot entry for booting. All other Bootloader Spec entries will +be ignored. + A bootloader spec entry can also reside on an NFS server in which case a RFC2224 compatible NFS URI string must be passed to the boot command: diff --git a/common/blspec.c b/common/blspec.c index 6171461..2c682e1 100644 --- a/common/blspec.c +++ b/common/blspec.c @@ -420,6 +420,30 @@ } /* + * entry_is_match_machine_id - check if a bootspec entry is match with + * the machine id given by global variable. + * + * returns true if the entry is match, false otherwise + */ + +static bool entry_is_match_machine_id(struct blspec_entry *entry) +{ + int ret = true; + const char *env_machineid = getenv_nonempty("global.boot.machine_id"); + + if (env_machineid) { + const char *machineid = blspec_entry_var_get(entry, "machine-id"); + if (!machineid || strcmp(machineid, env_machineid)) { + pr_debug("ignoring entry with missmatched machine-id " \ + "\"%s\" != \"%s\"\n", env_machineid, machineid); + ret = false; + } + } + + return ret; +} + +/* * blspec_scan_directory - scan over a directory * * Given a root path collects all bootentries entries found under /bootentries/entries/. @@ -504,6 +528,11 @@ continue; } + if (!entry_is_match_machine_id(entry)) { + blspec_entry_free(&entry->entry); + continue; + } + found++; if (entry->cdev && entry->cdev->dev) { @@ -756,4 +785,4 @@ { return bootentry_register_provider(blspec_bootentry_provider); } -device_initcall(blspec_init); \ No newline at end of file +device_initcall(blspec_init);