aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2023-12-13 16:52:14 +0000
committerKyle Evans <kevans@FreeBSD.org>2023-12-13 16:52:14 +0000
commitd04415c520b031fb8eb93cb252e4acee66149c87 (patch)
treed981c487be759fdbf0f277931f5e4e340fefdd3b
parenta206524709bdfbd577bcfe76676da80b8250f84c (diff)
downloadsrc-d04415c520b031fb8eb93cb252e4acee66149c87.tar.gz
src-d04415c520b031fb8eb93cb252e4acee66149c87.zip
loader: lua: remove the default kernel if it doesn't exist
The `kernel` env var provides the default kernel, usually "kernel". It may be the case that the user doesn't have a "kernel" kernel, just "kernel.*" kernels, but have left `kernel` to the default because we autodetect entries by default anyways. If we're doing autodetection, take note of whether the default kernel exists or not and remove it from the list if it doesn't and we had found any other kernels. We avoid it in the #kernels == 1 case because something fishy has likely happened and we should just trust the configuration. Reviewed by: imp, manu Differential Revision: https://reviews.freebsd.org/D42967
-rw-r--r--stand/lua/core.lua28
1 files changed, 24 insertions, 4 deletions
diff --git a/stand/lua/core.lua b/stand/lua/core.lua
index c7581b296b8f..9226de564348 100644
--- a/stand/lua/core.lua
+++ b/stand/lua/core.lua
@@ -201,17 +201,18 @@ function core.kernelList()
return core.cached_kernels
end
- local k = loader.getenv("kernel")
+ local default_kernel = loader.getenv("kernel")
local v = loader.getenv("kernels")
local autodetect = loader.getenv("kernels_autodetect") or ""
local kernels = {}
local unique = {}
local i = 0
- if k ~= nil then
+
+ if default_kernel then
i = i + 1
- kernels[i] = k
- unique[k] = true
+ kernels[i] = default_kernel
+ unique[default_kernel] = true
end
if v ~= nil then
@@ -239,6 +240,8 @@ function core.kernelList()
return core.cached_kernels
end
+ local present = {}
+
-- Automatically detect other bootable kernel directories using a
-- heuristic. Any directory in /boot that contains an ordinary file
-- named "kernel" is considered eligible.
@@ -267,8 +270,25 @@ function core.kernelList()
unique[file] = true
end
+ present[file] = true
+
::continue::
end
+
+ -- If we found more than one kernel, prune the "kernel" specified kernel
+ -- off of the list if it wasn't found during traversal. If we didn't
+ -- actually find any kernels, we just assume that they know what they're
+ -- doing and leave it alone.
+ if default_kernel and not present[default_kernel] and #kernels > 1 then
+ for i = 1, #kernels do
+ if i == #kernels then
+ kernels[i] = nil
+ else
+ kernels[i] = kernels[i + 1]
+ end
+ end
+ end
+
core.cached_kernels = kernels
return core.cached_kernels
end