Page MenuHomeFreeBSD

D55597.id172942.diff
No OneTemporary

D55597.id172942.diff

diff --git a/sys/kern/subr_firmware.c b/sys/kern/subr_firmware.c
--- a/sys/kern/subr_firmware.c
+++ b/sys/kern/subr_firmware.c
@@ -264,10 +264,16 @@
uint32_t flags;
};
-static const char *fw_path = "/boot/firmware/";
+static char firmware_path[MAXPATHLEN] = "/boot/firmware";
-static void
-try_binary_file(const char *imagename, uint32_t flags)
+SYSCTL_STRING(_kern, OID_AUTO, firmware_path, CTLFLAG_RWTUN, firmware_path,
+ sizeof(firmware_path), "firmware load search path");
+
+TUNABLE_STR("firmware_path", firmware_path, sizeof(firmware_path));
+
+static bool
+try_binary_file_path(const char *path, size_t pathlen,
+ const char *imagename, uint32_t flags)
{
struct nameidata nd;
struct thread *td = curthread;
@@ -281,19 +287,16 @@
int oflags;
size_t resid;
int error;
- bool warn = (flags & FIRMWARE_GET_NOWARN) == 0;
- /*
- * XXX TODO: Loop over some path instead of a single element path.
- * and fetch this path from the 'firmware_path' kenv the loader sets.
- */
sb = sbuf_new_auto();
- sbuf_printf(sb, "%s%s", fw_path, imagename);
+ sbuf_bcat(sb, path, pathlen);
+ if (path[pathlen - 1] != '/')
+ sbuf_putc(sb, '/');
+ sbuf_cat(sb, imagename);
sbuf_finish(sb);
fn = sbuf_data(sb);
if (bootverbose)
printf("Trying to load binary firmware from %s\n", fn);
-
NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, fn);
oflags = FREAD;
error = vn_open(&nd, &oflags, 0, NULL);
@@ -331,16 +334,37 @@
if (bootverbose)
printf("%s: Loaded binary firmware using %s\n", imagename, fn);
sbuf_delete(sb);
- return;
+ return (true);
err2: /* cleanup in vn_open through vn_close */
VOP_UNLOCK(nd.ni_vp);
vn_close(nd.ni_vp, FREAD, cred, td);
err:
free(data, M_FIRMWARE);
- if (bootverbose || warn)
- printf("%s: could not load binary firmware %s either\n", imagename, fn);
sbuf_delete(sb);
+ return (false);
+}
+
+static void
+try_binary_file(const char *imagename, uint32_t flags)
+{
+ char *cp, *ep;
+ bool warn = (flags & FIRMWARE_GET_NOWARN) == 0;
+
+ for (cp = firmware_path; *cp; cp = ep + 1) {
+ for (ep = cp; (*ep != 0) && (*ep != ';'); ep++);
+ if (ep == cp) {
+ if (*ep == 0)
+ break;
+ continue;
+ }
+ if (try_binary_file_path(cp, ep - cp, imagename, flags))
+ return;
+ if (*ep == 0)
+ break;
+ }
+ if (bootverbose || warn)
+ printf("%s: could not load binary firmware\n", imagename);
}
static void

File Metadata

Mime Type
text/plain
Expires
Sun, Aug 23, 10:36 AM (8 h, 47 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37133527
Default Alt Text
D55597.id172942.diff (2 KB)

Event Timeline