From 2328f889ef3f48f985d6cea16cdba8a203bbcc50 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 9 Sep 2026 16:37:15 -0300 Subject: [PATCH] kernel: firmware loading --- firmware/LICENCE.rtlwifi_firmware.txt | 39 ++++++++++ firmware/rtl8188eufw.bin | Bin 0 -> 15262 bytes kernel-src/include/kernel/firmware.h | 11 +++ kernel-src/io/firmware.c | 99 ++++++++++++++++++++++++++ recipes/firmware | 8 +++ source-recipes/firmware | 3 + 6 files changed, 160 insertions(+) create mode 100644 firmware/LICENCE.rtlwifi_firmware.txt create mode 100644 firmware/rtl8188eufw.bin create mode 100644 kernel-src/include/kernel/firmware.h create mode 100644 kernel-src/io/firmware.c create mode 100644 recipes/firmware create mode 100644 source-recipes/firmware diff --git a/firmware/LICENCE.rtlwifi_firmware.txt b/firmware/LICENCE.rtlwifi_firmware.txt new file mode 100644 index 00000000..d70921f4 --- /dev/null +++ b/firmware/LICENCE.rtlwifi_firmware.txt @@ -0,0 +1,39 @@ +Copyright (c) 2010, Realtek Semiconductor Corporation +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Realtek Semiconductor Corporation nor the names of its + suppliers may be used to endorse or promote products derived from this + software without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Realtek Semiconductor Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/firmware/rtl8188eufw.bin b/firmware/rtl8188eufw.bin new file mode 100644 index 0000000000000000000000000000000000000000..8bb12ea88246d2e7060a46bdeef61800c1ed1881 GIT binary patch literal 15262 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 + +typedef void (*firmware_callback_t)(void *ctx, void *data, size_t size); + +// firmware data is only valid only for the duration of the callback +int firmware_load(const char *name, firmware_callback_t callback, void *ctx); + +#endif diff --git a/kernel-src/io/firmware.c b/kernel-src/io/firmware.c new file mode 100644 index 00000000..87e9dd32 --- /dev/null +++ b/kernel-src/io/firmware.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include + +#define FIRMWARE_SIZE_LIMIT (16 * 1024) +#define FIRMWARE_PATH "/usr/lib/firmware/" + +typedef struct { + const char *name; + firmware_callback_t callback; + void *ctx; +} firmware_ctx_t; + +static void do_load(void *ctx) { + firmware_ctx_t *fc = ctx; + printf("firmware: loading \"%s\"\n", fc->name); + + vnode_t *firmware_dir; + int error = vfs_lookup(&firmware_dir, vfsroot, FIRMWARE_PATH, NULL, 0); + if (error) { + printf("firmware: loading \"%s\" failed: failed to open %s (%s)\n", + fc->name, FIRMWARE_PATH, strerror(error)); + goto leave; + } + + VOP_UNLOCK(firmware_dir); // vfs_lookup returns vnode locked + + vnode_t *firmware_file; + error = vfs_lookup(&firmware_file, firmware_dir, fc->name, NULL, 0); + VOP_RELEASE(firmware_dir); + if (error) { + printf("firmware: loading \"%s\" failed: failed to open file (%s)\n", + fc->name, strerror(error)); + goto leave; + } + + vattr_t vattr; + error = VOP_GETATTR(firmware_file, &vattr, NULL); + VOP_UNLOCK(firmware_file); + if (error) + goto leave_release; + + if (vattr.size >= FIRMWARE_SIZE_LIMIT) { + error = EINVAL; + goto leave_release; + } + + void *buffer = alloc(vattr.size); + if (buffer == NULL) { + error = ENOMEM; + goto leave_release; + } + + size_t bytes_read; + error = vfs_read(firmware_file, buffer, vattr.size, 0, &bytes_read, 0); + if (error) + goto leave_free; + + if (bytes_read != vattr.size) { + error = EINVAL; + goto leave_free; + } + + printf("firmware: \"%s\" loaded\n", fc->name); + fc->callback(fc->ctx, buffer, vattr.size); + +leave_free: + free(buffer); +leave_release: + if (error) { + printf("firmware: loading \"%s\" failed: %s\n", + fc->name, strerror(error)); + } + VOP_RELEASE(firmware_file); +leave: + free(fc); +} + +int firmware_load(const char *name, firmware_callback_t callback, void *ctx) { + // TODO: support kernel embedded firmware + firmware_ctx_t *fc = alloc(sizeof(firmware_ctx_t)); + if (fc == NULL) + return ENOMEM; + + fc->name = name; + fc->callback = callback; + fc->ctx = ctx; + + int error = vfs_root_event_attach(do_load, fc); + if (error && error != EBUSY) { + free(fc); + return error; + } else if (error == EBUSY) { + do_load(fc); + } + + return 0; +} diff --git a/recipes/firmware b/recipes/firmware new file mode 100644 index 00000000..29641f82 --- /dev/null +++ b/recipes/firmware @@ -0,0 +1,8 @@ +name=firmware +revision=1 +from_source=firmware + +package() { + mkdir -p ${dest_dir}/usr/lib/firmware + cp -r ${source_dir}/* ${dest_dir}/usr/lib/firmware +} diff --git a/source-recipes/firmware b/source-recipes/firmware new file mode 100644 index 00000000..0cdf23fb --- /dev/null +++ b/source-recipes/firmware @@ -0,0 +1,3 @@ +name=firmware +version=0 +source_dir="firmware"