From 125baaebf5bafad38d6771239cbc674089c92b22 Mon Sep 17 00:00:00 2001 From: Astronand Date: Tue, 25 Aug 2026 21:16:16 -0400 Subject: [PATCH 1/2] oc firmware 1.0 --- .../data/boot/ac/boot.lua | 465 +++++------------- Src/Hyperion-firmware-ac/data/boot/ac/eeprom | 68 +++ .../data/boot/ac/initdisks | 136 +++++ .../modules/advancedcomputers/01_devices.kmod | 15 + .../modules/advancedcomputers/13_devraw.kmod | 23 + .../modules/advancedcomputers/22_http.kmod | 0 .../lib/modules/advancedcomputers/25_tty.kmod | 177 +++++++ .../advancedcomputers/26_keyboards.kmod | 113 +++++ .../modules/advancedcomputers/30_daemon.kmod | 99 ++++ .../advancedcomputers/36_scheduler.kmod | 146 ++++++ Src/Hyperion-firmware-oc/authors.txt | 3 + .../data/boot/oc/boot.lua | 49 +- Src/Hyperion-firmware-oc/data/boot/oc/eeprom | 2 +- .../data/boot/oc/initdisks | 2 +- .../lib/modules/opencomputers/25_tty.kmod | 73 ++- .../modules/opencomputers/26_keyboards.kmod | 113 +++++ .../lib/modules/opencomputers/30_daemon.kmod | 99 ++++ .../modules/opencomputers/36_scheduler.kmod | 5 +- Src/Hyperion-firmware-oc/description.txt | 1 + Src/Hyperion-firmware-oc/version.txt | 1 + Src/Hyperion-kernel/data/boot/fstab | 2 +- Src/Hyperion-kernel/data/boot/kernel.lua | 32 +- .../data/lib/modules/hyperion/10_vfs.kmod | 5 +- .../lib/modules/hyperion/45_hypervisor.kmod | 11 +- .../data/lib/modules/hyperion/92_setup.kmod | 123 ++--- Src/coreutils/data/bin/login | 7 +- Src/coreutils/data/etc/sysinit/autorun/login | 7 +- Src/hysh/data/bin/hysh | 8 +- Src/spm/data/bin/spm | 8 + Src/sysinit/data/usr/lib/sysinit/sysinit | 3 +- packages/Hyperion-firmware-ac.pkg | 2 +- packages/Hyperion-firmware-oc.pkg | 12 +- packages/Hyperion-kernel.pkg | 2 +- packages/coreutils.pkg | 2 +- packages/hysh.pkg | 2 +- packages/raw/Hyperion-firmware-ac.tar.gz | Bin 2876 -> 8378 bytes packages/raw/Hyperion-firmware-oc.tar.gz | Bin 6722 -> 8373 bytes packages/raw/Hyperion-kernel.tar.gz | Bin 32366 -> 32037 bytes packages/raw/coreutils.tar.gz | Bin 7109 -> 7181 bytes packages/raw/hysh.tar.gz | Bin 27107 -> 27102 bytes packages/raw/spm.tar.gz | Bin 5836 -> 5934 bytes packages/raw/sysinit.tar.gz | Bin 1014 -> 1038 bytes packages/spm.pkg | 2 +- packages/sysinit.pkg | 2 +- 44 files changed, 1307 insertions(+), 513 deletions(-) create mode 100644 Src/Hyperion-firmware-ac/data/boot/ac/eeprom create mode 100644 Src/Hyperion-firmware-ac/data/boot/ac/initdisks create mode 100644 Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/01_devices.kmod create mode 100644 Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/13_devraw.kmod create mode 100644 Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/22_http.kmod create mode 100644 Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/25_tty.kmod create mode 100644 Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/26_keyboards.kmod create mode 100644 Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/30_daemon.kmod create mode 100644 Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/36_scheduler.kmod create mode 100644 Src/Hyperion-firmware-oc/authors.txt create mode 100644 Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/26_keyboards.kmod create mode 100644 Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/30_daemon.kmod create mode 100644 Src/Hyperion-firmware-oc/description.txt create mode 100644 Src/Hyperion-firmware-oc/version.txt diff --git a/Src/Hyperion-firmware-ac/data/boot/ac/boot.lua b/Src/Hyperion-firmware-ac/data/boot/ac/boot.lua index a20abf1..79a5744 100644 --- a/Src/Hyperion-firmware-ac/data/boot/ac/boot.lua +++ b/Src/Hyperion-firmware-ac/data/boot/ac/boot.lua @@ -1,344 +1,121 @@ ---:Minify:-- -local args={...} -local bootdrive=args[1] -local gpu=components:getFirst("gpu") -local screenTextBuffer=nil -local cursorX,cursorY=0,0 -local screenSizeX,screenSizeY=128,25 - - -if gpu then - screenTextBuffer=gpu:newBuffer(screenSizeX,screenSizeY) - for t,v in components:list() do - if t == "screen" then - gpu:assignBuffer(screenTextBuffer, v) - end - end -end - -local function write(text) - cursorX, cursorY = screenTextBuffer:pasteText(cursorX, cursorY, "SCROLL_SPILL_CLEAR", text) - cursorY = cursorY + 1 - cursorX = 0 - if cursorY >= screenSizeY then - cursorY = screenSizeY-1 - screenTextBuffer:newline() - end -end - -local function displaySuperBadError(err) - gpu:freeAllBuffers() - screenTextBuffer=gpu:newBuffer(screenSizeX,screenSizeY) - for t,v in components:list() do - if t == "screen" then - gpu:assignBuffer(screenTextBuffer, v) - end - end - term.setBackgroundColor(0x1) - term.setTextColor(0x4) - term.clear() - term.setCursorPos(1, 1) - term.write("A critical error occurred while loading the system:") - term.setCursorPos(1, 3) - write(err) - while true do end -end - -local ok, err = xpcall(function() - local apis = {} - - local lua = { - coroutine = true, - debug = true, - _VERSION = true, - assert = true, - collectgarbage = true, - error = true, - gcinfo = true, - getmetatable = true, - ipairs = true, - __inext = true, - load = true, - math = true, - next = true, - pairs = true, - pcall = true, - rawequal = true, - rawget = true, - rawlen = true, - rawset = true, - select = true, - setmetatable = true, - string = true, - table = true, - tonumber = true, - tostring = true, - type = true, - xpcall = true, - _G = true - } - - local debug = debug - for i, v in pairs(_G) do - if not lua[i] or lua[i] == nil then - apis[i] = v - _G[i] = nil - end - end - - local function string_file(file) - local str = file:read() - local buf = {str or ""} - local pos = 1 - local closed = false - - local function content() - return table.concat(buf) - end - - local function set_content(s) - buf = {s} - end - - local function flush() - file.write(content()) - end - - local file = {} - - function file.read(n) - assert(not closed, "file is closed") - - local s = content() - local len = #s - - if not n then - local out = s:sub(pos) - pos = len + 1 - return out - end - - local out = s:sub(pos, pos + n - 1) - pos = pos + #out - return out - end - - function file.write(data) - assert(not closed, "file is closed") - - local s = content() - local before = s:sub(1, pos - 1) - local after = s:sub(pos + #data) - - set_content(before .. data .. after) - pos = pos + #data - - return true - end - - function file.seek(whence, offset) - assert(not closed, "file is closed") - - local s = content() - local len = #s - - whence = whence or "cur" - offset = offset or 0 - - if whence == "set" then - pos = offset + 1 - elseif whence == "cur" then - pos = pos + offset - elseif whence == "end" then - pos = len + offset + 1 - else - error("invalid whence") - end - - if pos < 1 then pos = 1 end - if pos > len + 1 then pos = len + 1 end - - return pos - 1 - end - - function file:close() - assert(not closed, "file is closed") - flush() - closed = true - end - - function file:flush() - assert(not closed, "file is closed") - flush() - end - - return file - end - - local function getFile(path) - local file = bootdrive:open(path, "r") - if not file then - displaySuperBadError("Could not open file: " .. path) - end - local content = file:read() - return content - end - - local Kernel = load(getFile("/boot/kernel.lua"),"@Kernel") - local initFs = load(getFile("/boot/ac/initdisks"),"@Init_disks")(apis) - local fs = load(getFile("/boot/initfs"), "@InitFs")() - - if not Kernel then displaySuperBadError("Could not load kernel.") end - if not initFs then displaySuperBadError("Could not load initdisks.") end - if not fs then displaySuperBadError("Could not load initfs.") end - - local computercomp=apis.components:getFirst("computer") - local uefi=apis.components:getFirst("uefi") - local computer = { - time = function() return apis.os.epoch("utc") end, - clock = function() return apis.os.clock() * 1000 end, - shutdown = apis.os.shutdown, - reboot = apis.os.reboot, - getMachineEvent = function() - return computercomp:getMachineEvent() - end, - getEEPROM = function() return uefi.data end, - setEEPROM = function(_, text) - uefi.data=text - end - } - - local icolors = { - [0x1] = 1, -- #000000 - [0x2] = 2, -- #FFFFFF - [0x4] = 3, -- #FF0000 - [0x8] = 4, -- #00FF00 - [0x10] = 5, -- #0000FF - [0x20] = 6, -- #00FFFF - [0x40] = 7, -- #FF00FF - [0x80] = 8, -- #FFFF00 - [0x100] = 9, -- #FF6D00 - [0x200] = 10, -- #6DFF55 - [0x400] = 11, -- #24FFFF - [0x800] = 12, -- #924900 - [0x1000] = 13, -- #6D6D55 - [0x2000] = 14, -- #DBDBAA - [0x4000] = 15, -- #6D00FF - [0x8000] = 16 -- #B6FF00 - } - - local colors = { - 0x0001, -- #000000 - 0x0002, -- #FFFFFF - 0x0004, -- #FF0000 - 0x0008, -- #00FF00 - 0x0010, -- #0000FF - 0x0020, -- #00FFFF - 0x0040, -- #FF00FF - 0x0080, -- #FFFF00 - 0x0100, -- #FF6D00 - 0x0200, -- #6DFF55 - 0x0400, -- #24FFFF - 0x0800, -- #924900 - 0x1000, -- #6D6D55 - 0x2000, -- #DBDBAA - 0x4000, -- #6D00FF - 0x8000 -- #B6FF00 - } - - apis.term.setBackgroundColor(0x8000) - apis.term.setTextColor(0x1000) - apis.term.clear() - apis.term.setCursorPos(1, 1) - - local kernelCoro = coroutine.create(function() - ---@diagnostic disable-next-line: param-type-mismatch - local ok, err = xpcall(Kernel, debug.traceback, apis, initFs, "cct", "/sbin/init", - { - print = function(_, text) write(text .. "\n") end, - printInline = function(_, text) write(text) end, - clear = function() - apis.term.clear() - apis.term.setCursorPos(1, 1) - end, - setCursorPos = function(_, x, y) - apis.term.setCursorPos(x, y) - end, - getCursorPos = function() return apis.term.getCursorPos() end, - getSize = function() return apis.term.getSize() end, - setBackgroundColor = function(_, color) - apis.term.setBackgroundColor(colors[color]) - end, - setTextColor = function(_, color) - apis.term.setTextColor(colors[color]) - end, - getBackgroundColor = function() - return icolors[apis.term.getBackgroundColor()] - end, - getTextColor = function() - return icolors[apis.term.getTextColor()] - end - }, computer, fs, "$") - if not ok then displaySuperBadError(err) end - end) - - function coroutine.resumeWithTimeout(co, timeout, ...) - local startTime = computer.time() - debug.sethook(co, function() - if computer.time() > startTime + timeout then - return coroutine.yield("timeout") - end - end, "", 1000) - local ret = {coroutine.resume(co, ...)} - if ret[1] and ret[2] == "timeout" then - return "timeout" - elseif ret[1] == false then - return "error", ret[2] - else - debug.sethook(co) - return "success", table.unpack(ret, 2) - end - end - - write("Loaded in " .. tostring(apis.os.clock()) .. " seconds.\n") - - while true do - local status, err = coroutine.resumeWithTimeout(kernelCoro, 50) - apis.os.queueEvent("NoSleep") - local exit = false - while not exit do - local event = {coroutine.yield()} - if event[1] == "key" then - queueEvent("keyPressed", 1, event[2]) - if acekeys[event[2]] then - queueEvent("keyTyped", 1, acekeys[event[2]]) - end - elseif event[1] == "char" then - queueEvent("keyTyped", 1, event[2]) - elseif event[1] == "key_up" then - queueEvent("keyReleased", 1, event[2]) - elseif event[1] == "disk" then - queueEvent("componentAdded", "disk") - elseif event[1] == "disk_eject" then - queueEvent("componentRemoved", "disk") - elseif event[1] == "modem_message" then - queueEvent("modem_message", table.unpack(event, 2)) - elseif event[1] == "rednet_message" then - queueEvent("rednet_message", table.unpack(event, 2)) - elseif event[1] == "http_success" then - queueEvent("http_success", table.unpack(event, 2)) - elseif event[1] == "http_failure" then - queueEvent("http_failure", table.unpack(event, 2)) - elseif event[1] == "NoSleep" then - exit = true - end - end - 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 -while true do coroutine.yield() end +local cp,c=component,computer;local b_addr=c.getBootAddress();local b_fs=cp.proxy(b_addr) +local gpu=cp.list("gpu")() and cp.proxy(cp.list("gpu")()) +local e_rom=cp.list("eeprom")() and cp.proxy(cp.list("eeprom")()) +local screens={} +for addr in cp.list("screen") do + if gpu then + gpu.bind(addr) + local w,h=gpu.maxResolution() + gpu.setResolution(w,h) + gpu.fill(1,1,w,h," ") + cp.proxy(addr).turnOn() + screens[#screens+1] = {cx=1,cy=1,w=w,h=h,addr=addr} + end +end +local function scroll(scr) gpu.copy(1,2,scr.w,scr.h-1,0,-1);gpu.fill(1,scr.h,scr.w,1," ") end +local function write(t) + if not gpu then return end + for s=1, #screens do + local scr=screens[s] + gpu.bind(scr.addr) + for i=1,#t do + local char=t:sub(i,i) + if char=="\n" then scr.cx=1;scr.cy=scr.cy+1 + elseif char=="\t" then scr.cx=scr.cx+(4-((scr.cx-1)%4)) + elseif char=="\b" then if scr.cx>1 then scr.cx=scr.cx-1;gpu.set(scr.cx,scr.cy," ") end + else gpu.set(scr.cx,scr.cy,char);scr.cx=scr.cx+1 end + if scr.cx>scr.w then scr.cx=1;scr.cy=scr.cy+1 end + if scr.cy>scr.h then scroll(scr);scr.cy=scr.cy-1 end + end + end +end +local function throw(err) + if gpu then + gpu.setBackground(0x0000AA); + gpu.setForeground(0xFFFFFF); + for i=1, #screens do + gpu.fill(1,1,screens[i].w,screens[i].h," "); + screens[i].cx,screens[i].cy=1,1; + end + write("CRITICAL KERNEL ERROR:\n"..tostring(err)) + end + while true do c.pullSignal() end +end +local ok,err=xpcall(function() + local apis={} + local _l={coroutine=1,debug=1,_VERSION=1,assert=1,collectgarbage=1,error=1,getmetatable=1,ipairs=1,load=1,math=1,next=1,pairs=1,pcall=1,rawequal=1,rawget=1,rawlen=1,rawset=1,select=1,setmetatable=1,string=1,table=1,tonumber=1,tostring=1,type=1,xpcall=1,_G=1} + for k,v in pairs(_G) do if not _l[k] then apis[k]=v;_G[k]=nil end end + function sleep(t) local s=c.uptime()+t;while c.uptime() 0 then + return table.unpack(table.remove(eQ, 1)) + else + return nil + end + end, + getEEPROM=function() return e_rom and e_rom.get() or "" end, + setEEPROM=function(_,t) if e_rom then e_rom.set(t) end end, + getNvram=function() return e_rom and e_rom.getData() or "" end, + setNvram=function(_,t) if e_rom then e_rom.setData(t) end end, + beep=function(freq, timeMs) c.beep(freq, timeMs / 1000) end, + initfs=fs, + disks=initFs, + architecture="oc", + firmware=apis, + reboot=false, + yield=function() coroutine.yield() end, + screenCtl={ + print=function(_,t) write(tostring(t).."\n") end, + printInline=function(_,t) write(tostring(t)) end, + clear=function() if gpu then for i=1, #screens do local scr=screens[i];gpu.bind(scr.addr);gpu.fill(1,1,scr.w,scr.h," ");scr.cx,scr.cy=1,1 end end end, + resetCursor=function() for i=1, #screens do local scr=screens[i];scr.cx,scr.cy=1,1 end end, + setBackgroundColor=function(_,cl) if gpu then gpu.setBackground(cl) end end, + setTextColor=function(_,cl) if gpu then gpu.setForeground(cl) end end, + enable=function() end, + disable=function() end + } + } + local kCo=coroutine.create(function() + local s,e=xpcall(Kernel,debug.traceback,efi) + if not s and not efi.reboot then throw(e) end + if efi.reboot then c.shutdown(true) else c.shutdown() end + end) + efi.screenCtl:print("Loaded in "..tostring(c.uptime()).."s") + while true do + local st,e=coroutine.resume(kCo) + c.pushSignal("NoSleep") + local ex=false + while not ex do + local ev={c.pullSignal(0)} + if ev[1]=="key_down" then qEv("keyPressed",1,ev[3]);qEv("keyTyped",1,string.char(ev[3])) + elseif ev[1]=="key_up" then qEv("keyReleased",1,ev[3]) + end + if ev[1]=="NoSleep" then ex=true else qEv(table.unpack(ev)) end + end + if st=="error" or coroutine.status(kCo)=="dead" then + if efi.reboot then c.shutdown(true) end + throw("Kernel fault: "..tostring(e)) + end + end +end,debug.traceback) +if not ok then throw("Boot fault: "..err) end \ No newline at end of file diff --git a/Src/Hyperion-firmware-ac/data/boot/ac/eeprom b/Src/Hyperion-firmware-ac/data/boot/ac/eeprom new file mode 100644 index 0000000..3ff38a9 --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/boot/ac/eeprom @@ -0,0 +1,68 @@ +local init +do + local component_invoke = component.invoke + local function boot_invoke(address, method, ...) + local result = table.pack(pcall(component_invoke, address, method, ...)) + if not result[1] then + return nil, result[2] + else + return table.unpack(result, 2, result.n) + end + end + + -- backwards compatibility, may remove later + local eeprom = component.list("eeprom")() + computer.getBootAddress = function() + return boot_invoke(eeprom, "getData") + end + computer.setBootAddress = function(address) + return boot_invoke(eeprom, "setData", address) + end + + do + local screen = component.list("screen")() + local gpu = component.list("gpu")() + if gpu and screen then + boot_invoke(gpu, "bind", screen) + end + end + local function tryLoadFrom(address) + local handle, reason = boot_invoke(address, "open", "/oc/boot.lua") + if not handle then + return nil, reason + end + local buffer = "" + repeat + local data, reason = boot_invoke(address, "read", handle, math.maxinteger or math.huge) + if not data and reason then + return nil, reason + end + buffer = buffer .. (data or "") + until not data + boot_invoke(address, "close", handle) + return load(buffer, "=init") + end + local reason + if computer.getBootAddress() then + init, reason = tryLoadFrom(computer.getBootAddress()) + end + if not init then + computer.setBootAddress() + for address in component.list("filesystem") do + init, reason = tryLoadFrom(address) + if init then + computer.setBootAddress(address) + break + end + end + end + if not init then + error("no bootable medium found" .. (reason and (": " .. tostring(reason)) or ""), 0) + end +end +local ok, err = xpcall(init,debug.traceback) +if not ok then + error(err) +else + return err +end \ No newline at end of file diff --git a/Src/Hyperion-firmware-ac/data/boot/ac/initdisks b/Src/Hyperion-firmware-ac/data/boot/ac/initdisks new file mode 100644 index 0000000..26bee35 --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/boot/ac/initdisks @@ -0,0 +1,136 @@ +local args = {...} +local apis = args[1] +local bootdrive = args[2] +local bootaddr = args[3] +local disks = {} +local internal = {} + +local function createDisk(id, hw) + local disk = { + address = id, + isReadOnly = function() return hw.isReadOnly() end + } + + function disk:spaceUsed() return hw.spaceUsed() end + function disk:spaceTotal() return hw.spaceTotal() end + + function disk:list(path) + if not hw.exists(path) or not hw.isDirectory(path) then + return nil, "not directory" + end + return hw.list(path) + end + + function disk:fileExists(path) + return hw.exists(path) and not hw.isDirectory(path) + end + + function disk:directoryExists(path) + return hw.exists(path) and hw.isDirectory(path) + end + + function disk:type(path) + if not hw.exists(path) then + return nil + elseif hw.isDirectory(path) then + return "directory" + else + return "file" + end + end + + function disk:makeDirectory(path) + hw.makeDirectory(path) + end + + function disk:remove(path) + if hw.exists(path) then hw.remove(path) end + end + + function disk:setLabel(label) hw.setLabel(label) end + function disk:getLabel() return hw.getLabel() end + + function disk:attributes(path) + return { + size = hw.size(path), + isDir = hw.isDirectory(path), + isReadOnly = hw.isReadOnly(), + modified = hw.lastModified(path), + created = hw.lastModified(path) + } + end + + function disk:open(path, mode) + local fd = hw.open(path, mode) + + if not fd then + local dir = path:match("^(.*)/[^/]+$") + + if dir and not hw.exists(dir) then + local ok, err = hw.makeDirectory(dir) + if not ok then + return nil, err or "could not create parent directory" + end + end + + fd = hw.open(path, mode) + if not fd then + return nil, "file not found or access denied" + end + end + + return { + read = function(num) return hw.read(fd, num) end, + + readAll = function() + local data = {} + while true do + local chunk = hw.read(fd, math.huge) + if not chunk then break end + data[#data + 1] = chunk + end + return table.concat(data) + end, + + write = function(data) return hw.write(fd, data) end, + seek = function(whence, offset) + return hw.seek(fd, whence, offset) + end, + + flush = function() + hw.close(fd) + fd = hw.open(path, mode) + end, + + close = function() + hw.close(fd) + fd = nil + end + } + end + + return disk +end + +internal["$"] = createDisk("$", bootdrive) + +local function refresh() + disks = {} + for addr in apis.component.list("filesystem") do + if addr ~= bootaddr then + disks[addr] = createDisk(addr, apis.component.proxy(addr)) + end + end +end + +local function iter() + refresh() + local combined = {} + + for id, obj in pairs(internal) do combined[id] = obj end + for id, obj in pairs(disks) do combined[id] = obj end + + return pairs(combined) +end + +return {refresh = refresh, list = iter} \ No newline at end of file diff --git a/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/01_devices.kmod b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/01_devices.kmod new file mode 100644 index 0000000..4360c41 --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/01_devices.kmod @@ -0,0 +1,15 @@ +--:Minify:-- +local kernel=... +kernel.oc={} +kernel.oc.component=kernel.apis.component +kernel.oc.computer=kernel.apis.computer + +kernel.log("Installed components:") +for addr, typ in kernel.oc.component.list() do + local dev=kernel.oc.component.proxy(addr) + local tier="" + if dev.getTier then + tier=dev.getTier() + end + kernel.log(" "..addr.." : "..typ..tier) +end \ No newline at end of file diff --git a/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/13_devraw.kmod b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/13_devraw.kmod new file mode 100644 index 0000000..557f5db --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/13_devraw.kmod @@ -0,0 +1,23 @@ +--:Minify:-- +local kernel=... +local component=kernel.oc.component + +local function wrap(p) + return function(op, mode) + if op=="type" then + return "device" + elseif op=="open" then + if kernel.uid~=0 then error("EACCES") end + return component.proxy(p) + end + end +end + +for addr, typ in kernel.oc.component.list() do + local obj=wrap(addr) + kernel.devfs.data["raw"][addr]=obj + local typefolder=kernel.devfs.data["raw"]["by-type"][typ] + if not typefolder then typefolder={} end + typefolder[tostring(#table.keys(typefolder)+1)] = obj + kernel.devfs.data["raw"]["by-type"][typ]=typefolder +end \ No newline at end of file diff --git a/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/22_http.kmod b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/22_http.kmod new file mode 100644 index 0000000..e69de29 diff --git a/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/25_tty.kmod b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/25_tty.kmod new file mode 100644 index 0000000..4c9b525 --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/25_tty.kmod @@ -0,0 +1,177 @@ +-- OpenComputers TTY driver + +local kernel = ... +local component = kernel.oc.component +local computer = kernel.oc.computer + +local plt = { + 0x000000, 0x000040, 0x000080, 0x0000C0, 0x0000FF, + 0x002400, 0x002440, 0x002480, 0x0024C0, 0x0024FF, + 0x004900, 0x004940, 0x004980, 0x0049C0, 0x0049FF, + 0x006D00, 0x006D40, 0x006D80, 0x006DC0, 0x006DFF, + 0x009200, 0x009240, 0x009280, 0x0092C0, 0x0092FF, + 0x00B600, 0x00B640, 0x00B680, 0x00B6C0, 0x00B6FF, + 0x00DB00, 0x00DB40, 0x00DB80, 0x00DBC0, 0x00DBFF, + 0x00FF00, 0x00FF40, 0x00FF80, 0x00FFC0, 0x00FFFF, + + 0x330000, 0x330040, 0x330080, 0x3300C0, 0x3300FF, + 0x332400, 0x332440, 0x332480, 0x3324C0, 0x3324FF, + 0x334900, 0x334940, 0x334980, 0x3349C0, 0x3349FF, + 0x336D00, 0x336D40, 0x336D80, 0x336DC0, 0x336DFF, + 0x339200, 0x339240, 0x339280, 0x3392C0, 0x3392FF, + 0x33B600, 0x33B640, 0x33B680, 0x33B6C0, 0x33B6FF, + 0x33DB00, 0x33DB40, 0x33DB80, 0x33DBC0, 0x33DBFF, + 0x33FF00, 0x33FF40, 0x33FF80, 0x33FFC0, 0x33FFFF, + + 0x660000, 0x660040, 0x660080, 0x6600C0, 0x6600FF, + 0x662400, 0x662440, 0x662480, 0x6624C0, 0x6624FF, + 0x664900, 0x664940, 0x664980, 0x6649C0, 0x6649FF, + 0x666D00, 0x666D40, 0x666D80, 0x666DC0, 0x666DFF, + 0x669200, 0x669240, 0x669280, 0x6692C0, 0x6692FF, + 0x66B600, 0x66B640, 0x66B680, 0x66B6C0, 0x66B6FF, + 0x66DB00, 0x66DB40, 0x66DB80, 0x66DBC0, 0x66DBFF, + 0x66FF00, 0x66FF40, 0x66FF80, 0x66FFC0, 0x66FFFF, + + 0x990000, 0x990040, 0x990080, 0x9900C0, 0x9900FF, + 0x992400, 0x992440, 0x992480, 0x9924C0, 0x9924FF, + 0x994900, 0x994940, 0x994980, 0x9949C0, 0x9949FF, + 0x996D00, 0x996D40, 0x996D80, 0x996DC0, 0x996DFF, + 0x999200, 0x999240, 0x999280, 0x9992C0, 0x9992FF, + 0x99B600, 0x99B640, 0x99B680, 0x99B6C0, 0x99B6FF, + 0x99DB00, 0x99DB40, 0x99DB80, 0x99DBC0, 0x99DBFF, + 0x99FF00, 0x99FF40, 0x99FF80, 0x99FFC0, 0x99FFFF, + + 0xCC0000, 0xCC0040, 0xCC0080, 0xCC00C0, 0xCC00FF, + 0xCC2400, 0xCC2440, 0xCC2480, 0xCC24C0, 0xCC24FF, + 0xCC4900, 0xCC4940, 0xCC4980, 0xCC49C0, 0xCC49FF, + 0xCC6D00, 0xCC6D40, 0xCC6D80, 0xCC6DC0, 0xCC6DFF, + 0xCC9200, 0xCC9240, 0xCC9280, 0xCC92C0, 0xCC92FF, + 0xCCB600, 0xCCB640, 0xCCB680, 0xCCB6C0, 0xCCB6FF, + 0xCCDB00, 0xCCDB40, 0xCCDB80, 0xCCDBC0, 0xCCDBFF, + 0xCCFF00, 0xCCFF40, 0xCCFF80, 0xCCFFC0, 0xCCFFFF, + + 0xFF0000, 0xFF0040, 0xFF0080, 0xFF00C0, 0xFF00FF, + 0xFF2400, 0xFF2440, 0xFF2480, 0xFF24C0, 0xFF24FF, + 0xFF4900, 0xFF4940, 0xFF4980, 0xFF49C0, 0xFF49FF, + 0xFF6D00, 0xFF6D40, 0xFF6D80, 0xFF6DC0, 0xFF6DFF, + 0xFF9200, 0xFF9240, 0xFF9280, 0xFF92C0, 0xFF92FF, + 0xFFB600, 0xFFB640, 0xFFB680, 0xFFB6C0, 0xFFB6FF, + 0xFFDB00, 0xFFDB40, 0xFFDB80, 0xFFDBC0, 0xFFDBFF, + 0xFFFF00, 0xFFFF40, 0xFFFF80, 0xFFFFC0, 0xFFFFFF, + + 0x000000, 0x0F0F0F, 0x1E1E1E, 0x2D2D2D, + 0x3C3C3C, 0x4B4B4B, 0x5A5A5A, 0x696969, + 0x787878, 0x878787, 0x969696, 0xA5A5A5, + 0xB4B4B4, 0xC3C3C3, 0xD2D2D2, 0xE1E1E1 +} + +local gpus,screens = {},{} + +for addr, typ in component.list("gpu") do + if typ == "gpu" then + gpus[#gpus+1]=component.proxy(addr) + end +end + +if #gpus>0 then + for addr, typ in component.list("screen") do + if typ == "screen" then + gpus[1].bind(addr) + local w,h = gpus[1].maxResolution() + gpus[1].setResolution(w,h) + screens[addr]={cx=1,cy=1,w=w,h=h,addr=addr,fg=0,bg=0,gpu=nil} + end + end +end + +local scrnum = 0 +for i,v in pairs(screens) do + scrnum=scrnum+1 +end + +kernel.log("initialized "..tostring(#gpus).." gpus and "..tostring(scrnum).." screens") + +local binds,newid={},0 +local curaddr="" +local function scroll(scr, gpu) gpu.copy(1,2,scr.w,scr.h-1,0,-1);gpu.fill(1,scr.h,scr.w,1," ") end +local function write(text, addr) + local g=gpus[1] + local scr=screens[addr] + if not scr then error("NODEV") end + if curaddr~=addr then g.bind(addr); g.setForeground(scr.fg); g.setBackground(scr.bg) end + for i=1,#text do + local char=text:sub(i,i) + if char=="\n" then scr.cx=1;scr.cy=scr.cy+1 + elseif char=="\t" then scr.cx=scr.cx+(4-((scr.cx-1)%4)) + elseif char=="\b" then if scr.cx>1 then scr.cx=scr.cx-1;g.set(scr.cx,scr.cy," ") end + else g.set(scr.cx,scr.cy,char);scr.cx=scr.cx+1 end + if scr.cx>scr.w then scr.cx=1;scr.cy=scr.cy+1 end + if scr.cy>scr.h then scroll(scr, g);scr.cy=scr.cy-1 end + end +end + +local function newtty(addr) + newid=newid+1 + kernel.devfs.data["tty"][tostring(newid)]=function(op, mode) + if op=="type" then + return "Terminal" + elseif op=="open" then + local h = { + read=function(amount) end, + write=function(content) + write(content, addr) + end, + size=function() + return screens[addr].w, screens[addr].h + end, + clear=function() + local g=gpus[1] + local scr=screens[addr] + if addr~=curaddr then g.bind(addr) end + g.fill(1,1,scr.w,scr.h," "); + scr.cx,scr.cy=1,1 + end, + gpos=function() + return screens[addr].cx, screens[addr].cy + end, + spos=function(x,y) + if not tonumber(x) or not tonumber(y) then error("Invailid arg") end + screens[addr].cx, screens[addr].cy = x,y + end, + sfgc=function(c) + screens[addr].fg=c + end, + sbgc=function(c) + screens[addr].bg=c + end, + gfgc=function() + return screens[addr].fg + end, + gbgc=function() + return screens[addr].bg + end, + isvirt=function() + return false + end, + gplt=function() + return plt + end + } + if mode=="rw" then + return h + elseif mode=="r" then + h["write"]=nil + return h + elseif mode=="w" then + h["read"]=nil + return h + end + end + end +end + +if #gpus>=1 and scrnum>=1 then + for addr,obj in pairs(screens) do + newtty(addr) + end +end \ No newline at end of file diff --git a/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/26_keyboards.kmod b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/26_keyboards.kmod new file mode 100644 index 0000000..92f87c8 --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/26_keyboards.kmod @@ -0,0 +1,113 @@ +--:Minify:-- +local kernel=... +kernel.oc.keyboards={} +local kbs=kernel.oc.keyboards + +local kbidx=0 +local keyboard = {} + +keyboard.keys = { + back = 0x0E, -- backspace + delete = 0xD3, + down = 0xD0, + enter = 0x1C, + home = 0xC7, + lcontrol = 0x1D, + left = 0xCB, + lmenu = 0x38, -- left Alt + lshift = 0x2A, + pageDown = 0xD1, + rcontrol = 0x9D, + right = 0xCD, + rmenu = 0xB8, -- right Alt + rshift = 0x36, + space = 0x39, + tab = 0x0F, + up = 0xC8, + ["end"] = 0xCF, + numpadenter = 0x9C, +} +kernel.oc.keys=keyboard.keys + +for i=0, 255 do + kernel.oc.keys[string.char(i)]=i +end + +------------------------------------------------------------------------------- + +function keyboard.isAltDown(addr) + return kbs[addr].pressedCodes[keyboard.keys.lmenu] or kbs[addr].pressedCodes[keyboard.keys.rmenu] +end + +function keyboard.isControl(char) + return type(char) == "number" and (char < 0x20 or (char >= 0x7F and char <= 0x9F)) +end + +function keyboard.isControlDown(addr) + return kbs[addr].pressedCodes[keyboard.keys.lcontrol] or kbs[addr].pressedCodes[keyboard.keys.rcontrol] +end + +function keyboard.isKeyDown(addr,charOrCode) + if type(charOrCode) == "string" then + return kbs[addr].pressedChars[utf8 and utf8.codepoint(charOrCode) or charOrCode:byte()] + elseif type(charOrCode) == "number" then + return kbs[addr].pressedCodes[charOrCode] + end +end + +function keyboard.isShiftDown(addr) + return kbs[addr].pressedCodes[keyboard.keys.lshift] or kbs[addr].pressedCodes[keyboard.keys.rshift] +end +kernel.oc.keyboard=keyboard + +local function serializeBool(bool) + if bool then + return "T" + else + return "F" + end +end + +for addr, typ in kernel.oc.component.list("keyboard") do + if typ=="keyboard" then + kbidx=kbidx+1 + kbs[addr]={pressedChars = {}, pressedCodes = {}, events=kernel.newFifo()} + kernel.devfs.data["input"]["keyboard"..tostring(kbidx)]=function(op,mode) + if op=="type" then + return "Keyboard" + elseif op=="open" then + local h = { + read=function(amount) + local rv="" + for i=1, amount or 1 do + local event = {kernel.oc.keyboards[addr].events.pop()} + if event[1] then + rv=rv..event[1] + end + end + if rv=="" then rv=nil end + return rv + end, + write=function(content) + end, + gctrl=function() + return serializeBool(keyboard.isControlDown(addr))..";"..serializeBool(keyboard.isAltDown(addr)) + end, + isKeyDown=function(char) + return keyboard.isKeyDown(addr,char) + end + } + if mode=="rw" then + return h + elseif mode=="r" then + h["write"]=nil + return h + elseif mode=="w" then + h["read"]=nil + return h + end + end + end + end +end + diff --git a/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/30_daemon.kmod b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/30_daemon.kmod new file mode 100644 index 0000000..898b012 --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/30_daemon.kmod @@ -0,0 +1,99 @@ +--:Minify:-- +local kernel=... +local keys=kernel.oc.keys + +kernel.processes.ocdaemon = function() + + local timeout = false + + kernel.log("OC daemon started") + + local ctrlKeyMap = { + [keys.a]=1, [keys.b]=2, [keys.c]=3, + [keys.d]=4, [keys.e]=5, [keys.f]=6, + [keys.g]=7, [keys.h]=8, [keys.i]=9, + [keys.j]=10, [keys.k]=11, [keys.l]=12, + [keys.m]=13, [keys.n]=14, [keys.o]=15, + [keys.p]=16, [keys.q]=17, [keys.r]=18, + [keys.s]=19, [keys.t]=20, [keys.u]=21, + [keys.v]=22, [keys.w]=23, [keys.x]=24, + [keys.y]=25, [keys.z]=26, + } + + local specialKeyMap = { + [keys.up] = "\27[A", + [keys.down] = "\27[B", + [keys.right] = "\27[C", + [keys.left] = "\27[D", + [keys.home] = "\27[H", + [keys["end"]] = "\27[F", + --[keys.pageUp] = "\27[5~", + --[keys.pageDown] = "\27[6~", + [keys.delete] = "\27[3~", + [keys.enter] = "\n", + [keys.back] = "\b", + [keys.tab] = "\t", + } + + while true do + + local event = {kernel.EFI.getMachineEvent()} + + if event[1] then + + local eventType = event[1] + local addr = event[2] + local char = event[3] + local keyCode = event[4] + + if eventType == "key_down" then + + local keyboard = kernel.oc.keyboards[addr] + + if keyboard.ctrl then + + local ctrlByte = ctrlKeyMap[keyCode] + + if ctrlByte then + if ctrlByte == 3 then + + for _, task in ipairs(syscall.getTasks()) do + syscall.sigsend(task, 1) + end + + else + keyboard.events.push(string.char(ctrlByte)) + end + end + + else + + local special = specialKeyMap[keyCode] + + if special then + keyboard.events.push(special) + + elseif char and char > 0 then + keyboard.events.push(kernel.apis.unicode.char(char)) + end + + end + + elseif eventType == "key_up" then + + end + + timeout = false + + else + timeout = true + end + + if timeout then + sleep(0.05) + end + + end +end + +kernel.log("OC daemon queued for execution") \ No newline at end of file diff --git a/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/36_scheduler.kmod b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/36_scheduler.kmod new file mode 100644 index 0000000..bb7b4db --- /dev/null +++ b/Src/Hyperion-firmware-ac/data/lib/modules/advancedcomputers/36_scheduler.kmod @@ -0,0 +1,146 @@ +--:Minify:-- +local kernel=... +local alpha = 0.85 +local C_target = 0.01 +local Tmin = 0.0005 +local Tmax = 0.5 +local lambda_budget = 0.08 +local lambda_clamp = 0.03 +local lambda_var = 0.02 +local k_min = 0.5 +local k_max = 0.5 +local B = 0.01 + +function kernel.main() + kernel.log("Starting main loop...") + kernel.saveLog() + local stopLog=5 + local logTasks=100 + + while not kernel.exitMain do + if kernel.config.logTasks then + if logTasks<0 then + kernel.log("Active Tasks:") + for i,v in pairs(kernel.tasks) do + kernel.log(v.name.." : "..v.status.." : "..tostring(v.pid).." : "..tostring(v.exit)) + end + kernel.log("[END BLOCK]") + logTasks=100 + end + logTasks=logTasks-1 + end + local N = 0 + local Tmin_hit = 0 + local Tmax_hit = 0 + local totalTaskTime = 0 + local taskTimes = {} + + for pid, task in pairs(kernel.tasks) do + if kernel.exitMain then break end + + for _,list in ipairs(kernel.perTaskHooks) do + for id,hook in ipairs(list) do + local ok,err = xpcall(hook, debug.traceback, task, pid) + if not ok then + kernel.log("[MAIN HOOK ERR]: "..err, "ERROR", 0xFF0000) + list[id]=nil + end + end + end + + if task.status == "R" then + N = N + 1 + task.timeSlice = math.min(Tmax, math.max(Tmin, B / (N ^ alpha))) + if task.status == "R" then + local startTime = kernel.EFI:getEpochMs() + local ret + if stopLog > 0 then + kernel.log("Running task " .. tostring(task.pid) .. " (" .. task.name .. ") with time slice " .. string.format("%.3f", task.timeSlice) .. "s", "DBUG", 0x00FFFF) + end + + ret = { coroutine.resume(task.coro, table.unpack(task.syscallReturn)) } + + + local elapsed = kernel.EFI:getEpochMs() - startTime + task.lastTime = elapsed + task.totalTime = (task.totalTime or 0) + elapsed + task.numRuns = (task.numRuns or 0) + 1 + + taskTimes[#taskTimes+1] = elapsed + totalTaskTime = totalTaskTime + elapsed + + if elapsed <= Tmin then Tmin_hit = Tmin_hit + 1 end + if elapsed >= Tmax then Tmax_hit = Tmax_hit + 1 end + + if ret[1] == "error" or ret[1] == false then + kernel.log("processHandlerException: " .. tostring(ret[2]), "ERROR", 0xFF0000) + task.status = "Z" + task.exit = "processHandlerException: " .. tostring(ret[2]) + + elseif ret[1] == "timeout" then + task.ivs = task.ivs + 1 + task.syscallReturn = {} + + elseif ret[1] == "success" or ret[1] == true then + task.vs = task.vs + 1 + + if ret[2] == "syscall" then + local scname = ret[3] + if kernel.syscalls[scname] then + if kernel.config.debugSyscalls then + kernel.log("Task " .. task.pid .. " syscall: " .. scname, "DBUG", 0x00FFFF) + for i = 4, #ret do + kernel.log(" inval[" .. (i-3) .. "] = " .. tostring(ret[i]), "DBUG", 0x00FFFF) + end + end + + local sysret = { xpcall(kernel.syscalls[scname], debug.traceback, table.unpack(ret, 4)) } + + if kernel.config.debugSyscalls then + if not sysret[1] then + kernel.log("Task " .. task.pid .. " syscall " .. scname .. " failed: " .. tostring(sysret[2]), "ERROR", 0xFF0000) + else + kernel.log("Task " .. task.pid .. " syscall " .. scname .. " ok, " .. (#sysret-1) .. " retvals", "DBUG", 0x00FFFF) + for i = 2, #sysret do + local v = type(sysret[i]) == "table" and table.serialize(sysret[i]) or tostring(sysret[i]) + kernel.log(" retval[" .. (i-1) .. "] = " .. v, "DBUG", 0x00FFFF) + end + end + end + + if not sysret[1] then + task.syscallReturn = { false, sysret[2] } + else + task.syscallReturn = { true, table.unpack(sysret, 2) } + end + else + task.syscallReturn = { false, "Unknown syscall: " .. tostring(scname) } + end + end + end + end + end + kernel.EFI:yield() + end + + local T_prev_avg = (N > 0) and (totalTaskTime / N) or 0 + local T_prev_var = 0 + for _, t in ipairs(taskTimes) do + T_prev_var = T_prev_var + (t - T_prev_avg) ^ 2 + end + if N > 0 then T_prev_var = T_prev_var / N end + + if N > 0 then + local f_clamp = k_min * (Tmin_hit / N) - k_max * (Tmax_hit / N) + local B_budget = (C_target * (N ^ (alpha - 1))) / math.max(T_prev_avg, 1e-8) + B = B + lambda_budget * (B_budget - B) + lambda_clamp * f_clamp - lambda_var * T_prev_var + end + + kernel.hpv.reapDeadTasks() + if stopLog > 0 then + kernel.log("Executed " .. N .. " tasks, avg time: " .. string.format("%.2f", T_prev_avg) .. "ms, var: " .. string.format("%.2f", T_prev_var) .. ", B: " .. string.format("%.5f", B)) + stopLog = stopLog - 1 + kernel.saveLog() + end + end +end \ No newline at end of file diff --git a/Src/Hyperion-firmware-oc/authors.txt b/Src/Hyperion-firmware-oc/authors.txt new file mode 100644 index 0000000..a265f81 --- /dev/null +++ b/Src/Hyperion-firmware-oc/authors.txt @@ -0,0 +1,3 @@ +Hyperion +Astronand +Xtimhedae \ No newline at end of file diff --git a/Src/Hyperion-firmware-oc/data/boot/oc/boot.lua b/Src/Hyperion-firmware-oc/data/boot/oc/boot.lua index 6bb0830..79a5744 100644 --- a/Src/Hyperion-firmware-oc/data/boot/oc/boot.lua +++ b/Src/Hyperion-firmware-oc/data/boot/oc/boot.lua @@ -3,11 +3,14 @@ local gpu=cp.list("gpu")() and cp.proxy(cp.list("gpu")()) local e_rom=cp.list("eeprom")() and cp.proxy(cp.list("eeprom")()) local screens={} for addr in cp.list("screen") do - local w,h=gpu and gpu.maxResolution() or 20,10 - gpu.setResolution(w,h) - gpu.fill(1,1,w,h," ") - cp.proxy(addr).turnOn() - screens[#screens+1] = {cx=1,cy=1,w=w,h=h,addr=addr} + if gpu then + gpu.bind(addr) + local w,h=gpu.maxResolution() + gpu.setResolution(w,h) + gpu.fill(1,1,w,h," ") + cp.proxy(addr).turnOn() + screens[#screens+1] = {cx=1,cy=1,w=w,h=h,addr=addr} + end end local function scroll(scr) gpu.copy(1,2,scr.w,scr.h-1,0,-1);gpu.fill(1,scr.h,scr.w,1," ") end local function write(t) @@ -22,7 +25,7 @@ local function write(t) elseif char=="\b" then if scr.cx>1 then scr.cx=scr.cx-1;gpu.set(scr.cx,scr.cy," ") end else gpu.set(scr.cx,scr.cy,char);scr.cx=scr.cx+1 end if scr.cx>scr.w then scr.cx=1;scr.cy=scr.cy+1 end - if scr.cy>scr.h then error("executed")scroll(scr);scr.cy=scr.cy-1 end + if scr.cy>scr.h then scroll(scr);scr.cy=scr.cy-1 end end end end @@ -39,11 +42,9 @@ local function throw(err) while true do c.pullSignal() end end local ok,err=xpcall(function() - local apis={os={},fs={},peripheral={},term={}} + local apis={} local _l={coroutine=1,debug=1,_VERSION=1,assert=1,collectgarbage=1,error=1,getmetatable=1,ipairs=1,load=1,math=1,next=1,pairs=1,pcall=1,rawequal=1,rawget=1,rawlen=1,rawset=1,select=1,setmetatable=1,string=1,table=1,tonumber=1,tostring=1,type=1,xpcall=1,_G=1} for k,v in pairs(_G) do if not _l[k] then apis[k]=v;_G[k]=nil end end - apis.os.clock=c.uptime;apis.os.epoch=function()return math.floor(c.uptime()*1000) end - apis.os.queueEvent=c.pushSignal function sleep(t) local s=c.uptime()+t;while c.uptime()0 and table.unpack(table.remove(eQ,1)) or nil end, + getMachineEvent=function() + if #eQ > 0 then + return table.unpack(table.remove(eQ, 1)) + else + return nil + end + end, getEEPROM=function() return e_rom and e_rom.get() or "" end, setEEPROM=function(_,t) if e_rom then e_rom.set(t) end end, getNvram=function() return e_rom and e_rom.getData() or "" end, @@ -86,8 +87,8 @@ local ok,err=xpcall(function() screenCtl={ print=function(_,t) write(tostring(t).."\n") end, printInline=function(_,t) write(tostring(t)) end, - clear=function() if gpu then gpu.fill(1,1,w,h," ");cx,cy=1,1 end end, - resetCursor=function() cx,cy=1,1 end, + clear=function() if gpu then for i=1, #screens do local scr=screens[i];gpu.bind(scr.addr);gpu.fill(1,1,scr.w,scr.h," ");scr.cx,scr.cy=1,1 end end end, + resetCursor=function() for i=1, #screens do local scr=screens[i];scr.cx,scr.cy=1,1 end end, setBackgroundColor=function(_,cl) if gpu then gpu.setBackground(cl) end end, setTextColor=function(_,cl) if gpu then gpu.setForeground(cl) end end, enable=function() end, @@ -108,10 +109,8 @@ local ok,err=xpcall(function() local ev={c.pullSignal(0)} if ev[1]=="key_down" then qEv("keyPressed",1,ev[3]);qEv("keyTyped",1,string.char(ev[3])) elseif ev[1]=="key_up" then qEv("keyReleased",1,ev[3]) - elseif ev[1]=="component_added" then qEv("componentAdded",ev[3]) - elseif ev[1]=="component_removed" then qEv("componentRemoved",ev[3]) - elseif ev[1]=="modem_message" then qEv("modem_message",table.unpack(ev,2)) - elseif ev[1]=="NoSleep" then ex=true end + end + if ev[1]=="NoSleep" then ex=true else qEv(table.unpack(ev)) end end if st=="error" or coroutine.status(kCo)=="dead" then if efi.reboot then c.shutdown(true) end diff --git a/Src/Hyperion-firmware-oc/data/boot/oc/eeprom b/Src/Hyperion-firmware-oc/data/boot/oc/eeprom index 0b449bb..3ff38a9 100644 --- a/Src/Hyperion-firmware-oc/data/boot/oc/eeprom +++ b/Src/Hyperion-firmware-oc/data/boot/oc/eeprom @@ -27,7 +27,7 @@ do end end local function tryLoadFrom(address) - local handle, reason = boot_invoke(address, "open", "/boot/oc/boot.lua") + local handle, reason = boot_invoke(address, "open", "/oc/boot.lua") if not handle then return nil, reason end diff --git a/Src/Hyperion-firmware-oc/data/boot/oc/initdisks b/Src/Hyperion-firmware-oc/data/boot/oc/initdisks index ef90d54..26bee35 100644 --- a/Src/Hyperion-firmware-oc/data/boot/oc/initdisks +++ b/Src/Hyperion-firmware-oc/data/boot/oc/initdisks @@ -7,7 +7,7 @@ local internal = {} local function createDisk(id, hw) local disk = { - address = id, + address = id, isReadOnly = function() return hw.isReadOnly() end } diff --git a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/25_tty.kmod b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/25_tty.kmod index 62d0274..4c9b525 100644 --- a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/25_tty.kmod +++ b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/25_tty.kmod @@ -67,23 +67,52 @@ local plt = { local gpus,screens = {},{} -for addr, typ in component.list() do +for addr, typ in component.list("gpu") do if typ == "gpu" then - gpus[#gpus]=component.proxy(addr) - elseif typ == "screen" then - screens[addr]={cx=1,cy=1,w=w,h=h} + gpus[#gpus+1]=component.proxy(addr) end end -local binds,newid={},0 +if #gpus>0 then + for addr, typ in component.list("screen") do + if typ == "screen" then + gpus[1].bind(addr) + local w,h = gpus[1].maxResolution() + gpus[1].setResolution(w,h) + screens[addr]={cx=1,cy=1,w=w,h=h,addr=addr,fg=0,bg=0,gpu=nil} + end + end +end +local scrnum = 0 +for i,v in pairs(screens) do + scrnum=scrnum+1 +end + +kernel.log("initialized "..tostring(#gpus).." gpus and "..tostring(scrnum).." screens") + +local binds,newid={},0 +local curaddr="" +local function scroll(scr, gpu) gpu.copy(1,2,scr.w,scr.h-1,0,-1);gpu.fill(1,scr.h,scr.w,1," ") end local function write(text, addr) local g=gpus[1] + local scr=screens[addr] + if not scr then error("NODEV") end + if curaddr~=addr then g.bind(addr); g.setForeground(scr.fg); g.setBackground(scr.bg) end + for i=1,#text do + local char=text:sub(i,i) + if char=="\n" then scr.cx=1;scr.cy=scr.cy+1 + elseif char=="\t" then scr.cx=scr.cx+(4-((scr.cx-1)%4)) + elseif char=="\b" then if scr.cx>1 then scr.cx=scr.cx-1;g.set(scr.cx,scr.cy," ") end + else g.set(scr.cx,scr.cy,char);scr.cx=scr.cx+1 end + if scr.cx>scr.w then scr.cx=1;scr.cy=scr.cy+1 end + if scr.cy>scr.h then scroll(scr, g);scr.cy=scr.cy-1 end + end end local function newtty(addr) newid=newid+1 - kernel.devfs.data["tty"][newid]=function(op, mode) + kernel.devfs.data["tty"][tostring(newid)]=function(op, mode) if op=="type" then return "Terminal" elseif op=="open" then @@ -93,33 +122,33 @@ local function newtty(addr) write(content, addr) end, size=function() - local s={obj.getSize()} - return tostring(screens[addr].w)..":" + return screens[addr].w, screens[addr].h end, clear=function() - obj.clear() - obj.setCursorPos(1,1) + local g=gpus[1] + local scr=screens[addr] + if addr~=curaddr then g.bind(addr) end + g.fill(1,1,scr.w,scr.h," "); + scr.cx,scr.cy=1,1 end, gpos=function() - local s={obj.getCursorPos()} - return table.concat(s,";") + return screens[addr].cx, screens[addr].cy end, spos=function(x,y) - return obj.setCursorPos(x,y) + if not tonumber(x) or not tonumber(y) then error("Invailid arg") end + screens[addr].cx, screens[addr].cy = x,y end, sfgc=function(c) - fg=c - return obj.setTextColor(aprox(c)) + screens[addr].fg=c end, sbgc=function(c) - bg=c - return obj.setBackgroundColor(aprox(c)) + screens[addr].bg=c end, gfgc=function() - return fg + return screens[addr].fg end, gbgc=function() - return bg + return screens[addr].bg end, isvirt=function() return false @@ -141,6 +170,8 @@ local function newtty(addr) end end -if #gpus>=1 and #screens>=1 then - +if #gpus>=1 and scrnum>=1 then + for addr,obj in pairs(screens) do + newtty(addr) + end end \ No newline at end of file diff --git a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/26_keyboards.kmod b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/26_keyboards.kmod new file mode 100644 index 0000000..92f87c8 --- /dev/null +++ b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/26_keyboards.kmod @@ -0,0 +1,113 @@ +--:Minify:-- +local kernel=... +kernel.oc.keyboards={} +local kbs=kernel.oc.keyboards + +local kbidx=0 +local keyboard = {} + +keyboard.keys = { + back = 0x0E, -- backspace + delete = 0xD3, + down = 0xD0, + enter = 0x1C, + home = 0xC7, + lcontrol = 0x1D, + left = 0xCB, + lmenu = 0x38, -- left Alt + lshift = 0x2A, + pageDown = 0xD1, + rcontrol = 0x9D, + right = 0xCD, + rmenu = 0xB8, -- right Alt + rshift = 0x36, + space = 0x39, + tab = 0x0F, + up = 0xC8, + ["end"] = 0xCF, + numpadenter = 0x9C, +} +kernel.oc.keys=keyboard.keys + +for i=0, 255 do + kernel.oc.keys[string.char(i)]=i +end + +------------------------------------------------------------------------------- + +function keyboard.isAltDown(addr) + return kbs[addr].pressedCodes[keyboard.keys.lmenu] or kbs[addr].pressedCodes[keyboard.keys.rmenu] +end + +function keyboard.isControl(char) + return type(char) == "number" and (char < 0x20 or (char >= 0x7F and char <= 0x9F)) +end + +function keyboard.isControlDown(addr) + return kbs[addr].pressedCodes[keyboard.keys.lcontrol] or kbs[addr].pressedCodes[keyboard.keys.rcontrol] +end + +function keyboard.isKeyDown(addr,charOrCode) + if type(charOrCode) == "string" then + return kbs[addr].pressedChars[utf8 and utf8.codepoint(charOrCode) or charOrCode:byte()] + elseif type(charOrCode) == "number" then + return kbs[addr].pressedCodes[charOrCode] + end +end + +function keyboard.isShiftDown(addr) + return kbs[addr].pressedCodes[keyboard.keys.lshift] or kbs[addr].pressedCodes[keyboard.keys.rshift] +end +kernel.oc.keyboard=keyboard + +local function serializeBool(bool) + if bool then + return "T" + else + return "F" + end +end + +for addr, typ in kernel.oc.component.list("keyboard") do + if typ=="keyboard" then + kbidx=kbidx+1 + kbs[addr]={pressedChars = {}, pressedCodes = {}, events=kernel.newFifo()} + kernel.devfs.data["input"]["keyboard"..tostring(kbidx)]=function(op,mode) + if op=="type" then + return "Keyboard" + elseif op=="open" then + local h = { + read=function(amount) + local rv="" + for i=1, amount or 1 do + local event = {kernel.oc.keyboards[addr].events.pop()} + if event[1] then + rv=rv..event[1] + end + end + if rv=="" then rv=nil end + return rv + end, + write=function(content) + end, + gctrl=function() + return serializeBool(keyboard.isControlDown(addr))..";"..serializeBool(keyboard.isAltDown(addr)) + end, + isKeyDown=function(char) + return keyboard.isKeyDown(addr,char) + end + } + if mode=="rw" then + return h + elseif mode=="r" then + h["write"]=nil + return h + elseif mode=="w" then + h["read"]=nil + return h + end + end + end + end +end + diff --git a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/30_daemon.kmod b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/30_daemon.kmod new file mode 100644 index 0000000..898b012 --- /dev/null +++ b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/30_daemon.kmod @@ -0,0 +1,99 @@ +--:Minify:-- +local kernel=... +local keys=kernel.oc.keys + +kernel.processes.ocdaemon = function() + + local timeout = false + + kernel.log("OC daemon started") + + local ctrlKeyMap = { + [keys.a]=1, [keys.b]=2, [keys.c]=3, + [keys.d]=4, [keys.e]=5, [keys.f]=6, + [keys.g]=7, [keys.h]=8, [keys.i]=9, + [keys.j]=10, [keys.k]=11, [keys.l]=12, + [keys.m]=13, [keys.n]=14, [keys.o]=15, + [keys.p]=16, [keys.q]=17, [keys.r]=18, + [keys.s]=19, [keys.t]=20, [keys.u]=21, + [keys.v]=22, [keys.w]=23, [keys.x]=24, + [keys.y]=25, [keys.z]=26, + } + + local specialKeyMap = { + [keys.up] = "\27[A", + [keys.down] = "\27[B", + [keys.right] = "\27[C", + [keys.left] = "\27[D", + [keys.home] = "\27[H", + [keys["end"]] = "\27[F", + --[keys.pageUp] = "\27[5~", + --[keys.pageDown] = "\27[6~", + [keys.delete] = "\27[3~", + [keys.enter] = "\n", + [keys.back] = "\b", + [keys.tab] = "\t", + } + + while true do + + local event = {kernel.EFI.getMachineEvent()} + + if event[1] then + + local eventType = event[1] + local addr = event[2] + local char = event[3] + local keyCode = event[4] + + if eventType == "key_down" then + + local keyboard = kernel.oc.keyboards[addr] + + if keyboard.ctrl then + + local ctrlByte = ctrlKeyMap[keyCode] + + if ctrlByte then + if ctrlByte == 3 then + + for _, task in ipairs(syscall.getTasks()) do + syscall.sigsend(task, 1) + end + + else + keyboard.events.push(string.char(ctrlByte)) + end + end + + else + + local special = specialKeyMap[keyCode] + + if special then + keyboard.events.push(special) + + elseif char and char > 0 then + keyboard.events.push(kernel.apis.unicode.char(char)) + end + + end + + elseif eventType == "key_up" then + + end + + timeout = false + + else + timeout = true + end + + if timeout then + sleep(0.05) + end + + end +end + +kernel.log("OC daemon queued for execution") \ No newline at end of file diff --git a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod index bb7b4db..c4a3109 100644 --- a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod +++ b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod @@ -120,7 +120,10 @@ function kernel.main() end end end - kernel.EFI:yield() + if kernel.EFI:getEpochMs()>=nextyield then + kernel.EFI:yield() + nextyield=kernel.EFI:getEpochMs()+5000 + end end local T_prev_avg = (N > 0) and (totalTaskTime / N) or 0 diff --git a/Src/Hyperion-firmware-oc/description.txt b/Src/Hyperion-firmware-oc/description.txt new file mode 100644 index 0000000..6d7a173 --- /dev/null +++ b/Src/Hyperion-firmware-oc/description.txt @@ -0,0 +1 @@ +firmware for Opencomputers mod \ No newline at end of file diff --git a/Src/Hyperion-firmware-oc/version.txt b/Src/Hyperion-firmware-oc/version.txt new file mode 100644 index 0000000..afaf360 --- /dev/null +++ b/Src/Hyperion-firmware-oc/version.txt @@ -0,0 +1 @@ +1.0.0 \ No newline at end of file diff --git a/Src/Hyperion-kernel/data/boot/fstab b/Src/Hyperion-kernel/data/boot/fstab index b7fa0b1..bfbb2d4 100644 --- a/Src/Hyperion-kernel/data/boot/fstab +++ b/Src/Hyperion-kernel/data/boot/fstab @@ -1,4 +1,4 @@ -F $;/boot/ +U $;/boot/ V devfs0000;/dev/ V tmpfs0000;/tmp/ V procfs0000;/proc/ diff --git a/Src/Hyperion-kernel/data/boot/kernel.lua b/Src/Hyperion-kernel/data/boot/kernel.lua index 2e01056..e9efb23 100644 --- a/Src/Hyperion-kernel/data/boot/kernel.lua +++ b/Src/Hyperion-kernel/data/boot/kernel.lua @@ -139,6 +139,7 @@ end kernel.config = config local skip=false +local mounted={} local root=false for i,v in ipairs(split(fstab,"\n")) do if v:sub(1,1)=="U" or v:sub(1,1)=="F" then @@ -152,13 +153,42 @@ for i,v in ipairs(split(fstab,"\n")) do if not skip then local path=v:sub(#id+4) if path=="/" then root=true end + mounted[id]=true ifs.mount(id,path) else skip=false end end end -if not root then kernel.panic("No disk mounted to /") end +if not root then + kernel.log("No rootdisk found, prompting user...", "WARN", 0xFF8800) + screen:setTextColor(0xDDDDDD) + screen:print("Disk to mount to /:") + local idx=1 + local canadates={} + for i,v in pairs(kernel.disks) do + if not mounted[i] then + screen:print("("..idx..") : "..i) + canadates[idx]=i + idx=idx+1 + end + end + while true do + EFI:yield() + local event={EFI:getMachineEvent()} + if event[1]=="keyTyped" then + if tonumber(event[3]) then + if canadates[tonumber(event[3])] then + ifs.writeAllText("/boot/fstab", "U "..canadates[tonumber(event[3])]..";/\n"..fstab) + fstab="U "..canadates[tonumber(event[3])]..";/\n"..fstab + ifs.mount(canadates[tonumber(event[3])], "/") + break + end + end + screen:print(event[1], event[3]) + end + end +end kernel.log("Disks initialized") function kernel.saveLog() diff --git a/Src/Hyperion-kernel/data/lib/modules/hyperion/10_vfs.kmod b/Src/Hyperion-kernel/data/lib/modules/hyperion/10_vfs.kmod index 1f44069..c34f1c6 100644 --- a/Src/Hyperion-kernel/data/lib/modules/hyperion/10_vfs.kmod +++ b/Src/Hyperion-kernel/data/lib/modules/hyperion/10_vfs.kmod @@ -1068,8 +1068,9 @@ function vfs.chown(path, uid, gid) if kernel.unixSockets[namei(path)] then error("EINVAL") end local disk = resolveMount(path) if disk:isReadOnly() then error("ERDONLY") end - local _euid = (kernel.currentTask and (kernel.currentTask.euid or kernel.currentTask.uid)) or kernel.uid - if _euid ~= 0 then error("EPERM") end + local meta = getFileMeta(path) + local euid = (kernel.currentTask and (kernel.currentTask.euid or kernel.currentTask.uid)) or kernel.uid + if euid ~= 0 and euid ~= meta.owner then error("EPERM") end updateMeta(path, function(e) e.owner = uid; e.group = gid end) end diff --git a/Src/Hyperion-kernel/data/lib/modules/hyperion/45_hypervisor.kmod b/Src/Hyperion-kernel/data/lib/modules/hyperion/45_hypervisor.kmod index 0e2066a..720f78d 100644 --- a/Src/Hyperion-kernel/data/lib/modules/hyperion/45_hypervisor.kmod +++ b/Src/Hyperion-kernel/data/lib/modules/hyperion/45_hypervisor.kmod @@ -128,11 +128,12 @@ function sys.exec(path, args, envars) local task = kernel.currentTask local func, euid, _ = loadExecutable(path, kernel._U) - if task.fd then - for fd, _ in pairs(task.fd) do - if fd > 2 then pcall(kernel.vfs.close, fd) end - end - end + -- no idea why this is here? + --if task.fd then + -- for fd, _ in pairs(task.fd) do + -- if fd > 2 then pcall(kernel.vfs.close, fd) end + -- end + --end task.euid = euid task.args = args or {} diff --git a/Src/Hyperion-kernel/data/lib/modules/hyperion/92_setup.kmod b/Src/Hyperion-kernel/data/lib/modules/hyperion/92_setup.kmod index 051846e..790fc72 100644 --- a/Src/Hyperion-kernel/data/lib/modules/hyperion/92_setup.kmod +++ b/Src/Hyperion-kernel/data/lib/modules/hyperion/92_setup.kmod @@ -2,6 +2,8 @@ local kernel = ... if kernel.firstBoot then + kernel.log("Seeding filesystem permissions...") + local P = kernel.vfs.P local PERM = kernel.vfs.PERM @@ -14,107 +16,44 @@ if kernel.firstBoot then local RWXRWXRWX = PERM.RWXRWXRWX local SUID_755 = PERM.SUID_755 - local META_VERSION = 0x02 - local rootDisk = kernel.disks["$"] - - local function makeEntry(name, etype, owner, group, perms, cmeta) - cmeta = cmeta or "" - local plo = perms % 256 - local phi = math.floor(perms / 256) % 256 - local olo = (owner or 0) % 256 - local ohi = math.floor((owner or 0) / 256) % 256 - local glo = (group or 0) % 256 - local ghi = math.floor((group or 0) / 256) % 256 - return string.char(#name) .. name - .. string.char(etype, olo, ohi, glo, ghi, plo, phi) - .. string.char(#cmeta) .. cmeta - end - - local REG = 0x00 - - local function mergeMeta(dir, entries) - local diskDir = dir - if diskDir:sub(1,1) == "/" then diskDir = diskDir:sub(2) end - local metaPath = (diskDir == "" and ".meta" or diskDir .. "/.meta") - - local existing = {} - local rok, rf = pcall(function() return rootDisk:open(metaPath, "r") end) - if rok and rf then - local raw = rf.read(65535) - if rf.close then rf.close() end - existing = (kernel.vfs._parseMetafile and kernel.vfs._parseMetafile(raw)) or {} - end - - for _, e in ipairs(entries) do - local name = e[1] - local etype = e[2] or REG - local owner = e[3] or 0 - local group = e[4] or 0 - local perms = e[5] or RWX_RX_RX - local cmeta = e[6] or "" - existing[name] = { - etype = etype, - owner = owner, - group = group, - perms = perms, - cmeta = cmeta, - } - end - - local data = string.char(META_VERSION) - for name, m in pairs(existing) do - data = data .. makeEntry( - name, - m.etype or REG, - m.owner or 0, - m.group or 0, - m.perms or RWX_RX_RX, - m.cmeta or "" - ) - end - - local ok, err = pcall(function() - local f = rootDisk:open(metaPath, "w") - f.write(data) - f.close() - end) - if not ok then - kernel.log("permissions: failed to write " .. metaPath .. ": " .. tostring(err), "WARN", 0xFF8800) + local function seed(root, data) + for i=1,#data do + local entry=data[1] + kernel.vfs.chmod(root..entry[1],entry[2],entry[3]) + kernel.vfs.chown(root..entry[1],entry[4]) end end - kernel.log("Seeding filesystem permissions...") - - mergeMeta("/", { - {"bin", REG, 0, 0, RWX_RX_RX}, - {"boot", REG, 0, 0, RWX_RX_RX}, - {"dev", REG, 0, 0, RWXRWXRWX}, - {"etc", REG, 0, 0, RWX_RX_RX}, - {"home", REG, 0, 0, RWX_RX_RX}, - {"lib", REG, 0, 0, RWX_RX_RX}, - {"proc", REG, 0, 0, RWXRWXRWX}, - {"root", REG, 0, 0, RW____ }, - {"sbin", REG, 0, 0, RWX_RX_RX}, - {"tmp", REG, 0, 0, RWXRWXRWX}, - {"usr", REG, 0, 0, RWX_RX_RX}, - {"var", REG, 0, 0, RWXRWXRWX}, - {"opt", REG, 0, 0, RWX_RX_RX}, + seed("/", { + {"bin", 0, 0, RWX_RX_RX}, + {"boot", 0, 0, RWX_RX_RX}, + {"dev", 0, 0, RWXRWXRWX}, + {"etc", 0, 0, RWX_RX_RX}, + {"home", 0, 0, RWX_RX_RX}, + {"lib", 0, 0, RWX_RX_RX}, + {"proc", 0, 0, RWXRWXRWX}, + {"root", 0, 0, RW____ }, + {"sbin", 0, 0, RWX_RX_RX}, + {"tmp", 0, 0, RWXRWXRWX}, + {"usr", 0, 0, RWX_RX_RX}, + {"var", 0, 0, RWXRWXRWX}, + {"opt", 0, 0, RWX_RX_RX}, }) - mergeMeta("/bin", { - {"login", REG, 0, 0, SUID_755 }, - {"su", REG, 0, 0, SUID_755 }, - {"sudo", REG, 0, 0, SUID_755 }, + seed("/bin/", { + {"login", 0, 0, SUID_755 }, + {"su", 0, 0, SUID_755 }, + {"sudo", 0, 0, SUID_755 }, }) - mergeMeta("/etc", { - {"passwd", REG, 0, 0, RW_R_R }, - {"shadow", REG, 0, 0, RW____ }, - {"pam.d", REG, 0, 0, RW____ }, + seed("/etc/", { + {"passwd", 0, 0, RW_R_R }, + {"shadow", 0, 0, RW____ }, + {"pam.d", 0, 0, RW____ }, }) - mergeMeta("/etc/pam.d", { - {"secret", REG, 0, 0, RW____}, + seed("/etc/pam.d/", { + {"secret", 0, 0, RW____}, }) kernel.log("Filesystem permissions seeded.") diff --git a/Src/coreutils/data/bin/login b/Src/coreutils/data/bin/login index 51b9c86..611a451 100644 --- a/Src/coreutils/data/bin/login +++ b/Src/coreutils/data/bin/login @@ -3,6 +3,7 @@ syscall.open("/dev/input/keyboard1", "r") --stdin (fd 0) syscall.open("/dev/tty/1", "w") --stdout (fd 1) syscall.open("/dev/null", "w") --stderr (fd 2) +local fs=require("fs") local MAX_ATTEMPTS = 3 @@ -100,7 +101,9 @@ local function spawnShell(username, uid, shell, homedir) pcall(syscall.chdir, "/") end - local ok, err = pcall(syscall.execspawn, shell, username .. ":shell") + local shellfunc, err = load(fs.readAllText(shell)) + + local ok, err = pcall(syscall.spawn, shellfunc, username .. ":shell", nil,nil,nil,true) if not ok then syscall.write(1, "login: failed to launch shell: " .. tostring(err) .. "\n") sleep(2) @@ -145,7 +148,7 @@ local function doLogin() syscall.devctl(1, "sfgc", 0xFFFFFF) sleep(0.3) - spawnShell(username, uid, shell, homedir) + pcall(spawnShell, username, uid, shell, homedir) return -- back to login prompt else attempts = attempts + 1 diff --git a/Src/coreutils/data/etc/sysinit/autorun/login b/Src/coreutils/data/etc/sysinit/autorun/login index 51b9c86..611a451 100644 --- a/Src/coreutils/data/etc/sysinit/autorun/login +++ b/Src/coreutils/data/etc/sysinit/autorun/login @@ -3,6 +3,7 @@ syscall.open("/dev/input/keyboard1", "r") --stdin (fd 0) syscall.open("/dev/tty/1", "w") --stdout (fd 1) syscall.open("/dev/null", "w") --stderr (fd 2) +local fs=require("fs") local MAX_ATTEMPTS = 3 @@ -100,7 +101,9 @@ local function spawnShell(username, uid, shell, homedir) pcall(syscall.chdir, "/") end - local ok, err = pcall(syscall.execspawn, shell, username .. ":shell") + local shellfunc, err = load(fs.readAllText(shell)) + + local ok, err = pcall(syscall.spawn, shellfunc, username .. ":shell", nil,nil,nil,true) if not ok then syscall.write(1, "login: failed to launch shell: " .. tostring(err) .. "\n") sleep(2) @@ -145,7 +148,7 @@ local function doLogin() syscall.devctl(1, "sfgc", 0xFFFFFF) sleep(0.3) - spawnShell(username, uid, shell, homedir) + pcall(spawnShell, username, uid, shell, homedir) return -- back to login prompt else attempts = attempts + 1 diff --git a/Src/hysh/data/bin/hysh b/Src/hysh/data/bin/hysh index ee08df8..74ff793 100644 --- a/Src/hysh/data/bin/hysh +++ b/Src/hysh/data/bin/hysh @@ -1206,14 +1206,14 @@ local function runCommand(command) local proc = syscall.spawn(function() -- Open standard fds so programs that don't do it themselves work correctly. - syscall.open("/proc/self/parent/fd/0", "r") -- fd 0 stdin - syscall.open("/proc/self/parent/fd/1", "w") -- fd 1 stdout - syscall.open("/proc/self/parent/fd/2", "w") -- fd 2 stderr + --syscall.open("/proc/self/parent/fd/0", "r") -- fd 0 stdin + --syscall.open("/proc/self/parent/fd/1", "w") -- fd 1 stdout + --syscall.open("/proc/self/parent/fd/2", "w") -- fd 2 stderr -- exec replaces this coroutine's code with a fresh isolated environment -- compiled from disk by the kernel (via loadExecutable -> freshUserEnv), -- so the child cannot share any upvalue or syscall table state with hysh. syscall.exec(cmdPath, {table.unpack(args, 2)}) - end, progName, nil, nil, nil, true) + end, progName) while true do local exited, code = syscall.collect(proc) diff --git a/Src/spm/data/bin/spm b/Src/spm/data/bin/spm index 76b43c8..b557ddb 100644 --- a/Src/spm/data/bin/spm +++ b/Src/spm/data/bin/spm @@ -717,6 +717,14 @@ local spm = function(...) w(src.." -> "..dest) syscall.symlink(dest, src) end + elseif f=="setup.lua" then + local func, err = load(c, "setupscript", "t", _G) + if not func then + w("Failed to load setup script for package "..i) + else + local ok, err = xpcall(func, debug.traceback) + if not ok then w("Setup script for package "..i.." exited with error: "..err) end + end end end end diff --git a/Src/sysinit/data/usr/lib/sysinit/sysinit b/Src/sysinit/data/usr/lib/sysinit/sysinit index dd9ec91..f331dd6 100644 --- a/Src/sysinit/data/usr/lib/sysinit/sysinit +++ b/Src/sysinit/data/usr/lib/sysinit/sysinit @@ -36,7 +36,7 @@ for i,v in ipairs(files) do kernel.log("Error loading startup script '" .. filepath .. "': " .. err, "ERROR", 0xFF0000) else syscall.spawn(function() - local status, err = pcall(startupFunc) + local status, err = xpcall(startupFunc, debug.traceback) if not status then kernel.log("Error executing startup script '" .. filepath .. "': " .. err, "ERROR", 0xFF0000) else @@ -45,6 +45,7 @@ for i,v in ipairs(files) do end, "startup:" .. v, nil,nil,nil,true) end end +kernel.log("sysinit complete") kernel.saveLog() while true do diff --git a/packages/Hyperion-firmware-ac.pkg b/packages/Hyperion-firmware-ac.pkg index a98e054..c047643 100644 --- a/packages/Hyperion-firmware-ac.pkg +++ b/packages/Hyperion-firmware-ac.pkg @@ -8,6 +8,6 @@ ], "dependencies": [], "version": "1.0.0", - "hash": "149200eb06cf1d63a4dc44c7b22d3fa6", + "hash": "a4e33985213691b829940e014685ba0d", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/Hyperion-firmware-ac.tar.gz" } diff --git a/packages/Hyperion-firmware-oc.pkg b/packages/Hyperion-firmware-oc.pkg index a7843a1..0a9d6db 100644 --- a/packages/Hyperion-firmware-oc.pkg +++ b/packages/Hyperion-firmware-oc.pkg @@ -1,9 +1,13 @@ { "id": "Hyperion-firmware-oc", - "description": "No description provided", - "authors": [], + "description": "firmware for Opencomputers mod", + "authors": [ + "Hyperion", + "Astronand", + "Xtimhedae" + ], "dependencies": [], - "version": "0.0.0", - "hash": "4d47c5c61eecb18b7b7b754747fb1581", + "version": "1.0.0", + "hash": "f9351ff01bb846e57e0f93595dbe303a", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/Hyperion-firmware-oc.tar.gz" } diff --git a/packages/Hyperion-kernel.pkg b/packages/Hyperion-kernel.pkg index b11ee70..5c6f2a4 100644 --- a/packages/Hyperion-kernel.pkg +++ b/packages/Hyperion-kernel.pkg @@ -8,6 +8,6 @@ ], "dependencies": [], "version": "1.5.0", - "hash": "975ef619a9a505d08931a036ed770c1e", + "hash": "d45b18adc188a3090e5f1d9aca687347", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/Hyperion-kernel.tar.gz" } diff --git a/packages/coreutils.pkg b/packages/coreutils.pkg index 935b683..9bca453 100644 --- a/packages/coreutils.pkg +++ b/packages/coreutils.pkg @@ -8,6 +8,6 @@ ], "dependencies": [], "version": "1.0.0", - "hash": "62188c73a708084a818781d91b8fe0eb", + "hash": "34996938f359f52e92a388483c3fb5c9", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/coreutils.tar.gz" } diff --git a/packages/hysh.pkg b/packages/hysh.pkg index 9be2827..b235d8e 100644 --- a/packages/hysh.pkg +++ b/packages/hysh.pkg @@ -7,6 +7,6 @@ ], "dependencies": [], "version": "1.3.0", - "hash": "7bee8c7e7a7feabb9db5491e5c1f952a", + "hash": "cbc352d49cb9837ee825471351dd9ffc", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/hysh.tar.gz" } diff --git a/packages/raw/Hyperion-firmware-ac.tar.gz b/packages/raw/Hyperion-firmware-ac.tar.gz index 8029b4914ad0bfd8d2c6eac4fbf1c847e8b5e156..cc53a502cce98a92f1c6e7469774b3cd35efcecf 100644 GIT binary patch literal 8378 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 literal 2876 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 F0RZ%Ff%X6Z diff --git a/packages/raw/Hyperion-firmware-oc.tar.gz b/packages/raw/Hyperion-firmware-oc.tar.gz index e3718c0eca6a0e9636f611cf5d0e204e8fdc5e4a..1259ce7d74d2d22ac4a1df33a570be518e9ce1e4 100644 GIT binary patch literal 8373 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 A`v3p{ literal 6722 zcmb2|=3oE;rvGnabBk}gO*)qz`qX~GgS%P^Z5flARBvzvr5_A>{Mge_m>sY>7XX#t)!7RGlk8{fTr*_gr2{*G>h*wT~lOin#B zPdrw3`QzsGb@x~EUq5(|@qf$ee>aabA3XTEd413G_}aGYnc|6TSL?sNul##q*?-T7 zmh=C7{_=n4{}uiB|IT0XOEW*d@xS!{-oJbI!v4oM{HvdS^1;Vnr4W*Z=0ddz&47|DWe)JG{Qkyi;zS9^vcT`eQO(y z3lwe|@&=~`a#yr}?Mj`thxwUOuvgtbm!{>-+=tEW`ttua8t-eiH@D-mEZ&j#f!}1J zs_@lMFO4J@Yn;$%ef9A0vqL?XkIHfwmnbYPKm7k(8N1*8o3c0BXKk@@7LzJi*=zRA zJTk;!^@JezU}aD4HODp5bPSE!)(W-E=(jrISmA8i{cG==>JuMBUw`g45>J(OJ;^fr z(qyw`pC;t9)XWzVZBxDcQRmE`N2&W{A}0#pysD&Ndj9*_|DHaI7S|eUYfl`Ut8X`t zZ&i!VxtVS;A)QB$2cN#XRi|-b_y1S7zD21ipJbWDah0lGCz{pTgJklAURST2{ikp8c^1pln@pMut4|+$kf*k6?ai#IPxE?JYacE+ ztJfVl?OsHHbLPxbTC3GqZHq+u*00}G!ny70{-c^Nu4@0@5co>vti)8ShtuP{W+v>; zG>>WA^x=gQkJDFIi;lxuOQ-3JxZl4Z%)=LL#inm)cJ{%Wv+d>wSI_T}??3O?UvJcR z{@lH}ds%|tf9*2S-=wkgk!)&q?5UIKfoFP@qKz`T4BzQaEBs@(%j?jMP13US5bJQBIP(fDb-;g5(j5n{)F@GhHUS#$5T$@B@vehY7RYb0K{ z!6~h~{=w%@_WkGY?XN87GB{H_P4tEM!HOF@c5rPDtY~fB*?3UhC#E>eA;h@L&@!qe zuq{u+?=WZ0nZrqJ@|?R}^|U5$XR+J-q3!Q39#xhwrXxCn3ePny53jOZaYgl)c!QV5 zr4&o~jXj5r#2*>_*bzE4uI@emJMa0GZ`TyudbB8V`u)cxOKaYy*3{K19uxkiU-L1% zefs^!=|V?WEDu^7v0(bMy@p@jn)2N-giCU_ujoc`-~UbvEPL4X=yO_DJip8SE`NC=_?X&^TCIV|U~(orhs(6nqQ>GvlNT z`Yb-bdN6t8#Ud`bZ@0{SkDHu6)1w;^Au;2y_W1~ljcIoTsy9Cs-OS&3q5Xc``6efc z{233fPxoZhIyy^n zcILl;>e*8feUnyLoQz(Xc(GyUWR3mjEdNUXDAU{@R&vF!|H$P@pITNd(Q2^}tv#Xg zB+bY9f$7VamlXuKDxY4_N)eYAi&}U1_l1cI^QIPQt#r7RnRoMRo=-~28YQm}A9VJg z=02tzxL4)(%;O7n&3?W9cq++n{q@bf@6@USoAk~m*;~t3{;I8AGPO^5@u$lL=ZbP4 zc>NPt>fGCYr}0Ige!2YAt_4eqb&pNlBIWUNozbcPY(FiItvq)jY)Sxkm9fXq<)0kp zHq|?9SLd|i-kW+Gd_2K3_iZe}(UhH5P8+-?v>#pIvFa z{LnM;dG`-3b&Fcu!dfORc=p(-nMsx}@2~p0kN3Fo4F1;nxkgoo>i(@eFRt%&`g97T zVxQ{1l$?3%ByL?h@Jw5B<&rGk&(elJDEMBeD~6ohEeJ~=~uKaaHOr9blfC)zZF~7uiU)m zYlhn=W!M ze0P1)dnGadFY}h1Sap2!nq4!LuJCk4$lF!u9`Ngq3O}`UfzhKw@4gl|hCcUvl0Qiz zc^CVPEff2b*}7HN%0`vk-}lI_Wk)2-XfJmHwt)1}6J zvy(!vOGPY-mC*Rk*mTjiGD~}M-aMU$j4Q5fOOxDiV472^q-Axe+Q!!kU%ic)svYNt z_W$2{b?@OTN{&9aloq`gjkHKpej&p?r_}h*sh<|^EH`Zv?^UrJ$eQ$M!#Yu!@1JgN znz6*Zvo%{PTBmDk$nH&RLRKq2a9aF8b$j&bKb((v%noXX#ye*UYDU<(>P}4!S!~Vq zqJPux16<5N{fi{*~{o|*sl&$*O)YBJAXww%>hEI6IG zaaHl^G>fU4bJosz$XvUe$K_ncc02RE-`)yuH4SEvjn|oNQ9kY4jKfZ4GmEQRgoGoO z&e*CurI$Ur)_sN4PXEKHF?-hVs4v^TdE>+2a_NAuU0q*xZ8A9^o84=hSE4X^{kH3A z-|LU8`z2rTKmYyDe|3NV_3z%leeeIzKi~aNIP>#s-weekb(TA=H_kHpW8@i~aP`{8 z4C6@+_pdOBKa)s0`%GfTo~z94b6!7UlHg`Pes?wp&#S4{ZrYn)t!qeN*W2)D!IL1y zX%>B2hEu+a%rFaI#X93%mTTd039VCcL3b6O%5#*J^OiUo)Tmj$U$&vcEl@_ZT%n*M zy+iVFhoaG`Q*pw~t1oT*`a2>b;%?9CyS2=_swOP`R&Aon5!RP@YU{)fsU?4oSiXOv z^Sid0>&dK>DzP`G>aDsLC(Ib?efjF!9j}gY9@~9()2Fh;)N1)=myT+g`^xBhJ*XIZw7 zWOnA=Ytp*QgQqnzWbF@pW2&XMNTBKmd+JeN&k3Phd-8kE9FFd2xG8#tq0wn){K^~N zA1B&}x2;(uWn8j#iO`GyYn2yYdAc`?Rxex>u~V@tQfcj8!}F)#M_iWXCsn;}mYmu|{)ocp9|>n8n)y~nmDUs=_-;9b#Uhhw_?Z!Nf3 zuD(_Epj6=MV}8{uO{bQ5hAwCO>Y#g_w>JEET=nUvZx5+F)p85xy?jt5>fFMM8@`$D z>^xz%;BBOuOU(=q#ib{{r?lI6}Il47V-YHOq26B?{jLRW>r}~w|Gzf z!2Bif&XSOmBKlW5cYa@Y_fW{fL%#iYoyzn+{p{Q4(f8?k;IU(_v+kbU^Xyja{BB>n ziCRLNllLzW*{c__{ENkFnQWtNhO4(Y=6>61`lxZ2$3OS*ADmM^O2^J#nHqaN+gA5m zk=$~d&7tX2*E;Mq$vXVzR#ay8Q=2_$YyUQhciftJ|7763=B#fq(d!cz`E6)CBGCFr zq%R`p=#T5q9mBpR3`;=5gW5w#Pd; zJB)aqvPm|soE+RdL_f%*HM_F=*--+B+SiE3!^C@JM}gmLX@g+=*audJ2Zy-aLZ<&B#Ub%VB- zRVFjdTqVtCqvZbb@J9*tXPn*#QqG9Yv|`DTH`$?bHT_eH<@Mv5^*w1^f(-uR-?z`= zi91?&`kiOD=EJOD7LBh=vfoQ?&9jbGyS`|)=ZG%5N5q75`eg ze_wfUp0oHC@0vv$znl6^E{yoly6tX2*kbdaXQTG&Th3i3P-reLty^>}uXI!P+{3(E z%FoCs&-FW)e0%PrqW*L1EZ=W6$u07KoN8BnfNcTOM~|x|mnQALc_VZ6Y~#OgOT!nn zwdKv;7f~i%m9+C(>(|viht8kfKjTi;sTI;ebBu0mk9PXfbJp1defTzrafiLUV3s%uw9ps zonzNh9$OxsX*2u&1=?+2xoft4-O>~17IT_0aEHyClppY!ZN2JRjVOVYi_A>@e}>)^ zTQL2EVSxUQCMM1I+slvryZiqC(Tgw2tJr@C-}_(k{oD5U|Ns8{)vlS#8Taev^K1V< zJJzrMukZ0+;^_+6f5)Q_FaB!(<~w`y+JE~){(fhlF1)QPA@=(2Hlh8I|IhPhov-I< z|9$xF@BQOg)Z+*G7E?K0Uo2NbciAH?(h4(@mrrr+=i{{Q) z+Rd@V#J7}RuH)x#&IzZ)<+r3gc)BI#beJ~Bzm?lL_RqHcw<>FWy40hW+jg`5VYK>v zdI$dx&Byf{+8^6<=bK6YxGxxvlmU)`?erqR&6-TsFE@_hQ~t{ZP$_+9Vy$6jVf^#A`)U;Y1?8h9sn z&A;|@|0UmCKmT8n@3(XL>i_4B|4YAj*x4Ag?&HJ5^^!H`?QgF+VlHq54FSi(~E_3m4N8(W@6qIV)S3oUEq)b_(37 zALAsquwjDV*8fp~Z}*o$WUh8ETvTOP0_9xXx5(;NIh6BS+4bu$h?WI`!?_ltThLTWp*d73X?s@=WwTp)4YBX(btgzKOqodnI;& z-5C&h^WVN838m>1+%*)I1Z%b`7D3!Kl?*}6H%Gab8o1~w_6InuScAmzSRMrPNQo9q z1xT>^qmw4jL?W!7b*RY!=4mZ$ZYE?yph1LcGLeG85<;9ta2G#uf!RS;z#_$q$THVX z^&ia{1wHm1ZRb;9?B+?GA+ZnawXY%f4Yo0g$yC}cojO^zNcS7Pt7v{~iu8uYBy|!IwOSs8i zsqAal1Jo{TEXIVf))R!mhU+t*p&= zR-62sIb;5zpUY+&*Zcl5?Ah9vamS}g>SxHmx%Lmt~s^oo{`zBm8Vst7NEI$l0A& zSTC+_lJVuTeZIn|D|K_3hTc@i=Qcf47X8h6 z>ea%6xFy^kpXX<19(eEE(ayy8>+jsTuO`M#65ZX~wLM~Dj8;f~t#gTC@4Bik|JSia zQ-9{}zkBp$ZZ)gyh9oxq|C?0f9{R6)oi6JANNEcH`t9eWqIg%w37wO))!RHtJz(nj z^D7n%#GYHU$k=*M?Bv)7-bXbKw`ZKY^(i$>??j>Ns@H{$>lG4a@@|cclD(Po_32Wt zmveXBjIsLjmw7>#*3^T4T5^9V`daIF?9(-DW|A^BdTnCy_r#}9Q`nz8kofwTqf*@B zhV-{x+qXW6u3hUYwd~ustFwb2x0k=KJF@wP{*|36eTknI-}G%aTl&VY?uK0r;}X+% zFE)LzlH#|_>OJ`ERN(P)u5(sO^MhaP2(G!mX5wMX2aX-@A7}Kmsr&UYrgySM%c&$U zth9cRGhg!B%8%uS=Wpmbe-{jT`A_7|hAlNWe;!xQkDHeMe_iZ3$0yg8=Du9f`@ZMj zGcEgQHO_OKH8!FAstU-! z*YDlC^5vCX@dal;o>_R^eSb~~vg%aRoGIJWQc z+aC7g+j6(8pHzM=qy6YZrRVEoN;9tA(EWP@(@9jE>^-f7ezm(~xVP>sRz{&H4EPBL9Wca+hw^T<~kJ$d1$3Lfz|McUSaT zm&}^_N2uw}++~YD{yZnXaQ+kJ<@)xw&_{pu%*E(O=4P4HC ztv&488D?oe#s82Qe|+u|yE)l~N2(TnQmwb#v&{Kl*w@2J(}KJdt-DWqwQmYie8+6N zaDM3VyBp3|zKLD4RKr;z(z{OYgudLmwWbBn51yz#nQbgrD*Zp;oJG+h!OuNY0&Yze zD8B5u$dsj7uSoVW=Q&Q<#OuzB9$BVn*T~MC|3vidyUvr`b7L<5P_|RB_q?O$zSYbm zDp|37=PZs?m79qyYY(PAJ#zApVT_$}omp_;^X$)ND=r(`dsg#H%*snwa{jZpZ&&i< zNjBH+U$Z^?Jd;UJqGhX{V9|TN6bW_-pUTfWvhQw?dSpLU$n9Il#89ahT(+w7LR5Z> zwe`&qx$wj1?SGdiI^BmP^515tI(FQvF7#e!+%tF`dym6#4I=S zyF_7toyr?4$K9XIV%@jjuwLi&m zRN&iYuE^8AUov+-)ZSLK-%uy2?1SFTsn$DfoYyHEEN;CSxN~F9#d}}PlYSo*`h92j zu>)6@rAt~H~zWbon$e$YiIZS_m*r@D(j@<%HEjq6mECi z&Z9DqS&?HuC$EUGNnhcW(0`WG>{q?zTzTzhOIddJlxwx$rb*}B7H`;g{oAd$+u7B* Z>)&qOOPKR_|BiqBk4qklGAv+V001%zJDC6g diff --git a/packages/raw/Hyperion-kernel.tar.gz b/packages/raw/Hyperion-kernel.tar.gz index 239178c291e30de8413d9897dc191af90012e857..16774ef755a0a7083571a03f3724f7f0d07fa509 100644 GIT binary patch delta 28709 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

%&tuF3w_ck*+uja| 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 diff --git a/packages/raw/coreutils.tar.gz b/packages/raw/coreutils.tar.gz index 364fc7ba4885fe001c29146e25599d1a3eccdcbe..6c65874608024fd6000610dbc68502a754045f44 100644 GIT binary patch literal 7181 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 literal 7109 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 B>lXk3 diff --git a/packages/raw/hysh.tar.gz b/packages/raw/hysh.tar.gz index 7e6352bc7c4b1cd38a03a241a767894d8b93445a..84ce130319873844d4e9c4953d91910591f542db 100644 GIT binary patch delta 17415 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

Xu->D0I>H&ZO6rE^!z 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 delta 17421 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 literal 5836 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 bp8xC0a=Wi2F#ld(@}D_@W!`0m1q=)TJq==U diff --git a/packages/raw/sysinit.tar.gz b/packages/raw/sysinit.tar.gz index b1499af6227436fba842149f53e9a992bcc8dd2e..812fcdcd1ea6afbbe0f9cfb7b4e3e1dbbea98726 100644 GIT binary patch literal 1038 zcmb2|=3oE;rvGoFV)Gwa2|Tsjf9TX{HclqR02P%bv1_C5w(s2)w7XuxSLW4Gi^$uF zj;sH^FP}3bf5(KVQFo`{{atJ3RSPOS=EW%hc-@YelNf@%K9I zR(&x(2|7Y#~D_;9Q>%(P5 zhV6^xX1znQ=Mm1JXIDL#1mb-(nzFB|_|KUW{g za_`7rd!Duv|4V#ux_x!)kIPa*S`ouXaKKkGPUT--;prGydq;s1r zzizW`e)en8TcN#|=Q?%E$a{*L+$+4L)olLJ?+@FT{1Y|G=j#tMUi-iLL;jJP+JEh} zHUIX@{eM-uU!=nFf8zfBU;FL;f2&CRci4dA`w#gN-@nKIz5kT4-Myaq_{*XzdDfxE z7E6Ny?Ar1!ti1QjW_HCp=cznL-b`P{8Pm4yoYaa8zx@q?mv?zwjkxrlb@By=Wm(DL zR=*~>a{78y-t#o}jL7zzp-_2b$)`1`dYflxxrRFos>nlLB@3fkygZMom^<(Jd8}ipOUkV%!M`p?e_i@l zlee^`bjH1H7k*#<^+4#p`k6n4_B|dyIhCB6YpU!2pSLwRaQEolxt@P~Gfs)xO1@dx zarW90*5}^R!rO|qm+&6i_NVj6#^Yi+=7K%j!}N8zZq}$uU<7@wf7XSVV-w=o~dSm$!s+rxgS5*uMS*j z9NA$UR&b@H?AVHc5UI&UH_g%$PjY=?a4U#-^zz2)y&7-NZsMIQ>9V8yL5Nd{TMu(m z`+<8iG@?7tt@6>AU30nGxU=Z?@h2`dhu{23Se$=-W%#MhCpx=SPjB^YoqBuO=E;AL zec-#YaS{W2YSo6i1l^xUeunS5aIZ>3<;`*Bb7oqRmA9v!TIl05@2!D z@l@o)`9l8}1^quaPvy(T89$=j3~PHHy<9ih_~^r!#)`RH=j(`{*Ool*G4(IgCOxHf zvNo%PK1Fy&_8PB$d-BGVwpj+JEw6sLk$dFl#}uszg zT*_<=dKuAl^4xEi$p6Qe?h_CC`73by`~Md+uK#x|5REN8A@H}p>|dm4h|$5h{a)S& zljoI9D4+4a^TC7ve{{Y#ieLY)z~Qv!zxc=fQMONd^r!rvFSJMZfBf6u_D6o*7rHOY zw1fHU)Q^pwEahDDy;RvPe_KVkx7+SI$G>JqecHd}8~e_G75MP!mp#w=V-f$Ozt@Md z+&l8uo=54+|I|PEcH3V658ME9jl_e$`+18d9}k|MBEA|4;wEFL(aU{{oSB_5bZ9XZ`B`d;jOl@5}!;^>4nq<$n3A zv;s%fD1MtEE9* z-kh%u_U5kqzWnP!)qVamem<_7G3k|XL<`%`U*Eoc)-^eB`1ovT;UChMO~Svd*tpxs zFnaRT%6*&660NuUL@DQZ%lpe#zd2YYeD2e|UrSRxclS*!_*FZJW8Ox~lM#Lg6@Sgs zSatf)#_EZh84qS&;)<$RHF;UUj=N|7<@kTi_k5h?+;huoezZTAh^T20=@mk2~IejSKmdcJtU=CY?J+3ba(C1Qs{k zP~2dC>{Qr-%~qGRS$!+=)dF*W_sDF_x7lrTmSe^Cw>Y|23tu_Bk4?%TFDAz2-|sVMSbHgD|jxc9ebC!nc1p*NLh*m9lq4 z=j4B1wm{-!>7LbdE*+X(vfa7TxZ%x}=o0zVq?3>W|a diff --git a/packages/spm.pkg b/packages/spm.pkg index c4c7eba..def084f 100644 --- a/packages/spm.pkg +++ b/packages/spm.pkg @@ -14,6 +14,6 @@ "Hyperion-core" ], "version": "1.0.0", - "hash": "4cd02eed9e91a8e458dde2227725e2ad", + "hash": "996e0fed6b0cb4ae5fb578ba3cfb0680", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/spm.tar.gz" } diff --git a/packages/sysinit.pkg b/packages/sysinit.pkg index 50008ff..87eec79 100644 --- a/packages/sysinit.pkg +++ b/packages/sysinit.pkg @@ -7,6 +7,6 @@ ], "dependencies": [], "version": "1.1.0", - "hash": "cab61038368a1d215852edd1ff411988", + "hash": "8c4a3ffcf86326bb0c07338060bb7727", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/sysinit.tar.gz" } -- 2.55.0 From 05ca0f10a229395decf93ed3b4a9e4c224fb1d32 Mon Sep 17 00:00:00 2001 From: Astronand Date: Tue, 25 Aug 2026 21:16:48 -0400 Subject: [PATCH 2/2] forgot var def --- .../modules/opencomputers/36_scheduler.kmod | 1 + packages/Hyperion-firmware-oc.pkg | 2 +- packages/raw/Hyperion-firmware-oc.tar.gz | Bin 8373 -> 8386 bytes 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod index c4a3109..18dddea 100644 --- a/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod +++ b/Src/Hyperion-firmware-oc/data/lib/modules/opencomputers/36_scheduler.kmod @@ -10,6 +10,7 @@ local lambda_var = 0.02 local k_min = 0.5 local k_max = 0.5 local B = 0.01 +local nextyield=0 function kernel.main() kernel.log("Starting main loop...") diff --git a/packages/Hyperion-firmware-oc.pkg b/packages/Hyperion-firmware-oc.pkg index 0a9d6db..75f445d 100644 --- a/packages/Hyperion-firmware-oc.pkg +++ b/packages/Hyperion-firmware-oc.pkg @@ -8,6 +8,6 @@ ], "dependencies": [], "version": "1.0.0", - "hash": "f9351ff01bb846e57e0f93595dbe303a", + "hash": "913d68c1c1a42afd42bfbab61a10729e", "tarball": "https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/packages/raw/Hyperion-firmware-oc.tar.gz" } diff --git a/packages/raw/Hyperion-firmware-oc.tar.gz b/packages/raw/Hyperion-firmware-oc.tar.gz index 1259ce7d74d2d22ac4a1df33a570be518e9ce1e4..e405570510d0f2d7ed421abde439848b95b58365 100644 GIT binary patch delta 7993 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

    )&qOiE0G_YZ A*8l(j delta 7990 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 N{**a#CJZMS7yza4^cnyF -- 2.55.0