From 7c1bd03a71cccfcf48e79d241787021b0de98e73 Mon Sep 17 00:00:00 2001 From: hachem Date: Sun, 4 Oct 2026 02:02:15 +0200 Subject: feat: add more user programs --- user/user.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 user/user.h (limited to 'user/user.h') diff --git a/user/user.h b/user/user.h new file mode 100644 index 0000000..676326b --- /dev/null +++ b/user/user.h @@ -0,0 +1,97 @@ +// shared syscall stubs + tiny helpers for revel ring 3 programs + +static long sys_write(const char* buffer, unsigned long length) +{ + long result; + __asm__ volatile("int $0x80" : "=a"(result) : "a"(1L), "D"(buffer), "S"(length) : "memory"); + return result; +} + +static long sys_read(void) +{ + long result; + __asm__ volatile("int $0x80" : "=a"(result) : "a"(2L) : "memory"); + return result; +} + +static void sys_exit(long code) +{ + __asm__ volatile("int $0x80" : : "a"(0L), "D"(code) : "memory"); + for (;;); +} + +static long sys_fs_size(const char* name) +{ + long result; + __asm__ volatile("int $0x80" : "=a"(result) : "a"(4L), "D"(name) : "memory"); + return result; +} + +static long sys_fs_read(const char* name, unsigned long offset, char* buffer, unsigned long length) +{ + long result; + __asm__ volatile("int $0x80" + : "=a"(result) + : "a"(5L), "D"(name), "S"(offset), "d"(buffer), "c"(length) + : "memory"); + return result; +} + +static void put(const char* string) +{ + unsigned long length = 0; + while (string[length]) + length++; + sys_write(string, length); +} + +static int read_line(char* buffer, int max_length) +{ + int length = 0; + for (;;) + { + char character = (char)sys_read(); + if (character == '\n') + break; + if (character == '\b') + { + if (length > 0) + { + length--; + sys_write("\b \b", 3); + } + continue; + } + if (length < max_length - 1) + { + buffer[length++] = character; + sys_write(&character, 1); + } + } + buffer[length] = 0; + return length; +} + +static void put_int(long value) +{ + char buffer[21]; + int length = 0; + int negative = value < 0; + unsigned long magnitude = negative ? (unsigned long)(-value) : (unsigned long)value; + if (magnitude == 0) + buffer[length++] = '0'; + while (magnitude > 0) + { + buffer[length++] = (char)('0' + magnitude % 10); + magnitude /= 10; + } + if (negative) + buffer[length++] = '-'; + for (int left = 0, right = length - 1; left < right; left++, right--) + { + char swap = buffer[left]; + buffer[left] = buffer[right]; + buffer[right] = swap; + } + sys_write(buffer, length); +} -- cgit v1.3