#include "common.h" #define syscall_hdlr_0(a, b, c) \ a b() { \ asm volatile("mov $" c ", %%eax; int $0x80" : : :); \ } #define syscall_hdlr_1(a, b, c, d, e) \ a b(d e) { \ asm volatile("mov $" c ", %%eax; mov %0, %%ebx; int $0x80" : : "m" (e) : "ebx"); \ } #define syscall_hdlr_2(a, b, c, d, e, f, g) \ a b(d e, f g) { \ asm volatile("mov $" c ", %%eax; mov %0, %%ebx; mov %1, %%ecx; int $0x80" : : "m" (e), "m" (g) : "ebx", "ecx"); \ } #define syscall_hdlr_3(a, b, c, d, e, f, g, h, i) \ a b(d e, f g, h i) { \ asm volatile("mov $" c ", %%eax; mov %0, %%ebx; mov %1, %%ecx; mov %2, %%edx; int $0x80" : : "m" (e), "m" (g), "m" (i) : "ebx", "ecx", "edx"); \ } #include "syscalls.h" char** environ = 0; uint32_t strcmpc(char* a, char* b, char c) { for (int i=0; a[i] && b[i]; i++) { if (a[i] == c) return i; } return 0; } void __setup(uint32_t argc, char** argv, char** envp) { environ = envp; } char* getenv(char* key) { for (int i=0; environ[i]; i++) { uint32_t pos; if (pos = strcmpc(environ[i], key, '=')) { return key+pos+1; } } return 0; } void setenv(char* key, char* value) { uint32_t environ_count = 0; for (int i=0; environ[i]; i++) environ_count += 1; char** new_environ = (char**)malloc((environ_count+2)*sizeof(char*)); for (int i=0; i= 0x30 && c <= 0x39; } void printf(const char* string, ...) { va_list ptr; va_start(ptr, string); int index = 0; char current; while (current=string[index++]) { if (current == '%') { uint32_t width = 0; bool lp = false; if (string[index] == '.') { lp = true; index++; } else { while (isnum(string[index])) { width *= 10; width += string[index] - 0x30; index++; } } int type = string[index++]; int offset; switch (type) { case 'd': { char decimal_buffer[11]; offset = int_to_decimal(va_arg(ptr, int), decimal_buffer); print(decimal_buffer + offset); break; } case 'x': { char hex_buffer[8]; offset = int_to_hex(va_arg(ptr, int), hex_buffer); print(hex_buffer); break; } case 's': { if (width) { char s[width+1]; s[width] = 0; memcpy(s, va_arg(ptr, const char*), width); print(s); } else if (lp) { int width = va_arg(ptr, int); char s[width+1]; s[width] = 0; memcpy(s, va_arg(ptr, const char*), width); print(s); } else { print(va_arg(ptr, const char*)); } break; } case 'c': { int promoted = va_arg(ptr, int); char charred = promoted; write(1, 0, &charred); break; } } continue; } write(1, 0, ¤t); } va_end(ptr); } void memset(void* ptr, char c, uint32_t count) { for (int i=0; i