syscalls.c (691B)
1 #include <stddef.h> 2 #include <dat.h> 3 4 typedef long ssize_t; 5 6 #define syscall3(n, arg1, arg2, arg3) ({ \ 7 long ret; \ 8 asm volatile ( \ 9 "int $0x80" \ 10 : "=a"(ret) \ 11 : "a"(n), "b"(arg1), "c"(arg2), "d"(arg3) \ 12 : "memory" \ 13 ); \ 14 ret; \ 15 }) 16 17 size_t write(int fd, void *buf, size_t size) { 18 long ret = syscall3(sys_write, fd, buf, size); 19 return ret; 20 } 21 22 size_t read(int fd, void *buf, size_t size) { 23 long ret = syscall3(sys_read, fd, buf, size); 24 return ret; 25 } 26 27 size_t test_syscall_read() { 28 char c; 29 size_t bytes = read(stdin, &c, 1); 30 31 if (bytes > 0) { 32 write(stdout, &c, 1); 33 } else { 34 asm volatile("hlt"); 35 } 36 37 return bytes; 38 }