mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
Merge pull request #25610 from alexrp/std-os-linux-cleanup
`std.os.linux`: some miscellaneous cleanup in arch bits
This commit is contained in:
commit
1f8a72175b
@ -32,21 +32,27 @@ test {
|
||||
}
|
||||
|
||||
const arch_bits = switch (native_arch) {
|
||||
.x86 => @import("linux/x86.zig"),
|
||||
.x86_64 => @import("linux/x86_64.zig"),
|
||||
.aarch64, .aarch64_be => @import("linux/aarch64.zig"),
|
||||
.arm, .armeb, .thumb, .thumbeb => @import("linux/arm.zig"),
|
||||
.hexagon => @import("linux/hexagon.zig"),
|
||||
.riscv32 => @import("linux/riscv32.zig"),
|
||||
.riscv64 => @import("linux/riscv64.zig"),
|
||||
.sparc64 => @import("linux/sparc64.zig"),
|
||||
.loongarch64 => @import("linux/loongarch64.zig"),
|
||||
.m68k => @import("linux/m68k.zig"),
|
||||
.mips, .mipsel => @import("linux/mips.zig"),
|
||||
.mips64, .mips64el => @import("linux/mips64.zig"),
|
||||
.mips64, .mips64el => switch (builtin.abi) {
|
||||
.gnuabin32, .muslabin32 => @import("linux/mipsn32.zig"),
|
||||
else => @import("linux/mips64.zig"),
|
||||
},
|
||||
.powerpc, .powerpcle => @import("linux/powerpc.zig"),
|
||||
.powerpc64, .powerpc64le => @import("linux/powerpc64.zig"),
|
||||
.riscv32 => @import("linux/riscv32.zig"),
|
||||
.riscv64 => @import("linux/riscv64.zig"),
|
||||
.s390x => @import("linux/s390x.zig"),
|
||||
.sparc64 => @import("linux/sparc64.zig"),
|
||||
.x86 => @import("linux/x86.zig"),
|
||||
.x86_64 => switch (builtin.abi) {
|
||||
.gnux32, .muslx32 => @import("linux/x32.zig"),
|
||||
else => @import("linux/x86_64.zig"),
|
||||
},
|
||||
else => struct {},
|
||||
};
|
||||
|
||||
@ -88,9 +94,6 @@ pub fn clone(
|
||||
}
|
||||
|
||||
pub const ARCH = arch_bits.ARCH;
|
||||
pub const Elf_Symndx = arch_bits.Elf_Symndx;
|
||||
pub const F = arch_bits.F;
|
||||
pub const Flock = arch_bits.Flock;
|
||||
pub const HWCAP = arch_bits.HWCAP;
|
||||
pub const SC = arch_bits.SC;
|
||||
pub const Stat = arch_bits.Stat;
|
||||
@ -103,8 +106,6 @@ pub const mode_t = arch_bits.mode_t;
|
||||
pub const nlink_t = arch_bits.nlink_t;
|
||||
pub const off_t = arch_bits.off_t;
|
||||
pub const time_t = arch_bits.time_t;
|
||||
pub const timeval = arch_bits.timeval;
|
||||
pub const timezone = arch_bits.timezone;
|
||||
pub const user_desc = arch_bits.user_desc;
|
||||
|
||||
pub const tls = @import("linux/tls.zig");
|
||||
@ -113,10 +114,10 @@ pub const IOCTL = @import("linux/ioctl.zig");
|
||||
pub const SECCOMP = @import("linux/seccomp.zig");
|
||||
|
||||
pub const syscalls = @import("linux/syscalls.zig");
|
||||
pub const SYS = switch (@import("builtin").cpu.arch) {
|
||||
pub const SYS = switch (native_arch) {
|
||||
.arc => syscalls.Arc,
|
||||
.arm, .armeb, .thumb, .thumbeb => syscalls.Arm,
|
||||
.aarch64, .aarch64_be => syscalls.Arm64,
|
||||
.arm, .armeb, .thumb, .thumbeb => syscalls.Arm,
|
||||
.csky => syscalls.CSky,
|
||||
.hexagon => syscalls.Hexagon,
|
||||
.loongarch64 => syscalls.LoongArch64,
|
||||
@ -126,20 +127,20 @@ pub const SYS = switch (@import("builtin").cpu.arch) {
|
||||
.gnuabin32, .muslabin32 => syscalls.MipsN32,
|
||||
else => syscalls.MipsN64,
|
||||
},
|
||||
.or1k => syscalls.OpenRisc,
|
||||
.powerpc, .powerpcle => syscalls.PowerPC,
|
||||
.powerpc64, .powerpc64le => syscalls.PowerPC64,
|
||||
.riscv32 => syscalls.RiscV32,
|
||||
.riscv64 => syscalls.RiscV64,
|
||||
.s390x => syscalls.S390x,
|
||||
.sparc => syscalls.Sparc,
|
||||
.sparc64 => syscalls.Sparc64,
|
||||
.powerpc, .powerpcle => syscalls.PowerPC,
|
||||
.powerpc64, .powerpc64le => syscalls.PowerPC64,
|
||||
.x86 => syscalls.X86,
|
||||
.x86_64 => switch (builtin.abi) {
|
||||
.gnux32, .muslx32 => syscalls.X32,
|
||||
else => syscalls.X64,
|
||||
},
|
||||
.xtensa => syscalls.Xtensa,
|
||||
.or1k => syscalls.OpenRisc,
|
||||
else => @compileError("The Zig Standard Library is missing syscall definitions for the target CPU architecture"),
|
||||
};
|
||||
|
||||
@ -1600,6 +1601,70 @@ pub fn waitid(id_type: P, id: i32, infop: *siginfo_t, flags: u32) usize {
|
||||
return syscall5(.waitid, @intFromEnum(id_type), @as(usize, @bitCast(@as(isize, id))), @intFromPtr(infop), flags, 0);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const GETLK = GET_SET_LK.GETLK;
|
||||
pub const SETLK = GET_SET_LK.SETLK;
|
||||
pub const SETLKW = GET_SET_LK.SETLKW;
|
||||
|
||||
const GET_SET_LK = if (@sizeOf(usize) == 64) extern struct {
|
||||
pub const GETLK = if (is_mips) 14 else if (is_sparc) 7 else 5;
|
||||
pub const SETLK = if (is_mips) 6 else if (is_sparc) 8 else 6;
|
||||
pub const SETLKW = if (is_mips) 7 else if (is_sparc) 9 else 7;
|
||||
} else extern struct {
|
||||
// Ensure that 32-bit code uses the large-file variants (GETLK64, etc).
|
||||
|
||||
pub const GETLK = if (is_mips) 33 else 12;
|
||||
pub const SETLK = if (is_mips) 34 else 13;
|
||||
pub const SETLKW = if (is_mips) 35 else 14;
|
||||
};
|
||||
|
||||
pub const SETOWN = if (is_mips) 24 else if (is_sparc) 6 else 8;
|
||||
pub const GETOWN = if (is_mips) 23 else if (is_sparc) 5 else 9;
|
||||
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
|
||||
pub const OFD_GETLK = 36;
|
||||
pub const OFD_SETLK = 37;
|
||||
pub const OFD_SETLKW = 38;
|
||||
|
||||
pub const RDLCK = if (is_sparc) 1 else 0;
|
||||
pub const WRLCK = if (is_sparc) 2 else 1;
|
||||
pub const UNLCK = if (is_sparc) 3 else 2;
|
||||
};
|
||||
|
||||
pub const F_OWNER = enum(i32) {
|
||||
TID = 0,
|
||||
PID = 1,
|
||||
PGRP = 2,
|
||||
_,
|
||||
};
|
||||
|
||||
pub const f_owner_ex = extern struct {
|
||||
type: F_OWNER,
|
||||
pid: pid_t,
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
_unused: if (is_sparc) i16 else void,
|
||||
};
|
||||
|
||||
pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize {
|
||||
if (@hasField(SYS, "fcntl64")) {
|
||||
return syscall3(.fcntl64, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, cmd))), arg);
|
||||
@ -1612,6 +1677,8 @@ pub fn flock(fd: fd_t, operation: i32) usize {
|
||||
return syscall2(.flock, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, operation))));
|
||||
}
|
||||
|
||||
pub const Elf_Symndx = if (native_arch == .s390x) u64 else u32;
|
||||
|
||||
// We must follow the C calling convention when we call into the VDSO
|
||||
const VdsoClockGettime = *align(1) const fn (clockid_t, *timespec) callconv(.c) usize;
|
||||
var vdso_clock_gettime: ?VdsoClockGettime = &init_vdso_clock_gettime;
|
||||
@ -8361,6 +8428,16 @@ pub const POSIX_FADV = switch (native_arch) {
|
||||
},
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
tv_sec: isize,
|
||||
tv_usec: i64,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
/// The timespec struct used by the kernel.
|
||||
pub const kernel_timespec = extern struct {
|
||||
sec: i64,
|
||||
|
||||
@ -1,46 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const pid_t = linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const timespec = std.os.linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={x0}" (-> usize),
|
||||
: [ret] "={x0}" (-> u64),
|
||||
: [number] "{x8}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={x0}" (-> usize),
|
||||
: [ret] "={x0}" (-> u64),
|
||||
: [number] "{x8}" (@intFromEnum(number)),
|
||||
[arg1] "{x0}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={x0}" (-> usize),
|
||||
: [ret] "={x0}" (-> u64),
|
||||
: [number] "{x8}" (@intFromEnum(number)),
|
||||
[arg1] "{x0}" (arg1),
|
||||
[arg2] "{x1}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={x0}" (-> usize),
|
||||
: [ret] "={x0}" (-> u64),
|
||||
: [number] "{x8}" (@intFromEnum(number)),
|
||||
[arg1] "{x0}" (arg1),
|
||||
[arg2] "{x1}" (arg2),
|
||||
@ -48,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={x0}" (-> usize),
|
||||
: [ret] "={x0}" (-> u64),
|
||||
: [number] "{x8}" (@intFromEnum(number)),
|
||||
[arg1] "{x0}" (arg1),
|
||||
[arg2] "{x1}" (arg2),
|
||||
@ -59,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={x0}" (-> usize),
|
||||
: [ret] "={x0}" (-> u64),
|
||||
: [number] "{x8}" (@intFromEnum(number)),
|
||||
[arg1] "{x0}" (arg1),
|
||||
[arg2] "{x1}" (arg2),
|
||||
@ -73,15 +61,15 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
) u64 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={x0}" (-> usize),
|
||||
: [ret] "={x0}" (-> u64),
|
||||
: [number] "{x8}" (@intFromEnum(number)),
|
||||
[arg1] "{x0}" (arg1),
|
||||
[arg2] "{x1}" (arg2),
|
||||
@ -92,7 +80,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// x0, x1, w2, x3, x4, x5, x6
|
||||
//
|
||||
@ -135,7 +123,7 @@ pub fn clone() callconv(.naked) usize {
|
||||
pub const restore = restore_rt;
|
||||
|
||||
pub fn restore_rt() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ mov x8, %[number]
|
||||
\\ svc #0
|
||||
@ -150,54 +138,19 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
}
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__kernel_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6.39";
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = isize;
|
||||
pub const time_t = i64;
|
||||
pub const mode_t = u32;
|
||||
pub const off_t = isize;
|
||||
pub const ino_t = usize;
|
||||
pub const dev_t = usize;
|
||||
pub const blkcnt_t = isize;
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
pub const blkcnt_t = i64;
|
||||
|
||||
// The `stat` definition used by the Linux kernel.
|
||||
pub const Stat = extern struct {
|
||||
@ -205,40 +158,28 @@ pub const Stat = extern struct {
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad: usize,
|
||||
__pad: u64,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
__pad2: i32,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [2]u32,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: isize,
|
||||
usec: isize,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
@ -1,45 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const pid_t = linux.pid_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const timespec = linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r7}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r7}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r7}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r7}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -47,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r7}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -58,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r7}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -72,15 +61,15 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
return asm volatile ("svc #0"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r7}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -91,7 +80,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// r0, r1, r2, r3, +0, +4, +8
|
||||
//
|
||||
@ -128,23 +117,23 @@ pub fn clone() callconv(.naked) usize {
|
||||
}
|
||||
|
||||
pub fn restore() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ mov r7, %[number]
|
||||
\\ svc #0
|
||||
:
|
||||
: [number] "I" (@intFromEnum(SYS.sigreturn)),
|
||||
: .{ .memory = true }),
|
||||
),
|
||||
else => asm volatile (
|
||||
\\ svc #0
|
||||
:
|
||||
: [number] "{r7}" (@intFromEnum(SYS.sigreturn)),
|
||||
: .{ .memory = true }),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn restore_rt() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ mov r7, %[number]
|
||||
\\ svc #0
|
||||
@ -159,32 +148,6 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
}
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const GETLK = 12;
|
||||
pub const SETLK = 13;
|
||||
pub const SETLKW = 14;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6";
|
||||
@ -216,19 +179,9 @@ pub const HWCAP = struct {
|
||||
pub const EVTSTRM = 1 << 21;
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
__pad0: [4]u8,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = isize;
|
||||
pub const time_t = i32;
|
||||
pub const mode_t = u32;
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
@ -242,39 +195,27 @@ pub const Stat = extern struct {
|
||||
__ino_truncated: u32,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__rdev_padding: u32,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
ino: ino_t,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: i32,
|
||||
usec: i32,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
@ -1,45 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const uid_t = std.os.linux.uid_t;
|
||||
const gid_t = std.os.linux.gid_t;
|
||||
const pid_t = std.os.linux.pid_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const timespec = std.os.linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile ("trap0(#1)"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r6}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile ("trap0(#1)"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r6}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile ("trap0(#1)"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r6}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile ("trap0(#1)"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r6}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -47,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile ("trap0(#1)"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r6}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -58,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile ("trap0(#1)"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r6}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -72,15 +61,15 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
return asm volatile ("trap0(#1)"
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [number] "{r6}" (@intFromEnum(number)),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -91,7 +80,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// r0, r1, r2, r3, r4, r5, +0
|
||||
//
|
||||
@ -130,44 +119,6 @@ pub fn clone() callconv(.naked) usize {
|
||||
);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: time_t,
|
||||
usec: i32,
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = i64;
|
||||
@ -183,32 +134,30 @@ pub const Stat = extern struct {
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad: u32,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
__pad2: i32,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [2]u32,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
pub const VDSO = void;
|
||||
|
||||
@ -1,48 +1,38 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const timespec = linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall 0
|
||||
: [ret] "={$r4}" (-> usize),
|
||||
: [ret] "={$r4}" (-> u64),
|
||||
: [number] "{$r11}" (@intFromEnum(number)),
|
||||
: .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall 0
|
||||
: [ret] "={$r4}" (-> usize),
|
||||
: [ret] "={$r4}" (-> u64),
|
||||
: [number] "{$r11}" (@intFromEnum(number)),
|
||||
[arg1] "{$r4}" (arg1),
|
||||
: .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall 0
|
||||
: [ret] "={$r4}" (-> usize),
|
||||
: [ret] "={$r4}" (-> u64),
|
||||
: [number] "{$r11}" (@intFromEnum(number)),
|
||||
[arg1] "{$r4}" (arg1),
|
||||
[arg2] "{$r5}" (arg2),
|
||||
: .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall 0
|
||||
: [ret] "={$r4}" (-> usize),
|
||||
: [ret] "={$r4}" (-> u64),
|
||||
: [number] "{$r11}" (@intFromEnum(number)),
|
||||
[arg1] "{$r4}" (arg1),
|
||||
[arg2] "{$r5}" (arg2),
|
||||
@ -50,10 +40,10 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall 0
|
||||
: [ret] "={$r4}" (-> usize),
|
||||
: [ret] "={$r4}" (-> u64),
|
||||
: [number] "{$r11}" (@intFromEnum(number)),
|
||||
[arg1] "{$r4}" (arg1),
|
||||
[arg2] "{$r5}" (arg2),
|
||||
@ -62,10 +52,10 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall 0
|
||||
: [ret] "={$r4}" (-> usize),
|
||||
: [ret] "={$r4}" (-> u64),
|
||||
: [number] "{$r11}" (@intFromEnum(number)),
|
||||
[arg1] "{$r4}" (arg1),
|
||||
[arg2] "{$r5}" (arg2),
|
||||
@ -77,16 +67,16 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall 0
|
||||
: [ret] "={$r4}" (-> usize),
|
||||
: [ret] "={$r4}" (-> u64),
|
||||
: [number] "{$r11}" (@intFromEnum(number)),
|
||||
[arg1] "{$r4}" (arg1),
|
||||
[arg2] "{$r5}" (arg2),
|
||||
@ -97,7 +87,7 @@ pub fn syscall6(
|
||||
: .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// a0, a1, a2, a3, a4, a5, a6
|
||||
// sys_clone(flags, stack, ptid, ctid, tls)
|
||||
@ -150,64 +140,33 @@ pub const Stat = extern struct {
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
_pad1: u64,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
_pad2: i32,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
_pad3: [2]u32,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
tv_sec: time_t,
|
||||
tv_usec: i64,
|
||||
};
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_5.10";
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
@ -1,43 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const uid_t = std.os.linux.uid_t;
|
||||
const gid_t = std.os.linux.uid_t;
|
||||
const pid_t = std.os.linux.pid_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const timespec = std.os.linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile ("trap #0"
|
||||
: [ret] "={d0}" (-> usize),
|
||||
: [ret] "={d0}" (-> u32),
|
||||
: [number] "{d0}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile ("trap #0"
|
||||
: [ret] "={d0}" (-> usize),
|
||||
: [ret] "={d0}" (-> u32),
|
||||
: [number] "{d0}" (@intFromEnum(number)),
|
||||
[arg1] "{d1}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile ("trap #0"
|
||||
: [ret] "={d0}" (-> usize),
|
||||
: [ret] "={d0}" (-> u32),
|
||||
: [number] "{d0}" (@intFromEnum(number)),
|
||||
[arg1] "{d1}" (arg1),
|
||||
[arg2] "{d2}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile ("trap #0"
|
||||
: [ret] "={d0}" (-> usize),
|
||||
: [ret] "={d0}" (-> u32),
|
||||
: [number] "{d0}" (@intFromEnum(number)),
|
||||
[arg1] "{d1}" (arg1),
|
||||
[arg2] "{d2}" (arg2),
|
||||
@ -45,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile ("trap #0"
|
||||
: [ret] "={d0}" (-> usize),
|
||||
: [ret] "={d0}" (-> u32),
|
||||
: [number] "{d0}" (@intFromEnum(number)),
|
||||
[arg1] "{d1}" (arg1),
|
||||
[arg2] "{d2}" (arg2),
|
||||
@ -56,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile ("trap #0"
|
||||
: [ret] "={d0}" (-> usize),
|
||||
: [ret] "={d0}" (-> u32),
|
||||
: [number] "{d0}" (@intFromEnum(number)),
|
||||
[arg1] "{d1}" (arg1),
|
||||
[arg2] "{d2}" (arg2),
|
||||
@ -70,15 +61,15 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
return asm volatile ("trap #0"
|
||||
: [ret] "={d0}" (-> usize),
|
||||
: [ret] "={d0}" (-> u32),
|
||||
: [number] "{d0}" (@intFromEnum(number)),
|
||||
[arg1] "{d1}" (arg1),
|
||||
[arg2] "{d2}" (arg2),
|
||||
@ -89,7 +80,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// +4, +8, +12, +16, +20, +24, +28
|
||||
//
|
||||
@ -151,32 +142,6 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const GETLK = 12;
|
||||
pub const SETLK = 13;
|
||||
pub const SETLKW = 14;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = i32;
|
||||
@ -186,51 +151,36 @@ pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
pub const blkcnt_t = i64;
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: time_t,
|
||||
usec: i32,
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
};
|
||||
|
||||
pub const Stat = extern struct {
|
||||
dev: dev_t,
|
||||
__pad: i16,
|
||||
__ino_truncated: i32,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad2: i16,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
ino: ino_t,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
// No VDSO used as of glibc 112a0ae18b831bf31f44d81b82666980312511d6.
|
||||
pub const VDSO = void;
|
||||
|
||||
@ -1,32 +1,20 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const pid_t = linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const timespec = linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
: .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall_pipe(fd: *[2]i32) usize {
|
||||
pub fn syscall_pipe(fd: *[2]i32) u32 {
|
||||
return asm volatile (
|
||||
\\ .set noat
|
||||
\\ .set noreorder
|
||||
@ -39,47 +27,47 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
|
||||
\\ sw $2, 0($4)
|
||||
\\ sw $3, 4($4)
|
||||
\\ 2:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(SYS.pipe)),
|
||||
[fd] "{$4}" (fd),
|
||||
: .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
: .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
: .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -87,14 +75,14 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -103,7 +91,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ .set noat
|
||||
\\ subu $sp, $sp, 24
|
||||
@ -114,7 +102,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -129,13 +117,13 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
return asm volatile (
|
||||
\\ .set noat
|
||||
\\ subu $sp, $sp, 24
|
||||
@ -147,7 +135,7 @@ pub fn syscall6(
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -160,14 +148,14 @@ pub fn syscall6(
|
||||
|
||||
pub fn syscall7(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
arg7: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
arg7: u32,
|
||||
) u32 {
|
||||
return asm volatile (
|
||||
\\ .set noat
|
||||
\\ subu $sp, $sp, 32
|
||||
@ -180,7 +168,7 @@ pub fn syscall7(
|
||||
\\ blez $2, 1f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -192,7 +180,7 @@ pub fn syscall7(
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// 3, 4, 5, 6, 7, 8, 9
|
||||
//
|
||||
@ -243,47 +231,11 @@ pub fn clone() callconv(.naked) usize {
|
||||
);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 24;
|
||||
pub const GETOWN = 23;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const GETLK = 33;
|
||||
pub const SETLK = 34;
|
||||
pub const SETLKW = 35;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6";
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
__pad0: [4]u8,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
pub const blksize_t = u32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = i32;
|
||||
@ -300,51 +252,27 @@ pub const Stat = extern struct {
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad1: [2]u32,
|
||||
size: off_t,
|
||||
atim: i32,
|
||||
atim_nsec: i32,
|
||||
mtim: i32,
|
||||
mtim_nsec: i32,
|
||||
ctim: i32,
|
||||
ctim_nsec: i32,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
blksize: blksize_t,
|
||||
__pad3: u32,
|
||||
blocks: blkcnt_t,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
return .{
|
||||
.sec = self.atim,
|
||||
.nsec = self.atim_nsec,
|
||||
};
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
return .{
|
||||
.sec = self.mtim,
|
||||
.nsec = self.mtim_nsec,
|
||||
};
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
return .{
|
||||
.sec = self.ctim,
|
||||
.nsec = self.ctim_nsec,
|
||||
};
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: isize,
|
||||
usec: isize,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
@ -1,32 +1,20 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const pid_t = linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const timespec = linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
: .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall_pipe(fd: *[2]i32) usize {
|
||||
pub fn syscall_pipe(fd: *[2]i32) u64 {
|
||||
return asm volatile (
|
||||
\\ .set noat
|
||||
\\ .set noreorder
|
||||
@ -39,13 +27,13 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
|
||||
\\ sw $2, 0($4)
|
||||
\\ sw $3, 4($4)
|
||||
\\ 2:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(SYS.pipe)),
|
||||
[fd] "{$4}" (fd),
|
||||
: .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
@ -53,34 +41,34 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
\\ nop
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
: .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
: .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -88,14 +76,14 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -104,14 +92,14 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -123,20 +111,20 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -149,21 +137,21 @@ pub fn syscall6(
|
||||
|
||||
pub fn syscall7(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
arg7: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
arg7: u64,
|
||||
) u64 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> usize),
|
||||
: [ret] "={$2}" (-> u64),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
@ -175,7 +163,7 @@ pub fn syscall7(
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// 3, 4, 5, 6, 7, 8, 9
|
||||
//
|
||||
@ -222,47 +210,11 @@ pub fn clone() callconv(.naked) usize {
|
||||
);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 24;
|
||||
pub const GETOWN = 23;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const GETLK = 33;
|
||||
pub const SETLK = 34;
|
||||
pub const SETLKW = 35;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6";
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
__pad0: [4]u8,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
pub const blksize_t = u32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = i32;
|
||||
@ -279,8 +231,8 @@ pub const Stat = extern struct {
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
|
||||
size: off_t,
|
||||
@ -294,36 +246,24 @@ pub const Stat = extern struct {
|
||||
__pad3: u32,
|
||||
blocks: blkcnt_t,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return .{
|
||||
.sec = self.atim,
|
||||
.nsec = self.atim_nsec,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return .{
|
||||
.sec = self.mtim,
|
||||
.nsec = self.mtim_nsec,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return .{
|
||||
.sec = self.ctim,
|
||||
.nsec = self.ctim_nsec,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: isize,
|
||||
usec: isize,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
271
lib/std/os/linux/mipsn32.zig
Normal file
271
lib/std/os/linux/mipsn32.zig
Normal file
@ -0,0 +1,271 @@
|
||||
// TODO: A lot of this file is very likely wrong.
|
||||
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
: .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall_pipe(fd: *[2]i32) u32 {
|
||||
return asm volatile (
|
||||
\\ .set noat
|
||||
\\ .set noreorder
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ nop
|
||||
\\ b 2f
|
||||
\\ subu $2, $0, $2
|
||||
\\ 1:
|
||||
\\ sw $2, 0($4)
|
||||
\\ sw $3, 4($4)
|
||||
\\ 2:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(SYS.pipe)),
|
||||
[fd] "{$4}" (fd),
|
||||
: .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ nop
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
: .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
: .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
[arg3] "{$6}" (arg3),
|
||||
: .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
[arg3] "{$6}" (arg3),
|
||||
[arg4] "{$7}" (arg4),
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
[arg3] "{$6}" (arg3),
|
||||
[arg4] "{$7}" (arg4),
|
||||
[arg5] "{$8}" (arg5),
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
[arg3] "{$6}" (arg3),
|
||||
[arg4] "{$7}" (arg4),
|
||||
[arg5] "{$8}" (arg5),
|
||||
[arg6] "{$9}" (arg6),
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall7(
|
||||
number: SYS,
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
arg7: u32,
|
||||
) u32 {
|
||||
return asm volatile (
|
||||
\\ syscall
|
||||
\\ beq $7, $zero, 1f
|
||||
\\ blez $2, 1f
|
||||
\\ dsubu $2, $0, $2
|
||||
\\ 1:
|
||||
: [ret] "={$2}" (-> u32),
|
||||
: [number] "{$2}" (@intFromEnum(number)),
|
||||
[arg1] "{$4}" (arg1),
|
||||
[arg2] "{$5}" (arg2),
|
||||
[arg3] "{$6}" (arg3),
|
||||
[arg4] "{$7}" (arg4),
|
||||
[arg5] "{$8}" (arg5),
|
||||
[arg6] "{$9}" (arg6),
|
||||
[arg7] "{$10}" (arg7),
|
||||
: .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// 3, 4, 5, 6, 7, 8, 9
|
||||
//
|
||||
// syscall(SYS_clone, flags, stack, ptid, tls, ctid)
|
||||
// 2 4, 5, 6, 7, 8
|
||||
asm volatile (
|
||||
\\ # Save function pointer and argument pointer on new thread stack
|
||||
\\ and $5, $5, -16
|
||||
\\ dsubu $5, $5, 16
|
||||
\\ sd $4, 0($5)
|
||||
\\ sd $7, 8($5)
|
||||
\\ # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid)
|
||||
\\ move $4, $6
|
||||
\\ move $6, $8
|
||||
\\ move $7, $9
|
||||
\\ move $8, $10
|
||||
\\ li $2, 5055 # SYS_clone
|
||||
\\ syscall
|
||||
\\ beq $7, $0, 1f
|
||||
\\ nop
|
||||
\\ jr $ra
|
||||
\\ dsubu $2, $0, $2
|
||||
\\1:
|
||||
\\ beq $2, $0, 1f
|
||||
\\ nop
|
||||
\\ jr $ra
|
||||
\\ nop
|
||||
\\1:
|
||||
);
|
||||
if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
|
||||
\\ .cfi_undefined $ra
|
||||
);
|
||||
asm volatile (
|
||||
\\ move $fp, $zero
|
||||
\\ move $ra, $zero
|
||||
\\
|
||||
\\ ld $25, 0($sp)
|
||||
\\ ld $4, 8($sp)
|
||||
\\ jalr $25
|
||||
\\ nop
|
||||
\\ move $4, $2
|
||||
\\ li $2, 5058 # SYS_exit
|
||||
\\ syscall
|
||||
);
|
||||
}
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6";
|
||||
};
|
||||
|
||||
pub const blksize_t = u32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = i32;
|
||||
pub const mode_t = u32;
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
pub const blkcnt_t = i64;
|
||||
|
||||
// The `stat` definition used by the Linux kernel.
|
||||
pub const Stat = extern struct {
|
||||
dev: dev_t,
|
||||
__pad0: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
|
||||
size: off_t,
|
||||
atim: u32,
|
||||
atim_nsec: u32,
|
||||
mtim: u32,
|
||||
mtim_nsec: u32,
|
||||
ctim: u32,
|
||||
ctim_nsec: u32,
|
||||
blksize: blksize_t,
|
||||
__pad3: u32,
|
||||
blocks: blkcnt_t,
|
||||
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return .{
|
||||
.sec = self.atim,
|
||||
.nsec = self.atim_nsec,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return .{
|
||||
.sec = self.mtim,
|
||||
.nsec = self.mtim_nsec,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return .{
|
||||
.sec = self.ctim,
|
||||
.nsec = self.ctim_nsec,
|
||||
};
|
||||
}
|
||||
};
|
||||
@ -1,61 +1,49 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const pid_t = linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const timespec = linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
// r0 is both an input register and a clobber. musl and glibc achieve this with
|
||||
// a "+" constraint, which isn't supported in Zig, so instead we separately list
|
||||
// r0 as both an input and an output. (Listing it as an input and a clobber would
|
||||
// cause the C backend to emit invalid code; see #25209.)
|
||||
var r0_out: usize = undefined;
|
||||
var r0_out: u32 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u32),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
: [number] "{r0}" (@intFromEnum(number)),
|
||||
: .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
// r0 is both an input and a clobber.
|
||||
var r0_out: usize = undefined;
|
||||
var r0_out: u32 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u32),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
: [number] "{r0}" (@intFromEnum(number)),
|
||||
[arg1] "{r3}" (arg1),
|
||||
: .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r0_out: u32 = undefined;
|
||||
var r4_out: u32 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u32),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
: [number] "{r0}" (@intFromEnum(number)),
|
||||
@ -64,17 +52,17 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
: .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r0_out: u32 = undefined;
|
||||
var r4_out: u32 = undefined;
|
||||
var r5_out: u32 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u32),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -85,18 +73,18 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r6_out: usize = undefined;
|
||||
var r0_out: u32 = undefined;
|
||||
var r4_out: u32 = undefined;
|
||||
var r5_out: u32 = undefined;
|
||||
var r6_out: u32 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u32),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -109,19 +97,19 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r6_out: usize = undefined;
|
||||
var r7_out: usize = undefined;
|
||||
var r0_out: u32 = undefined;
|
||||
var r4_out: u32 = undefined;
|
||||
var r5_out: u32 = undefined;
|
||||
var r6_out: u32 = undefined;
|
||||
var r7_out: u32 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u32),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -138,26 +126,26 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r6_out: usize = undefined;
|
||||
var r7_out: usize = undefined;
|
||||
var r8_out: usize = undefined;
|
||||
var r0_out: u32 = undefined;
|
||||
var r4_out: u32 = undefined;
|
||||
var r5_out: u32 = undefined;
|
||||
var r6_out: u32 = undefined;
|
||||
var r7_out: u32 = undefined;
|
||||
var r8_out: u32 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u32),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -174,7 +162,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true, .cr0 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// 3, 4, 5, 6, 7, 8, 9
|
||||
//
|
||||
@ -247,14 +235,14 @@ pub fn clone() callconv(.naked) usize {
|
||||
pub const restore = restore_rt;
|
||||
|
||||
pub fn restore_rt() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ li 0, %[number]
|
||||
\\ sc
|
||||
:
|
||||
: [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
|
||||
),
|
||||
else => _ = asm volatile (
|
||||
else => asm volatile (
|
||||
\\ sc
|
||||
:
|
||||
: [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
|
||||
@ -262,48 +250,14 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
}
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const GETLK = 12;
|
||||
pub const SETLK = 13;
|
||||
pub const SETLKW = 14;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__kernel_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6.15";
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = isize;
|
||||
pub const time_t = i32;
|
||||
pub const mode_t = u32;
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
@ -316,39 +270,27 @@ pub const Stat = extern struct {
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__rdev_padding: i16,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [2]u32,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: time_t,
|
||||
usec: isize,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
@ -1,61 +1,49 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const pid_t = linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const timespec = linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
// r0 is both an input register and a clobber. musl and glibc achieve this with
|
||||
// a "+" constraint, which isn't supported in Zig, so instead we separately list
|
||||
// r0 as both an input and an output. (Listing it as an input and a clobber would
|
||||
// cause the C backend to emit invalid code; see #25209.)
|
||||
var r0_out: usize = undefined;
|
||||
var r0_out: u64 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u64),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
: [number] "{r0}" (@intFromEnum(number)),
|
||||
: .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
// r0 is both an input and a clobber.
|
||||
var r0_out: usize = undefined;
|
||||
var r0_out: u64 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u64),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
: [number] "{r0}" (@intFromEnum(number)),
|
||||
[arg1] "{r3}" (arg1),
|
||||
: .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r0_out: u64 = undefined;
|
||||
var r4_out: u64 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u64),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
: [number] "{r0}" (@intFromEnum(number)),
|
||||
@ -64,17 +52,17 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
: .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r0_out: u64 = undefined;
|
||||
var r4_out: u64 = undefined;
|
||||
var r5_out: u64 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u64),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -85,18 +73,18 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r6_out: usize = undefined;
|
||||
var r0_out: u64 = undefined;
|
||||
var r4_out: u64 = undefined;
|
||||
var r5_out: u64 = undefined;
|
||||
var r6_out: u64 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u64),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -109,19 +97,19 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r6_out: usize = undefined;
|
||||
var r7_out: usize = undefined;
|
||||
var r0_out: u64 = undefined;
|
||||
var r4_out: u64 = undefined;
|
||||
var r5_out: u64 = undefined;
|
||||
var r6_out: u64 = undefined;
|
||||
var r7_out: u64 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u64),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -138,26 +126,26 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
) u64 {
|
||||
// These registers are both inputs and clobbers.
|
||||
var r0_out: usize = undefined;
|
||||
var r4_out: usize = undefined;
|
||||
var r5_out: usize = undefined;
|
||||
var r6_out: usize = undefined;
|
||||
var r7_out: usize = undefined;
|
||||
var r8_out: usize = undefined;
|
||||
var r0_out: u64 = undefined;
|
||||
var r4_out: u64 = undefined;
|
||||
var r5_out: u64 = undefined;
|
||||
var r6_out: u64 = undefined;
|
||||
var r7_out: u64 = undefined;
|
||||
var r8_out: u64 = undefined;
|
||||
return asm volatile (
|
||||
\\ sc
|
||||
\\ bns+ 1f
|
||||
\\ neg 3, 3
|
||||
\\ 1:
|
||||
: [ret] "={r3}" (-> usize),
|
||||
: [ret] "={r3}" (-> u64),
|
||||
[r0_out] "={r0}" (r0_out),
|
||||
[r4_out] "={r4}" (r4_out),
|
||||
[r5_out] "={r5}" (r5_out),
|
||||
@ -174,7 +162,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true, .cr0 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// 3, 4, 5, 6, 7, 8, 9
|
||||
//
|
||||
@ -232,14 +220,14 @@ pub fn clone() callconv(.naked) usize {
|
||||
pub const restore = restore_rt;
|
||||
|
||||
pub fn restore_rt() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ li 0, %[number]
|
||||
\\ sc
|
||||
:
|
||||
: [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
|
||||
),
|
||||
else => _ = asm volatile (
|
||||
else => asm volatile (
|
||||
\\ sc
|
||||
:
|
||||
: [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
|
||||
@ -247,46 +235,11 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
}
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__kernel_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6.15";
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
pub const blksize_t = i64;
|
||||
pub const nlink_t = u64;
|
||||
pub const time_t = i64;
|
||||
@ -302,38 +255,26 @@ pub const Stat = extern struct {
|
||||
ino: ino_t,
|
||||
nlink: nlink_t,
|
||||
mode: mode_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [3]u64,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: isize,
|
||||
usec: isize,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
@ -1,45 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const uid_t = std.os.linux.uid_t;
|
||||
const gid_t = std.os.linux.gid_t;
|
||||
const pid_t = std.os.linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const timespec = std.os.linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u32),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u32),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u32),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u32),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -47,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u32),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -58,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u32),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -72,15 +61,15 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u32),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -91,7 +80,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// a0, a1, a2, a3, a4, a5, a6
|
||||
//
|
||||
@ -135,30 +124,6 @@ pub fn clone() callconv(.naked) usize {
|
||||
);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = i64;
|
||||
@ -168,54 +133,38 @@ pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
pub const blkcnt_t = i64;
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: time_t,
|
||||
usec: i64,
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
// The `stat` definition used by the Linux kernel.
|
||||
pub const Stat = extern struct {
|
||||
dev: dev_t,
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad: usize,
|
||||
__pad: u32,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
__pad2: i32,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [2]u32,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_4.15";
|
||||
|
||||
@ -1,45 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const uid_t = std.os.linux.uid_t;
|
||||
const gid_t = std.os.linux.gid_t;
|
||||
const pid_t = std.os.linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const timespec = std.os.linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u64),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u64),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u64),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u64),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -47,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u64),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -58,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u64),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -72,15 +61,15 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
) u64 {
|
||||
return asm volatile ("ecall"
|
||||
: [ret] "={x10}" (-> usize),
|
||||
: [ret] "={x10}" (-> u64),
|
||||
: [number] "{x17}" (@intFromEnum(number)),
|
||||
[arg1] "{x10}" (arg1),
|
||||
[arg2] "{x11}" (arg2),
|
||||
@ -91,7 +80,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// a0, a1, a2, a3, a4, a5, a6
|
||||
//
|
||||
@ -135,30 +124,6 @@ pub fn clone() callconv(.naked) usize {
|
||||
);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = i64;
|
||||
@ -168,54 +133,38 @@ pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
pub const blkcnt_t = i64;
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: time_t,
|
||||
usec: i64,
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
__unused: [4]u8,
|
||||
};
|
||||
|
||||
// The `stat` definition used by the Linux kernel.
|
||||
pub const Stat = extern struct {
|
||||
dev: dev_t,
|
||||
ino: ino_t,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__pad: usize,
|
||||
__pad: u64,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
__pad2: i32,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [2]u32,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_4.15";
|
||||
|
||||
@ -1,45 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const uid_t = std.os.linux.uid_t;
|
||||
const gid_t = std.os.linux.gid_t;
|
||||
const pid_t = std.os.linux.pid_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const timespec = std.os.linux.timespec;
|
||||
const stack_t = std.os.linux.stack_t;
|
||||
const sigset_t = std.os.linux.sigset_t;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
return asm volatile ("svc 0"
|
||||
: [ret] "={r2}" (-> usize),
|
||||
: [ret] "={r2}" (-> u64),
|
||||
: [number] "{r1}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
return asm volatile ("svc 0"
|
||||
: [ret] "={r2}" (-> usize),
|
||||
: [ret] "={r2}" (-> u64),
|
||||
: [number] "{r1}" (@intFromEnum(number)),
|
||||
[arg1] "{r2}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
return asm volatile ("svc 0"
|
||||
: [ret] "={r2}" (-> usize),
|
||||
: [ret] "={r2}" (-> u64),
|
||||
: [number] "{r1}" (@intFromEnum(number)),
|
||||
[arg1] "{r2}" (arg1),
|
||||
[arg2] "{r3}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
return asm volatile ("svc 0"
|
||||
: [ret] "={r2}" (-> usize),
|
||||
: [ret] "={r2}" (-> u64),
|
||||
: [number] "{r1}" (@intFromEnum(number)),
|
||||
[arg1] "{r2}" (arg1),
|
||||
[arg2] "{r3}" (arg2),
|
||||
@ -47,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
return asm volatile ("svc 0"
|
||||
: [ret] "={r2}" (-> usize),
|
||||
: [ret] "={r2}" (-> u64),
|
||||
: [number] "{r1}" (@intFromEnum(number)),
|
||||
[arg1] "{r2}" (arg1),
|
||||
[arg2] "{r3}" (arg2),
|
||||
@ -58,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
return asm volatile ("svc 0"
|
||||
: [ret] "={r2}" (-> usize),
|
||||
: [ret] "={r2}" (-> u64),
|
||||
: [number] "{r1}" (@intFromEnum(number)),
|
||||
[arg1] "{r2}" (arg1),
|
||||
[arg2] "{r3}" (arg2),
|
||||
@ -70,9 +59,9 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize, arg6: usize) usize {
|
||||
pub fn syscall6(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64, arg6: u64) u64 {
|
||||
return asm volatile ("svc 0"
|
||||
: [ret] "={r2}" (-> usize),
|
||||
: [ret] "={r2}" (-> u64),
|
||||
: [number] "{r1}" (@intFromEnum(number)),
|
||||
[arg1] "{r2}" (arg1),
|
||||
[arg2] "{r3}" (arg2),
|
||||
@ -83,7 +72,7 @@ pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
asm volatile (
|
||||
\\# int clone(
|
||||
\\# fn, a = r2
|
||||
@ -157,26 +146,6 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
);
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const blksize_t = i64;
|
||||
pub const nlink_t = u64;
|
||||
pub const time_t = i64;
|
||||
@ -186,51 +155,36 @@ pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
pub const blkcnt_t = i64;
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: time_t,
|
||||
usec: i64,
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
};
|
||||
|
||||
// The `stat` definition used by the Linux kernel.
|
||||
pub const Stat = extern struct {
|
||||
dev: dev_t,
|
||||
ino: ino_t,
|
||||
nlink: nlink_t,
|
||||
mode: mode_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
size: off_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
blksize: blksize_t,
|
||||
blocks: blkcnt_t,
|
||||
__unused: [3]c_ulong,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u64;
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__kernel_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6.29";
|
||||
|
||||
@ -1,21 +1,8 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const pid_t = linux.pid_t;
|
||||
const uid_t = linux.uid_t;
|
||||
const clock_t = linux.clock_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const timespec = linux.timespec;
|
||||
|
||||
pub fn syscall_pipe(fd: *[2]i32) usize {
|
||||
pub fn syscall_pipe(fd: *[2]i32) u64 {
|
||||
return asm volatile (
|
||||
\\ mov %[arg], %%g3
|
||||
\\ t 0x6d
|
||||
@ -29,13 +16,13 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
|
||||
\\ st %%o1, [%%g3+4]
|
||||
\\ clr %%o0
|
||||
\\2:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(SYS.pipe)),
|
||||
[arg] "r" (fd),
|
||||
: .{ .memory = true, .g3 = true });
|
||||
}
|
||||
|
||||
pub fn syscall_fork() usize {
|
||||
pub fn syscall_fork() u64 {
|
||||
// Linux/sparc64 fork() returns two values in %o0 and %o1:
|
||||
// - On the parent's side, %o0 is the child's PID and %o1 is 0.
|
||||
// - On the child's side, %o0 is the parent's PID and %o1 is 1.
|
||||
@ -52,58 +39,58 @@ pub fn syscall_fork() usize {
|
||||
\\ dec %%o1
|
||||
\\ and %%o1, %%o0, %%o0
|
||||
\\ 2:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(SYS.fork)),
|
||||
: .{ .memory = true, .icc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
return asm volatile (
|
||||
\\ t 0x6d
|
||||
\\ bcc,pt %%xcc, 1f
|
||||
\\ nop
|
||||
\\ neg %%o0
|
||||
\\ 1:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(number)),
|
||||
: .{ .memory = true, .icc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ t 0x6d
|
||||
\\ bcc,pt %%xcc, 1f
|
||||
\\ nop
|
||||
\\ neg %%o0
|
||||
\\ 1:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(number)),
|
||||
[arg1] "{o0}" (arg1),
|
||||
: .{ .memory = true, .icc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ t 0x6d
|
||||
\\ bcc,pt %%xcc, 1f
|
||||
\\ nop
|
||||
\\ neg %%o0
|
||||
\\ 1:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(number)),
|
||||
[arg1] "{o0}" (arg1),
|
||||
[arg2] "{o1}" (arg2),
|
||||
: .{ .memory = true, .icc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ t 0x6d
|
||||
\\ bcc,pt %%xcc, 1f
|
||||
\\ nop
|
||||
\\ neg %%o0
|
||||
\\ 1:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(number)),
|
||||
[arg1] "{o0}" (arg1),
|
||||
[arg2] "{o1}" (arg2),
|
||||
@ -111,14 +98,14 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true, .icc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ t 0x6d
|
||||
\\ bcc,pt %%xcc, 1f
|
||||
\\ nop
|
||||
\\ neg %%o0
|
||||
\\ 1:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(number)),
|
||||
[arg1] "{o0}" (arg1),
|
||||
[arg2] "{o1}" (arg2),
|
||||
@ -127,14 +114,14 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true, .icc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
return asm volatile (
|
||||
\\ t 0x6d
|
||||
\\ bcc,pt %%xcc, 1f
|
||||
\\ nop
|
||||
\\ neg %%o0
|
||||
\\ 1:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(number)),
|
||||
[arg1] "{o0}" (arg1),
|
||||
[arg2] "{o1}" (arg2),
|
||||
@ -146,20 +133,20 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
) u64 {
|
||||
return asm volatile (
|
||||
\\ t 0x6d
|
||||
\\ bcc,pt %%xcc, 1f
|
||||
\\ nop
|
||||
\\ neg %%o0
|
||||
\\ 1:
|
||||
: [ret] "={o0}" (-> usize),
|
||||
: [ret] "={o0}" (-> u64),
|
||||
: [number] "{g1}" (@intFromEnum(number)),
|
||||
[arg1] "{o0}" (arg1),
|
||||
[arg2] "{o1}" (arg2),
|
||||
@ -170,7 +157,7 @@ pub fn syscall6(
|
||||
: .{ .memory = true, .icc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// i0, i1, i2, i3, i4, i5, sp
|
||||
//
|
||||
@ -236,93 +223,51 @@ pub fn restore_rt() callconv(.c) void {
|
||||
: .{ .memory = true, .icc = true, .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
|
||||
pub const SETOWN = 5;
|
||||
pub const GETOWN = 6;
|
||||
pub const GETLK = 7;
|
||||
pub const SETLK = 8;
|
||||
pub const SETLKW = 9;
|
||||
|
||||
pub const RDLCK = 1;
|
||||
pub const WRLCK = 2;
|
||||
pub const UNLCK = 3;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6";
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
};
|
||||
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
pub const time_t = isize;
|
||||
pub const time_t = i64;
|
||||
pub const mode_t = u32;
|
||||
pub const dev_t = usize;
|
||||
pub const dev_t = u64;
|
||||
pub const nlink_t = u32;
|
||||
pub const blksize_t = isize;
|
||||
pub const blkcnt_t = isize;
|
||||
pub const blksize_t = i64;
|
||||
pub const blkcnt_t = i64;
|
||||
|
||||
// The `stat64` definition used by the kernel.
|
||||
pub const Stat = extern struct {
|
||||
dev: u64,
|
||||
ino: u64,
|
||||
nlink: u64,
|
||||
dev: dev_t,
|
||||
ino: ino_t,
|
||||
nlink: nlink_t,
|
||||
_pad: i32,
|
||||
|
||||
mode: u32,
|
||||
uid: u32,
|
||||
gid: u32,
|
||||
mode: mode_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
__pad0: u32,
|
||||
|
||||
rdev: u64,
|
||||
rdev: dev_t,
|
||||
size: i64,
|
||||
blksize: i64,
|
||||
blocks: i64,
|
||||
blksize: blksize_t,
|
||||
blocks: blkcnt_t,
|
||||
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [3]u64,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: isize,
|
||||
usec: i32,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
@ -4,64 +4,55 @@
|
||||
//! Save and restore r7 around the syscall without touching the stack pointer not
|
||||
//! to break the frame chain.
|
||||
const std = @import("../../std.zig");
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
var buf: [2]usize = .{ @intFromEnum(number), undefined };
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
var buf: [2]u32 = .{ @intFromEnum(number), undefined };
|
||||
return asm volatile (
|
||||
\\ str r7, [%[tmp], #4]
|
||||
\\ ldr r7, [%[tmp]]
|
||||
\\ svc #0
|
||||
\\ ldr r7, [%[tmp], #4]
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [tmp] "{r1}" (&buf),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
var buf: [2]usize = .{ @intFromEnum(number), undefined };
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
var buf: [2]u32 = .{ @intFromEnum(number), undefined };
|
||||
return asm volatile (
|
||||
\\ str r7, [%[tmp], #4]
|
||||
\\ ldr r7, [%[tmp]]
|
||||
\\ svc #0
|
||||
\\ ldr r7, [%[tmp], #4]
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [tmp] "{r1}" (&buf),
|
||||
[arg1] "{r0}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
var buf: [2]usize = .{ @intFromEnum(number), undefined };
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
var buf: [2]u32 = .{ @intFromEnum(number), undefined };
|
||||
return asm volatile (
|
||||
\\ str r7, [%[tmp], #4]
|
||||
\\ ldr r7, [%[tmp]]
|
||||
\\ svc #0
|
||||
\\ ldr r7, [%[tmp], #4]
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [tmp] "{r2}" (&buf),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
var buf: [2]usize = .{ @intFromEnum(number), undefined };
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
var buf: [2]u32 = .{ @intFromEnum(number), undefined };
|
||||
return asm volatile (
|
||||
\\ str r7, [%[tmp], #4]
|
||||
\\ ldr r7, [%[tmp]]
|
||||
\\ svc #0
|
||||
\\ ldr r7, [%[tmp], #4]
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [tmp] "{r3}" (&buf),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -69,16 +60,14 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
var buf: [2]usize = .{ @intFromEnum(number), undefined };
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
var buf: [2]u32 = .{ @intFromEnum(number), undefined };
|
||||
return asm volatile (
|
||||
\\ str r7, [%[tmp], #4]
|
||||
\\ ldr r7, [%[tmp]]
|
||||
\\ svc #0
|
||||
\\ ldr r7, [%[tmp], #4]
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [tmp] "{r4}" (&buf),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -87,16 +76,14 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
var buf: [2]usize = .{ @intFromEnum(number), undefined };
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
var buf: [2]u32 = .{ @intFromEnum(number), undefined };
|
||||
return asm volatile (
|
||||
\\ str r7, [%[tmp], #4]
|
||||
\\ ldr r7, [%[tmp]]
|
||||
\\ svc #0
|
||||
\\ ldr r7, [%[tmp], #4]
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [tmp] "{r5}" (&buf),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
@ -108,22 +95,20 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
var buf: [2]usize = .{ @intFromEnum(number), undefined };
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
var buf: [2]u32 = .{ @intFromEnum(number), undefined };
|
||||
return asm volatile (
|
||||
\\ str r7, [%[tmp], #4]
|
||||
\\ ldr r7, [%[tmp]]
|
||||
\\ svc #0
|
||||
\\ ldr r7, [%[tmp], #4]
|
||||
: [ret] "={r0}" (-> usize),
|
||||
: [ret] "={r0}" (-> u32),
|
||||
: [tmp] "{r6}" (&buf),
|
||||
[arg1] "{r0}" (arg1),
|
||||
[arg2] "{r1}" (arg2),
|
||||
|
||||
@ -16,7 +16,6 @@ const math = std.math;
|
||||
const assert = std.debug.assert;
|
||||
const native_arch = @import("builtin").cpu.arch;
|
||||
const linux = std.os.linux;
|
||||
const posix = std.posix;
|
||||
const page_size_min = std.heap.page_size_min;
|
||||
|
||||
/// Represents an ELF TLS variant.
|
||||
@ -523,7 +522,7 @@ pub fn initStatic(phdrs: []elf.Phdr) void {
|
||||
}
|
||||
|
||||
inline fn mmap_tls(length: usize) usize {
|
||||
const prot = posix.PROT.READ | posix.PROT.WRITE;
|
||||
const prot = linux.PROT.READ | linux.PROT.WRITE;
|
||||
const flags: linux.MAP = .{ .TYPE = .PRIVATE, .ANONYMOUS = true };
|
||||
|
||||
if (@hasField(linux.SYS, "mmap2")) {
|
||||
|
||||
192
lib/std/os/linux/x32.zig
Normal file
192
lib/std/os/linux/x32.zig
Normal file
@ -0,0 +1,192 @@
|
||||
// TODO: A lot of this file is very likely wrong.
|
||||
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> u32),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> u32),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> u32),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> u32),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
[arg3] "{rdx}" (arg3),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> u32),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
[arg3] "{rdx}" (arg3),
|
||||
[arg4] "{r10}" (arg4),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> u32),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
[arg3] "{rdx}" (arg3),
|
||||
[arg4] "{r10}" (arg4),
|
||||
[arg5] "{r8}" (arg5),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> u32),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
[arg3] "{rdx}" (arg3),
|
||||
[arg4] "{r10}" (arg4),
|
||||
[arg5] "{r8}" (arg5),
|
||||
[arg6] "{r9}" (arg6),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
asm volatile (
|
||||
\\ movl $56,%%eax // SYS_clone
|
||||
\\ movq %%rdi,%%r11
|
||||
\\ movq %%rdx,%%rdi
|
||||
\\ movq %%r8,%%rdx
|
||||
\\ movq %%r9,%%r8
|
||||
\\ movq 8(%%rsp),%%r10
|
||||
\\ movq %%r11,%%r9
|
||||
\\ andq $-16,%%rsi
|
||||
\\ subq $8,%%rsi
|
||||
\\ movq %%rcx,(%%rsi)
|
||||
\\ syscall
|
||||
\\ testq %%rax,%%rax
|
||||
\\ jz 1f
|
||||
\\ retq
|
||||
\\
|
||||
\\1:
|
||||
);
|
||||
if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
|
||||
\\ .cfi_undefined %%rip
|
||||
);
|
||||
asm volatile (
|
||||
\\ xorl %%ebp,%%ebp
|
||||
\\
|
||||
\\ popq %%rdi
|
||||
\\ callq *%%r9
|
||||
\\ movl %%eax,%%edi
|
||||
\\ movl $60,%%eax // SYS_exit
|
||||
\\ syscall
|
||||
\\
|
||||
);
|
||||
}
|
||||
|
||||
pub const restore = restore_rt;
|
||||
|
||||
pub fn restore_rt() callconv(.naked) noreturn {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ movl %[number], %%eax
|
||||
\\ syscall
|
||||
:
|
||||
: [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
|
||||
),
|
||||
else => asm volatile (
|
||||
\\ syscall
|
||||
:
|
||||
: [number] "{rax}" (@intFromEnum(SYS.rt_sigreturn)),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
pub const mode_t = u32;
|
||||
pub const time_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const blksize_t = i32;
|
||||
pub const blkcnt_t = i32;
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6";
|
||||
|
||||
pub const GETCPU_SYM = "__vdso_getcpu";
|
||||
pub const GETCPU_VER = "LINUX_2.6";
|
||||
};
|
||||
|
||||
pub const ARCH = struct {
|
||||
pub const SET_GS = 0x1001;
|
||||
pub const SET_FS = 0x1002;
|
||||
pub const GET_FS = 0x1003;
|
||||
pub const GET_GS = 0x1004;
|
||||
};
|
||||
|
||||
// The `stat` definition used by the Linux kernel.
|
||||
pub const Stat = extern struct {
|
||||
dev: dev_t,
|
||||
ino: ino_t,
|
||||
nlink: nlink_t,
|
||||
|
||||
mode: mode_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
__pad0: u32,
|
||||
rdev: dev_t,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
blocks: i64,
|
||||
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [3]i32,
|
||||
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
@ -1,46 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const pid_t = linux.pid_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const timespec = linux.timespec;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u32 {
|
||||
return asm volatile ("int $0x80"
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(number)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u32) u32 {
|
||||
return asm volatile ("int $0x80"
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(number)),
|
||||
[arg1] "{ebx}" (arg1),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
|
||||
return asm volatile ("int $0x80"
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(number)),
|
||||
[arg1] "{ebx}" (arg1),
|
||||
[arg2] "{ecx}" (arg2),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
|
||||
return asm volatile ("int $0x80"
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(number)),
|
||||
[arg1] "{ebx}" (arg1),
|
||||
[arg2] "{ecx}" (arg2),
|
||||
@ -48,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
|
||||
return asm volatile ("int $0x80"
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(number)),
|
||||
[arg1] "{ebx}" (arg1),
|
||||
[arg2] "{ecx}" (arg2),
|
||||
@ -59,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
|
||||
return asm volatile ("int $0x80"
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(number)),
|
||||
[arg1] "{ebx}" (arg1),
|
||||
[arg2] "{ecx}" (arg2),
|
||||
@ -73,20 +61,20 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u32,
|
||||
arg2: u32,
|
||||
arg3: u32,
|
||||
arg4: u32,
|
||||
arg5: u32,
|
||||
arg6: u32,
|
||||
) u32 {
|
||||
// arg6 can't be passed to asm in a register because ebp might be reserved as the frame pointer
|
||||
// and there are no more GPRs available; so we'll need a memory operand for it. Adding that
|
||||
// memory operand means that on PIC we might need a reference to the GOT, which in turn needs
|
||||
// *its* own GPR, so we need to pass another arg in memory too! This is surprisingly hard to get
|
||||
// right, because we can't touch esp or ebp until we're done with the memory input (as that
|
||||
// input could be relative to esp or ebp).
|
||||
const args56: [2]usize = .{ arg5, arg6 };
|
||||
const args56: [2]u32 = .{ arg5, arg6 };
|
||||
return asm volatile (
|
||||
\\ push %[args56]
|
||||
\\ push %%ebp
|
||||
@ -99,7 +87,7 @@ pub fn syscall6(
|
||||
\\ int $0x80
|
||||
\\ pop %%ebp
|
||||
\\ pop %%edi
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(number)),
|
||||
[arg1] "{ebx}" (arg1),
|
||||
[arg2] "{ecx}" (arg2),
|
||||
@ -109,16 +97,16 @@ pub fn syscall6(
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn socketcall(call: usize, args: [*]const usize) usize {
|
||||
pub fn socketcall(call: u32, args: [*]const u32) u32 {
|
||||
return asm volatile ("int $0x80"
|
||||
: [ret] "={eax}" (-> usize),
|
||||
: [ret] "={eax}" (-> u32),
|
||||
: [number] "{eax}" (@intFromEnum(SYS.socketcall)),
|
||||
[arg1] "{ebx}" (call),
|
||||
[arg2] "{ecx}" (@intFromPtr(args)),
|
||||
: .{ .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u32 {
|
||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||
// +8, +12, +16, +20, +24, +28, +32
|
||||
//
|
||||
@ -169,23 +157,23 @@ pub fn clone() callconv(.naked) usize {
|
||||
}
|
||||
|
||||
pub fn restore() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ movl %[number], %%eax
|
||||
\\ int $0x80
|
||||
:
|
||||
: [number] "i" (@intFromEnum(SYS.sigreturn)),
|
||||
: .{ .memory = true }),
|
||||
),
|
||||
else => asm volatile (
|
||||
\\ int $0x80
|
||||
:
|
||||
: [number] "{eax}" (@intFromEnum(SYS.sigreturn)),
|
||||
: .{ .memory = true }),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn restore_rt() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ movl %[number], %%eax
|
||||
\\ int $0x80
|
||||
@ -200,46 +188,14 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
}
|
||||
}
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
pub const GETLK = 12;
|
||||
pub const SETLK = 13;
|
||||
pub const SETLKW = 14;
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
};
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
pub const CGT_VER = "LINUX_2.6";
|
||||
};
|
||||
|
||||
pub const ARCH = struct {};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
};
|
||||
|
||||
pub const blksize_t = i32;
|
||||
pub const nlink_t = u32;
|
||||
pub const time_t = isize;
|
||||
pub const time_t = i32;
|
||||
pub const mode_t = u32;
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
@ -253,43 +209,31 @@ pub const Stat = extern struct {
|
||||
__ino_truncated: u32,
|
||||
mode: mode_t,
|
||||
nlink: nlink_t,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
rdev: dev_t,
|
||||
__rdev_padding: u32,
|
||||
size: off_t,
|
||||
blksize: blksize_t,
|
||||
blocks: blkcnt_t,
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
ino: ino_t,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: i32,
|
||||
usec: i32,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
pub const user_desc = extern struct {
|
||||
entry_number: u32,
|
||||
base_addr: u32,
|
||||
|
||||
@ -1,48 +1,34 @@
|
||||
const builtin = @import("builtin");
|
||||
const std = @import("../../std.zig");
|
||||
const maxInt = std.math.maxInt;
|
||||
const linux = std.os.linux;
|
||||
const SYS = linux.SYS;
|
||||
const iovec = std.posix.iovec;
|
||||
const iovec_const = std.posix.iovec_const;
|
||||
const SYS = std.os.linux.SYS;
|
||||
|
||||
const pid_t = linux.pid_t;
|
||||
const uid_t = linux.uid_t;
|
||||
const gid_t = linux.gid_t;
|
||||
const clock_t = linux.clock_t;
|
||||
const stack_t = linux.stack_t;
|
||||
const sigset_t = linux.sigset_t;
|
||||
const sockaddr = linux.sockaddr;
|
||||
const socklen_t = linux.socklen_t;
|
||||
const timespec = linux.timespec;
|
||||
|
||||
pub fn syscall0(number: SYS) usize {
|
||||
pub fn syscall0(number: SYS) u64 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> usize),
|
||||
: [ret] "={rax}" (-> u64),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall1(number: SYS, arg1: usize) usize {
|
||||
pub fn syscall1(number: SYS, arg1: u64) u64 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> usize),
|
||||
: [ret] "={rax}" (-> u64),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
|
||||
pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> usize),
|
||||
: [ret] "={rax}" (-> u64),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> usize),
|
||||
: [ret] "={rax}" (-> u64),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
@ -50,9 +36,9 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
|
||||
pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> usize),
|
||||
: [ret] "={rax}" (-> u64),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
@ -61,9 +47,9 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
|
||||
pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> usize),
|
||||
: [ret] "={rax}" (-> u64),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
@ -75,15 +61,15 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
|
||||
|
||||
pub fn syscall6(
|
||||
number: SYS,
|
||||
arg1: usize,
|
||||
arg2: usize,
|
||||
arg3: usize,
|
||||
arg4: usize,
|
||||
arg5: usize,
|
||||
arg6: usize,
|
||||
) usize {
|
||||
arg1: u64,
|
||||
arg2: u64,
|
||||
arg3: u64,
|
||||
arg4: u64,
|
||||
arg5: u64,
|
||||
arg6: u64,
|
||||
) u64 {
|
||||
return asm volatile ("syscall"
|
||||
: [ret] "={rax}" (-> usize),
|
||||
: [ret] "={rax}" (-> u64),
|
||||
: [number] "{rax}" (@intFromEnum(number)),
|
||||
[arg1] "{rdi}" (arg1),
|
||||
[arg2] "{rsi}" (arg2),
|
||||
@ -94,7 +80,7 @@ pub fn syscall6(
|
||||
: .{ .rcx = true, .r11 = true, .memory = true });
|
||||
}
|
||||
|
||||
pub fn clone() callconv(.naked) usize {
|
||||
pub fn clone() callconv(.naked) u64 {
|
||||
asm volatile (
|
||||
\\ movl $56,%%eax // SYS_clone
|
||||
\\ movq %%rdi,%%r11
|
||||
@ -131,7 +117,7 @@ pub fn clone() callconv(.naked) usize {
|
||||
pub const restore = restore_rt;
|
||||
|
||||
pub fn restore_rt() callconv(.naked) noreturn {
|
||||
switch (@import("builtin").zig_backend) {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage2_c => asm volatile (
|
||||
\\ movl %[number], %%eax
|
||||
\\ syscall
|
||||
@ -146,34 +132,14 @@ pub fn restore_rt() callconv(.naked) noreturn {
|
||||
}
|
||||
}
|
||||
|
||||
pub const mode_t = usize;
|
||||
pub const time_t = isize;
|
||||
pub const nlink_t = usize;
|
||||
pub const blksize_t = isize;
|
||||
pub const blkcnt_t = isize;
|
||||
|
||||
pub const F = struct {
|
||||
pub const DUPFD = 0;
|
||||
pub const GETFD = 1;
|
||||
pub const SETFD = 2;
|
||||
pub const GETFL = 3;
|
||||
pub const SETFL = 4;
|
||||
pub const GETLK = 5;
|
||||
pub const SETLK = 6;
|
||||
pub const SETLKW = 7;
|
||||
pub const SETOWN = 8;
|
||||
pub const GETOWN = 9;
|
||||
pub const SETSIG = 10;
|
||||
pub const GETSIG = 11;
|
||||
|
||||
pub const SETOWN_EX = 15;
|
||||
pub const GETOWN_EX = 16;
|
||||
pub const GETOWNER_UIDS = 17;
|
||||
|
||||
pub const RDLCK = 0;
|
||||
pub const WRLCK = 1;
|
||||
pub const UNLCK = 2;
|
||||
};
|
||||
pub const mode_t = u64;
|
||||
pub const time_t = i64;
|
||||
pub const nlink_t = u64;
|
||||
pub const blksize_t = i64;
|
||||
pub const blkcnt_t = i64;
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
|
||||
pub const VDSO = struct {
|
||||
pub const CGT_SYM = "__vdso_clock_gettime";
|
||||
@ -190,59 +156,35 @@ pub const ARCH = struct {
|
||||
pub const GET_GS = 0x1004;
|
||||
};
|
||||
|
||||
pub const Flock = extern struct {
|
||||
type: i16,
|
||||
whence: i16,
|
||||
start: off_t,
|
||||
len: off_t,
|
||||
pid: pid_t,
|
||||
};
|
||||
|
||||
pub const off_t = i64;
|
||||
pub const ino_t = u64;
|
||||
pub const dev_t = u64;
|
||||
|
||||
// The `stat` definition used by the Linux kernel.
|
||||
pub const Stat = extern struct {
|
||||
dev: dev_t,
|
||||
ino: ino_t,
|
||||
nlink: usize,
|
||||
nlink: u64,
|
||||
|
||||
mode: u32,
|
||||
uid: uid_t,
|
||||
gid: gid_t,
|
||||
uid: std.os.linux.uid_t,
|
||||
gid: std.os.linux.gid_t,
|
||||
__pad0: u32,
|
||||
rdev: dev_t,
|
||||
size: off_t,
|
||||
blksize: isize,
|
||||
blksize: i64,
|
||||
blocks: i64,
|
||||
|
||||
atim: timespec,
|
||||
mtim: timespec,
|
||||
ctim: timespec,
|
||||
__unused: [3]isize,
|
||||
atim: std.os.linux.timespec,
|
||||
mtim: std.os.linux.timespec,
|
||||
ctim: std.os.linux.timespec,
|
||||
__unused: [3]i64,
|
||||
|
||||
pub fn atime(self: @This()) timespec {
|
||||
pub fn atime(self: @This()) std.os.linux.timespec {
|
||||
return self.atim;
|
||||
}
|
||||
|
||||
pub fn mtime(self: @This()) timespec {
|
||||
pub fn mtime(self: @This()) std.os.linux.timespec {
|
||||
return self.mtim;
|
||||
}
|
||||
|
||||
pub fn ctime(self: @This()) timespec {
|
||||
pub fn ctime(self: @This()) std.os.linux.timespec {
|
||||
return self.ctim;
|
||||
}
|
||||
};
|
||||
|
||||
pub const timeval = extern struct {
|
||||
sec: isize,
|
||||
usec: isize,
|
||||
};
|
||||
|
||||
pub const timezone = extern struct {
|
||||
minuteswest: i32,
|
||||
dsttime: i32,
|
||||
};
|
||||
|
||||
pub const Elf_Symndx = u32;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user