forked from Hyperion/HyperionOS
super dupper system update (it runs)
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
local BOOT_DRIVE_PATH="/$"
|
||||
local term = term
|
||||
local os = os
|
||||
-- Function to write text to the terminal with special character handling
|
||||
@@ -100,6 +101,7 @@ local ok, err = xpcall(function()
|
||||
}
|
||||
|
||||
-- Move all non-Lua standard library globals into the apis table
|
||||
local debug = debug
|
||||
for i,v in pairs(_G) do
|
||||
if not lua[i] or lua[i]==nil then
|
||||
apis[i]=v
|
||||
@@ -107,6 +109,11 @@ local ok, err = xpcall(function()
|
||||
end
|
||||
end
|
||||
|
||||
function sleep(time)
|
||||
local stoptime = apis.os.clock() + (time)
|
||||
while stoptime > apis.os.clock() do end
|
||||
end
|
||||
|
||||
-- Set up terminal default colors
|
||||
apis.term.setPaletteColor(0x1, 0x000000) -- #000000
|
||||
apis.term.setPaletteColor(0x2, 0xFFFFFF) -- #FFFFFF
|
||||
@@ -135,9 +142,9 @@ local ok, err = xpcall(function()
|
||||
end
|
||||
|
||||
-- Load kernel first if it fails, we can't continue so we display an error
|
||||
local Kernel = load(getFile("/$/boot/kernel.lua"),"@Kernel")
|
||||
local initFs = load(getFile("/$/boot/cct/initdisks","@Init_disks"))(apis)
|
||||
local fs = load(getFile("/$/boot/initfs"),"@InitFs")()
|
||||
local Kernel = load(getFile(BOOT_DRIVE_PATH.."/boot/kernel.lua"),"@Kernel")
|
||||
local initFs = load(getFile(BOOT_DRIVE_PATH.."/boot/cct/initdisks","@Init_disks"))(apis)
|
||||
local fs = load(getFile(BOOT_DRIVE_PATH.."/boot/initfs"),"@InitFs")()
|
||||
if not Kernel then
|
||||
displaySuperBadError("Could not load kernel.")
|
||||
end
|
||||
@@ -163,7 +170,7 @@ local ok, err = xpcall(function()
|
||||
-- Set up computer api
|
||||
local computer = {
|
||||
time = function() return apis.os.epoch("utc") end,
|
||||
clock = apis.os.clock,
|
||||
clock = function() return apis.os.clock()/1000 end,
|
||||
shutdown = apis.os.shutdown,
|
||||
reboot = apis.os.reboot,
|
||||
getMachineEvent = function()
|
||||
@@ -255,13 +262,13 @@ local ok, err = xpcall(function()
|
||||
end
|
||||
end, "", 1000)
|
||||
local ret = {coroutine.resume(co, ...)}
|
||||
if ret[1]=="timeout" then
|
||||
return nil, "Coroutine timed out"
|
||||
if ret[1] and ret[2]=="timeout" then
|
||||
return "timeout"
|
||||
elseif ret[1]==false then
|
||||
return false, ret[2]
|
||||
return "error", ret[2]
|
||||
else
|
||||
debug.sethook(co)
|
||||
return true, table.unpack(ret)
|
||||
return "success", table.unpack(ret, 2)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -291,12 +298,13 @@ local ok, err = xpcall(function()
|
||||
exit=true
|
||||
end
|
||||
end
|
||||
if status == false or coroutine.status(kernelCoro)=="dead" then
|
||||
if status == "error" or coroutine.status(kernelCoro)=="dead" then
|
||||
displaySuperBadError("Kernel error: "..tostring(err))
|
||||
coroutine.yield("key")
|
||||
end
|
||||
end
|
||||
end, debug.traceback)
|
||||
|
||||
if not ok then
|
||||
displaySuperBadError("Fatal error during boot: "..err)
|
||||
end
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
sleep(1)
|
||||
local BOOT_DRIVE_PATH="/$"
|
||||
-- UnBIOS by JackMacWindows
|
||||
-- This will undo most of the changes/additions made in the BIOS, but some things may remain wrapped if `debug` is unavailable
|
||||
-- To use, just place a `bios.lua` in the root of the drive, and run this program
|
||||
@@ -58,7 +60,7 @@ function _G.term.native()
|
||||
term.setCursorPos(1, 1)
|
||||
term.setCursorBlink(true)
|
||||
term.clear()
|
||||
local file = fs.open("/$/boot/cct/boot.lua", "r")
|
||||
local file = fs.open(BOOT_DRIVE_PATH.."/boot/cct/boot.lua", "r")
|
||||
if file == nil then
|
||||
term.setCursorBlink(false)
|
||||
term.setTextColor(16384)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
local apis = ({...})[1]
|
||||
local BOOT_DRIVE_PATH="/$"
|
||||
local fs = apis.fs
|
||||
local native = apis.peripheral
|
||||
local peripheral = {}
|
||||
@@ -62,33 +63,6 @@ local function createDisk(id, basePath, readonly, periph)
|
||||
return fs.getCapacity(basePath)
|
||||
end
|
||||
|
||||
function disk:readAllText(path)
|
||||
local p = fs.combine(basePath, path)
|
||||
if not fs.exists(p) then return nil, "file not found" end
|
||||
local h = fs.open(p, "r")
|
||||
local t = h.readAll()
|
||||
h.close()
|
||||
return t
|
||||
end
|
||||
|
||||
function disk:writeAllText(path, text)
|
||||
local p = fs.combine(basePath, path)
|
||||
local h = fs.open(p, "w")
|
||||
if not h then return nil, "cannot write" end
|
||||
h.write(text)
|
||||
h.close()
|
||||
return true
|
||||
end
|
||||
|
||||
function disk:appendAllText(path, text)
|
||||
local p = fs.combine(basePath, path)
|
||||
local h = fs.open(p, "a")
|
||||
if not h then return nil, "cannot append" end
|
||||
h.write(text)
|
||||
h.close()
|
||||
return true
|
||||
end
|
||||
|
||||
function disk:list(path)
|
||||
local p = fs.combine(basePath, path)
|
||||
if not fs.exists(p) or not fs.isDir(p) then return nil, "not directory" end
|
||||
@@ -105,6 +79,17 @@ local function createDisk(id, basePath, readonly, periph)
|
||||
return fs.exists(p) and fs.isDir(p)
|
||||
end
|
||||
|
||||
function disk:type(path)
|
||||
local p = fs.combine(basePath, path)
|
||||
if not fs.exists(p) then
|
||||
return nil
|
||||
elseif fs.isDir(p) then
|
||||
return "directory"
|
||||
else
|
||||
return "file"
|
||||
end
|
||||
end
|
||||
|
||||
function disk:makeDirectory(path)
|
||||
local p = fs.combine(basePath, path)
|
||||
fs.makeDir(p)
|
||||
@@ -125,9 +110,14 @@ local function createDisk(id, basePath, readonly, periph)
|
||||
return periph.getLabel()
|
||||
end
|
||||
|
||||
function disk:size(path)
|
||||
function disk:attributes(path)
|
||||
local p = fs.combine(basePath, path)
|
||||
return fs.getSize(p)
|
||||
return fs.attributes(p)
|
||||
end
|
||||
|
||||
function disk:open(path, mode)
|
||||
local p = fs.combine(basePath, path)
|
||||
return fs.open(p, mode)
|
||||
end
|
||||
|
||||
return disk
|
||||
@@ -136,7 +126,7 @@ end
|
||||
---------------------------------------------------------
|
||||
-- INTERNAL DISK "$" (mapped to "/")
|
||||
---------------------------------------------------------
|
||||
internal["$"] = createDisk("$", "/$", false, {
|
||||
internal["$"] = createDisk("$", BOOT_DRIVE_PATH, false, {
|
||||
setLabel=function(label)
|
||||
local h = fs.open("/.label", "w")
|
||||
h.write(label)
|
||||
|
||||
2
Build/boot/fstab
Normal file
2
Build/boot/fstab
Normal file
@@ -0,0 +1,2 @@
|
||||
U $;/
|
||||
U devfs0000;/dev/
|
||||
@@ -49,15 +49,23 @@ function fs.remove(path)
|
||||
end
|
||||
function fs.readAllText(path)
|
||||
local disk, newPath = resolve(path)
|
||||
return disk:readAllText(newPath)
|
||||
local handle = disk:open(newPath, "r")
|
||||
if not handle then return nil end
|
||||
local content = handle.readAll()
|
||||
handle.close()
|
||||
return content
|
||||
end
|
||||
function fs.writeAllText(path, text)
|
||||
local disk, newPath = resolve(path)
|
||||
return disk:writeAllText(newPath, text)
|
||||
local handle = disk:open(newPath, "w")
|
||||
handle.write(text)
|
||||
handle.close()
|
||||
end
|
||||
function fs.appendAllText(path, text)
|
||||
local disk, newPath = resolve(path)
|
||||
return disk:appendAllText(newPath, text)
|
||||
local handle = disk:open(newPath, "a")
|
||||
handle.write(text)
|
||||
handle.close()
|
||||
end
|
||||
function fs.load(path)
|
||||
return load(fs.readAllText(path), path)
|
||||
|
||||
@@ -2,7 +2,6 @@ local args = {...}
|
||||
local apis = args[1]
|
||||
local disks = args[2]
|
||||
local arch = args[3]
|
||||
local initPath = args[4]
|
||||
local screen = args[5]
|
||||
local computer = args[6]
|
||||
local ifs = args[7]
|
||||
@@ -19,12 +18,22 @@ kernel.key = {}
|
||||
kernel.cache = {}
|
||||
kernel.cache.preload = {}
|
||||
kernel._G=_G
|
||||
kernel.sleep=sleep
|
||||
kernel.debug=true
|
||||
|
||||
_G.sleep=nil
|
||||
local windowsExp = false
|
||||
|
||||
function kernel.log(msg, level)
|
||||
LOG_Text = LOG_Text..tostring(computer.time()).." "..kernel.user.." "..kernel.process.."["..tostring(level or "INFO").."]: "..msg.."\n"
|
||||
LOG_Text = LOG_Text..tostring(computer:time()).." "..kernel.user.." "..kernel.process.."["..tostring(level or "INFO").."]: "..msg.."\n"
|
||||
if kernel.status == "start" then
|
||||
screen:print(tostring(computer.time()).." "..kernel.user.." "..kernel.process.."["..tostring(level or "INFO").."]: "..msg)
|
||||
screen:print(tostring(computer:time()).." "..kernel.user.." "..kernel.process.."["..tostring(level or "INFO").."]: "..msg)
|
||||
elseif kernel.status == "init" then
|
||||
kernel.standbyTask=kernel.currentTask
|
||||
kernel.currentTask=kernel.kernelTask
|
||||
kernel.tty.print(tostring(computer:time()).." "..kernel.user.." "..kernel.process.."["..tostring(level or "INFO").."]: "..msg)
|
||||
kernel.currentTask=kernel.standbyTask
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -74,9 +83,13 @@ kernel.log("Kernel loaded.")
|
||||
kernel.log("Mounting init disks...")
|
||||
disks.refresh()
|
||||
ifs.update(disks)
|
||||
kernel.disks={}
|
||||
for _,v in disks.list() do
|
||||
kernel.disks[v.address] = v
|
||||
end
|
||||
ifs.mount("$", "/")
|
||||
|
||||
local fstab=ifs.readAllText("/etc/fstab")
|
||||
local fstab=ifs.readAllText("/boot/fstab")
|
||||
local split = function(str, delim, maxResultCountOrNil)
|
||||
assert(#delim == 1, "only delim len 1 supported for now")
|
||||
maxResultCountOrNil = (maxResultCountOrNil or 0)-1
|
||||
@@ -95,6 +108,33 @@ local split = function(str, delim, maxResultCountOrNil)
|
||||
return rv
|
||||
end
|
||||
|
||||
if not ifs.isFile("/boot/boot.cfg") then
|
||||
kernel.log("boot.cfg missing or corrupted!, Attempting to write recovery boot.cfg", "ERROR")
|
||||
ifs.writeAllText("/boot/boot.cfg",[[
|
||||
-- DO NOT EDIT THIS FILE IF YOU DO NOT KNOW WHAT YOU ARE DOING!
|
||||
-- DOING SO MAY RENDER YOUR SYSTEM UNBOOTABLE!
|
||||
|
||||
-- This file is auto-generated during the build process.
|
||||
-- RECOVERY BOOT CONFIGURATION FILE
|
||||
return {
|
||||
initPath = "/sbin/init.lua",
|
||||
maxOpenFiles = 128,
|
||||
maxFilesPerTask = 16,
|
||||
preempt=true
|
||||
}
|
||||
]])
|
||||
end
|
||||
local initCfgFunc, err = load(ifs.readAllText("/boot/boot.cfg"), "@boot.cfg")
|
||||
if not initCfgFunc then
|
||||
kernel.PANIC("Failed to load /boot/boot.cfg: "..tostring(err))
|
||||
end
|
||||
|
||||
local initCfgStatus, config = pcall(initCfgFunc)
|
||||
if not initCfgStatus then
|
||||
kernel.PANIC("Error in /boot/boot.cfg: "..tostring(config))
|
||||
end
|
||||
kernel.config = config
|
||||
|
||||
for i,v in ipairs(split(fstab,"\n")) do
|
||||
if v:sub(1,1)=="U" then
|
||||
local id=""
|
||||
@@ -118,47 +158,94 @@ end
|
||||
ifs.remove("/tmp")
|
||||
ifs.makeDir("/tmp")
|
||||
|
||||
local drivers={}
|
||||
drivers.raw={}
|
||||
drivers.processes={}
|
||||
drivers.type={}
|
||||
|
||||
function drivers.register(object)
|
||||
drivers.raw[#drivers.raw+1]=object
|
||||
if object.main then drivers.processes[#drivers.processes+1]=object.main end
|
||||
if drivers.type[object.type]==nil then drivers.type[object.type]={} end
|
||||
drivers.type[object.type][#drivers.type[object.type]+1]=object
|
||||
function kernel.newFifo()
|
||||
local fifo = {}
|
||||
fifo.push=function(data)
|
||||
table.insert(data)
|
||||
end
|
||||
fifo.pop=function()
|
||||
return table.remove(fifo,1)
|
||||
end
|
||||
return fifo
|
||||
end
|
||||
|
||||
function kernel.newUUID()
|
||||
local template = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
|
||||
local uuid = ""
|
||||
for i = 1, #template do
|
||||
local c = template:sub(i,i)
|
||||
if c == "x" then
|
||||
uuid = uuid .. string.format("%x", math.random(0, 15))
|
||||
elseif c == "y" then
|
||||
uuid = uuid .. string.format("%x", math.random(8, 11))
|
||||
else
|
||||
uuid = uuid .. c
|
||||
end
|
||||
end
|
||||
return uuid
|
||||
end
|
||||
|
||||
kernel.syscalls={}
|
||||
local modules={[0]={}}
|
||||
for i=0, 100 do
|
||||
modules[i]={}
|
||||
end
|
||||
|
||||
kernel.log("Gathering modules")
|
||||
for i,v in ipairs(ifs.list("/lib/modules/Hyperion/")) do
|
||||
local prior=tonumber(v:sub(1,2))
|
||||
modules[prior+1][#modules[prior+1]+1]="/lib/modules/Hyperion/"..v
|
||||
for _, i in ipairs(ifs.list("/lib/modules")) do
|
||||
for _,v in ipairs(ifs.list("/lib/modules/"..i)) do
|
||||
local prior=tonumber(v:sub(1,2))
|
||||
modules[prior+1][#modules[prior+1]+1]="/lib/modules/"..i.."/"..v
|
||||
end
|
||||
end
|
||||
|
||||
kernel.drivers=drivers
|
||||
kernel.ifs=ifs
|
||||
kernel.apis=apis
|
||||
kernel.computer=computer
|
||||
kernel.initPath=initPath
|
||||
kernel.arch=arch
|
||||
kernel.initdisks=disks
|
||||
kernel.screen=screen
|
||||
kernel.processes={}
|
||||
kernel.fstab=fstab
|
||||
|
||||
kernel.kernelTask = {
|
||||
name="kernel",
|
||||
status="R",
|
||||
pid=0,
|
||||
tgid=0,
|
||||
user="root",
|
||||
uid=0,
|
||||
fd={},
|
||||
exit="",
|
||||
sleep=0,
|
||||
ivs=0,
|
||||
vs=0,
|
||||
children={},
|
||||
syscallReturn={},
|
||||
cwd="/",
|
||||
timeSlice=0,
|
||||
lastTime=0,
|
||||
totalTime=0,
|
||||
numRuns=0
|
||||
}
|
||||
kernel.currentTask = kernel.kernelTask
|
||||
|
||||
kernel.log("Running modules")
|
||||
for _,p in ipairs(modules) do
|
||||
for _,v in ipairs(p) do
|
||||
local code=ifs.readAllText(v)
|
||||
if not code then
|
||||
kernel.log("ModuReadErr: "..v, "WARN")
|
||||
goto skip
|
||||
end
|
||||
local func,err=load(code,"@"..v)
|
||||
if not func then kernel.log("ModuLoadErr: "..tostring(err), "WARN") goto skip end
|
||||
if not func then kernel.panic("ModuLoadErr: "..tostring(err)) goto skip end
|
||||
local status, err = xpcall(func,debug.traceback, kernel)
|
||||
if not status then kernel.log("ModuRunErr: "..tostring(err), "WARN") end
|
||||
if not status then kernel.panic("ModuRunErr: "..tostring(err)) end
|
||||
::skip::
|
||||
end
|
||||
end
|
||||
|
||||
kernel.log("Kernel initialized successfully.")
|
||||
kernel.main()
|
||||
kernel.PANIC("Execution complete")
|
||||
Reference in New Issue
Block a user