105 lines
2.5 KiB
C
105 lines
2.5 KiB
C
#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"
|
|
|
|
void print(char* string) {
|
|
char* c = string;
|
|
int i=0;
|
|
while (*(c++))
|
|
i++;
|
|
write(i, 0, (uint8_t*)string);
|
|
}
|
|
|
|
int int_to_decimal(unsigned int number, char* string_buffer) {
|
|
for (int i=0; i<11; i++)
|
|
string_buffer[i] = 0;
|
|
|
|
int index = 9;
|
|
unsigned int acc = number;
|
|
if (acc == 0)
|
|
string_buffer[index--] = '0';
|
|
while (acc != 0) {
|
|
string_buffer[index--] = 0x30+(acc%10);
|
|
acc /= 10;
|
|
}
|
|
return (index+1);
|
|
}
|
|
|
|
char dec_to_hex[16] = "0123456789abcdef";
|
|
int int_to_hex(unsigned int number, char* string_buffer) {
|
|
for (int i=0; i<8; i++)
|
|
string_buffer[i] = '0';
|
|
string_buffer[8] = 0;
|
|
|
|
int index = 7;
|
|
unsigned int acc = number;
|
|
if (acc == 0)
|
|
string_buffer[index--] = '0';
|
|
while (acc != 0) {
|
|
string_buffer[index--] = dec_to_hex[acc%0x10];
|
|
acc /= 0x10;
|
|
}
|
|
return (index+1);
|
|
}
|
|
|
|
void printf(const char* string, ...) {
|
|
va_list ptr;
|
|
va_start(ptr, string);
|
|
|
|
int index = 0;
|
|
char current;
|
|
|
|
while (current=string[index++]) {
|
|
if (current == '%') {
|
|
int type = string[index++];
|
|
int offset;
|
|
switch (type) {
|
|
case 'd': {
|
|
char decimal_buffer[11];
|
|
offset = int_to_decimal(va_arg(ptr, int), decimal_buffer);
|
|
printf(decimal_buffer + offset);
|
|
break;
|
|
}
|
|
case 'x': {
|
|
char hex_buffer[8];
|
|
offset = int_to_hex(va_arg(ptr, int), hex_buffer);
|
|
printf(hex_buffer);
|
|
break;
|
|
}
|
|
case 's': {
|
|
printf(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);
|
|
} |