os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 6769ced179395019001757ab499fa95d3da4fb97
parent 191c79c25f49607d77aadead95181a10db65a43b
Author: erai <erai@omiltem.net>
Date:   Tue, 13 May 2025 00:28:10 -0400

add arch independent statbuf

Diffstat:
Mbuild.sh | 4++--
Mcpio.om | 25++-----------------------
Msyscall.aarch64.om | 47+++++++++++++++++++++++++++++++++++++++++++++--
Msyscall.om | 23++++++++++++++++++++++-
Msyscall.x86_64.om | 49+++++++++++++++++++++++++++++++++++++++++++++++--
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 {