hello world

This commit is contained in:
nora 2023-09-29 21:47:19 +02:00
parent 52b9c8fb38
commit ddba35d06b
12 changed files with 492 additions and 6 deletions

View file

@ -3,15 +3,19 @@
use core::ffi::c_char;
use libuwuc::println;
extern crate libuwuc;
#[panic_handler]
#[cfg(not(test))]
fn handler(_arg: &core::panic::PanicInfo) -> ! {
loop {}
libuwuc::io::println!("panic!");
libuwuc::start::exit(1);
}
#[no_mangle]
extern "C" fn main(_argc: i32, _argv: *const *const c_char) -> i32 {
println!("Hello, world!");
0
}

8
src/basic_mem.rs Normal file
View file

@ -0,0 +1,8 @@
#[no_mangle]
pub(crate) unsafe extern "C" fn memset(ptr: *mut u8, constant: u8, len: usize) {
for i in 0..len {
unsafe {
*ptr.add(i) = constant;
}
}
}

35
src/io/mod.rs Normal file
View file

@ -0,0 +1,35 @@
use crate::sys::syscall;
pub const STDIN: i32 = 0;
pub const STDOUT: i32 = 1;
pub const STDERR: i32 = 2;
#[doc(hidden)]
pub struct Printer;
impl core::fmt::Write for Printer {
fn write_str(&mut self, mut s: &str) -> core::fmt::Result {
unsafe {
while s.len() > 0 {
let result =
syscall::syscall!(syscall::SYS_WRITE, STDIN, s.as_ptr(), s.len()) as i64;
if result < 0 {
return Err(core::fmt::Error);
}
s = &s[(result as usize)..];
}
}
Ok(())
}
}
#[macro_export]
macro_rules! println {
($($tt:tt)*) => {
{
use ::core::fmt::Write;
::core::writeln!($crate::io::Printer, $($tt)*).unwrap();
}
};
}
pub use println;

View file

@ -1,4 +1,12 @@
#![no_std]
#![warn(unreachable_pub)]
mod basic_mem;
pub mod io;
pub mod start;
mod stubs;
mod sys;
pub mod syscall {
pub use crate::sys::syscall::*;
}

24
src/start.rs Normal file
View file

@ -0,0 +1,24 @@
use core::ffi::{c_char, c_int};
/// The entrypoint of the program.
/// This is called by a bit of assembly handling architecture-specific _start.
pub(crate) unsafe extern "C" fn start(
argc: i32,
argv: *const *const c_char,
_envp: *const *const c_char,
) -> ! {
extern "C" {
fn main(argc: c_int, argv: *const *const c_char) -> c_int;
}
let result = main(argc, argv);
exit(result as u64);
}
pub fn exit(code: u64) -> ! {
unsafe {
crate::sys::syscall::syscall!(crate::sys::syscall::SYS_EXIT, code);
core::hint::unreachable_unchecked()
}
}

7
src/stubs.rs Normal file
View file

@ -0,0 +1,7 @@
// libcore seems to require this symbol, even though it's unused.
#[no_mangle]
fn rust_eh_personality() {
unsafe {
crate::sys::helpers::trap!();
}
}

View file

@ -0,0 +1,6 @@
macro_rules! trap {
() => {
::core::arch::asm!("ud2");
};
}
pub(crate) use trap;

View file

@ -1 +1,3 @@
pub(crate) mod helpers;
pub(crate) mod start;
pub(crate) mod syscall;

View file

@ -1,8 +1,25 @@
core::arch::global_asm!(
".global _start",
"_start:",
"mov rdi, 42",
"mov rax, 60",
"syscall"
// Hello, World!
// We have been started. All of this assembly sucks and we want into rustland as quickly as possible.
// Have a bit of fun and then, run away to libuwuc::start::start.
// First, mark the top-most stack frame as 0 to prevent sadness for frame-pointer based unwinding.
"mov rbp, 0",
// We're off to a good start already.
// Pass the variables to the start function arguments.
"mov rdi, [rsp]", // &argc = rsp
"mov rsi, [rsp+8]", // &argv = rsp+8
"mov rdx, rdi", // &envp = rsp+8*argc+8
"mov rax, 8",
"mul rdx",
"add rdx, 8",
"add rdx, rsp",
"mov rdx, [rdx]", // &envp = rsp+8*argc+8
// The stack will be 16-byte aligned at process entry already.
// So we're good to go!
"call {start}",
start = sym crate::start::start
);

View file

@ -0,0 +1,8 @@
# curl -L https://filippo.io/linux-syscall-table/TABELLA_64.json > table.json
import json
with open ("table.json") as f:
data = f.read()
data=json.loads(data)
for entry in data:
value = data[entry]
print(f"pub const SYS_{value[1].upper()}: i64 = {value[0]};")

View file

@ -0,0 +1,53 @@
// Useful reference: https://filippo.io/linux-syscall-table/
#[allow(non_upper_case_globals)]
mod values;
pub use values::*;
#[macro_export]
macro_rules! syscall {
($number:expr) => {{
let out: u64;
::core::arch::asm!(
"syscall",
in("rdi") $number,
lateout("rax") out,
);
out
}};
($number:expr, $arg1:expr) => {{
let out: u64;
::core::arch::asm!(
"syscall",
in("rax") $number,
in("rdi") $arg1,
lateout("rax") out,
);
out
}};
($number:expr, $arg1:expr, $arg2:expr) => {{
let out: u64;
::core::arch::asm!(
"syscall",
in("rax") $number,
in("rdi") $arg1,
in("rsi") $arg2,
lateout("rax") out,
);
out
}};
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr) => {{
let out: u64;
::core::arch::asm!(
"syscall",
in("rax") $number,
in("rdi") $arg1,
in("rsi") $arg2,
in("rdx") $arg3,
lateout("rax") out,
);
out
}};
}
pub use syscall;

View file

@ -0,0 +1,314 @@
pub const SYS_READ: i64 = 0;
pub const SYS_WRITE: i64 = 1;
pub const SYS_OPEN: i64 = 2;
pub const SYS_CLOSE: i64 = 3;
pub const SYS_STAT: i64 = 4;
pub const SYS_FSTAT: i64 = 5;
pub const SYS_LSTAT: i64 = 6;
pub const SYS_POLL: i64 = 7;
pub const SYS_LSEEK: i64 = 8;
pub const SYS_MMAP: i64 = 9;
pub const SYS_MPROTECT: i64 = 10;
pub const SYS_MUNMAP: i64 = 11;
pub const SYS_BRK: i64 = 12;
pub const SYS_RT_SIGACTION: i64 = 13;
pub const SYS_RT_SIGPROCMASK: i64 = 14;
pub const SYS_RT_SIGRETURN: i64 = 15;
pub const SYS_IOCTL: i64 = 16;
pub const SYS_PREAD64: i64 = 17;
pub const SYS_PWRITE64: i64 = 18;
pub const SYS_READV: i64 = 19;
pub const SYS_WRITEV: i64 = 20;
pub const SYS_ACCESS: i64 = 21;
pub const SYS_PIPE: i64 = 22;
pub const SYS_SELECT: i64 = 23;
pub const SYS_SCHED_YIELD: i64 = 24;
pub const SYS_MREMAP: i64 = 25;
pub const SYS_MSYNC: i64 = 26;
pub const SYS_MINCORE: i64 = 27;
pub const SYS_MADVISE: i64 = 28;
pub const SYS_SHMGET: i64 = 29;
pub const SYS_SHMAT: i64 = 30;
pub const SYS_SHMCTL: i64 = 31;
pub const SYS_DUP: i64 = 32;
pub const SYS_DUP2: i64 = 33;
pub const SYS_PAUSE: i64 = 34;
pub const SYS_NANOSLEEP: i64 = 35;
pub const SYS_GETITIMER: i64 = 36;
pub const SYS_ALARM: i64 = 37;
pub const SYS_SETITIMER: i64 = 38;
pub const SYS_GETPID: i64 = 39;
pub const SYS_SENDFILE: i64 = 40;
pub const SYS_SOCKET: i64 = 41;
pub const SYS_CONNECT: i64 = 42;
pub const SYS_ACCEPT: i64 = 43;
pub const SYS_SENDTO: i64 = 44;
pub const SYS_RECVFROM: i64 = 45;
pub const SYS_SENDMSG: i64 = 46;
pub const SYS_RECVMSG: i64 = 47;
pub const SYS_SHUTDOWN: i64 = 48;
pub const SYS_BIND: i64 = 49;
pub const SYS_LISTEN: i64 = 50;
pub const SYS_GETSOCKNAME: i64 = 51;
pub const SYS_GETPEERNAME: i64 = 52;
pub const SYS_SOCKETPAIR: i64 = 53;
pub const SYS_SETSOCKOPT: i64 = 54;
pub const SYS_GETSOCKOPT: i64 = 55;
pub const SYS_CLONE: i64 = 56;
pub const SYS_FORK: i64 = 57;
pub const SYS_VFORK: i64 = 58;
pub const SYS_EXECVE: i64 = 59;
pub const SYS_EXIT: i64 = 60;
pub const SYS_WAIT4: i64 = 61;
pub const SYS_KILL: i64 = 62;
pub const SYS_UNAME: i64 = 63;
pub const SYS_SEMGET: i64 = 64;
pub const SYS_SEMOP: i64 = 65;
pub const SYS_SEMCTL: i64 = 66;
pub const SYS_SHMDT: i64 = 67;
pub const SYS_MSGGET: i64 = 68;
pub const SYS_MSGSND: i64 = 69;
pub const SYS_MSGRCV: i64 = 70;
pub const SYS_MSGCTL: i64 = 71;
pub const SYS_FCNTL: i64 = 72;
pub const SYS_FLOCK: i64 = 73;
pub const SYS_FSYNC: i64 = 74;
pub const SYS_FDATASYNC: i64 = 75;
pub const SYS_TRUNCATE: i64 = 76;
pub const SYS_FTRUNCATE: i64 = 77;
pub const SYS_GETDENTS: i64 = 78;
pub const SYS_GETCWD: i64 = 79;
pub const SYS_CHDIR: i64 = 80;
pub const SYS_FCHDIR: i64 = 81;
pub const SYS_RENAME: i64 = 82;
pub const SYS_MKDIR: i64 = 83;
pub const SYS_RMDIR: i64 = 84;
pub const SYS_CREAT: i64 = 85;
pub const SYS_LINK: i64 = 86;
pub const SYS_UNLINK: i64 = 87;
pub const SYS_SYMLINK: i64 = 88;
pub const SYS_READLINK: i64 = 89;
pub const SYS_CHMOD: i64 = 90;
pub const SYS_FCHMOD: i64 = 91;
pub const SYS_CHOWN: i64 = 92;
pub const SYS_FCHOWN: i64 = 93;
pub const SYS_LCHOWN: i64 = 94;
pub const SYS_UMASK: i64 = 95;
pub const SYS_GETTIMEOFDAY: i64 = 96;
pub const SYS_GETRLIMIT: i64 = 97;
pub const SYS_GETRUSAGE: i64 = 98;
pub const SYS_SYSINFO: i64 = 99;
pub const SYS_TIMES: i64 = 100;
pub const SYS_PTRACE: i64 = 101;
pub const SYS_GETUID: i64 = 102;
pub const SYS_SYSLOG: i64 = 103;
pub const SYS_GETGID: i64 = 104;
pub const SYS_SETUID: i64 = 105;
pub const SYS_SETGID: i64 = 106;
pub const SYS_GETEUID: i64 = 107;
pub const SYS_GETEGID: i64 = 108;
pub const SYS_SETPGID: i64 = 109;
pub const SYS_GETPPID: i64 = 110;
pub const SYS_GETPGRP: i64 = 111;
pub const SYS_SETSID: i64 = 112;
pub const SYS_SETREUID: i64 = 113;
pub const SYS_SETREGID: i64 = 114;
pub const SYS_GETGROUPS: i64 = 115;
pub const SYS_SETGROUPS: i64 = 116;
pub const SYS_SETRESUID: i64 = 117;
pub const SYS_GETRESUID: i64 = 118;
pub const SYS_SETRESGID: i64 = 119;
pub const SYS_GETRESGID: i64 = 120;
pub const SYS_GETPGID: i64 = 121;
pub const SYS_SETFSUID: i64 = 122;
pub const SYS_SETFSGID: i64 = 123;
pub const SYS_GETSID: i64 = 124;
pub const SYS_CAPGET: i64 = 125;
pub const SYS_CAPSET: i64 = 126;
pub const SYS_RT_SIGPENDING: i64 = 127;
pub const SYS_RT_SIGTIMEDWAIT: i64 = 128;
pub const SYS_RT_SIGQUEUEINFO: i64 = 129;
pub const SYS_RT_SIGSUSPEND: i64 = 130;
pub const SYS_SIGALTSTACK: i64 = 131;
pub const SYS_UTIME: i64 = 132;
pub const SYS_MKNOD: i64 = 133;
pub const SYS_USELIB: i64 = 134;
pub const SYS_PERSONALITY: i64 = 135;
pub const SYS_USTAT: i64 = 136;
pub const SYS_STATFS: i64 = 137;
pub const SYS_FSTATFS: i64 = 138;
pub const SYS_SYSFS: i64 = 139;
pub const SYS_GETPRIORITY: i64 = 140;
pub const SYS_SETPRIORITY: i64 = 141;
pub const SYS_SCHED_SETPARAM: i64 = 142;
pub const SYS_SCHED_GETPARAM: i64 = 143;
pub const SYS_SCHED_SETSCHEDULER: i64 = 144;
pub const SYS_SCHED_GETSCHEDULER: i64 = 145;
pub const SYS_SCHED_GET_PRIORITY_MAX: i64 = 146;
pub const SYS_SCHED_GET_PRIORITY_MIN: i64 = 147;
pub const SYS_SCHED_RR_GET_INTERVAL: i64 = 148;
pub const SYS_MLOCK: i64 = 149;
pub const SYS_MUNLOCK: i64 = 150;
pub const SYS_MLOCKALL: i64 = 151;
pub const SYS_MUNLOCKALL: i64 = 152;
pub const SYS_VHANGUP: i64 = 153;
pub const SYS_MODIFY_LDT: i64 = 154;
pub const SYS_PIVOT_ROOT: i64 = 155;
pub const SYS__SYSCTL: i64 = 156;
pub const SYS_PRCTL: i64 = 157;
pub const SYS_ARCH_PRCTL: i64 = 158;
pub const SYS_ADJTIMEX: i64 = 159;
pub const SYS_SETRLIMIT: i64 = 160;
pub const SYS_CHROOT: i64 = 161;
pub const SYS_SYNC: i64 = 162;
pub const SYS_ACCT: i64 = 163;
pub const SYS_SETTIMEOFDAY: i64 = 164;
pub const SYS_MOUNT: i64 = 165;
pub const SYS_UMOUNT2: i64 = 166;
pub const SYS_SWAPON: i64 = 167;
pub const SYS_SWAPOFF: i64 = 168;
pub const SYS_REBOOT: i64 = 169;
pub const SYS_SETHOSTNAME: i64 = 170;
pub const SYS_SETDOMAINNAME: i64 = 171;
pub const SYS_IOPL: i64 = 172;
pub const SYS_IOPERM: i64 = 173;
pub const SYS_CREATE_MODULE: i64 = 174;
pub const SYS_INIT_MODULE: i64 = 175;
pub const SYS_DELETE_MODULE: i64 = 176;
pub const SYS_GET_KERNEL_SYMS: i64 = 177;
pub const SYS_QUERY_MODULE: i64 = 178;
pub const SYS_QUOTACTL: i64 = 179;
pub const SYS_NFSSERVCTL: i64 = 180;
pub const SYS_GETPMSG: i64 = 181;
pub const SYS_PUTPMSG: i64 = 182;
pub const SYS_AFS_SYSCALL: i64 = 183;
pub const SYS_TUXCALL: i64 = 184;
pub const SYS_SECURITY: i64 = 185;
pub const SYS_GETTID: i64 = 186;
pub const SYS_READAHEAD: i64 = 187;
pub const SYS_SETXATTR: i64 = 188;
pub const SYS_LSETXATTR: i64 = 189;
pub const SYS_FSETXATTR: i64 = 190;
pub const SYS_GETXATTR: i64 = 191;
pub const SYS_LGETXATTR: i64 = 192;
pub const SYS_FGETXATTR: i64 = 193;
pub const SYS_LISTXATTR: i64 = 194;
pub const SYS_LLISTXATTR: i64 = 195;
pub const SYS_FLISTXATTR: i64 = 196;
pub const SYS_REMOVEXATTR: i64 = 197;
pub const SYS_LREMOVEXATTR: i64 = 198;
pub const SYS_FREMOVEXATTR: i64 = 199;
pub const SYS_TKILL: i64 = 200;
pub const SYS_TIME: i64 = 201;
pub const SYS_FUTEX: i64 = 202;
pub const SYS_SCHED_SETAFFINITY: i64 = 203;
pub const SYS_SCHED_GETAFFINITY: i64 = 204;
pub const SYS_SET_THREAD_AREA: i64 = 205;
pub const SYS_IO_SETUP: i64 = 206;
pub const SYS_IO_DESTROY: i64 = 207;
pub const SYS_IO_GETEVENTS: i64 = 208;
pub const SYS_IO_SUBMIT: i64 = 209;
pub const SYS_IO_CANCEL: i64 = 210;
pub const SYS_GET_THREAD_AREA: i64 = 211;
pub const SYS_LOOKUP_DCOOKIE: i64 = 212;
pub const SYS_EPOLL_CREATE: i64 = 213;
pub const SYS_EPOLL_CTL_OLD: i64 = 214;
pub const SYS_EPOLL_WAIT_OLD: i64 = 215;
pub const SYS_REMAP_FILE_PAGES: i64 = 216;
pub const SYS_GETDENTS64: i64 = 217;
pub const SYS_SET_TID_ADDRESS: i64 = 218;
pub const SYS_RESTART_SYSCALL: i64 = 219;
pub const SYS_SEMTIMEDOP: i64 = 220;
pub const SYS_FADVISE64: i64 = 221;
pub const SYS_TIMER_CREATE: i64 = 222;
pub const SYS_TIMER_SETTIME: i64 = 223;
pub const SYS_TIMER_GETTIME: i64 = 224;
pub const SYS_TIMER_GETOVERRUN: i64 = 225;
pub const SYS_TIMER_DELETE: i64 = 226;
pub const SYS_CLOCK_SETTIME: i64 = 227;
pub const SYS_CLOCK_GETTIME: i64 = 228;
pub const SYS_CLOCK_GETRES: i64 = 229;
pub const SYS_CLOCK_NANOSLEEP: i64 = 230;
pub const SYS_EXIT_GROUP: i64 = 231;
pub const SYS_EPOLL_WAIT: i64 = 232;
pub const SYS_EPOLL_CTL: i64 = 233;
pub const SYS_TGKILL: i64 = 234;
pub const SYS_UTIMES: i64 = 235;
pub const SYS_VSERVER: i64 = 236;
pub const SYS_MBIND: i64 = 237;
pub const SYS_SET_MEMPOLICY: i64 = 238;
pub const SYS_GET_MEMPOLICY: i64 = 239;
pub const SYS_MQ_OPEN: i64 = 240;
pub const SYS_MQ_UNLINK: i64 = 241;
pub const SYS_MQ_TIMEDSEND: i64 = 242;
pub const SYS_MQ_TIMEDRECEIVE: i64 = 243;
pub const SYS_MQ_NOTIFY: i64 = 244;
pub const SYS_MQ_GETSETATTR: i64 = 245;
pub const SYS_KEXEC_LOAD: i64 = 246;
pub const SYS_WAITID: i64 = 247;
pub const SYS_ADD_KEY: i64 = 248;
pub const SYS_REQUEST_KEY: i64 = 249;
pub const SYS_KEYCTL: i64 = 250;
pub const SYS_IOPRIO_SET: i64 = 251;
pub const SYS_IOPRIO_GET: i64 = 252;
pub const SYS_INOTIFY_INIT: i64 = 253;
pub const SYS_INOTIFY_ADD_WATCH: i64 = 254;
pub const SYS_INOTIFY_RM_WATCH: i64 = 255;
pub const SYS_MIGRATE_PAGES: i64 = 256;
pub const SYS_OPENAT: i64 = 257;
pub const SYS_MKDIRAT: i64 = 258;
pub const SYS_MKNODAT: i64 = 259;
pub const SYS_FCHOWNAT: i64 = 260;
pub const SYS_FUTIMESAT: i64 = 261;
pub const SYS_NEWFSTATAT: i64 = 262;
pub const SYS_UNLINKAT: i64 = 263;
pub const SYS_RENAMEAT: i64 = 264;
pub const SYS_LINKAT: i64 = 265;
pub const SYS_SYMLINKAT: i64 = 266;
pub const SYS_READLINKAT: i64 = 267;
pub const SYS_FCHMODAT: i64 = 268;
pub const SYS_FACCESSAT: i64 = 269;
pub const SYS_PSELECT6: i64 = 270;
pub const SYS_PPOLL: i64 = 271;
pub const SYS_UNSHARE: i64 = 272;
pub const SYS_SET_ROBUST_LIST: i64 = 273;
pub const SYS_GET_ROBUST_LIST: i64 = 274;
pub const SYS_SPLICE: i64 = 275;
pub const SYS_TEE: i64 = 276;
pub const SYS_SYNC_FILE_RANGE: i64 = 277;
pub const SYS_VMSPLICE: i64 = 278;
pub const SYS_MOVE_PAGES: i64 = 279;
pub const SYS_UTIMENSAT: i64 = 280;
pub const SYS_EPOLL_PWAIT: i64 = 281;
pub const SYS_SIGNALFD: i64 = 282;
pub const SYS_TIMERFD_CREATE: i64 = 283;
pub const SYS_EVENTFD: i64 = 284;
pub const SYS_FALLOCATE: i64 = 285;
pub const SYS_TIMERFD_SETTIME: i64 = 286;
pub const SYS_TIMERFD_GETTIME: i64 = 287;
pub const SYS_ACCEPT4: i64 = 288;
pub const SYS_SIGNALFD4: i64 = 289;
pub const SYS_EVENTFD2: i64 = 290;
pub const SYS_EPOLL_CREATE1: i64 = 291;
pub const SYS_DUP3: i64 = 292;
pub const SYS_PIPE2: i64 = 293;
pub const SYS_INOTIFY_INIT1: i64 = 294;
pub const SYS_PREADV: i64 = 295;
pub const SYS_PWRITEV: i64 = 296;
pub const SYS_RT_TGSIGQUEUEINFO: i64 = 297;
pub const SYS_PERF_EVENT_OPEN: i64 = 298;
pub const SYS_RECVMMSG: i64 = 299;
pub const SYS_FANOTIFY_INIT: i64 = 300;
pub const SYS_FANOTIFY_MARK: i64 = 301;
pub const SYS_PRLIMIT64: i64 = 302;
pub const SYS_NAME_TO_HANDLE_AT: i64 = 303;
pub const SYS_OPEN_BY_HANDLE_AT: i64 = 304;
pub const SYS_CLOCK_ADJTIME: i64 = 305;
pub const SYS_SYNCFS: i64 = 306;
pub const SYS_SENDMMSG: i64 = 307;
pub const SYS_SETNS: i64 = 308;
pub const SYS_GETCPU: i64 = 309;
pub const SYS_PROCESS_VM_READV: i64 = 310;
pub const SYS_PROCESS_VM_WRITEV: i64 = 311;
pub const SYS_KCMP: i64 = 312;
pub const SYS_FINIT_MODULE: i64 = 313;