mirror of
https://github.com/Adorable-Catgirl/Zorya-NEO.git
synced 2024-11-23 10:48:06 +11:00
New initram format.
This commit is contained in:
parent
116a35786e
commit
b5d155a9cf
@ -13,7 +13,7 @@ os.execute("mkdir -p pkg/bios")
|
|||||||
|
|
||||||
status("Building EEPROM...")
|
status("Building EEPROM...")
|
||||||
os.execute("luacomp src/loader.lua -O pkg/bios/managed.bios")
|
os.execute("luacomp src/loader.lua -O pkg/bios/managed.bios")
|
||||||
--os.execute("luacomp src/zy-neo/zinit.lua -O debug.lua")
|
os.execute("luacomp src/zy-neo/zinit.lua -O debug.lua")
|
||||||
if (os.execute("[[ $(stat --printf=%s pkg/bios/managed.bios) > 4096 ]]")) then
|
if (os.execute("[[ $(stat --printf=%s pkg/bios/managed.bios) > 4096 ]]")) then
|
||||||
io.stderr:write("WARNING: BIOS is over 4KiB!\n")
|
io.stderr:write("WARNING: BIOS is over 4KiB!\n")
|
||||||
end
|
end
|
||||||
@ -36,6 +36,6 @@ status("Library build complete.\n\nBuilding installer...")
|
|||||||
os.execute("cp utils/ser.lua pkg/init.lua")
|
os.execute("cp utils/ser.lua pkg/init.lua")
|
||||||
os.execute("cp -r installer_dat pkg")
|
os.execute("cp -r installer_dat pkg")
|
||||||
status("Packing installer...")
|
status("Packing installer...")
|
||||||
os.execute("cd pkg; find * -depth | cpio -o | lua ../utils/mkselfextract.lua > ../zorya-neo-installer.lua")
|
os.execute("cd pkg; find * -depth | lua ../utils/make_tsar.lua | lua ../utils/mkselfextract.lua > ../zorya-neo-installer.lua")
|
||||||
status("Build complete.")
|
status("Build complete.")
|
||||||
status(string.format("Took %ds.", os.time()-start))
|
status(string.format("Took %ds.", os.time()-start))
|
@ -19,9 +19,9 @@ local cfg = component.proxy(component.list("eeprom")()).getData()
|
|||||||
local baddr = cfg:sub(1, 36)
|
local baddr = cfg:sub(1, 36)
|
||||||
local bootfs = component.proxy(baddr)
|
local bootfs = component.proxy(baddr)
|
||||||
|
|
||||||
assert(bootfs.exists(".zy2/image.romfs"), "No boot image!")
|
assert(bootfs.exists(".zy2/image.tsar"), "No boot image!")
|
||||||
|
|
||||||
local romfs_file = assert(bootfs.open(".zy2/image.romfs", "rb"))
|
local romfs_file = assert(bootfs.open(".zy2/image.tsar", "rb"))
|
||||||
|
|
||||||
local romfs_dev = romfs.read(function(a)
|
local romfs_dev = romfs.read(function(a)
|
||||||
local c = ""
|
local c = ""
|
||||||
|
73
src/zy-neo/builtins/util_tsar.lua
Normal file
73
src/zy-neo/builtins/util_tsar.lua
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
local magic = 0x5f7d
|
||||||
|
local magic_rev = 0x7d5f
|
||||||
|
local header_fmt = "I2I2I2I2I2I6I6"
|
||||||
|
local en = string.unpack("=I2", string.char(0x7d, 0x5f)) == magic -- true = LE, false = BE
|
||||||
|
local function get_end(e)
|
||||||
|
return (e and "<") or ">"
|
||||||
|
end
|
||||||
|
local function read_header(dat)
|
||||||
|
local e = get_end(en)
|
||||||
|
local m = string.unpack(e.."I2", dat)
|
||||||
|
if m ~= magic and m ~= magic_rev then return nil, "bad magic" end
|
||||||
|
if m ~= magic then
|
||||||
|
e = get_end(not en)
|
||||||
|
end
|
||||||
|
local ent = {}
|
||||||
|
ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime = string.unpack(e..header_fmt, dat)
|
||||||
|
return ent
|
||||||
|
end
|
||||||
|
|
||||||
|
local arc = {}
|
||||||
|
|
||||||
|
function arc:fetch(path)
|
||||||
|
for i=1, #self.tbl do
|
||||||
|
if (self.tbl[i].name == path and self.tbl[i].mode & 32768 > 0) then
|
||||||
|
self.seek(self.tbl[i].pos-self.seek(0))
|
||||||
|
return self.read(self.tbl[i].filesize), self.tbl[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil, "file not found"
|
||||||
|
end
|
||||||
|
|
||||||
|
function arc:exists(path)
|
||||||
|
for i=1, #self.tbl do
|
||||||
|
if (self.tbl[i].name == path) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function arc:list(path)
|
||||||
|
if path:sub(#path) ~= "/" then path = path .. "/" end
|
||||||
|
local ent = {}
|
||||||
|
for i=1, #self.tbl do
|
||||||
|
if (self.tbl[i].name:sub(1, #path) == path and not self.tbl[i].name:find("/", #path+1, false)) then
|
||||||
|
ent[#ent+1] = self.tbl[i].name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return ent
|
||||||
|
end
|
||||||
|
|
||||||
|
function arc:close()
|
||||||
|
self.close()
|
||||||
|
end
|
||||||
|
|
||||||
|
local tsar = {
|
||||||
|
read = function(read, seek, close)
|
||||||
|
local tbl = {}
|
||||||
|
local lname = ""
|
||||||
|
while lname ~= "TRAILER!!!" do
|
||||||
|
local dat = read(22)
|
||||||
|
local e = read_header(dat)
|
||||||
|
e.name = read(e.namesize)
|
||||||
|
e.pos = seek(e.namesize & 1)
|
||||||
|
seek(e.filesize + (e.filesize & 1))
|
||||||
|
lname = e.name
|
||||||
|
if lname ~= "TRAILER!!!" then
|
||||||
|
tbl[#tbl+1] = e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return setmetatable({tbl = tbl, read = read, seek = seek, close = close}, {__index=tsar})
|
||||||
|
end
|
||||||
|
}
|
@ -36,7 +36,7 @@ end
|
|||||||
local builtins = {}
|
local builtins = {}
|
||||||
--#include "src/zy-neo/utils.lua"
|
--#include "src/zy-neo/utils.lua"
|
||||||
|
|
||||||
--#include "src/zy-neo/builtins/util_romfs.lua"
|
--#include "src/zy-neo/builtins/util_tsar.lua"
|
||||||
|
|
||||||
sys.add_lib("zorya", (function()
|
sys.add_lib("zorya", (function()
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ sys.add_lib("zorya", (function()
|
|||||||
|
|
||||||
local loaded_mods = {}
|
local loaded_mods = {}
|
||||||
|
|
||||||
loaded_mods.util_romfs = romfs
|
loaded_mods.util_tsar = tsar
|
||||||
|
|
||||||
function zy.loadmod(mod)
|
function zy.loadmod(mod)
|
||||||
if (loaded_mods[mod]) then return loaded_mods[mod] end
|
if (loaded_mods[mod]) then return loaded_mods[mod] end
|
||||||
|
76
utils/make_tsar.lua
Normal file
76
utils/make_tsar.lua
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
--Makes a TSAR file
|
||||||
|
local lfs = require("lfs")
|
||||||
|
local files = {}
|
||||||
|
for l in io.stdin:lines() do
|
||||||
|
files[#files+1] = l
|
||||||
|
end
|
||||||
|
local attr = {}
|
||||||
|
local modes = {
|
||||||
|
["fifo"] = 1,
|
||||||
|
["char device"] = 2,
|
||||||
|
["directory"] = 4,
|
||||||
|
["block device"] = 6,
|
||||||
|
["file"] = 8,
|
||||||
|
["link"] = 0xA,
|
||||||
|
["socket"] = 0xC
|
||||||
|
}
|
||||||
|
local function getperm()
|
||||||
|
local md = 0
|
||||||
|
for i=1, 9 do
|
||||||
|
if (attr.permissions:sub(i,i) ~= "-") then
|
||||||
|
md = md | (1 << (i-1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return md | (modes[attr.mode] << 12)
|
||||||
|
end
|
||||||
|
local size = 0
|
||||||
|
for i=1, #files do
|
||||||
|
lfs.attributes(files[i], attr)
|
||||||
|
local ent = {
|
||||||
|
magic = 0x5f7d,
|
||||||
|
namesize = #files[i],
|
||||||
|
name = files[i],
|
||||||
|
mode = getperm(),
|
||||||
|
uid = attr.uid,
|
||||||
|
gid = attr.gid,
|
||||||
|
filesize = attr.size,
|
||||||
|
mtime = attr.modification
|
||||||
|
}
|
||||||
|
if attr.mode ~= "file" then
|
||||||
|
ent.filesize = 0
|
||||||
|
end
|
||||||
|
io.stdout:write(string.pack("=I2I2I2I2I2I6I6", ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime))
|
||||||
|
size = size+22
|
||||||
|
io.stdout:write(ent.name)
|
||||||
|
size = size + ent.namesize
|
||||||
|
if ent.namesize & 1 > 0 then
|
||||||
|
io.stdout:write("\0")
|
||||||
|
size = size+1
|
||||||
|
end
|
||||||
|
if attr.mode == "file" then
|
||||||
|
local h = io.open(files[i], "rb")
|
||||||
|
io.stdout:write(h:read("*a"))
|
||||||
|
h:close()
|
||||||
|
size = size+ent.filesize
|
||||||
|
if ent.filesize & 1 > 0 then
|
||||||
|
io.stdout:write("\0")
|
||||||
|
size = size+1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
do
|
||||||
|
local ent = {
|
||||||
|
magic = 0x5f7d,
|
||||||
|
namesize = 10,
|
||||||
|
name = "TRAILER!!!",
|
||||||
|
mode = 0,
|
||||||
|
uid = 0,
|
||||||
|
gid = 0,
|
||||||
|
filesize = 0,
|
||||||
|
mtime = 0
|
||||||
|
}
|
||||||
|
io.stdout:write(string.pack("=I2I2I2I2I2I6I6", ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime))
|
||||||
|
io.stdout:write(ent.name)
|
||||||
|
size = size + 32
|
||||||
|
end
|
||||||
|
io.stderr:write((size//512).." blocks.\n")
|
@ -48,12 +48,17 @@ local tbl = {}
|
|||||||
|
|
||||||
local pos = 1
|
local pos = 1
|
||||||
local function read(n)
|
local function read(n)
|
||||||
local d = dat:sub(pos, pos+n)
|
local d = dat:sub(pos, pos+n-1)
|
||||||
pos = pos + n
|
pos = pos + n
|
||||||
return d
|
return d
|
||||||
end
|
end
|
||||||
|
|
||||||
local function readint(amt, rev)
|
local function seek(n)
|
||||||
|
pos = pos + n
|
||||||
|
return pos
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[local function readint(amt, rev)
|
||||||
local tmp = 0
|
local tmp = 0
|
||||||
for i=(rev and amt) or 1, (rev and 1) or amt, (rev and -1) or 1 do
|
for i=(rev and amt) or 1, (rev and 1) or amt, (rev and -1) or 1 do
|
||||||
tmp = tmp | (read(1):byte() << ((i-1)*8))
|
tmp = tmp | (read(1):byte() << ((i-1)*8))
|
||||||
@ -95,6 +100,39 @@ while true do
|
|||||||
end
|
end
|
||||||
tbl[#tbl+1] = dent
|
tbl[#tbl+1] = dent
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
|
local magic = 0x5f7d
|
||||||
|
local magic_rev = 0x7d5f
|
||||||
|
local header_fmt = "I2I2I2I2I2I6I6"
|
||||||
|
local en = string.unpack("=I2", string.char(0x7d, 0x5f)) == magic -- true = LE, false = BE
|
||||||
|
local function get_end(e)
|
||||||
|
return (e and "<") or ">"
|
||||||
|
end
|
||||||
|
local function read_header(dat)
|
||||||
|
local e = get_end(en)
|
||||||
|
local m = string.unpack(e.."I2", dat)
|
||||||
|
if m ~= magic and m ~= magic_rev then return nil, "bad magic" end
|
||||||
|
if m ~= magic then
|
||||||
|
e = get_end(not en)
|
||||||
|
end
|
||||||
|
local ent = {}
|
||||||
|
ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime = string.unpack(e..header_fmt, dat)
|
||||||
|
return ent
|
||||||
|
end
|
||||||
|
|
||||||
|
local lname = ""
|
||||||
|
while lname ~= "TRAILER!!!" do
|
||||||
|
local dat = read(22)
|
||||||
|
local e = read_header(dat)
|
||||||
|
e.name = read(e.namesize)
|
||||||
|
e.pos = seek(e.namesize & 1)
|
||||||
|
seek(e.filesize + (e.filesize & 1))
|
||||||
|
lname = e.name
|
||||||
|
if lname ~= "TRAILER!!!" then
|
||||||
|
tbl[#tbl+1] = e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local unpack = unpack or table.unpack
|
local unpack = unpack or table.unpack
|
||||||
|
|
||||||
@ -102,4 +140,6 @@ for i=1, #tbl do
|
|||||||
if (tbl[i].name == "init.lua") then
|
if (tbl[i].name == "init.lua") then
|
||||||
load(dat:sub(tbl[i].pos, tbl[i].pos+tbl[i].filesize-1))(tbl, dat, unpack(arg))
|
load(dat:sub(tbl[i].pos, tbl[i].pos+tbl[i].filesize-1))(tbl, dat, unpack(arg))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
error("Init not found.")
|
@ -111,22 +111,80 @@ fs.makeDirectory(".zy2")
|
|||||||
fs.makeDirectory(".zy2/mods")
|
fs.makeDirectory(".zy2/mods")
|
||||||
fs.makeDirectory(".zy2/lib")
|
fs.makeDirectory(".zy2/lib")
|
||||||
|
|
||||||
local romfs = fs.open(".zy2/image.romfs", "w")
|
local romfs = fs.open(".zy2/image.tsar", "w")
|
||||||
fs.write(romfs, "romfs\1\0")
|
--fs.write(romfs, "romfs\1\0")
|
||||||
|
|
||||||
|
local modes = {
|
||||||
|
["fifo"] = 1,
|
||||||
|
["char device"] = 2,
|
||||||
|
["directory"] = 4,
|
||||||
|
["block device"] = 6,
|
||||||
|
["file"] = 8,
|
||||||
|
["link"] = 0xA,
|
||||||
|
["socket"] = 0xC
|
||||||
|
}
|
||||||
|
local function getperm(ftype, perm)
|
||||||
|
local md = 0
|
||||||
|
for i=1, 9 do
|
||||||
|
if (perm:sub(i,i) ~= "-") then
|
||||||
|
md = md | (1 << (i-1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return md | (modes[ftype] << 12)
|
||||||
|
end
|
||||||
|
|
||||||
|
function makeDirectory(path)
|
||||||
|
local ent = {
|
||||||
|
name = path,
|
||||||
|
namesize = #path,
|
||||||
|
magic = 0x5f7d,
|
||||||
|
mode = getperm("directory", "r-xr-xr-x"),
|
||||||
|
uid = 0,
|
||||||
|
gid = 0,
|
||||||
|
filesize = 0,
|
||||||
|
mtime = os.time()
|
||||||
|
}
|
||||||
|
fs.write(romfs, string.pack("=I2I2I2I2I2I6I6", ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime))
|
||||||
|
fs.write(romfs, path)
|
||||||
|
end
|
||||||
|
|
||||||
|
makeDirectory(".zy2")
|
||||||
|
makeDirectory(".zy2/mods")
|
||||||
|
makeDirectory(".zy2/lib")
|
||||||
|
|
||||||
function writeFile(path, data)
|
function writeFile(path, data)
|
||||||
--local hand = fs.open(path, "w")
|
--local hand = fs.open(path, "w")
|
||||||
--fs.write(hand, data)
|
--fs.write(hand, data)
|
||||||
--fs.close(hand)
|
--fs.close(hand)
|
||||||
fs.write(romfs, string.char(#path)..path)
|
--fs.write(romfs, string.char(#path)..path)
|
||||||
local ext = path:sub(#path-2)
|
--local ext = path:sub(#path-2)
|
||||||
fs.write(romfs, string.pack("<i2", #data))
|
--fs.write(romfs, string.pack("<i2", #data))
|
||||||
if (ext == "lua" or ext == "z2l" or ext == "z2y") then
|
--if (ext == "lua" or ext == "z2l" or ext == "z2y") then
|
||||||
fs.write(romfs, "x")
|
-- fs.write(romfs, "x")
|
||||||
else
|
--else
|
||||||
fs.write(romfs, "-")
|
-- fs.write(romfs, "-")
|
||||||
|
--end
|
||||||
|
--fs.write(romfs, data)
|
||||||
|
local ent = {
|
||||||
|
name = path,
|
||||||
|
namesize = #path,
|
||||||
|
magic = 0x5f7d,
|
||||||
|
mode = getperm("file", ((ext == "lua" or ext == "z2l" or ext == "z2y") and "r-xr-xr-x") or "rw-r--r--"),
|
||||||
|
uid = 0,
|
||||||
|
gid = 0,
|
||||||
|
filesize = #data,
|
||||||
|
mtime = os.time()
|
||||||
|
}
|
||||||
|
fs.write(romfs, string.pack("=I2I2I2I2I2I6I6", ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime))
|
||||||
|
fs.write(romfs, path)
|
||||||
|
if ent.namesize & 1 > 0 then
|
||||||
|
io.stdout:write("\0")
|
||||||
end
|
end
|
||||||
fs.write(romfs, data)
|
fs.write(romfs, data)
|
||||||
|
if ent.filesize & 1 > 0 then
|
||||||
|
io.stdout:write("\0")
|
||||||
|
size = size+1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
setStatus("Getting file list...")
|
setStatus("Getting file list...")
|
||||||
|
Loading…
Reference in New Issue
Block a user