From d94b024b73aeca06de417e0fd3c502495312a8b2 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sat, 7 Dec 2019 13:40:28 +0100 Subject: Added userspace libc and began userspace based shell --- src/kernel/cmos/rtc.c | 2 +- src/kernel/commands/command.c | 4 +- src/kernel/fs/ata_pio.c | 2 +- src/kernel/fs/install.c | 2 +- src/kernel/fs/iso9660/iso9660.c | 2 +- src/kernel/fs/marfs/directory.c | 2 +- src/kernel/fs/marfs/disklevel.c | 2 +- src/kernel/fs/marfs/marfs.h | 2 +- src/kernel/fs/marfs/new_file.c | 2 +- src/kernel/fs/marfs/read_whole_file.c | 2 +- src/kernel/fs/marfs/sectorlevel.c | 4 +- src/kernel/gdt/gdt.c | 2 +- src/kernel/graphics/font.c | 2 +- src/kernel/graphics/vesa.c | 4 +- src/kernel/input/input.h | 4 + src/kernel/input/ps2/keyboard.c | 15 +- src/kernel/input/ps2/mouse.c | 2 +- src/kernel/interrupts/isr.c | 2 +- src/kernel/io/io.c | 4 +- src/kernel/kernel.c | 2 +- src/kernel/lib/math.h | 6 + src/kernel/lib/math/pow.c | 10 + src/kernel/lib/stdio.h | 16 ++ src/kernel/lib/stdio/getch.c | 9 + src/kernel/lib/stdio/printf.c | 10 + src/kernel/lib/stdio/readline.c | 9 + src/kernel/lib/stdio/vprintf.c | 52 ++++ src/kernel/lib/stdio/writec.c | 6 + src/kernel/lib/stdlib.h | 26 ++ src/kernel/lib/stdlib/atoi.c | 24 ++ src/kernel/lib/stdlib/htoa.c | 30 +++ src/kernel/lib/stdlib/htoi.c | 23 ++ src/kernel/lib/stdlib/itoa.c | 45 ++++ src/kernel/lib/stdlib/liballoc.c | 457 +++++++++++++++++++++++++++++++++ src/kernel/lib/stdlib/liballoc.h | 24 ++ src/kernel/lib/string.h | 22 ++ src/kernel/lib/string/strcat.c | 10 + src/kernel/lib/string/strcati.c | 8 + src/kernel/lib/string/strcmp.c | 10 + src/kernel/lib/string/strcpy.c | 9 + src/kernel/lib/string/strdisp.c | 12 + src/kernel/lib/string/strdup.c | 10 + src/kernel/lib/string/strinv.c | 13 + src/kernel/lib/string/strlen.c | 8 + src/kernel/syscall/actions/sys_read.c | 21 ++ src/kernel/syscall/actions/sys_write.c | 12 +- src/kernel/syscall/syscall.c | 6 +- src/kernel/syscall/syscall.h | 4 +- src/kernel/system.c | 6 +- src/mlibc/math.h | 6 - src/mlibc/math/pow.c | 10 - src/mlibc/stdio.h | 14 - src/mlibc/stdio/printf.c | 10 - src/mlibc/stdio/vprintf.c | 52 ---- src/mlibc/stdio/writec.c | 6 - src/mlibc/stdlib.h | 26 -- src/mlibc/stdlib/atoi.c | 24 -- src/mlibc/stdlib/htoa.c | 30 --- src/mlibc/stdlib/htoi.c | 23 -- src/mlibc/stdlib/itoa.c | 45 ---- src/mlibc/stdlib/liballoc.c | 457 --------------------------------- src/mlibc/stdlib/liballoc.h | 24 -- src/mlibc/string.h | 22 -- src/mlibc/string/strcat.c | 10 - src/mlibc/string/strcati.c | 8 - src/mlibc/string/strcmp.c | 10 - src/mlibc/string/strcpy.c | 9 - src/mlibc/string/strdisp.c | 12 - src/mlibc/string/strdup.c | 10 - src/mlibc/string/strinv.c | 13 - src/mlibc/string/strlen.c | 8 - src/userspace/main.c | 12 +- src/userspace/mlibc/math.h | 6 + src/userspace/mlibc/math/pow.c | 10 + src/userspace/mlibc/stdio.h | 16 ++ src/userspace/mlibc/stdio/getch.c | 7 + src/userspace/mlibc/stdio/printf.c | 10 + src/userspace/mlibc/stdio/readline.c | 7 + src/userspace/mlibc/stdio/vprintf.c | 53 ++++ src/userspace/mlibc/stdio/writec.c | 4 + src/userspace/mlibc/stdlib.h | 20 ++ src/userspace/mlibc/stdlib/atoi.c | 24 ++ src/userspace/mlibc/stdlib/htoa.c | 31 +++ src/userspace/mlibc/stdlib/htoi.c | 23 ++ src/userspace/mlibc/stdlib/itoa.c | 47 ++++ src/userspace/mlibc/string.h | 22 ++ src/userspace/mlibc/string/strcat.c | 10 + src/userspace/mlibc/string/strcati.c | 8 + src/userspace/mlibc/string/strcmp.c | 10 + src/userspace/mlibc/string/strcpy.c | 9 + src/userspace/mlibc/string/strdisp.c | 12 + src/userspace/mlibc/string/strdup.c | 11 + src/userspace/mlibc/string/strinv.c | 13 + src/userspace/mlibc/string/strlen.c | 8 + src/userspace/syscall.h | 8 +- 95 files changed, 1303 insertions(+), 868 deletions(-) create mode 100644 src/kernel/lib/math.h create mode 100644 src/kernel/lib/math/pow.c create mode 100644 src/kernel/lib/stdio.h create mode 100644 src/kernel/lib/stdio/getch.c create mode 100644 src/kernel/lib/stdio/printf.c create mode 100644 src/kernel/lib/stdio/readline.c create mode 100644 src/kernel/lib/stdio/vprintf.c create mode 100644 src/kernel/lib/stdio/writec.c create mode 100644 src/kernel/lib/stdlib.h create mode 100644 src/kernel/lib/stdlib/atoi.c create mode 100644 src/kernel/lib/stdlib/htoa.c create mode 100644 src/kernel/lib/stdlib/htoi.c create mode 100644 src/kernel/lib/stdlib/itoa.c create mode 100644 src/kernel/lib/stdlib/liballoc.c create mode 100644 src/kernel/lib/stdlib/liballoc.h create mode 100644 src/kernel/lib/string.h create mode 100644 src/kernel/lib/string/strcat.c create mode 100644 src/kernel/lib/string/strcati.c create mode 100644 src/kernel/lib/string/strcmp.c create mode 100644 src/kernel/lib/string/strcpy.c create mode 100644 src/kernel/lib/string/strdisp.c create mode 100644 src/kernel/lib/string/strdup.c create mode 100644 src/kernel/lib/string/strinv.c create mode 100644 src/kernel/lib/string/strlen.c create mode 100644 src/kernel/syscall/actions/sys_read.c delete mode 100644 src/mlibc/math.h delete mode 100644 src/mlibc/math/pow.c delete mode 100644 src/mlibc/stdio.h delete mode 100644 src/mlibc/stdio/printf.c delete mode 100644 src/mlibc/stdio/vprintf.c delete mode 100644 src/mlibc/stdio/writec.c delete mode 100644 src/mlibc/stdlib.h delete mode 100644 src/mlibc/stdlib/atoi.c delete mode 100644 src/mlibc/stdlib/htoa.c delete mode 100644 src/mlibc/stdlib/htoi.c delete mode 100644 src/mlibc/stdlib/itoa.c delete mode 100644 src/mlibc/stdlib/liballoc.c delete mode 100644 src/mlibc/stdlib/liballoc.h delete mode 100644 src/mlibc/string.h delete mode 100644 src/mlibc/string/strcat.c delete mode 100644 src/mlibc/string/strcati.c delete mode 100644 src/mlibc/string/strcmp.c delete mode 100644 src/mlibc/string/strcpy.c delete mode 100644 src/mlibc/string/strdisp.c delete mode 100644 src/mlibc/string/strdup.c delete mode 100644 src/mlibc/string/strinv.c delete mode 100644 src/mlibc/string/strlen.c create mode 100644 src/userspace/mlibc/math.h create mode 100644 src/userspace/mlibc/math/pow.c create mode 100644 src/userspace/mlibc/stdio.h create mode 100644 src/userspace/mlibc/stdio/getch.c create mode 100644 src/userspace/mlibc/stdio/printf.c create mode 100644 src/userspace/mlibc/stdio/readline.c create mode 100644 src/userspace/mlibc/stdio/vprintf.c create mode 100644 src/userspace/mlibc/stdio/writec.c create mode 100644 src/userspace/mlibc/stdlib.h create mode 100644 src/userspace/mlibc/stdlib/atoi.c create mode 100644 src/userspace/mlibc/stdlib/htoa.c create mode 100644 src/userspace/mlibc/stdlib/htoi.c create mode 100644 src/userspace/mlibc/stdlib/itoa.c create mode 100644 src/userspace/mlibc/string.h create mode 100644 src/userspace/mlibc/string/strcat.c create mode 100644 src/userspace/mlibc/string/strcati.c create mode 100644 src/userspace/mlibc/string/strcmp.c create mode 100644 src/userspace/mlibc/string/strcpy.c create mode 100644 src/userspace/mlibc/string/strdisp.c create mode 100644 src/userspace/mlibc/string/strdup.c create mode 100644 src/userspace/mlibc/string/strinv.c create mode 100644 src/userspace/mlibc/string/strlen.c (limited to 'src') diff --git a/src/kernel/cmos/rtc.c b/src/kernel/cmos/rtc.c index 0a67e64..0a5b63d 100644 --- a/src/kernel/cmos/rtc.c +++ b/src/kernel/cmos/rtc.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include unsigned char second; unsigned char minute; diff --git a/src/kernel/commands/command.c b/src/kernel/commands/command.c index c85356b..691684b 100644 --- a/src/kernel/commands/command.c +++ b/src/kernel/commands/command.c @@ -4,8 +4,8 @@ #include #include #include -#include -#include +#include +#include int32_t starts_with(const char *a, const char *b) { diff --git a/src/kernel/fs/ata_pio.c b/src/kernel/fs/ata_pio.c index f7b78cc..2de57b8 100644 --- a/src/kernel/fs/ata_pio.c +++ b/src/kernel/fs/ata_pio.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include diff --git a/src/kernel/fs/install.c b/src/kernel/fs/install.c index dfb6587..da0407d 100644 --- a/src/kernel/fs/install.c +++ b/src/kernel/fs/install.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/kernel/fs/iso9660/iso9660.c b/src/kernel/fs/iso9660/iso9660.c index 81b1ba6..3c61d94 100644 --- a/src/kernel/fs/iso9660/iso9660.c +++ b/src/kernel/fs/iso9660/iso9660.c @@ -2,7 +2,7 @@ #include #include #include -#include +#include struct iso9660_entity *ISO9660_get(char **dirs, uint8_t dirs_sz) { diff --git a/src/kernel/fs/marfs/directory.c b/src/kernel/fs/marfs/directory.c index 210d908..d0a1bff 100644 --- a/src/kernel/fs/marfs/directory.c +++ b/src/kernel/fs/marfs/directory.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include uint32_t marfs_new_dir(uint32_t uid) diff --git a/src/kernel/fs/marfs/disklevel.c b/src/kernel/fs/marfs/disklevel.c index a902362..106540e 100644 --- a/src/kernel/fs/marfs/disklevel.c +++ b/src/kernel/fs/marfs/disklevel.c @@ -14,7 +14,7 @@ void marfs_format(void) sb.s_first_chunk = 2 + sb.n_inodes; // Write to disk - marfs_writeSB(&sb); + marfs_write_superblock(&sb); // Initialize the inodes for (uint32_t i = 0; i < sb.n_inodes; i++) ata_clear28(interface, 2 + i); diff --git a/src/kernel/fs/marfs/marfs.h b/src/kernel/fs/marfs/marfs.h index f197e5b..67b693c 100644 --- a/src/kernel/fs/marfs/marfs.h +++ b/src/kernel/fs/marfs/marfs.h @@ -42,7 +42,7 @@ uint8_t marfs_write_mbr(uint8_t *mbr); struct marfs_superblock *marfs_read_superblock(); -uint8_t marfs_writeSB(struct marfs_superblock *sb); +uint8_t marfs_write_superblock(struct marfs_superblock *sb); uint32_t marfs_get_free_lba_block(void); diff --git a/src/kernel/fs/marfs/new_file.c b/src/kernel/fs/marfs/new_file.c index 4503ed1..4fef3b9 100644 --- a/src/kernel/fs/marfs/new_file.c +++ b/src/kernel/fs/marfs/new_file.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include static uint8_t last_max_level = 0; diff --git a/src/kernel/fs/marfs/read_whole_file.c b/src/kernel/fs/marfs/read_whole_file.c index 324cd9b..85f9bbb 100644 --- a/src/kernel/fs/marfs/read_whole_file.c +++ b/src/kernel/fs/marfs/read_whole_file.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include static uint8_t last_max_level = 0; diff --git a/src/kernel/fs/marfs/sectorlevel.c b/src/kernel/fs/marfs/sectorlevel.c index d9fa2c4..d905315 100644 --- a/src/kernel/fs/marfs/sectorlevel.c +++ b/src/kernel/fs/marfs/sectorlevel.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -29,7 +29,7 @@ struct marfs_superblock *marfs_read_superblock() return p; } -uint8_t marfs_writeSB(struct marfs_superblock *sb) +uint8_t marfs_write_superblock(struct marfs_superblock *sb) { sb_cache = *sb; return ata_write28(interface, 1, (uint8_t *) sb); diff --git a/src/kernel/gdt/gdt.c b/src/kernel/gdt/gdt.c index 94ce06b..41e6909 100644 --- a/src/kernel/gdt/gdt.c +++ b/src/kernel/gdt/gdt.c @@ -2,7 +2,7 @@ #include #include #include -#include +#include struct gdt_entry { unsigned short limit_low; diff --git a/src/kernel/graphics/font.c b/src/kernel/graphics/font.c index 458669b..147eaff 100644 --- a/src/kernel/graphics/font.c +++ b/src/kernel/graphics/font.c @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/kernel/graphics/vesa.c b/src/kernel/graphics/vesa.c index 4d6dc84..1b759e4 100644 --- a/src/kernel/graphics/vesa.c +++ b/src/kernel/graphics/vesa.c @@ -4,9 +4,9 @@ #include #include #include -#include +#include #include -#include +#include void switch_to_vga() { diff --git a/src/kernel/input/input.h b/src/kernel/input/input.h index 063eee2..3152622 100644 --- a/src/kernel/input/input.h +++ b/src/kernel/input/input.h @@ -12,4 +12,8 @@ void mouse_install(); */ void keyboard_install(); +void keyboard_clear_buffer(); + +char *keyboard_buffer; + #endif diff --git a/src/kernel/input/ps2/keyboard.c b/src/kernel/input/ps2/keyboard.c index 7294349..9e133ef 100644 --- a/src/kernel/input/ps2/keyboard.c +++ b/src/kernel/input/ps2/keyboard.c @@ -1,6 +1,11 @@ #include #include #include +#include +#include +#include +#include +#include int shift_pressed; int control_pressed; @@ -101,7 +106,7 @@ void keyboard_handler(struct regs *r) return; } - vesa_keyboard_char(current_keymap[scan_code]); + keyboard_buffer[strlen(keyboard_buffer)] = current_keymap[scan_code]; } else { // RELEASE if (current_keymap[scan_code] == -107) // TODO: IDK WHY -107?! control_pressed = 0; @@ -120,9 +125,17 @@ void keyboard_rate() outb(0x60, 0x0); // Rate{00000} Delay{00} 0 } +void keyboard_clear_buffer() +{ + memset(keyboard_buffer, 0, 4096); +} + // Installs the keyboard handler into IRQ1 void keyboard_install() { + keyboard_buffer = (char *) paging_alloc_pages(1); // 4KiB + paging_set_user((uint32_t) keyboard_buffer, 1); + keyboard_rate(); irq_install_handler(1, keyboard_handler); shift_pressed = 0; diff --git a/src/kernel/input/ps2/mouse.c b/src/kernel/input/ps2/mouse.c index cb7406f..75d80a1 100644 --- a/src/kernel/input/ps2/mouse.c +++ b/src/kernel/input/ps2/mouse.c @@ -150,4 +150,4 @@ void mouse_install() // Setup the mouse handler irq_install_handler(12, mouse_handler); info("Installed mouse handler"); -} +} \ No newline at end of file diff --git a/src/kernel/interrupts/isr.c b/src/kernel/interrupts/isr.c index 7a4d3f4..3dfd24c 100644 --- a/src/kernel/interrupts/isr.c +++ b/src/kernel/interrupts/isr.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include // Install ISRs in IDT void isrs_install() diff --git a/src/kernel/io/io.c b/src/kernel/io/io.c index c5ae657..6bd87e0 100644 --- a/src/kernel/io/io.c +++ b/src/kernel/io/io.c @@ -2,8 +2,8 @@ #include #include #include -#include -#include +#include +#include uint8_t inb(uint16_t port) { diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 69ad72a..bfd0803 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include extern void jump_userspace(); diff --git a/src/kernel/lib/math.h b/src/kernel/lib/math.h new file mode 100644 index 0000000..c9abf7d --- /dev/null +++ b/src/kernel/lib/math.h @@ -0,0 +1,6 @@ +#ifndef MELVIX_MATH_H +#define MELVIX_MATH_H + +int pow(int base, int exp); + +#endif diff --git a/src/kernel/lib/math/pow.c b/src/kernel/lib/math/pow.c new file mode 100644 index 0000000..24670a0 --- /dev/null +++ b/src/kernel/lib/math/pow.c @@ -0,0 +1,10 @@ +int pow(int base, int exp) +{ + if (exp < 0) return 0; + + if (!exp) return 1; + + int ret = base; + for (int i = 1; i < exp; i++) ret *= base; + return ret; +} \ No newline at end of file diff --git a/src/kernel/lib/stdio.h b/src/kernel/lib/stdio.h new file mode 100644 index 0000000..d102dd6 --- /dev/null +++ b/src/kernel/lib/stdio.h @@ -0,0 +1,16 @@ +#ifndef MELVIX_STDIO_H +#define MELVIX_STDIO_H + +#include + +char getch(); + +char *readline(); + +void writec(char c); + +void vprintf(const char *format, va_list args); + +void printf(const char *format, ...); + +#endif diff --git a/src/kernel/lib/stdio/getch.c b/src/kernel/lib/stdio/getch.c new file mode 100644 index 0000000..5361c97 --- /dev/null +++ b/src/kernel/lib/stdio/getch.c @@ -0,0 +1,9 @@ +#include +#include + +char getch() +{ + keyboard_clear_buffer(); + while (strlen(keyboard_buffer) == 0) {} + return keyboard_buffer[0]; +} \ No newline at end of file diff --git a/src/kernel/lib/stdio/printf.c b/src/kernel/lib/stdio/printf.c new file mode 100644 index 0000000..accb97d --- /dev/null +++ b/src/kernel/lib/stdio/printf.c @@ -0,0 +1,10 @@ +#include +#include + +void printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); +} \ No newline at end of file diff --git a/src/kernel/lib/stdio/readline.c b/src/kernel/lib/stdio/readline.c new file mode 100644 index 0000000..c65882d --- /dev/null +++ b/src/kernel/lib/stdio/readline.c @@ -0,0 +1,9 @@ +#include +#include + +char *readline() +{ + keyboard_clear_buffer(); + while (keyboard_buffer[strlen(keyboard_buffer) - 1] != '\n') {} + return keyboard_buffer; +} \ No newline at end of file diff --git a/src/kernel/lib/stdio/vprintf.c b/src/kernel/lib/stdio/vprintf.c new file mode 100644 index 0000000..885f584 --- /dev/null +++ b/src/kernel/lib/stdio/vprintf.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include + +void __writes(const char *data) +{ + for (size_t i = 0; i < strlen(data); i++) writec(data[i]); +} + +void vprintf(const char *fmt, va_list args) +{ + uint8_t readyToFormat = 0; + + char buff = 0; + + for (; *fmt; fmt++) { + if (readyToFormat) { + if (*fmt == '%') { + writec('%'); + readyToFormat = 0; + continue; + } + + buff = *fmt; + if (buff == 's') { + const char *str = va_arg(args, const char*); + __writes(str); + readyToFormat = 0; + } else if (buff == 'x') { + char *p = htoa((uint32_t) va_arg(args, int)); + __writes(p); + kfree(p); + readyToFormat = 0; + } else if (buff == 'd') { + char *p = itoa(va_arg(args, int)); + __writes(p); + kfree(p); + readyToFormat = 0; + } else if (buff == 'c') { + writec((char) va_arg(args, int)); + readyToFormat = 0; + } + } else { + if (*fmt == '%') + readyToFormat = 1; + else + writec(*fmt); + } + } +} \ No newline at end of file diff --git a/src/kernel/lib/stdio/writec.c b/src/kernel/lib/stdio/writec.c new file mode 100644 index 0000000..94d4fed --- /dev/null +++ b/src/kernel/lib/stdio/writec.c @@ -0,0 +1,6 @@ +#include + +void writec(char c) +{ + vesa_draw_char(c); +} \ No newline at end of file diff --git a/src/kernel/lib/stdlib.h b/src/kernel/lib/stdlib.h new file mode 100644 index 0000000..fb79f42 --- /dev/null +++ b/src/kernel/lib/stdlib.h @@ -0,0 +1,26 @@ +#ifndef MELVIX_STDLIB_H +#define MELVIX_STDLIB_H + +#include + +#ifndef MELVIX_ALLOC_H + +#include + +#endif + +#ifndef MELVIX_STRING_H + +#include + +#endif + +char *itoa(int n); + +int atoi(char *str); + +char *htoa(uint32_t n); + +int htoi(char *str); + +#endif diff --git a/src/kernel/lib/stdlib/atoi.c b/src/kernel/lib/stdlib/atoi.c new file mode 100644 index 0000000..4044972 --- /dev/null +++ b/src/kernel/lib/stdlib/atoi.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +int atoi(char *str) +{ + size_t s_str = strlen(str); + if (!s_str) return 0; + + uint8_t negative = 0; + if (str[0] == '-') negative = 1; + + size_t i = 0; + if (negative) i++; + + int ret = 0; + for (; i < s_str; i++) { + ret += (str[i] - '0') * pow(10, (s_str - i) - 1); + } + + if (negative) ret *= -1; + return ret; +} \ No newline at end of file diff --git a/src/kernel/lib/stdlib/htoa.c b/src/kernel/lib/stdlib/htoa.c new file mode 100644 index 0000000..85bd750 --- /dev/null +++ b/src/kernel/lib/stdlib/htoa.c @@ -0,0 +1,30 @@ +#include +#include +#include + +static const char __HTOA_TABLE[] = "0123456789ABCDEF"; + +char *htoa(uint32_t n) +{ + char *ret = kmalloc(10); + + int i = 0; + while (n) { + ret[i++] = __HTOA_TABLE[n & 0xF]; + n >>= 4; + } + + if (!i) { + ret[0] = '0'; + i++; + } + + for (; i <= 9; i++) ret[i] = 0; + + char *aux = strdup(ret); + kfree(ret); + ret = aux; + + strinv(ret); + return ret; +} \ No newline at end of file diff --git a/src/kernel/lib/stdlib/htoi.c b/src/kernel/lib/stdlib/htoi.c new file mode 100644 index 0000000..f2d4702 --- /dev/null +++ b/src/kernel/lib/stdlib/htoi.c @@ -0,0 +1,23 @@ +#include +#include +#include + +int htoi(char *str) +{ + size_t s_str = strlen(str); + + size_t i = 0; + int ret = 0; + for (; i < s_str; i++) { + char c = str[i]; + int aux = 0; + if (c >= '0' && c <= '9') + aux = c - '0'; + else if (c >= 'A' && c <= 'F') + aux = (c - 'A') + 10; + + ret += aux * pow(16, (s_str - i) - 1); + } + + return ret; +} \ No newline at end of file diff --git a/src/kernel/lib/stdlib/itoa.c b/src/kernel/lib/stdlib/itoa.c new file mode 100644 index 0000000..897fd55 --- /dev/null +++ b/src/kernel/lib/stdlib/itoa.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +static const char __ITOA_TABLE[] = "0123456789"; + +char *itoa(int n) +{ + if (paging_enabled == 0) + return "0"; // kmalloc isn't available + + if (!n) { + char *ret = kmalloc(2); + ret[0] = '0'; + ret[1] = 0; + return ret; + } + uint8_t negative = (uint8_t) (n < 0); + if (negative) n *= -1; + + int sz; + for (sz = 0; n % pow(10, sz) != n; sz++) {} + + char *ret = kmalloc(sz + 1); + + for (int i = 0; i < sz; i++) { + int digit = (n % pow(10, i + 1)) / pow(10, i); + ret[i] = __ITOA_TABLE[digit]; + } + ret[sz] = 0; + + if (negative) { + char *aux = kmalloc(sz + 2); + strcpy(aux, ret); + aux[sz] = '-'; + aux[sz + 1] = 0; + kfree(ret); + ret = aux; + } + + strinv(ret); + return ret; +} \ No newline at end of file diff --git a/src/kernel/lib/stdlib/liballoc.c b/src/kernel/lib/stdlib/liballoc.c new file mode 100644 index 0000000..41c55e1 --- /dev/null +++ b/src/kernel/lib/stdlib/liballoc.c @@ -0,0 +1,457 @@ +#include +#include +#include +#include + +int liballoc_lock() +{ + // asm ("cli"); + return 0; +} + +int liballoc_unlock() +{ + // asm ("sti"); + return 0; +} + +void *liballoc_alloc(size_t p) +{ + uint32_t ptr = paging_alloc_pages((uint32_t) p); + return (void *) ptr; +} + +int liballoc_free(void *ptr, size_t p) +{ + paging_set_free((uint32_t) ptr, (uint32_t) p); + return 0; +} + +#define ALIGNMENT 16ul +#define ALIGN_TYPE char +#define ALIGN_INFO sizeof(ALIGN_TYPE) * 16 +#define USE_CASE1 +#define USE_CASE2 +#define USE_CASE3 +#define USE_CASE4 +#define USE_CASE5 + +#define ALIGN(ptr) \ + if ( ALIGNMENT > 1 ) { \ + uintptr_t diff; \ + ptr = (void*) ((uintptr_t) ptr + ALIGN_INFO); \ + diff = (uintptr_t) ptr & (ALIGNMENT - 1); \ + if (diff != 0) { \ + diff = ALIGNMENT - diff; \ + ptr = (void*) ((uintptr_t) ptr + diff); \ + } \ + *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)) = diff + ALIGN_INFO; \ + } + +#define UNALIGN(ptr) \ + if (ALIGNMENT > 1) { \ + uintptr_t diff = *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)); \ + if (diff < (ALIGNMENT + ALIGN_INFO)) { \ + ptr = (void*) ((uintptr_t) ptr - diff); \ + } \ + } + +#define LIBALLOC_MAGIC 0x900df00d +#define LIBALLOC_DEAD 0xbaadf00d + +struct liballoc_major { + struct liballoc_major *prev; + struct liballoc_major *next; + unsigned int pages; + unsigned int size; + unsigned int usage; + struct liballoc_minor *first; +}; + +struct liballoc_minor { + struct liballoc_minor *prev; + struct liballoc_minor *next; + struct liballoc_major *block; + unsigned int magic; + unsigned int size; + unsigned int req_size; +}; + +static struct liballoc_major *l_memRoot = NULL; +static struct liballoc_major *l_bestBet = NULL; + +static unsigned int l_pageSize = 4096; +static unsigned int l_pageCount = 16; +static unsigned long long l_allocated = 0; +static unsigned long long l_inuse = 0; + +static long long l_warningCount = 0; +static long long l_errorCount = 0; +static long long l_possibleOverruns = 0; + +static void *liballoc_memset(void *s, int c, size_t n) +{ + unsigned int i; + for (i = 0; i < n; i++) + ((char *) s)[i] = c; + + return s; +} + +static void *liballoc_memcpy(void *s1, const void *s2, size_t n) +{ + char *cdest; + char *csrc; + unsigned int *ldest = (unsigned int *) s1; + unsigned int *lsrc = (unsigned int *) s2; + + while (n >= sizeof(unsigned int)) { + *ldest++ = *lsrc++; + n -= sizeof(unsigned int); + } + + cdest = (char *) ldest; + csrc = (char *) lsrc; + + while (n > 0) { + *cdest++ = *csrc++; + n -= 1; + } + return s1; +} + +static struct liballoc_major *allocate_new_page(unsigned int size) +{ + unsigned int st; + struct liballoc_major *maj; + + st = size + sizeof(struct liballoc_major); + st += sizeof(struct liballoc_minor); + + if ((st % l_pageSize) == 0) + st = st / (l_pageSize); + else + st = st / (l_pageSize) + 1; + + if (st < l_pageCount) st = l_pageCount; + + maj = (struct liballoc_major *) liballoc_alloc(st); + + if (maj == NULL) { + l_warningCount += 1; + return NULL; + } + + maj->prev = NULL; + maj->next = NULL; + maj->pages = st; + maj->size = st * l_pageSize; + maj->usage = sizeof(struct liballoc_major); + maj->first = NULL; + + l_allocated += maj->size; + + return maj; +} + +void *PREFIX(malloc)(size_t req_size) +{ + int startedBet = 0; + unsigned long long bestSize = 0; + void *p = NULL; + uintptr_t diff; + struct liballoc_major *maj; + struct liballoc_minor *min; + struct liballoc_minor *new_min; + unsigned long size = req_size; + + if (ALIGNMENT > 1) { + size += ALIGNMENT + ALIGN_INFO; + } + + liballoc_lock(); + + if (size == 0) { + l_warningCount += 1; + liballoc_unlock(); + return PREFIX(malloc)(1); + } + + if (l_memRoot == NULL) { + l_memRoot = allocate_new_page(size); + if (l_memRoot == NULL) { + liballoc_unlock(); + return NULL; + } + } + + maj = l_memRoot; + startedBet = 0; + + if (l_bestBet != NULL) { + bestSize = l_bestBet->size - l_bestBet->usage; + + if (bestSize > (size + sizeof(struct liballoc_minor))) { + maj = l_bestBet; + startedBet = 1; + } + } + + while (maj != NULL) { + diff = maj->size - maj->usage; + if (bestSize < diff) { + l_bestBet = maj; + bestSize = diff; + } + +#ifdef USE_CASE1 + if (diff < (size + sizeof(struct liballoc_minor))) { + if (maj->next != NULL) { + maj = maj->next; + continue; + } + + if (startedBet == 1) { + maj = l_memRoot; + startedBet = 0; + continue; + } + + maj->next = allocate_new_page(size); + if (maj->next == NULL) break; + maj->next->prev = maj; + maj = maj->next; + } +#endif + +#ifdef USE_CASE2 + if (maj->first == NULL) { + maj->first = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); + + maj->first->magic = LIBALLOC_MAGIC; + maj->first->prev = NULL; + maj->first->next = NULL; + maj->first->block = maj; + maj->first->size = size; + maj->first->req_size = req_size; + maj->usage += size + sizeof(struct liballoc_minor); + l_inuse += size; + p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); + ALIGN(p); + liballoc_unlock(); + return p; + } +#endif + +#ifdef USE_CASE3 + diff = (uintptr_t) (maj->first); + diff -= (uintptr_t) maj; + diff -= sizeof(struct liballoc_major); + + if (diff >= (size + sizeof(struct liballoc_minor))) { + maj->first->prev = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); + maj->first->prev->next = maj->first; + maj->first = maj->first->prev; + maj->first->magic = LIBALLOC_MAGIC; + maj->first->prev = NULL; + maj->first->block = maj; + maj->first->size = size; + maj->first->req_size = req_size; + maj->usage += size + sizeof(struct liballoc_minor); + l_inuse += size; + p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); + ALIGN(p); + liballoc_unlock(); + return p; + } +#endif + +#ifdef USE_CASE4 + min = maj->first; + + while (min != NULL) { + if (min->next == NULL) { + diff = (uintptr_t) (maj) + maj->size; + diff -= (uintptr_t) min; + diff -= sizeof(struct liballoc_minor); + diff -= min->size; + if (diff >= (size + sizeof(struct liballoc_minor))) { + min->next = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); + min->next->prev = min; + min = min->next; + min->next = NULL; + min->magic = LIBALLOC_MAGIC; + min->block = maj; + min->size = size; + min->req_size = req_size; + maj->usage += size + sizeof(struct liballoc_minor); + l_inuse += size; + p = (void *) ((uintptr_t) min + sizeof(struct liballoc_minor)); + ALIGN(p); + liballoc_unlock(); + return p; + } + } + + if (min->next != NULL) { + diff = (uintptr_t) (min->next); + diff -= (uintptr_t) min; + diff -= sizeof(struct liballoc_minor); + diff -= min->size; + + if (diff >= (size + sizeof(struct liballoc_minor))) { + new_min = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); + new_min->magic = LIBALLOC_MAGIC; + new_min->next = min->next; + new_min->prev = min; + new_min->size = size; + new_min->req_size = req_size; + new_min->block = maj; + min->next->prev = new_min; + min->next = new_min; + maj->usage += size + sizeof(struct liballoc_minor); + l_inuse += size; + p = (void *) ((uintptr_t) new_min + sizeof(struct liballoc_minor)); + ALIGN(p); + liballoc_unlock(); + return p; + } + } + + min = min->next; + } +#endif + +#ifdef USE_CASE5 + if (maj->next == NULL) { + if (startedBet == 1) { + maj = l_memRoot; + startedBet = 0; + continue; + } + maj->next = allocate_new_page(size); + if (maj->next == NULL) break; + maj->next->prev = maj; + } +#endif + maj = maj->next; + } + + liballoc_unlock(); + + return NULL; +} + +void PREFIX(free)(void *ptr) +{ + struct liballoc_minor *min; + struct liballoc_major *maj; + + if (ptr == NULL) { + l_warningCount += 1; + return; + } + + UNALIGN(ptr); + liballoc_lock(); + + min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); + + if (min->magic != LIBALLOC_MAGIC) { + l_errorCount += 1; + + if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || + ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || + ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { + l_possibleOverruns += 1; + } + + liballoc_unlock(); + return; + } + + maj = min->block; + l_inuse -= min->size; + maj->usage -= (min->size + sizeof(struct liballoc_minor)); + min->magic = LIBALLOC_DEAD; + + if (min->next != NULL) min->next->prev = min->prev; + if (min->prev != NULL) min->prev->next = min->next; + if (min->prev == NULL) maj->first = min->next; + if (maj->first == NULL) { + if (l_memRoot == maj) l_memRoot = maj->next; + if (l_bestBet == maj) l_bestBet = NULL; + if (maj->prev != NULL) maj->prev->next = maj->next; + if (maj->next != NULL) maj->next->prev = maj->prev; + l_allocated -= maj->size; + liballoc_free(maj, maj->pages); + } else { + if (l_bestBet != NULL) { + int bestSize = l_bestBet->size - l_bestBet->usage; + int majSize = maj->size - maj->usage; + if (majSize > bestSize) l_bestBet = maj; + } + } + liballoc_unlock(); +} + +void *PREFIX(calloc)(size_t nobj, size_t size) +{ + int real_size; + void *p; + + real_size = nobj * size; + + p = PREFIX(malloc)(real_size); + + liballoc_memset(p, 0, real_size); + + return p; +} + +void *PREFIX(realloc)(void *p, size_t size) +{ + void *ptr; + struct liballoc_minor *min; + unsigned int real_size; + + if (size == 0) { + PREFIX(free)(p); + return NULL; + } + + if (p == NULL) return PREFIX(malloc)(size); + + ptr = p; + UNALIGN(ptr); + liballoc_lock(); + min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); + + if (min->magic != LIBALLOC_MAGIC) { + l_errorCount += 1; + if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || + ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || + ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { + l_possibleOverruns += 1; + } + + liballoc_unlock(); + return NULL; + } + + real_size = min->req_size; + + if (real_size >= size) { + min->req_size = size; + liballoc_unlock(); + return p; + } + + liballoc_unlock(); + + ptr = PREFIX(malloc)(size); + liballoc_memcpy(ptr, p, real_size); + PREFIX(free)(p); + + return ptr; +} diff --git a/src/kernel/lib/stdlib/liballoc.h b/src/kernel/lib/stdlib/liballoc.h new file mode 100644 index 0000000..6ed9efb --- /dev/null +++ b/src/kernel/lib/stdlib/liballoc.h @@ -0,0 +1,24 @@ +#ifndef MELVIX_ALLOC_H +#define MELVIX_ALLOC_H + +#include + +#define PREFIX(func) k ## func + +int liballoc_lock(); + +int liballoc_unlock(); + +void *liballoc_alloc(size_t); + +int liballoc_free(void *, size_t); + +void *PREFIX(malloc)(size_t); + +void *PREFIX(realloc)(void *, size_t); + +void *PREFIX(calloc)(size_t, size_t); + +void PREFIX(free)(void *); + +#endif diff --git a/src/kernel/lib/string.h b/src/kernel/lib/string.h new file mode 100644 index 0000000..fe925cb --- /dev/null +++ b/src/kernel/lib/string.h @@ -0,0 +1,22 @@ +#ifndef MELVIX_STRING_H +#define MELVIX_STRING_H + +#include + +size_t strlen(const char *str); + +void strcpy(char *dest, const char *orig); + +void strdisp(char *str, int n); + +void strcat(char *dest, const char *orig); + +void strcati(char *dest, const char *orig); + +char strcmp(const char *a, const char *b); + +char *strdup(const char *orig); + +void strinv(char *str); + +#endif diff --git a/src/kernel/lib/string/strcat.c b/src/kernel/lib/string/strcat.c new file mode 100644 index 0000000..e0d6885 --- /dev/null +++ b/src/kernel/lib/string/strcat.c @@ -0,0 +1,10 @@ +#include + +void strcat(char *dest, const char *orig) +{ + size_t s_dest = strlen(dest); + size_t s_orig = strlen(orig); + + for (size_t i = 0; i < s_orig; i++) dest[s_dest + i] = orig[i]; + dest[s_dest + s_orig] = 0; +} \ No newline at end of file diff --git a/src/kernel/lib/string/strcati.c b/src/kernel/lib/string/strcati.c new file mode 100644 index 0000000..9ee3a43 --- /dev/null +++ b/src/kernel/lib/string/strcati.c @@ -0,0 +1,8 @@ +#include + +void strcati(char *dest, const char *orig) +{ + size_t s_orig = strlen(orig); + strdisp(dest, (int) s_orig); + for (size_t i = 0; i < s_orig; i++) dest[i] = orig[i]; +} \ No newline at end of file diff --git a/src/kernel/lib/string/strcmp.c b/src/kernel/lib/string/strcmp.c new file mode 100644 index 0000000..b8ac2a7 --- /dev/null +++ b/src/kernel/lib/string/strcmp.c @@ -0,0 +1,10 @@ +#include + +char strcmp(const char *a, const char *b) +{ + if (strlen(a) != strlen(b)) return 1; + + for (size_t i = 0; i < strlen(a); i++) if (a[i] != b[i]) return 1; + + return 0; +} \ No newline at end of file diff --git a/src/kernel/lib/string/strcpy.c b/src/kernel/lib/string/strcpy.c new file mode 100644 index 0000000..bab8535 --- /dev/null +++ b/src/kernel/lib/string/strcpy.c @@ -0,0 +1,9 @@ +#include + +void strcpy(char *dest, const char *orig) +{ + size_t s_orig = strlen(orig); + + for (size_t i = 0; i < s_orig; i++) dest[i] = orig[i]; + dest[s_orig] = 0; +} \ No newline at end of file diff --git a/src/kernel/lib/string/strdisp.c b/src/kernel/lib/string/strdisp.c new file mode 100644 index 0000000..36c03c3 --- /dev/null +++ b/src/kernel/lib/string/strdisp.c @@ -0,0 +1,12 @@ +#include + +void strdisponce(char *str) +{ + for (size_t i = sizeof(str) + 2; i > 0; i--) str[i] = str[i - 1]; + str[0] = 0; +} + +void strdisp(char *str, int n) +{ + for (int i = 0; i < n; i++) strdisponce(str); +} \ No newline at end of file diff --git a/src/kernel/lib/string/strdup.c b/src/kernel/lib/string/strdup.c new file mode 100644 index 0000000..9330144 --- /dev/null +++ b/src/kernel/lib/string/strdup.c @@ -0,0 +1,10 @@ +#include +#include + +char *strdup(const char *orig) +{ + size_t s_orig = strlen(orig); + char *ret = kmalloc(s_orig + 1); + strcpy(ret, orig); + return ret; +} \ No newline at end of file diff --git a/src/kernel/lib/string/strinv.c b/src/kernel/lib/string/strinv.c new file mode 100644 index 0000000..b4b4212 --- /dev/null +++ b/src/kernel/lib/string/strinv.c @@ -0,0 +1,13 @@ +#include + +void strinv(char *str) +{ + size_t s_str = strlen(str); + + int iterations = (int) s_str / 2; + for (int i = 0; i < iterations; i++) { + char aux = str[i]; + str[i] = str[(s_str - i) - 1]; + str[(s_str - i) - 1] = aux; + } +} \ No newline at end of file diff --git a/src/kernel/lib/string/strlen.c b/src/kernel/lib/string/strlen.c new file mode 100644 index 0000000..77e3c00 --- /dev/null +++ b/src/kernel/lib/string/strlen.c @@ -0,0 +1,8 @@ +#include + +size_t strlen(const char *str) +{ + size_t len = 0; + while (str[len]) len++; + return len; +} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_read.c b/src/kernel/syscall/actions/sys_read.c new file mode 100644 index 0000000..761eec7 --- /dev/null +++ b/src/kernel/syscall/actions/sys_read.c @@ -0,0 +1,21 @@ +#include +#include +#include +#include +#include +#include + +uint32_t sys_read() +{ + serial_write("CALL\n"); + + keyboard_clear_buffer(); + while (keyboard_buffer[strlen(keyboard_buffer) - 1] != '\n') { + { + timer_wait(1); // IDK why? + } + } + serial_write(keyboard_buffer); + serial_write("\n"); + return (uint32_t) keyboard_buffer; +} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_write.c b/src/kernel/syscall/actions/sys_write.c index 882ff19..aef2b2b 100644 --- a/src/kernel/syscall/actions/sys_write.c +++ b/src/kernel/syscall/actions/sys_write.c @@ -1,9 +1,11 @@ #include -#include +#include +#include +#include -uint32_t sys_write(unsigned int fd, unsigned int buf, unsigned int count) +uint32_t sys_write(unsigned int buf) { - for (uint32_t i = 0; i < count; i++) - writec(*((char *) buf++)); - return count; + serial_put(((char *) buf)[0]); + printf((const char *) buf); + return strlen((const char *) buf); } \ No newline at end of file diff --git a/src/kernel/syscall/syscall.c b/src/kernel/syscall/syscall.c index 0eac619..eb44c87 100644 --- a/src/kernel/syscall/syscall.c +++ b/src/kernel/syscall/syscall.c @@ -6,11 +6,14 @@ typedef uint32_t (*syscall_func)(unsigned int, ...); uint32_t (*syscalls[])() = { - [1] = sys_write + [1] = sys_write, + [2] = sys_read }; void syscall_handler(struct regs *r) { + serial_write("Received syscall!\n"); + if (r->eax >= sizeof(syscalls) / sizeof(*syscalls)) return; @@ -18,7 +21,6 @@ void syscall_handler(struct regs *r) if (!location) return; - serial_write("Received syscall!\n"); location(r->ebx, r->ecx, r->edx, r->esi, r->edi); } diff --git a/src/kernel/syscall/syscall.h b/src/kernel/syscall/syscall.h index 8730dbf..8ed532d 100644 --- a/src/kernel/syscall/syscall.h +++ b/src/kernel/syscall/syscall.h @@ -5,6 +5,8 @@ extern void idt_syscall(); void syscalls_install(); -uint32_t sys_write(unsigned int buf, unsigned int count); +uint32_t sys_write(unsigned int buf); + +uint32_t sys_read(); #endif \ No newline at end of file diff --git a/src/kernel/system.c b/src/kernel/system.c index 7d57f66..179b2a2 100644 --- a/src/kernel/system.c +++ b/src/kernel/system.c @@ -1,11 +1,11 @@ #include #include #include -#include -#include +#include +#include #include #include -#include +#include #include char *vga_buffer = (char *) 0x500; diff --git a/src/mlibc/math.h b/src/mlibc/math.h deleted file mode 100644 index c9abf7d..0000000 --- a/src/mlibc/math.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MELVIX_MATH_H -#define MELVIX_MATH_H - -int pow(int base, int exp); - -#endif diff --git a/src/mlibc/math/pow.c b/src/mlibc/math/pow.c deleted file mode 100644 index 24670a0..0000000 --- a/src/mlibc/math/pow.c +++ /dev/null @@ -1,10 +0,0 @@ -int pow(int base, int exp) -{ - if (exp < 0) return 0; - - if (!exp) return 1; - - int ret = base; - for (int i = 1; i < exp; i++) ret *= base; - return ret; -} \ No newline at end of file diff --git a/src/mlibc/stdio.h b/src/mlibc/stdio.h deleted file mode 100644 index 82f1cfb..0000000 --- a/src/mlibc/stdio.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef MELVIX_STDIO_H -#define MELVIX_STDIO_H - -// TODO: Input methods - -#include - -void writec(char c); - -void vprintf(const char *format, va_list args); - -void printf(const char *format, ...); - -#endif diff --git a/src/mlibc/stdio/printf.c b/src/mlibc/stdio/printf.c deleted file mode 100644 index 5617d03..0000000 --- a/src/mlibc/stdio/printf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -void printf(const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - vprintf(fmt, args); - va_end(args); -} \ No newline at end of file diff --git a/src/mlibc/stdio/vprintf.c b/src/mlibc/stdio/vprintf.c deleted file mode 100644 index 81efce2..0000000 --- a/src/mlibc/stdio/vprintf.c +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include -#include - -void __writes(const char *data) -{ - for (size_t i = 0; i < strlen(data); i++) writec(data[i]); -} - -void vprintf(const char *fmt, va_list args) -{ - uint8_t readyToFormat = 0; - - char buff = 0; - - for (; *fmt; fmt++) { - if (readyToFormat) { - if (*fmt == '%') { - writec('%'); - readyToFormat = 0; - continue; - } - - buff = *fmt; - if (buff == 's') { - const char *str = va_arg(args, const char*); - __writes(str); - readyToFormat = 0; - } else if (buff == 'x') { - char *p = htoa((uint32_t) va_arg(args, int)); - __writes(p); - kfree(p); - readyToFormat = 0; - } else if (buff == 'd') { - char *p = itoa(va_arg(args, int)); - __writes(p); - kfree(p); - readyToFormat = 0; - } else if (buff == 'c') { - writec((char) va_arg(args, int)); - readyToFormat = 0; - } - } else { - if (*fmt == '%') - readyToFormat = 1; - else - writec(*fmt); - } - } -} \ No newline at end of file diff --git a/src/mlibc/stdio/writec.c b/src/mlibc/stdio/writec.c deleted file mode 100644 index 94d4fed..0000000 --- a/src/mlibc/stdio/writec.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -void writec(char c) -{ - vesa_draw_char(c); -} \ No newline at end of file diff --git a/src/mlibc/stdlib.h b/src/mlibc/stdlib.h deleted file mode 100644 index 36a3b5f..0000000 --- a/src/mlibc/stdlib.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MELVIX_STDLIB_H -#define MELVIX_STDLIB_H - -#include - -#ifndef MELVIX_ALLOC_H - -#include - -#endif - -#ifndef MELVIX_STRING_H - -#include - -#endif - -char *itoa(int n); - -int atoi(char *str); - -char *htoa(uint32_t n); - -int htoi(char *str); - -#endif diff --git a/src/mlibc/stdlib/atoi.c b/src/mlibc/stdlib/atoi.c deleted file mode 100644 index 0643372..0000000 --- a/src/mlibc/stdlib/atoi.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -int atoi(char *str) -{ - size_t s_str = strlen(str); - if (!s_str) return 0; - - uint8_t negative = 0; - if (str[0] == '-') negative = 1; - - size_t i = 0; - if (negative) i++; - - int ret = 0; - for (; i < s_str; i++) { - ret += (str[i] - '0') * pow(10, (s_str - i) - 1); - } - - if (negative) ret *= -1; - return ret; -} \ No newline at end of file diff --git a/src/mlibc/stdlib/htoa.c b/src/mlibc/stdlib/htoa.c deleted file mode 100644 index ab20260..0000000 --- a/src/mlibc/stdlib/htoa.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include - -static const char __HTOA_TABLE[] = "0123456789ABCDEF"; - -char *htoa(uint32_t n) -{ - char *ret = kmalloc(10); - - int i = 0; - while (n) { - ret[i++] = __HTOA_TABLE[n & 0xF]; - n >>= 4; - } - - if (!i) { - ret[0] = '0'; - i++; - } - - for (; i <= 9; i++) ret[i] = 0; - - char *aux = strdup(ret); - kfree(ret); - ret = aux; - - strinv(ret); - return ret; -} \ No newline at end of file diff --git a/src/mlibc/stdlib/htoi.c b/src/mlibc/stdlib/htoi.c deleted file mode 100644 index c78fe9d..0000000 --- a/src/mlibc/stdlib/htoi.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include - -int htoi(char *str) -{ - size_t s_str = strlen(str); - - size_t i = 0; - int ret = 0; - for (; i < s_str; i++) { - char c = str[i]; - int aux = 0; - if (c >= '0' && c <= '9') - aux = c - '0'; - else if (c >= 'A' && c <= 'F') - aux = (c - 'A') + 10; - - ret += aux * pow(16, (s_str - i) - 1); - } - - return ret; -} \ No newline at end of file diff --git a/src/mlibc/stdlib/itoa.c b/src/mlibc/stdlib/itoa.c deleted file mode 100644 index 3c8ee05..0000000 --- a/src/mlibc/stdlib/itoa.c +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include -#include -#include -#include - -static const char __ITOA_TABLE[] = "0123456789"; - -char *itoa(int n) -{ - if (paging_enabled == 0) - return "0"; // kmalloc isn't available - - if (!n) { - char *ret = kmalloc(2); - ret[0] = '0'; - ret[1] = 0; - return ret; - } - uint8_t negative = (uint8_t) (n < 0); - if (negative) n *= -1; - - int sz; - for (sz = 0; n % pow(10, sz) != n; sz++) {} - - char *ret = kmalloc(sz + 1); - - for (int i = 0; i < sz; i++) { - int digit = (n % pow(10, i + 1)) / pow(10, i); - ret[i] = __ITOA_TABLE[digit]; - } - ret[sz] = 0; - - if (negative) { - char *aux = kmalloc(sz + 2); - strcpy(aux, ret); - aux[sz] = '-'; - aux[sz + 1] = 0; - kfree(ret); - ret = aux; - } - - strinv(ret); - return ret; -} \ No newline at end of file diff --git a/src/mlibc/stdlib/liballoc.c b/src/mlibc/stdlib/liballoc.c deleted file mode 100644 index 3938215..0000000 --- a/src/mlibc/stdlib/liballoc.c +++ /dev/null @@ -1,457 +0,0 @@ -#include -#include -#include -#include - -int liballoc_lock() -{ - // asm ("cli"); - return 0; -} - -int liballoc_unlock() -{ - // asm ("sti"); - return 0; -} - -void *liballoc_alloc(size_t p) -{ - uint32_t ptr = paging_alloc_pages((uint32_t) p); - return (void *) ptr; -} - -int liballoc_free(void *ptr, size_t p) -{ - paging_set_free((uint32_t) ptr, (uint32_t) p); - return 0; -} - -#define ALIGNMENT 16ul -#define ALIGN_TYPE char -#define ALIGN_INFO sizeof(ALIGN_TYPE) * 16 -#define USE_CASE1 -#define USE_CASE2 -#define USE_CASE3 -#define USE_CASE4 -#define USE_CASE5 - -#define ALIGN(ptr) \ - if ( ALIGNMENT > 1 ) { \ - uintptr_t diff; \ - ptr = (void*) ((uintptr_t) ptr + ALIGN_INFO); \ - diff = (uintptr_t) ptr & (ALIGNMENT - 1); \ - if (diff != 0) { \ - diff = ALIGNMENT - diff; \ - ptr = (void*) ((uintptr_t) ptr + diff); \ - } \ - *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)) = diff + ALIGN_INFO; \ - } - -#define UNALIGN(ptr) \ - if (ALIGNMENT > 1) { \ - uintptr_t diff = *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)); \ - if (diff < (ALIGNMENT + ALIGN_INFO)) { \ - ptr = (void*) ((uintptr_t) ptr - diff); \ - } \ - } - -#define LIBALLOC_MAGIC 0x900df00d -#define LIBALLOC_DEAD 0xbaadf00d - -struct liballoc_major { - struct liballoc_major *prev; - struct liballoc_major *next; - unsigned int pages; - unsigned int size; - unsigned int usage; - struct liballoc_minor *first; -}; - -struct liballoc_minor { - struct liballoc_minor *prev; - struct liballoc_minor *next; - struct liballoc_major *block; - unsigned int magic; - unsigned int size; - unsigned int req_size; -}; - -static struct liballoc_major *l_memRoot = NULL; -static struct liballoc_major *l_bestBet = NULL; - -static unsigned int l_pageSize = 4096; -static unsigned int l_pageCount = 16; -static unsigned long long l_allocated = 0; -static unsigned long long l_inuse = 0; - -static long long l_warningCount = 0; -static long long l_errorCount = 0; -static long long l_possibleOverruns = 0; - -static void *liballoc_memset(void *s, int c, size_t n) -{ - unsigned int i; - for (i = 0; i < n; i++) - ((char *) s)[i] = c; - - return s; -} - -static void *liballoc_memcpy(void *s1, const void *s2, size_t n) -{ - char *cdest; - char *csrc; - unsigned int *ldest = (unsigned int *) s1; - unsigned int *lsrc = (unsigned int *) s2; - - while (n >= sizeof(unsigned int)) { - *ldest++ = *lsrc++; - n -= sizeof(unsigned int); - } - - cdest = (char *) ldest; - csrc = (char *) lsrc; - - while (n > 0) { - *cdest++ = *csrc++; - n -= 1; - } - return s1; -} - -static struct liballoc_major *allocate_new_page(unsigned int size) -{ - unsigned int st; - struct liballoc_major *maj; - - st = size + sizeof(struct liballoc_major); - st += sizeof(struct liballoc_minor); - - if ((st % l_pageSize) == 0) - st = st / (l_pageSize); - else - st = st / (l_pageSize) + 1; - - if (st < l_pageCount) st = l_pageCount; - - maj = (struct liballoc_major *) liballoc_alloc(st); - - if (maj == NULL) { - l_warningCount += 1; - return NULL; - } - - maj->prev = NULL; - maj->next = NULL; - maj->pages = st; - maj->size = st * l_pageSize; - maj->usage = sizeof(struct liballoc_major); - maj->first = NULL; - - l_allocated += maj->size; - - return maj; -} - -void *PREFIX(malloc)(size_t req_size) -{ - int startedBet = 0; - unsigned long long bestSize = 0; - void *p = NULL; - uintptr_t diff; - struct liballoc_major *maj; - struct liballoc_minor *min; - struct liballoc_minor *new_min; - unsigned long size = req_size; - - if (ALIGNMENT > 1) { - size += ALIGNMENT + ALIGN_INFO; - } - - liballoc_lock(); - - if (size == 0) { - l_warningCount += 1; - liballoc_unlock(); - return PREFIX(malloc)(1); - } - - if (l_memRoot == NULL) { - l_memRoot = allocate_new_page(size); - if (l_memRoot == NULL) { - liballoc_unlock(); - return NULL; - } - } - - maj = l_memRoot; - startedBet = 0; - - if (l_bestBet != NULL) { - bestSize = l_bestBet->size - l_bestBet->usage; - - if (bestSize > (size + sizeof(struct liballoc_minor))) { - maj = l_bestBet; - startedBet = 1; - } - } - - while (maj != NULL) { - diff = maj->size - maj->usage; - if (bestSize < diff) { - l_bestBet = maj; - bestSize = diff; - } - -#ifdef USE_CASE1 - if (diff < (size + sizeof(struct liballoc_minor))) { - if (maj->next != NULL) { - maj = maj->next; - continue; - } - - if (startedBet == 1) { - maj = l_memRoot; - startedBet = 0; - continue; - } - - maj->next = allocate_new_page(size); - if (maj->next == NULL) break; - maj->next->prev = maj; - maj = maj->next; - } -#endif - -#ifdef USE_CASE2 - if (maj->first == NULL) { - maj->first = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->next = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } -#endif - -#ifdef USE_CASE3 - diff = (uintptr_t) (maj->first); - diff -= (uintptr_t) maj; - diff -= sizeof(struct liballoc_major); - - if (diff >= (size + sizeof(struct liballoc_minor))) { - maj->first->prev = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - maj->first->prev->next = maj->first; - maj->first = maj->first->prev; - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } -#endif - -#ifdef USE_CASE4 - min = maj->first; - - while (min != NULL) { - if (min->next == NULL) { - diff = (uintptr_t) (maj) + maj->size; - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - if (diff >= (size + sizeof(struct liballoc_minor))) { - min->next = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - min->next->prev = min; - min = min->next; - min->next = NULL; - min->magic = LIBALLOC_MAGIC; - min->block = maj; - min->size = size; - min->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - } - - if (min->next != NULL) { - diff = (uintptr_t) (min->next); - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - - if (diff >= (size + sizeof(struct liballoc_minor))) { - new_min = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - new_min->magic = LIBALLOC_MAGIC; - new_min->next = min->next; - new_min->prev = min; - new_min->size = size; - new_min->req_size = req_size; - new_min->block = maj; - min->next->prev = new_min; - min->next = new_min; - maj->usage += size + sizeof(struct liballoc_minor); - l_inuse += size; - p = (void *) ((uintptr_t) new_min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - } - - min = min->next; - } -#endif - -#ifdef USE_CASE5 - if (maj->next == NULL) { - if (startedBet == 1) { - maj = l_memRoot; - startedBet = 0; - continue; - } - maj->next = allocate_new_page(size); - if (maj->next == NULL) break; - maj->next->prev = maj; - } -#endif - maj = maj->next; - } - - liballoc_unlock(); - - return NULL; -} - -void PREFIX(free)(void *ptr) -{ - struct liballoc_minor *min; - struct liballoc_major *maj; - - if (ptr == NULL) { - l_warningCount += 1; - return; - } - - UNALIGN(ptr); - liballoc_lock(); - - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_errorCount += 1; - - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possibleOverruns += 1; - } - - liballoc_unlock(); - return; - } - - maj = min->block; - l_inuse -= min->size; - maj->usage -= (min->size + sizeof(struct liballoc_minor)); - min->magic = LIBALLOC_DEAD; - - if (min->next != NULL) min->next->prev = min->prev; - if (min->prev != NULL) min->prev->next = min->next; - if (min->prev == NULL) maj->first = min->next; - if (maj->first == NULL) { - if (l_memRoot == maj) l_memRoot = maj->next; - if (l_bestBet == maj) l_bestBet = NULL; - if (maj->prev != NULL) maj->prev->next = maj->next; - if (maj->next != NULL) maj->next->prev = maj->prev; - l_allocated -= maj->size; - liballoc_free(maj, maj->pages); - } else { - if (l_bestBet != NULL) { - int bestSize = l_bestBet->size - l_bestBet->usage; - int majSize = maj->size - maj->usage; - if (majSize > bestSize) l_bestBet = maj; - } - } - liballoc_unlock(); -} - -void *PREFIX(calloc)(size_t nobj, size_t size) -{ - int real_size; - void *p; - - real_size = nobj * size; - - p = PREFIX(malloc)(real_size); - - liballoc_memset(p, 0, real_size); - - return p; -} - -void *PREFIX(realloc)(void *p, size_t size) -{ - void *ptr; - struct liballoc_minor *min; - unsigned int real_size; - - if (size == 0) { - PREFIX(free)(p); - return NULL; - } - - if (p == NULL) return PREFIX(malloc)(size); - - ptr = p; - UNALIGN(ptr); - liballoc_lock(); - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_errorCount += 1; - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possibleOverruns += 1; - } - - liballoc_unlock(); - return NULL; - } - - real_size = min->req_size; - - if (real_size >= size) { - min->req_size = size; - liballoc_unlock(); - return p; - } - - liballoc_unlock(); - - ptr = PREFIX(malloc)(size); - liballoc_memcpy(ptr, p, real_size); - PREFIX(free)(p); - - return ptr; -} diff --git a/src/mlibc/stdlib/liballoc.h b/src/mlibc/stdlib/liballoc.h deleted file mode 100644 index 6ed9efb..0000000 --- a/src/mlibc/stdlib/liballoc.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MELVIX_ALLOC_H -#define MELVIX_ALLOC_H - -#include - -#define PREFIX(func) k ## func - -int liballoc_lock(); - -int liballoc_unlock(); - -void *liballoc_alloc(size_t); - -int liballoc_free(void *, size_t); - -void *PREFIX(malloc)(size_t); - -void *PREFIX(realloc)(void *, size_t); - -void *PREFIX(calloc)(size_t, size_t); - -void PREFIX(free)(void *); - -#endif diff --git a/src/mlibc/string.h b/src/mlibc/string.h deleted file mode 100644 index fe925cb..0000000 --- a/src/mlibc/string.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef MELVIX_STRING_H -#define MELVIX_STRING_H - -#include - -size_t strlen(const char *str); - -void strcpy(char *dest, const char *orig); - -void strdisp(char *str, int n); - -void strcat(char *dest, const char *orig); - -void strcati(char *dest, const char *orig); - -char strcmp(const char *a, const char *b); - -char *strdup(const char *orig); - -void strinv(char *str); - -#endif diff --git a/src/mlibc/string/strcat.c b/src/mlibc/string/strcat.c deleted file mode 100644 index 0448430..0000000 --- a/src/mlibc/string/strcat.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -void strcat(char *dest, const char *orig) -{ - size_t s_dest = strlen(dest); - size_t s_orig = strlen(orig); - - for (size_t i = 0; i < s_orig; i++) dest[s_dest + i] = orig[i]; - dest[s_dest + s_orig] = 0; -} \ No newline at end of file diff --git a/src/mlibc/string/strcati.c b/src/mlibc/string/strcati.c deleted file mode 100644 index 8fdcc1a..0000000 --- a/src/mlibc/string/strcati.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -void strcati(char *dest, const char *orig) -{ - size_t s_orig = strlen(orig); - strdisp(dest, (int) s_orig); - for (size_t i = 0; i < s_orig; i++) dest[i] = orig[i]; -} \ No newline at end of file diff --git a/src/mlibc/string/strcmp.c b/src/mlibc/string/strcmp.c deleted file mode 100644 index be6c17a..0000000 --- a/src/mlibc/string/strcmp.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -char strcmp(const char *a, const char *b) -{ - if (strlen(a) != strlen(b)) return 1; - - for (size_t i = 0; i < strlen(a); i++) if (a[i] != b[i]) return 1; - - return 0; -} \ No newline at end of file diff --git a/src/mlibc/string/strcpy.c b/src/mlibc/string/strcpy.c deleted file mode 100644 index 8dfa65f..0000000 --- a/src/mlibc/string/strcpy.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -void strcpy(char *dest, const char *orig) -{ - size_t s_orig = strlen(orig); - - for (size_t i = 0; i < s_orig; i++) dest[i] = orig[i]; - dest[s_orig] = 0; -} \ No newline at end of file diff --git a/src/mlibc/string/strdisp.c b/src/mlibc/string/strdisp.c deleted file mode 100644 index d793718..0000000 --- a/src/mlibc/string/strdisp.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -void strdisponce(char *str) -{ - for (size_t i = sizeof(str) + 2; i > 0; i--) str[i] = str[i - 1]; - str[0] = 0; -} - -void strdisp(char *str, int n) -{ - for (int i = 0; i < n; i++) strdisponce(str); -} \ No newline at end of file diff --git a/src/mlibc/string/strdup.c b/src/mlibc/string/strdup.c deleted file mode 100644 index 0aa36f7..0000000 --- a/src/mlibc/string/strdup.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -char *strdup(const char *orig) -{ - size_t s_orig = strlen(orig); - char *ret = kmalloc(s_orig + 1); - strcpy(ret, orig); - return ret; -} \ No newline at end of file diff --git a/src/mlibc/string/strinv.c b/src/mlibc/string/strinv.c deleted file mode 100644 index 71f3355..0000000 --- a/src/mlibc/string/strinv.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -void strinv(char *str) -{ - size_t s_str = strlen(str); - - int iterations = (int) s_str / 2; - for (int i = 0; i < iterations; i++) { - char aux = str[i]; - str[i] = str[(s_str - i) - 1]; - str[(s_str - i) - 1] = aux; - } -} \ No newline at end of file diff --git a/src/mlibc/string/strlen.c b/src/mlibc/string/strlen.c deleted file mode 100644 index 133ee3d..0000000 --- a/src/mlibc/string/strlen.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -size_t strlen(const char *str) -{ - size_t len = 0; - while (str[len]) len++; - return len; -} \ No newline at end of file diff --git a/src/userspace/main.c b/src/userspace/main.c index f7cd3ba..c85e64d 100644 --- a/src/userspace/main.c +++ b/src/userspace/main.c @@ -1,9 +1,15 @@ #include +#include void user_main() { - const char hello[] = "> Successfully to usermode!\n"; - syscall_write(0, hello, sizeof(hello)); + char hello[] = "> Successfully switched to usermode!\n"; + syscall_write(hello); - while (1) {}; + while (1) { + char *command = (char *) syscall_read(); + char test[1024]; + strcpy(test, command); + syscall_write(command); + }; } \ No newline at end of file diff --git a/src/userspace/mlibc/math.h b/src/userspace/mlibc/math.h new file mode 100644 index 0000000..c9abf7d --- /dev/null +++ b/src/userspace/mlibc/math.h @@ -0,0 +1,6 @@ +#ifndef MELVIX_MATH_H +#define MELVIX_MATH_H + +int pow(int base, int exp); + +#endif diff --git a/src/userspace/mlibc/math/pow.c b/src/userspace/mlibc/math/pow.c new file mode 100644 index 0000000..24670a0 --- /dev/null +++ b/src/userspace/mlibc/math/pow.c @@ -0,0 +1,10 @@ +int pow(int base, int exp) +{ + if (exp < 0) return 0; + + if (!exp) return 1; + + int ret = base; + for (int i = 1; i < exp; i++) ret *= base; + return ret; +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdio.h b/src/userspace/mlibc/stdio.h new file mode 100644 index 0000000..d102dd6 --- /dev/null +++ b/src/userspace/mlibc/stdio.h @@ -0,0 +1,16 @@ +#ifndef MELVIX_STDIO_H +#define MELVIX_STDIO_H + +#include + +char getch(); + +char *readline(); + +void writec(char c); + +void vprintf(const char *format, va_list args); + +void printf(const char *format, ...); + +#endif diff --git a/src/userspace/mlibc/stdio/getch.c b/src/userspace/mlibc/stdio/getch.c new file mode 100644 index 0000000..114b6e0 --- /dev/null +++ b/src/userspace/mlibc/stdio/getch.c @@ -0,0 +1,7 @@ +// #include + +char getch() +{ + // return ((char *) syscall_read())[0]; + return 0; +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdio/printf.c b/src/userspace/mlibc/stdio/printf.c new file mode 100644 index 0000000..5617d03 --- /dev/null +++ b/src/userspace/mlibc/stdio/printf.c @@ -0,0 +1,10 @@ +#include +#include + +void printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdio/readline.c b/src/userspace/mlibc/stdio/readline.c new file mode 100644 index 0000000..a7082e6 --- /dev/null +++ b/src/userspace/mlibc/stdio/readline.c @@ -0,0 +1,7 @@ +// #include + +char *readline() +{ + // return (char *) syscall_read(); + return "0"; +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdio/vprintf.c b/src/userspace/mlibc/stdio/vprintf.c new file mode 100644 index 0000000..92999b6 --- /dev/null +++ b/src/userspace/mlibc/stdio/vprintf.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include + +void __writes(const char *data) +{ + for (size_t i = 0; i < strlen(data); i++) writec(data[i]); +} + +void vprintf(const char *fmt, va_list args) +{ + uint8_t readyToFormat = 0; + + char buff = 0; + + for (; *fmt; fmt++) { + if (readyToFormat) { + if (*fmt == '%') { + writec('%'); + readyToFormat = 0; + continue; + } + + buff = *fmt; + if (buff == 's') { + const char *str = va_arg(args, const char*); + __writes(str); + readyToFormat = 0; + } else if (buff == 'x') { + char *p = htoa((uint32_t) va_arg(args, int)); + __writes(p); + // kfree(p); + readyToFormat = 0; + } else if (buff == 'd') { + char *p = itoa(va_arg(args, int)); + __writes(p); + // kfree(p); + readyToFormat = 0; + } else if (buff == 'c') { + writec((char) va_arg(args, int)); + readyToFormat = 0; + } + } else { + if (*fmt == '%') + readyToFormat = 1; + else + writec(*fmt); + } + } +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdio/writec.c b/src/userspace/mlibc/stdio/writec.c new file mode 100644 index 0000000..9ffb1a1 --- /dev/null +++ b/src/userspace/mlibc/stdio/writec.c @@ -0,0 +1,4 @@ +void writec(char c) +{ + // +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdlib.h b/src/userspace/mlibc/stdlib.h new file mode 100644 index 0000000..ff8603c --- /dev/null +++ b/src/userspace/mlibc/stdlib.h @@ -0,0 +1,20 @@ +#ifndef MELVIX_STDLIB_H +#define MELVIX_STDLIB_H + +#include + +#ifndef MELVIX_STRING_H + +#include + +#endif + +char *itoa(int n); + +int atoi(char *str); + +char *htoa(uint32_t n); + +int htoi(char *str); + +#endif diff --git a/src/userspace/mlibc/stdlib/atoi.c b/src/userspace/mlibc/stdlib/atoi.c new file mode 100644 index 0000000..0643372 --- /dev/null +++ b/src/userspace/mlibc/stdlib/atoi.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +int atoi(char *str) +{ + size_t s_str = strlen(str); + if (!s_str) return 0; + + uint8_t negative = 0; + if (str[0] == '-') negative = 1; + + size_t i = 0; + if (negative) i++; + + int ret = 0; + for (; i < s_str; i++) { + ret += (str[i] - '0') * pow(10, (s_str - i) - 1); + } + + if (negative) ret *= -1; + return ret; +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdlib/htoa.c b/src/userspace/mlibc/stdlib/htoa.c new file mode 100644 index 0000000..098e1c8 --- /dev/null +++ b/src/userspace/mlibc/stdlib/htoa.c @@ -0,0 +1,31 @@ +#include +#include +#include + +static const char __HTOA_TABLE[] = "0123456789ABCDEF"; + +char *htoa(uint32_t n) +{ + char *ret = 0; + //kmalloc(10); + + int i = 0; + while (n) { + ret[i++] = __HTOA_TABLE[n & 0xF]; + n >>= 4; + } + + if (!i) { + ret[0] = '0'; + i++; + } + + for (; i <= 9; i++) ret[i] = 0; + + char *aux = strdup(ret); + // kfree(ret); + ret = aux; + + strinv(ret); + return ret; +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdlib/htoi.c b/src/userspace/mlibc/stdlib/htoi.c new file mode 100644 index 0000000..489e5c0 --- /dev/null +++ b/src/userspace/mlibc/stdlib/htoi.c @@ -0,0 +1,23 @@ +#include +#include +#include + +int htoi(char *str) +{ + size_t s_str = strlen(str); + + size_t i = 0; + int ret = 0; + for (; i < s_str; i++) { + char c = str[i]; + int aux = 0; + if (c >= '0' && c <= '9') + aux = c - '0'; + else if (c >= 'A' && c <= 'F') + aux = (c - 'A') + 10; + + ret += aux * pow(16, (s_str - i) - 1); + } + + return ret; +} \ No newline at end of file diff --git a/src/userspace/mlibc/stdlib/itoa.c b/src/userspace/mlibc/stdlib/itoa.c new file mode 100644 index 0000000..55c1383 --- /dev/null +++ b/src/userspace/mlibc/stdlib/itoa.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +static const char __ITOA_TABLE[] = "0123456789"; + +char *itoa(int n) +{ + //if (paging_enabled == 0) + // return "0"; // kmalloc isn't available + + if (!n) { + char *ret = 0; + //kmalloc(2); + ret[0] = '0'; + ret[1] = 0; + return ret; + } + uint8_t negative = (uint8_t) (n < 0); + if (negative) n *= -1; + + int sz; + for (sz = 0; n % pow(10, sz) != n; sz++) {} + + char *ret = 0; + //kmalloc(sz + 1); + + for (int i = 0; i < sz; i++) { + int digit = (n % pow(10, i + 1)) / pow(10, i); + ret[i] = __ITOA_TABLE[digit]; + } + ret[sz] = 0; + + if (negative) { + char *aux = 0; + //kmalloc(sz + 2); + strcpy(aux, ret); + aux[sz] = '-'; + aux[sz + 1] = 0; + // kfree(ret); + ret = aux; + } + + strinv(ret); + return ret; +} \ No newline at end of file diff --git a/src/userspace/mlibc/string.h b/src/userspace/mlibc/string.h new file mode 100644 index 0000000..fe925cb --- /dev/null +++ b/src/userspace/mlibc/string.h @@ -0,0 +1,22 @@ +#ifndef MELVIX_STRING_H +#define MELVIX_STRING_H + +#include + +size_t strlen(const char *str); + +void strcpy(char *dest, const char *orig); + +void strdisp(char *str, int n); + +void strcat(char *dest, const char *orig); + +void strcati(char *dest, const char *orig); + +char strcmp(const char *a, const char *b); + +char *strdup(const char *orig); + +void strinv(char *str); + +#endif diff --git a/src/userspace/mlibc/string/strcat.c b/src/userspace/mlibc/string/strcat.c new file mode 100644 index 0000000..0448430 --- /dev/null +++ b/src/userspace/mlibc/string/strcat.c @@ -0,0 +1,10 @@ +#include + +void strcat(char *dest, const char *orig) +{ + size_t s_dest = strlen(dest); + size_t s_orig = strlen(orig); + + for (size_t i = 0; i < s_orig; i++) dest[s_dest + i] = orig[i]; + dest[s_dest + s_orig] = 0; +} \ No newline at end of file diff --git a/src/userspace/mlibc/string/strcati.c b/src/userspace/mlibc/string/strcati.c new file mode 100644 index 0000000..8fdcc1a --- /dev/null +++ b/src/userspace/mlibc/string/strcati.c @@ -0,0 +1,8 @@ +#include + +void strcati(char *dest, const char *orig) +{ + size_t s_orig = strlen(orig); + strdisp(dest, (int) s_orig); + for (size_t i = 0; i < s_orig; i++) dest[i] = orig[i]; +} \ No newline at end of file diff --git a/src/userspace/mlibc/string/strcmp.c b/src/userspace/mlibc/string/strcmp.c new file mode 100644 index 0000000..be6c17a --- /dev/null +++ b/src/userspace/mlibc/string/strcmp.c @@ -0,0 +1,10 @@ +#include + +char strcmp(const char *a, const char *b) +{ + if (strlen(a) != strlen(b)) return 1; + + for (size_t i = 0; i < strlen(a); i++) if (a[i] != b[i]) return 1; + + return 0; +} \ No newline at end of file diff --git a/src/userspace/mlibc/string/strcpy.c b/src/userspace/mlibc/string/strcpy.c new file mode 100644 index 0000000..8dfa65f --- /dev/null +++ b/src/userspace/mlibc/string/strcpy.c @@ -0,0 +1,9 @@ +#include + +void strcpy(char *dest, const char *orig) +{ + size_t s_orig = strlen(orig); + + for (size_t i = 0; i < s_orig; i++) dest[i] = orig[i]; + dest[s_orig] = 0; +} \ No newline at end of file diff --git a/src/userspace/mlibc/string/strdisp.c b/src/userspace/mlibc/string/strdisp.c new file mode 100644 index 0000000..d793718 --- /dev/null +++ b/src/userspace/mlibc/string/strdisp.c @@ -0,0 +1,12 @@ +#include + +void strdisponce(char *str) +{ + for (size_t i = sizeof(str) + 2; i > 0; i--) str[i] = str[i - 1]; + str[0] = 0; +} + +void strdisp(char *str, int n) +{ + for (int i = 0; i < n; i++) strdisponce(str); +} \ No newline at end of file diff --git a/src/userspace/mlibc/string/strdup.c b/src/userspace/mlibc/string/strdup.c new file mode 100644 index 0000000..bb3597d --- /dev/null +++ b/src/userspace/mlibc/string/strdup.c @@ -0,0 +1,11 @@ +#include +#include + +char *strdup(const char *orig) +{ + // size_t s_orig = strlen(orig); + char *ret = 0; + // kmalloc(s_orig + 1); + strcpy(ret, orig); + return ret; +} \ No newline at end of file diff --git a/src/userspace/mlibc/string/strinv.c b/src/userspace/mlibc/string/strinv.c new file mode 100644 index 0000000..71f3355 --- /dev/null +++ b/src/userspace/mlibc/string/strinv.c @@ -0,0 +1,13 @@ +#include + +void strinv(char *str) +{ + size_t s_str = strlen(str); + + int iterations = (int) s_str / 2; + for (int i = 0; i < iterations; i++) { + char aux = str[i]; + str[i] = str[(s_str - i) - 1]; + str[(s_str - i) - 1] = aux; + } +} \ No newline at end of file diff --git a/src/userspace/mlibc/string/strlen.c b/src/userspace/mlibc/string/strlen.c new file mode 100644 index 0000000..133ee3d --- /dev/null +++ b/src/userspace/mlibc/string/strlen.c @@ -0,0 +1,8 @@ +#include + +size_t strlen(const char *str) +{ + size_t len = 0; + while (str[len]) len++; + return len; +} \ No newline at end of file diff --git a/src/userspace/syscall.h b/src/userspace/syscall.h index 162b219..6750093 100644 --- a/src/userspace/syscall.h +++ b/src/userspace/syscall.h @@ -62,11 +62,15 @@ /** * DECLARATIONS */ -DECL_SYSCALL3(write, int, const char *, int); +DECL_SYSCALL1(write, char *); + +DECL_SYSCALL0(read); /** * DEFINITIONS */ -DEFN_SYSCALL3(write, 1, int, const char *, int); +DEFN_SYSCALL1(write, 1, char *); + +DEFN_SYSCALL0(read, 2); #endif -- cgit v1.2.3