From 8df29db4bf2e99588328c91c775111e78b9ba320 Mon Sep 17 00:00:00 2001 From: Curle Date: Sun, 21 Jul 2019 19:13:42 +0100 Subject: [PATCH] Shuffle files in preparation for the shift to UEFI --- arch/{i386 => uefi_x64}/boot.s | 188 ++++----- arch/{i386 => uefi_x64}/linker.ld | 50 +-- arch/{i386 => uefi_x64}/make.config | 18 +- arch/{i386 => uefi_x64}/sys_clock.c | 68 ++-- arch/{i386 => uefi_x64}/tty.c | 0 iso/boot/grub/grub.cfg | 7 - iso/boot/grub/menu.lst | 5 - iso/boot/grub/stage2_eltorito | Bin 105522 -> 0 bytes libc/.gitignore | 3 - libc/Makefile | 91 ----- libc/arch/i386/make.config | 8 - libc/include/errno.h | 0 libc/include/stdio.h | 19 - libc/include/stdlib.h | 594 ---------------------------- libc/include/string.h | 13 - libc/include/sys/cdefs.h | 5 - libc/include/sys/types.h | 0 libc/stdio/printf.c | 93 ----- libc/stdio/putchar.c | 15 - libc/stdio/puts.c | 5 - libc/stdlib/abort.c | 15 - libc/string/memcmp.c | 13 - libc/string/memmove.c | 14 - libc/string/memset.c | 8 - libc/string/strlen.c | 7 - red.kernel | Bin 61812 -> 0 bytes 26 files changed, 162 insertions(+), 1077 deletions(-) rename arch/{i386 => uefi_x64}/boot.s (96%) mode change 100755 => 100644 rename arch/{i386 => uefi_x64}/linker.ld (93%) mode change 100755 => 100644 rename arch/{i386 => uefi_x64}/make.config (95%) mode change 100755 => 100644 rename arch/{i386 => uefi_x64}/sys_clock.c (95%) mode change 100755 => 100644 rename arch/{i386 => uefi_x64}/tty.c (100%) delete mode 100644 iso/boot/grub/grub.cfg delete mode 100755 iso/boot/grub/menu.lst delete mode 100755 iso/boot/grub/stage2_eltorito delete mode 100755 libc/.gitignore delete mode 100755 libc/Makefile delete mode 100755 libc/arch/i386/make.config delete mode 100755 libc/include/errno.h delete mode 100755 libc/include/stdio.h delete mode 100644 libc/include/stdlib.h delete mode 100644 libc/include/string.h delete mode 100755 libc/include/sys/cdefs.h delete mode 100755 libc/include/sys/types.h delete mode 100644 libc/stdio/printf.c delete mode 100644 libc/stdio/putchar.c delete mode 100755 libc/stdio/puts.c delete mode 100644 libc/stdlib/abort.c delete mode 100644 libc/string/memcmp.c delete mode 100644 libc/string/memmove.c delete mode 100644 libc/string/memset.c delete mode 100644 libc/string/strlen.c delete mode 100755 red.kernel diff --git a/arch/i386/boot.s b/arch/uefi_x64/boot.s old mode 100755 new mode 100644 similarity index 96% rename from arch/i386/boot.s rename to arch/uefi_x64/boot.s index 93820cd..46d2840 --- a/arch/i386/boot.s +++ b/arch/uefi_x64/boot.s @@ -1,94 +1,94 @@ -[BITS 32] ;... somehow. - -[GLOBAL start] -start: - mov esp, _sys_stack ; Stack pointer! - jmp stublet ; This has a purpse. I don't know what it is, but there is one. - -ALIGN 4 ; 4KB alignment, required by GRUB. -mboot: ; This is all magic, and all of it required for GRUB to see our stuff. - MULTIBOOT_ALIGN equ 1<<0 - MULTIBOOT_MEM equ 1<<1 - MULTIBOOT_AOUT equ 1<<16 - MULTIBOOT_MAGIC equ 0x1BADB002 - MULTIBOOT_FLAGS equ MULTIBOOT_ALIGN | MULTIBOOT_MEM | MULTIBOOT_AOUT - MULTIBOOT_CHECKSUM equ -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS) - EXTERN code, bss, end - - dd MULTIBOOT_MAGIC - dd MULTIBOOT_FLAGS - dd MULTIBOOT_CHECKSUM - - dd mboot - dd code - dd bss - dd end - dd start - -stublet: ; Where the kernel stuff goes. - - ;===================================== - ;===Priority: 32 bit Protected Mode=== - ;===================================== - - cli ; Interrupts be gone! - - xor cx, cx ; CX - GP, useful here. -kbempty: - in al, 64h ; Read keyboard status - test al, 02h ; Check if the buffer is full - loopnz kbempty ; Wait until it is - mov al, 0d1h ; Prepare a message - out 64h, al ; And then send it to the keyboard (controller) -kbempty2: - in al, 64h ; Read the status again - test al, 02h ; Check if it's processed our message - loopnz kbempty2 ; And wait until it has - mov al, 0dfh ; Prepare a different message, telling it to enable A20 - out 60h, al ; Send the message - mov cx, 14h ; Restore the value of CX -wait_kb: ; Insinuate a 25uS delay to allow the processor to catch up - out 0edh, ax - loop wait_kb - - mov eax, cr0 ; Read the control register - or al, 1 ; Set bit 1: protected mode - mov cr0, eax ; Set the control register back - jmp $+2 ; Clear the queue - nop ; (jump straight to kernel) - nop - -;================================== -;===32-bit Protected Mode active=== -;================================== - ; Call the kernel - - EXTERN kernel_main - call kernel_main - jmp $ - -[GLOBAL load_gdt] -[EXTERN gp] -load_gdt: - lgdt [gp] ; Load the new GDT pointer - - mov ax, 0x10 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - jmp 0x08:flush -flush: - ret - -[GLOBAL idt_load] -[EXTERN idtp] -idt_load: - lidt [idtp] - ret - - -SECTION .bss - resb 8192 -_sys_stack: +[BITS 32] ;... somehow. + +[GLOBAL start] +start: + mov esp, _sys_stack ; Stack pointer! + jmp stublet ; This has a purpse. I don't know what it is, but there is one. + +ALIGN 4 ; 4KB alignment, required by GRUB. +mboot: ; This is all magic, and all of it required for GRUB to see our stuff. + MULTIBOOT_ALIGN equ 1<<0 + MULTIBOOT_MEM equ 1<<1 + MULTIBOOT_AOUT equ 1<<16 + MULTIBOOT_MAGIC equ 0x1BADB002 + MULTIBOOT_FLAGS equ MULTIBOOT_ALIGN | MULTIBOOT_MEM | MULTIBOOT_AOUT + MULTIBOOT_CHECKSUM equ -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS) + EXTERN code, bss, end + + dd MULTIBOOT_MAGIC + dd MULTIBOOT_FLAGS + dd MULTIBOOT_CHECKSUM + + dd mboot + dd code + dd bss + dd end + dd start + +stublet: ; Where the kernel stuff goes. + + ;===================================== + ;===Priority: 32 bit Protected Mode=== + ;===================================== + + cli ; Interrupts be gone! + + xor cx, cx ; CX - GP, useful here. +kbempty: + in al, 64h ; Read keyboard status + test al, 02h ; Check if the buffer is full + loopnz kbempty ; Wait until it is + mov al, 0d1h ; Prepare a message + out 64h, al ; And then send it to the keyboard (controller) +kbempty2: + in al, 64h ; Read the status again + test al, 02h ; Check if it's processed our message + loopnz kbempty2 ; And wait until it has + mov al, 0dfh ; Prepare a different message, telling it to enable A20 + out 60h, al ; Send the message + mov cx, 14h ; Restore the value of CX +wait_kb: ; Insinuate a 25uS delay to allow the processor to catch up + out 0edh, ax + loop wait_kb + + mov eax, cr0 ; Read the control register + or al, 1 ; Set bit 1: protected mode + mov cr0, eax ; Set the control register back + jmp $+2 ; Clear the queue + nop ; (jump straight to kernel) + nop + +;================================== +;===32-bit Protected Mode active=== +;================================== + ; Call the kernel + + EXTERN kernel_main + call kernel_main + jmp $ + +[GLOBAL load_gdt] +[EXTERN gp] +load_gdt: + lgdt [gp] ; Load the new GDT pointer + + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + jmp 0x08:flush +flush: + ret + +[GLOBAL idt_load] +[EXTERN idtp] +idt_load: + lidt [idtp] + ret + + +SECTION .bss + resb 8192 +_sys_stack: diff --git a/arch/i386/linker.ld b/arch/uefi_x64/linker.ld old mode 100755 new mode 100644 similarity index 93% rename from arch/i386/linker.ld rename to arch/uefi_x64/linker.ld index 2b7963a..c705f4a --- a/arch/i386/linker.ld +++ b/arch/uefi_x64/linker.ld @@ -1,25 +1,25 @@ -OUTPUT_FORMAT("elf32-i386") -ENTRY(start) -phys = 0x00100000; -SECTIONS -{ - .text phys : AT(phys) { - code = .; - *(.text) - *(.rodata) - . = ALIGN(4096); - } - .data : AT(phys + (data - code)) - { - data = .; - *(.data) - . = ALIGN(4096); - } - .bss : AT(phys + (bss - code)) - { - bss = .; - *(.bss) - . = ALIGN(4096); - } - end = .; -} +OUTPUT_FORMAT("elf32-i386") +ENTRY(start) +phys = 0x00100000; +SECTIONS +{ + .text phys : AT(phys) { + code = .; + *(.text) + *(.rodata) + . = ALIGN(4096); + } + .data : AT(phys + (data - code)) + { + data = .; + *(.data) + . = ALIGN(4096); + } + .bss : AT(phys + (bss - code)) + { + bss = .; + *(.bss) + . = ALIGN(4096); + } + end = .; +} diff --git a/arch/i386/make.config b/arch/uefi_x64/make.config old mode 100755 new mode 100644 similarity index 95% rename from arch/i386/make.config rename to arch/uefi_x64/make.config index 3a2220f..70359ae --- a/arch/i386/make.config +++ b/arch/uefi_x64/make.config @@ -1,9 +1,9 @@ -KERNEL_ARCH_CFLAGS= -KERNEL_ARCH_CPPFLAGS= -KERNEL_ARCH_LDFLAGS= -KERNEL_ARCH_LIBS= - -KERNEL_ARCH_OBJS= \ -$(ARCHDIR)/boot.o \ -$(ARCHDIR)/sys_clock.o \ -$(ARCHDIR)/tty.o +KERNEL_ARCH_CFLAGS= +KERNEL_ARCH_CPPFLAGS= +KERNEL_ARCH_LDFLAGS= +KERNEL_ARCH_LIBS= + +KERNEL_ARCH_OBJS= \ +$(ARCHDIR)/boot.o \ +$(ARCHDIR)/sys_clock.o \ +$(ARCHDIR)/tty.o diff --git a/arch/i386/sys_clock.c b/arch/uefi_x64/sys_clock.c old mode 100755 new mode 100644 similarity index 95% rename from arch/i386/sys_clock.c rename to arch/uefi_x64/sys_clock.c index df0cb8d..cb26901 --- a/arch/i386/sys_clock.c +++ b/arch/uefi_x64/sys_clock.c @@ -1,35 +1,35 @@ -/************************ - *** Team Kitty, 2019 *** - *** Sync *** - ***********************/ - -/* This file provides an interface to - * the hardware timer / RTC. Not much - * more to be said about it. */ - -#include -#include -#include -#include - -size_t timer_ticks = 0; -size_t flag = 0; -void timer_handler(struct int_frame* r) { - gdb_end(); - timer_ticks++; - - if(timer_ticks % 18 == 0) { - if(++flag % 2 == 0) { - serial_print(0x3F8, "Tick."); - } else { - serial_print(0x3F8, "Tock."); - } - } - - if(timer_ticks > 18) - timer_ticks = 0; -} - -void timer_install() { - irq_install_handler(0, &timer_handler); +/************************ + *** Team Kitty, 2019 *** + *** Sync *** + ***********************/ + +/* This file provides an interface to + * the hardware timer / RTC. Not much + * more to be said about it. */ + +#include +#include +#include +#include + +size_t timer_ticks = 0; +size_t flag = 0; +void timer_handler(struct int_frame* r) { + gdb_end(); + timer_ticks++; + + if(timer_ticks % 18 == 0) { + if(++flag % 2 == 0) { + serial_print(0x3F8, "Tick."); + } else { + serial_print(0x3F8, "Tock."); + } + } + + if(timer_ticks > 18) + timer_ticks = 0; +} + +void timer_install() { + irq_install_handler(0, &timer_handler); } \ No newline at end of file diff --git a/arch/i386/tty.c b/arch/uefi_x64/tty.c similarity index 100% rename from arch/i386/tty.c rename to arch/uefi_x64/tty.c diff --git a/iso/boot/grub/grub.cfg b/iso/boot/grub/grub.cfg deleted file mode 100644 index a661ef3..0000000 --- a/iso/boot/grub/grub.cfg +++ /dev/null @@ -1,7 +0,0 @@ -set timeout=10 -set default=0 - -menuentry "ProjectRED" { - multiboot /boot/red.kernel - boot -} diff --git a/iso/boot/grub/menu.lst b/iso/boot/grub/menu.lst deleted file mode 100755 index 387d721..0000000 --- a/iso/boot/grub/menu.lst +++ /dev/null @@ -1,5 +0,0 @@ -defualt=0 -timeout=0 - -title ProjectRED -kernel /boot/kernel.elf diff --git a/iso/boot/grub/stage2_eltorito b/iso/boot/grub/stage2_eltorito deleted file mode 100755 index 9e1617cee78bb8f1ab6838837c9a1f36d729c9fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105522 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 I8%}5UKb>zEqW}N^ diff --git a/libc/.gitignore b/libc/.gitignore deleted file mode 100755 index 5e3628b..0000000 --- a/libc/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.a -*.d -*.o \ No newline at end of file diff --git a/libc/Makefile b/libc/Makefile deleted file mode 100755 index bdabd0e..0000000 --- a/libc/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -DEFAULT_HOST!=../default-host.sh -HOST?=DEFAULT_HOST -HOSTARCH!==../target-to-arch.sh $(HOST) - -CFLAGS?=-O2 -g -CPPFLAGS?= -LDFLAGS?= -LIBS?= - -DESTDIR?= -PREFIX?=/usr/local -EXEC_PREFIX?=$(PREFIX) -INCLUDEDIR?=$(PREFIX)/include -LIBDIR?=$(EXEC_PREFIX)/lib - -CFLAGS:=$(CFLAGS) -ffreestanding -Wall -Wextra -CPPFLAGS:=$(CPPFLAGS) -D__is_libc -Iinclude -LIBK_CFLAGS:=$(CFLAGS) -LIBK_CPPFLAGS:=$(CPPFLAGS) -D__is_libk - -ARCHDIR=arch/$(HOSTARCH) - -include $(ARCHDIR)/make.config - -CFLAGS:=$(CFLAGS) $(ARCH_CFLAGS) -CPPFLAGS:=$(CPPFLAGS) $(ARCH_CPPFLAGS) -LIBK_CFLAGS:=$(LIBK_CFLAGS) $(KERNEL_ARCH_CFLAGS) -LIBK_CPPFLAGS:=$(LIBK_CPPFLAGS) $(KERNEL_ARCH_CPPFLAGS) - -FREEOBJS=\ -$(ARCH_FREEOBJS)\ -stdio/printf.o\ -stdio/putchar.o\ -stdio/puts.o\ -stdlib/abort.o\ -string/memcmp.o\ -string/memcpy.o\ -string/memmove.o\ -string/memset.o\ -string/strlen.o\ - -HOSTEDOBJS=\ -$(ARCH_HOSTEDOBJS)\ - -OBJS=\ -$(FREEOBJS)\ -$(HOSTEDOBJS)\ - -LIBK_OBJS=$(FREEOBJS:.o=.libk.o) - -BINARIES=libk.a - -.PHONY: all clean install install-headers install-libs -.SUFFIXES: .o .libk.o .c .s - -all: $(BINARIES) - -libc.a: $(OBJS) - $(AR) rcs $@ $(OBJS) -libk.a: $(LIBK_OBJS) - $(AR) rcs $@ $(LIBK_OBJS) - -.c.o: - $(CC) -MD -c $< -o $@ -std=gnull $(CFLAGS) $(CPPFLAGS) - -.c.s: - $(CC) -MD -c $< -o $@ $(CFLAGS) $(CPPFLAGS) -.c.libk.o: - $(CC) -MD -c $< -o $@ -std=gnull $(LIBK_CFLAGS) $(LIBK_CPPFLAGS) -.s.libk.o: - $(CC) -MD -c $< -o $@ $(LIBK_CFLAGS) $(LIBK_CPPFLAGS) - -clean: - rm -f $(BINARIES) *.a - rm -f $(OBJS) $(LIBK_OBJS) *.o */*.o */*/*.o - rm -f $(OBJS:.o=.d) $(LIBK_OBJS:.o=.d) *.d */*.d */*/*.d - -install: install-headers install-libs - -install-headers: - mkdir -p $(DESTDIR)$(INCLUDEDIR) - cp -R --preserve-timestamps include/. $(DESTDIR)$(INCLUDEDIR)/. -install-libs: $(BINARIES) - mkdir -p $(DESTDIR)$(LIBDIR) - cp $(BINARIES) $(DESTDIR) $(LIBDIR) - --include $(OBJS:.o=.d) --include $(LIBK_OBJS:.o=.d) - - - diff --git a/libc/arch/i386/make.config b/libc/arch/i386/make.config deleted file mode 100755 index acb23fa..0000000 --- a/libc/arch/i386/make.config +++ /dev/null @@ -1,8 +0,0 @@ -ARCH_CFLAGS= -ARCH_CPPFLAGS= -KERNEL_ARCH_CFLAGS= -KERNEL_ARCH_CPPFLAGS= - -ARCH_FREEOBJS=\ - -ARCH_HOSTEDOBJS=\ diff --git a/libc/include/errno.h b/libc/include/errno.h deleted file mode 100755 index e69de29..0000000 diff --git a/libc/include/stdio.h b/libc/include/stdio.h deleted file mode 100755 index 86d8480..0000000 --- a/libc/include/stdio.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _STDIO_H -#define _STDIO_H 1 - -#include - -#define EOF (-1) - -struct __sFile { - int unused; -}; - -typedef struct __sFile FILE; - -#define stderr (_impure_ptr->_stderr) - -int printf(const char* __restrict, ...); -int putchar(int); -int puts(const char*); -#endif \ No newline at end of file diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h deleted file mode 100644 index f343d50..0000000 --- a/libc/include/stdlib.h +++ /dev/null @@ -1,594 +0,0 @@ -#ifndef _STDLIB_H -#define _STDLIB_H 1 - -#include - -__attribute__((__noreturn__)) void abort(void); - -/* - Default header file for malloc-2.8.x, written by Doug Lea - and released to the public domain, as explained at - http://creativecommons.org/publicdomain/zero/1.0/ - - This header is for ANSI C/C++ only. You can set any of - the following #defines before including: - - * If USE_DL_PREFIX is defined, it is assumed that malloc.c - was also compiled with this option, so all routines - have names starting with "dl". - - * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this - file will be #included AFTER . This is needed only if - your system defines a struct mallinfo that is incompatible with the - standard one declared here. Otherwise, you can include this file - INSTEAD of your system system . At least on ANSI, all - declarations should be compatible with system versions - - * If MSPACES is defined, declarations for mspace versions are included. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#include /* for size_t */ - -#ifndef ONLY_MSPACES -#define ONLY_MSPACES 0 /* define to a value */ -#elif ONLY_MSPACES != 0 -#define ONLY_MSPACES 1 -#endif /* ONLY_MSPACES */ -#ifndef NO_MALLINFO -#define NO_MALLINFO 0 -#endif /* NO_MALLINFO */ - -#ifndef MSPACES -#if ONLY_MSPACES -#define MSPACES 1 -#else /* ONLY_MSPACES */ -#define MSPACES 0 -#endif /* ONLY_MSPACES */ -#endif /* MSPACES */ - -#if !ONLY_MSPACES - -#if !NO_MALLINFO -#ifndef HAVE_USR_INCLUDE_MALLOC_H -#ifndef _MALLOC_H -#ifndef MALLINFO_FIELD_TYPE -#define MALLINFO_FIELD_TYPE size_t -#endif /* MALLINFO_FIELD_TYPE */ -#ifndef STRUCT_MALLINFO_DECLARED -#define STRUCT_MALLINFO_DECLARED 1 -struct mallinfo { - MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ - MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ - MALLINFO_FIELD_TYPE smblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ - MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ - MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ - MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ - MALLINFO_FIELD_TYPE fordblks; /* total free space */ - MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ -}; -#endif /* STRUCT_MALLINFO_DECLARED */ -#endif /* _MALLOC_H */ -#endif /* HAVE_USR_INCLUDE_MALLOC_H */ -#endif /* !NO_MALLINFO */ - -/* - malloc(size_t n) - Returns a pointer to a newly allocated chunk of at least n bytes, or - null if no space is available, in which case errno is set to ENOMEM - on ANSI C systems. - - If n is zero, malloc returns a minimum-sized chunk. (The minimum - size is 16 bytes on most 32bit systems, and 32 bytes on 64bit - systems.) Note that size_t is an unsigned type, so calls with - arguments that would be negative if signed are interpreted as - requests for huge amounts of space, which will often fail. The - maximum supported value of n differs across systems, but is in all - cases less than the maximum representable value of a size_t. -*/ -void* malloc(size_t); - -/* - free(void* p) - Releases the chunk of memory pointed to by p, that had been previously - allocated using malloc or a related routine such as realloc. - It has no effect if p is null. If p was not malloced or already - freed, free(p) will by default cuase the current program to abort. -*/ -void free(void*); - -/* - calloc(size_t n_elements, size_t element_size); - Returns a pointer to n_elements * element_size bytes, with all locations - set to zero. -*/ -void* calloc(size_t, size_t); - -/* - realloc(void* p, size_t n) - Returns a pointer to a chunk of size n that contains the same data - as does chunk p up to the minimum of (n, p's size) bytes, or null - if no space is available. - - The returned pointer may or may not be the same as p. The algorithm - prefers extending p in most cases when possible, otherwise it - employs the equivalent of a malloc-copy-free sequence. - - If p is null, realloc is equivalent to malloc. - - If space is not available, realloc returns null, errno is set (if on - ANSI) and p is NOT freed. - - if n is for fewer bytes than already held by p, the newly unused - space is lopped off and freed if possible. realloc with a size - argument of zero (re)allocates a minimum-sized chunk. - - The old unix realloc convention of allowing the last-free'd chunk - to be used as an argument to realloc is not supported. -*/ -void* realloc(void*, size_t); - -/* - realloc_in_place(void* p, size_t n) - Resizes the space allocated for p to size n, only if this can be - done without moving p (i.e., only if there is adjacent space - available if n is greater than p's current allocated size, or n is - less than or equal to p's size). This may be used instead of plain - realloc if an alternative allocation strategy is needed upon failure - to expand space; for example, reallocation of a buffer that must be - memory-aligned or cleared. You can use realloc_in_place to trigger - these alternatives only when needed. - - Returns p if successful; otherwise null. -*/ -void* realloc_in_place(void*, size_t); - -/* - memalign(size_t alignment, size_t n); - Returns a pointer to a newly allocated chunk of n bytes, aligned - in accord with the alignment argument. - - The alignment argument should be a power of two. If the argument is - not a power of two, the nearest greater power is used. - 8-byte alignment is guaranteed by normal malloc calls, so don't - bother calling memalign with an argument of 8 or less. - - Overreliance on memalign is a sure way to fragment space. -*/ -void* memalign(size_t, size_t); - -/* - int posix_memalign(void** pp, size_t alignment, size_t n); - Allocates a chunk of n bytes, aligned in accord with the alignment - argument. Differs from memalign only in that it (1) assigns the - allocated memory to *pp rather than returning it, (2) fails and - returns EINVAL if the alignment is not a power of two (3) fails and - returns ENOMEM if memory cannot be allocated. -*/ -int posix_memalign(void**, size_t, size_t); - -/* - valloc(size_t n); - Equivalent to memalign(pagesize, n), where pagesize is the page - size of the system. If the pagesize is unknown, 4096 is used. -*/ -void* valloc(size_t); - -/* - mallopt(int parameter_number, int parameter_value) - Sets tunable parameters The format is to provide a - (parameter-number, parameter-value) pair. mallopt then sets the - corresponding parameter to the argument value if it can (i.e., so - long as the value is meaningful), and returns 1 if successful else - 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, - normally defined in malloc.h. None of these are use in this malloc, - so setting them has no effect. But this malloc also supports other - options in mallopt: - - Symbol param # default allowed param values - M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming) - M_GRANULARITY -2 page size any power of 2 >= page size - M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) -*/ -int mallopt(int, int); - -#define M_TRIM_THRESHOLD (-1) -#define M_GRANULARITY (-2) -#define M_MMAP_THRESHOLD (-3) - -/* - malloc_footprint(); - Returns the number of bytes obtained from the system. The total - number of bytes allocated by malloc, realloc etc., is less than this - value. Unlike mallinfo, this function returns only a precomputed - result, so can be called frequently to monitor memory consumption. - Even if locks are otherwise defined, this function does not use them, - so results might not be up to date. -*/ -size_t malloc_footprint(void); - -/* - malloc_max_footprint(); - Returns the maximum number of bytes obtained from the system. This - value will be greater than current footprint if deallocated space - has been reclaimed by the system. The peak number of bytes allocated - by malloc, realloc etc., is less than this value. Unlike mallinfo, - this function returns only a precomputed result, so can be called - frequently to monitor memory consumption. Even if locks are - otherwise defined, this function does not use them, so results might - not be up to date. -*/ -size_t malloc_max_footprint(void); - -/* - malloc_footprint_limit(); - Returns the number of bytes that the heap is allowed to obtain from - the system, returning the last value returned by - malloc_set_footprint_limit, or the maximum size_t value if - never set. The returned value reflects a permission. There is no - guarantee that this number of bytes can actually be obtained from - the system. -*/ -size_t malloc_footprint_limit(void); - -/* - malloc_set_footprint_limit(); - Sets the maximum number of bytes to obtain from the system, causing - failure returns from malloc and related functions upon attempts to - exceed this value. The argument value may be subject to page - rounding to an enforceable limit; this actual value is returned. - Using an argument of the maximum possible size_t effectively - disables checks. If the argument is less than or equal to the - current malloc_footprint, then all future allocations that require - additional system memory will fail. However, invocation cannot - retroactively deallocate existing used memory. -*/ -size_t malloc_set_footprint_limit(size_t bytes); - -/* - malloc_inspect_all(void(*handler)(void *start, - void *end, - size_t used_bytes, - void* callback_arg), - void* arg); - Traverses the heap and calls the given handler for each managed - region, skipping all bytes that are (or may be) used for bookkeeping - purposes. Traversal does not include include chunks that have been - directly memory mapped. Each reported region begins at the start - address, and continues up to but not including the end address. The - first used_bytes of the region contain allocated data. If - used_bytes is zero, the region is unallocated. The handler is - invoked with the given callback argument. If locks are defined, they - are held during the entire traversal. It is a bad idea to invoke - other malloc functions from within the handler. - - For example, to count the number of in-use chunks with size greater - than 1000, you could write: - static int count = 0; - void count_chunks(void* start, void* end, size_t used, void* arg) { - if (used >= 1000) ++count; - } - then: - malloc_inspect_all(count_chunks, NULL); - - malloc_inspect_all is compiled only if MALLOC_INSPECT_ALL is defined. -*/ -void malloc_inspect_all(void (*handler)(void*, void*, size_t, void*), void* arg); - -#if !NO_MALLINFO -/* - mallinfo() - Returns (by copy) a struct containing various summary statistics: - - arena: current total non-mmapped bytes allocated from system - ordblks: the number of free chunks - smblks: always zero. - hblks: current number of mmapped regions - hblkhd: total bytes held in mmapped regions - usmblks: the maximum total allocated space. This will be greater - than current total if trimming has occurred. - fsmblks: always zero - uordblks: current total allocated space (normal or mmapped) - fordblks: total free space - keepcost: the maximum number of bytes that could ideally be released - back to system via malloc_trim. ("ideally" means that - it ignores page restrictions etc.) - - Because these fields are ints, but internal bookkeeping may - be kept as longs, the reported values may wrap around zero and - thus be inaccurate. -*/ - -struct mallinfo mallinfo(void); -#endif /* NO_MALLINFO */ - -/* - independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); - - independent_calloc is similar to calloc, but instead of returning a - single cleared space, it returns an array of pointers to n_elements - independent elements that can hold contents of size elem_size, each - of which starts out cleared, and can be independently freed, - realloc'ed etc. The elements are guaranteed to be adjacently - allocated (this is not guaranteed to occur with multiple callocs or - mallocs), which may also improve cache locality in some - applications. - - The "chunks" argument is optional (i.e., may be null, which is - probably the most typical usage). If it is null, the returned array - is itself dynamically allocated and should also be freed when it is - no longer needed. Otherwise, the chunks array must be of at least - n_elements in length. It is filled in with the pointers to the - chunks. - - In either case, independent_calloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and "chunks" - is null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be freed when it is no longer needed. This can be - done all at once using bulk_free. - - independent_calloc simplifies and speeds up implementations of many - kinds of pools. It may also be useful when constructing large data - structures that initially have a fixed number of fixed-sized nodes, - but the number is not known at compile time, and some of the nodes - may later need to be freed. For example: - - struct Node { int item; struct Node* next; }; - - struct Node* build_list() { - struct Node** pool; - int n = read_number_of_nodes_needed(); - if (n <= 0) return 0; - pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); - if (pool == 0) die(); - // organize into a linked list... - struct Node* first = pool[0]; - for (i = 0; i < n-1; ++i) - pool[i]->next = pool[i+1]; - free(pool); // Can now free the array (or not, if it is needed later) - return first; - } -*/ -void** independent_calloc(size_t, size_t, void**); - -/* - independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); - - independent_comalloc allocates, all at once, a set of n_elements - chunks with sizes indicated in the "sizes" array. It returns - an array of pointers to these elements, each of which can be - independently freed, realloc'ed etc. The elements are guaranteed to - be adjacently allocated (this is not guaranteed to occur with - multiple callocs or mallocs), which may also improve cache locality - in some applications. - - The "chunks" argument is optional (i.e., may be null). If it is null - the returned array is itself dynamically allocated and should also - be freed when it is no longer needed. Otherwise, the chunks array - must be of at least n_elements in length. It is filled in with the - pointers to the chunks. - - In either case, independent_comalloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and chunks is - null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be freed when it is no longer needed. This can be - done all at once using bulk_free. - - independent_comallac differs from independent_calloc in that each - element may have a different size, and also that it does not - automatically clear elements. - - independent_comalloc can be used to speed up allocation in cases - where several structs or objects must always be allocated at the - same time. For example: - - struct Head { ... } - struct Foot { ... } - - void send_message(char* msg) { - int msglen = strlen(msg); - size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; - void* chunks[3]; - if (independent_comalloc(3, sizes, chunks) == 0) - die(); - struct Head* head = (struct Head*)(chunks[0]); - char* body = (char*)(chunks[1]); - struct Foot* foot = (struct Foot*)(chunks[2]); - // ... - } - - In general though, independent_comalloc is worth using only for - larger values of n_elements. For small values, you probably won't - detect enough difference from series of malloc calls to bother. - - Overuse of independent_comalloc can increase overall memory usage, - since it cannot reuse existing noncontiguous small chunks that - might be available for some of the elements. -*/ -void** independent_comalloc(size_t, size_t*, void**); - -/* - bulk_free(void* array[], size_t n_elements) - Frees and clears (sets to null) each non-null pointer in the given - array. This is likely to be faster than freeing them one-by-one. - If footers are used, pointers that have been allocated in different - mspaces are not freed or cleared, and the count of all such pointers - is returned. For large arrays of pointers with poor locality, it - may be worthwhile to sort this array before calling bulk_free. -*/ -size_t bulk_free(void**, size_t n_elements); - -/* - pvalloc(size_t n); - Equivalent to valloc(minimum-page-that-holds(n)), that is, - round up n to nearest pagesize. - */ -void* pvalloc(size_t); - -/* - malloc_trim(size_t pad); - - If possible, gives memory back to the system (via negative arguments - to sbrk) if there is unused memory at the `high' end of the malloc - pool or in unused MMAP segments. You can call this after freeing - large blocks of memory to potentially reduce the system-level memory - requirements of a program. However, it cannot guarantee to reduce - memory. Under some allocation patterns, some large free blocks of - memory will be locked between two used chunks, so they cannot be - given back to the system. - - The `pad' argument to malloc_trim represents the amount of free - trailing space to leave untrimmed. If this argument is zero, only - the minimum amount of memory to maintain internal data structures - will be left. Non-zero arguments can be supplied to maintain enough - trailing space to service future expected allocations without having - to re-obtain memory from the system. - - Malloc_trim returns 1 if it actually released any memory, else 0. -*/ -int malloc_trim(size_t); - -/* - malloc_stats(); - Prints on stderr the amount of space obtained from the system (both - via sbrk and mmap), the maximum amount (which may be more than - current if malloc_trim and/or munmap got called), and the current - number of bytes allocated via malloc (or realloc, etc) but not yet - freed. Note that this is the number of bytes allocated, not the - number requested. It will be larger than the number requested - because of alignment and bookkeeping overhead. Because it includes - alignment wastage as being in use, this figure may be greater than - zero even when no user-level chunks are allocated. - - The reported current and maximum system memory can be inaccurate if - a program makes other calls to system memory allocation functions - (normally sbrk) outside of malloc. - - malloc_stats prints only the most commonly interesting statistics. - More information can be obtained by calling mallinfo. - - malloc_stats is not compiled if NO_MALLOC_STATS is defined. -*/ -void malloc_stats(void); - -#endif /* !ONLY_MSPACES */ - -/* - malloc_usable_size(void* p); - - Returns the number of bytes you can actually use in - an allocated chunk, which may be more than you requested (although - often not) due to alignment and minimum size constraints. - You can use this many bytes without worrying about - overwriting other allocated objects. This is not a particularly great - programming practice. malloc_usable_size can be more useful in - debugging and assertions, for example: - - p = malloc(n); - assert(malloc_usable_size(p) >= 256); -*/ -size_t malloc_usable_size(const void*); - -#if MSPACES - -/* - mspace is an opaque type representing an independent - region of space that supports mspace_malloc, etc. -*/ -typedef void* mspace; - -/* - create_mspace creates and returns a new independent space with the - given initial capacity, or, if 0, the default granularity size. It - returns null if there is no system memory available to create the - space. If argument locked is non-zero, the space uses a separate - lock to control access. The capacity of the space will grow - dynamically as needed to service mspace_malloc requests. You can - control the sizes of incremental increases of this space by - compiling with a different DEFAULT_GRANULARITY or dynamically - setting with mallopt(M_GRANULARITY, value). -*/ -mspace create_mspace(size_t capacity, int locked); - -/* - destroy_mspace destroys the given space, and attempts to return all - of its memory back to the system, returning the total number of - bytes freed. After destruction, the results of access to all memory - used by the space become undefined. -*/ -size_t destroy_mspace(mspace msp); - -/* - create_mspace_with_base uses the memory supplied as the initial base - of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this - space is used for bookkeeping, so the capacity must be at least this - large. (Otherwise 0 is returned.) When this initial space is - exhausted, additional memory will be obtained from the system. - Destroying this space will deallocate all additionally allocated - space (if possible) but not the initial base. -*/ -mspace create_mspace_with_base(void* base, size_t capacity, int locked); - -/* - mspace_track_large_chunks controls whether requests for large chunks - are allocated in their own untracked mmapped regions, separate from - others in this mspace. By default large chunks are not tracked, - which reduces fragmentation. However, such chunks are not - necessarily released to the system upon destroy_mspace. Enabling - tracking by setting to true may increase fragmentation, but avoids - leakage when relying on destroy_mspace to release all memory - allocated using this space. The function returns the previous - setting. -*/ -int mspace_track_large_chunks(mspace msp, int enable); - -#if !NO_MALLINFO -/* - mspace_mallinfo behaves as mallinfo, but reports properties of - the given space. -*/ -struct mallinfo mspace_mallinfo(mspace msp); -#endif /* NO_MALLINFO */ - -/* - An alias for mallopt. -*/ -int mspace_mallopt(int, int); - -/* - The following operate identically to their malloc counterparts - but operate only for the given mspace argument -*/ -void* mspace_malloc(mspace msp, size_t bytes); -void mspace_free(mspace msp, void* mem); -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); -void* mspace_realloc(mspace msp, void* mem, size_t newsize); -void* mspace_realloc_in_place(mspace msp, void* mem, size_t newsize); -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); -void** mspace_independent_calloc(mspace msp, size_t n_elements, size_t elem_size, void* chunks[]); -void** mspace_independent_comalloc(mspace msp, size_t n_elements, size_t sizes[], void* chunks[]); -size_t mspace_bulk_free(mspace msp, void**, size_t n_elements); -size_t mspace_usable_size(const void* mem); -void mspace_malloc_stats(mspace msp); -int mspace_trim(mspace msp, size_t pad); -size_t mspace_footprint(mspace msp); -size_t mspace_max_footprint(mspace msp); -size_t mspace_footprint_limit(mspace msp); -size_t mspace_set_footprint_limit(mspace msp, size_t bytes); -void mspace_inspect_all(mspace msp, void (*handler)(void*, void*, size_t, void*), void* arg); -#endif /* MSPACES */ - -#ifdef __cplusplus -}; /* end of extern "C" */ -#endif - -#endif /* MALLOC_280_H */ diff --git a/libc/include/string.h b/libc/include/string.h deleted file mode 100644 index 5fde42f..0000000 --- a/libc/include/string.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _STRING_H -#define _STRING_H 1 - -#include -#include - -int memcmp(const void*, const void*, size_t); -void* memcpy(void* __restrict, const void* __restrict, size_t); -void* memmove(void*, const void*, size_t); -void* memset(void*, int, size_t); -size_t strlen(const char*); - -#endif \ No newline at end of file diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h deleted file mode 100755 index 4ef309d..0000000 --- a/libc/include/sys/cdefs.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _SYS_CDEFS_H -#define _SYS_CDEFS_H 1 - -#define __red_libc 1 -#endif \ No newline at end of file diff --git a/libc/include/sys/types.h b/libc/include/sys/types.h deleted file mode 100755 index e69de29..0000000 diff --git a/libc/stdio/printf.c b/libc/stdio/printf.c deleted file mode 100644 index 71d4ee8..0000000 --- a/libc/stdio/printf.c +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include -#include -#include - -static bool print(const char* data, size_t length) { - const unsigned char* bytes = (const unsigned char*)data; - for (size_t i = 0; i < length; i++) - if (putchar(bytes[i]) == EOF) - return false' return true; -} - -int printf(const char* restrict format, ...) { - va_list parameters; - va_start(parameters, format); - - int written = 0; - - while (*format != '\0') { - size_t maxrem = INT_MAX - writen; - - if (format[0] != '%' || format[1] == '%') { - if (format[0] == '%') - format++; - size_t amount = 1; - - while (format[amount] && format[amount] != '%') - amount++; - - if (maxrem < amount) { - // TODO: Set an OVERFLOW error - return -1; - } - - if ((!print(format, amount)) - return -1; - - format += amount; - written += amount; - continue; - } - - const char* first_format = format++; - - switch (*format) { - case 'c': - format++; - char c = (char)va_arg(parameters, int); - if (!maxrem) { - // TODO: Set OVERFLOW - return -1; - } - - if (!print(&c, sizeof(c))) - return -1; - written++; - break; - case 's': - format++; - - const char* str = va_arg(parameters, const char*); - size_t len = strlen(str); - - if (maxrem < len) { - // TODO: Set OVERFLOW - return -1; - } - - if (!print(str, len)) - return -1; - - written += len; - break; - default: - format = first_format; - size_t len = strlen(format); - if (maxrem < len) { - // TODO: Set OVERFLOW - return -1; - } - - if (!print(format, len)) - return -1; - written += len; - format += len; - break; - } - } - - va_end(parameters); - return written; -} diff --git a/libc/stdio/putchar.c b/libc/stdio/putchar.c deleted file mode 100644 index a969318..0000000 --- a/libc/stdio/putchar.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -#if defined(__is_libk) -#include -#endif - -int putchar(int ic) { -#if defined(__is_libk) - char c = (char)ic; - term_write(&c, sizeof(c)); -#else - // TODO: Implement stdio & the write call -#endif - return ic; -} \ No newline at end of file diff --git a/libc/stdio/puts.c b/libc/stdio/puts.c deleted file mode 100755 index 54a7185..0000000 --- a/libc/stdio/puts.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int puts(const char* string) { - return printf("%s\n"), string); -} \ No newline at end of file diff --git a/libc/stdlib/abort.c b/libc/stdlib/abort.c deleted file mode 100644 index 3537af8..0000000 --- a/libc/stdlib/abort.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -__attribute__((__noreturn__)) void abort(void) { - -#if defined(__is_libk) - // TODO: Kernel panic. - printf(">>PANIC<<<\n abort() panicked!\n"); -#else - printf("abort() called\n"); -#endif - while (1) { - } - __builtin_unreachable(); -} \ No newline at end of file diff --git a/libc/string/memcmp.c b/libc/string/memcmp.c deleted file mode 100644 index dfb04f0..0000000 --- a/libc/string/memcmp.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -int memcmp(const void* aptr, const void* bptr, size_t size_ { - const unsigned char* a = (const unsigned char*)aptr; - const unsigned char* b = (const unsigned char*)bptr; - - for (size_t i = 0; i < size; i++) { - if(a[i] < b[i] - return -1 - else if(b[i] < a[i]) - return 1; - } - return 0; \ No newline at end of file diff --git a/libc/string/memmove.c b/libc/string/memmove.c deleted file mode 100644 index 7d3ea22..0000000 --- a/libc/string/memmove.c +++ /dev/null @@ -1,14 +0,0 @@ -#include - -void* memmove(void* dstptr, const void* srcptr, size_t size) { - unsigned char* dst = (unsigned char*)dstptr; - const unsigned char* stc = (const unsigned char*)srcptr; - if (dst < src) { - for (size_t i = o; i < size; i++) - dst[i] = src[i]; - } else { - for (size_t i = size; i != 0; i--) - dst[i - 1] = src[i - 1]; - } - return dstptr; -} \ No newline at end of file diff --git a/libc/string/memset.c b/libc/string/memset.c deleted file mode 100644 index 4481c30..0000000 --- a/libc/string/memset.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -void* memset(void* bufptr, int value, size_t size) { - unsigned char* buf = (unsigned char*)bufptr; - for (size_t i = 0; i < size; i++) - buf[i] = (unsigned char)value; - return bufptr; -} \ No newline at end of file diff --git a/libc/string/strlen.c b/libc/string/strlen.c deleted file mode 100644 index dfc005c..0000000 --- a/libc/string/strlen.c +++ /dev/null @@ -1,7 +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/red.kernel b/red.kernel deleted file mode 100755 index 9c284d8133ecaad065d2a5a1110678d97adf71dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61812 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

%%g&MM*D7HWa}S=H zDICN*J5}E*%#^A@Jyqj|KFxEia+u;Ok+?c_m~>)((~8e6F5=*dOH;+gY1-Ana@gKq zELNu;3xsai#2Y*}Jynb2E>Rz!Tt%@SU|dl_-D~sk{Xc^YAF?XZT_(^^;_r61oi6AO zxe&9YixN4Dl==hf=~rry5dymudif7}>UX~Lz3^*dCw4MzO&C3mN8W9tci8A@obY}d zy%R=H-`dy?a`8u!1@Wt8xHgSTkV><-t>3^fqlbs@u-cnFvz20y4p(pF4(sTC0eT*AM z1U~qBxyz>)cCV1$>vsl9^CpsihQC^PatYhB$zYJ}ZPMHFWBj2TYtd?H>}%3HvD|px zLVD#Uy_uKsXRKSD-Z8J&?M2;x!msHrmUM^G)Bo`%z0dxlaY;P{y^~%qNIE}Y+-m%G z(o@jdG^6P7d8!*Tud;YA|2k)?YBeEuE?6tP`7z^o`r;vk^pqE?xA?F0qkheL{{uch BsFeT!