commit 6769ced179395019001757ab499fa95d3da4fb97
parent 191c79c25f49607d77aadead95181a10db65a43b
Author: erai <erai@omiltem.net>
Date: Tue, 13 May 2025 00:28:10 -0400
add arch independent statbuf
Diffstat:
5 files changed, 118 insertions(+), 30 deletions(-)
diff --git a/build.sh b/build.sh
@@ -6,7 +6,7 @@ CRYPTO="ed25519.om sha512.om sha256.om chacha20.om poly1305.om aes.om rsa.om"
CC="cc1.om type.om as.om decl.om node.om"
SSHD="chacha20.om poly1305.om sha256.om sha512.om ed25519.om sshd.om"
SHELL="echo.om cmp.om rm.om ls.om cat.om xxd.om mv.om mkdir.om cpio.om sh.om"
-BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1 build.sh cc4.om"
+BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1"
./cc1 -m ${MACHINE} ${LIBS} echo.om -o echo -n echo.lines -G echo.call
./cc1 -m ${MACHINE} ${LIBS} cmp.om -o cmp -n cmp.lines -G cmp.call
@@ -20,7 +20,7 @@ BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1 build.sh cc4.om"
./cc1 -m ${MACHINE} ${LIBS} sh.om -o sh -n sh.lines -G sh.call
./cc1 -m ${MACHINE} ${LIBS} ${CRYPTO} sshd.om -o sshd -n sshd.lines -G sshd.call
+for name in ${BIN}; do echo ${name}; done | ./cpio -o > initramfs
if [ "${MACHINE}" = "x86_64" ]; then
- for name in ${BIN}; do echo ${name}; done | ./cpio -o > initramfs
./cc1 -m ${MACHINE} kernel.x86_64.om -o kernel.x86_64 -n kernel.x86_64.lines -G kernel.x86_64.call
fi
diff --git a/cpio.om b/cpio.om
@@ -1,24 +1,3 @@
-struct stat {
- dev: int;
- ino: int;
- nlink: int;
- uid_mode: int;
- gid: int;
- rdev: int;
- size: int;
- blksize: int;
- blocks: int;
- atime: int;
- atime_nsec: int;
- mtime: int;
- mtime_nsec: int;
- ctime: int;
- ctime_nsec: int;
- pad0: int;
- pad1: int;
- pad2: int;
-}
-
func main(argc: int, argv: **byte, envp: **byte) {
var opts: int;
var i: int;
@@ -87,7 +66,7 @@ func main(argc: int, argv: **byte, envp: **byte) {
exit(1);
}
- if fstat(fd, (&stat) as *byte) < 0 {
+ if fstat(fd, &stat) < 0 {
fflush(stdout);
fputs(stderr, "stat failed: ");
fputs(stderr, name);
@@ -98,7 +77,7 @@ func main(argc: int, argv: **byte, envp: **byte) {
// header
fputs(stdout, "070701");
fputh32(stdout, stat.ino & (-1 >> 32));
- fputh32(stdout, stat.uid_mode & (-1 >> 32));
+ fputh32(stdout, stat.mode);
fputh32(stdout, 0);
fputh32(stdout, 0);
fputh32(stdout, stat.nlink);
diff --git a/syscall.aarch64.om b/syscall.aarch64.om
@@ -40,6 +40,26 @@ enum {
SIGWINCH = 28,
}
+struct stat_aarch64 {
+ dev: int;
+ ino: int;
+ mode_nlink: int;
+ gid_uid: int;
+ rdev: int;
+ pad0: int;
+ size: int;
+ blksize: int;
+ blocks: int;
+ atime: int;
+ atime_nsec: int;
+ mtime: int;
+ mtime_nsec: int;
+ ctime: int;
+ ctime_nsec: int;
+ pad1: int;
+ pad2: int;
+}
+
func get_machine(): int {
return 0xb7;
}
@@ -60,8 +80,31 @@ func close(fd: int): int {
return syscall(57, fd, 0, 0, 0, 0, 0);
}
-func fstat(fd: int, buf: *byte): int {
- return syscall(80, fd, buf as int, 0, 0, 0, 0);
+func fstat(fd: int, sb: *stat): int {
+ var s: stat_aarch64;
+ var ret: int;
+ ret = syscall(80, fd, (&s) as int, 0, 0, 0, 0);
+ if ret == 0 {
+ sb.dev = s.dev;
+ sb.ino = s.ino;
+ sb.nlink = s.mode_nlink & (-1 >> 32);
+ sb.mode = s.mode_nlink >> 32;
+ sb.uid = s.gid_uid & (-1 >> 32);
+ sb.gid = s.gid_uid >> 32;
+ sb.rdev = s.rdev;
+ sb.size = s.size;
+ sb.blksize = s.blksize;
+ sb.blocks = s.blocks;
+ sb.atime = s.atime;
+ sb.atime_nsec = s.atime_nsec;
+ sb.mtime = s.mtime;
+ sb.mtime_nsec = s.mtime_nsec;
+ sb.ctime = s.ctime;
+ sb.ctime_nsec = s.ctime_nsec;
+ sb.pad1 = 0;
+ sb.pad2 = 0;
+ }
+ return ret;
}
func getrandom(buf: *byte, len: int, flags: int): int {
diff --git a/syscall.om b/syscall.om
@@ -10,13 +10,34 @@ struct sigaction {
mask: int;
}
+struct stat {
+ dev: int;
+ ino: int;
+ nlink: int;
+ mode: int;
+ uid: int;
+ gid: int;
+ rdev: int;
+ size: int;
+ blksize: int;
+ blocks: int;
+ atime: int;
+ atime_nsec: int;
+ mtime: int;
+ mtime_nsec: int;
+ ctime: int;
+ ctime_nsec: int;
+ pad1: int;
+ pad2: int;
+}
+
func get_machine(): int;
func syscall(n: int, a1: int, a2: int, a3: int, a4: int, a5: int, a6: int): int;
func read(fd: int, buf: *byte, n: int): int;
func write(fd: int, buf: *byte, n: int): int;
func open(name: *byte, flags: int, mode: int): int;
func close(fd: int): int;
-func fstat(fd: int, buf: *byte): int;
+func fstat(fd: int, sb: *stat): int;
func getrandom(buf: *byte, len: int, flags: int): int;
func poll(pfd: *int, nfd: int, timeout: int): int;
func lseek(fd: int, off: int, whence: int): int;
diff --git a/syscall.x86_64.om b/syscall.x86_64.om
@@ -40,6 +40,28 @@ enum {
SIGWINCH = 28,
}
+struct stat_x86_64 {
+ dev: int;
+
+ ino: int;
+ nlink: int;
+ uid_mode: int;
+ gid: int;
+ rdev: int;
+ size: int;
+ blksize: int;
+ blocks: int;
+ atime: int;
+ atime_nsec: int;
+ mtime: int;
+ mtime_nsec: int;
+ ctime: int;
+ ctime_nsec: int;
+ pad0: int;
+ pad1: int;
+ pad2: int;
+}
+
func get_machine(): int {
return 0x3e;
}
@@ -60,8 +82,31 @@ func close(fd: int): int {
return syscall(3, fd, 0, 0, 0, 0, 0);
}
-func fstat(fd: int, buf: *byte): int {
- return syscall(5, fd, buf as int, 0, 0, 0, 0);
+func fstat(fd: int, sb: *stat): int {
+ var s: stat_x86_64;
+ var ret: int;
+ ret = syscall(5, fd, (&s) as int, 0, 0, 0, 0);
+ if ret == 0 {
+ sb.dev = s.dev;
+ sb.ino = s.ino;
+ sb.nlink = s.nlink;
+ sb.mode = s.uid_mode & (-1 >> 32);
+ sb.uid = s.uid_mode >> 32;
+ sb.gid = s.gid;
+ sb.rdev = s.rdev;
+ sb.size = s.size;
+ sb.blksize = s.blksize;
+ sb.blocks = s.blocks;
+ sb.atime = s.atime;
+ sb.atime_nsec = s.atime_nsec;
+ sb.mtime = s.mtime;
+ sb.mtime_nsec = s.mtime_nsec;
+ sb.ctime = s.ctime;
+ sb.ctime_nsec = s.ctime_nsec;
+ sb.pad1 = 0;
+ sb.pad2 = 0;
+ }
+ return ret;
}
func getrandom(buf: *byte, len: int, flags: int): int {