summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcpplover0 <osdev555@yandex.com>2025-12-20 18:35:42 +0300
committercpplover0 <osdev555@yandex.com>2025-12-20 18:35:42 +0300
commit74b991b365d242931fe2d32eeb080827e9c4f31d (patch)
tree618668f1c0c0a2e83c5aa11dc2b33784cd57a13c
parent4bf2ac8837ef540d1e15041ba9f604466df1fdcc (diff)
probably some bug fixes, strip and buddy allocator freelist extension
-rw-r--r--GNUmakefile2
-rw-r--r--build-pkg.sh2
-rw-r--r--kernel/GNUmakefile2
-rw-r--r--kernel/include/arch/x86_64/cpu/data.hpp5
-rw-r--r--kernel/include/arch/x86_64/cpu/lapic.hpp2
-rw-r--r--kernel/include/arch/x86_64/scheduling.hpp3
-rw-r--r--kernel/include/generic/mm/paging.hpp6
-rw-r--r--kernel/include/generic/mm/pmm.hpp10
-rw-r--r--kernel/include/generic/mm/vmm.hpp22
-rw-r--r--kernel/include/generic/vfs/fd.hpp6
-rw-r--r--kernel/include/generic/vfs/vfs.hpp69
-rw-r--r--kernel/src/arch/x86_64/asm/scheduling.asm31
-rw-r--r--kernel/src/arch/x86_64/cpu/smp.cpp3
-rw-r--r--kernel/src/arch/x86_64/interrupts/asm/idt.asm21
-rw-r--r--kernel/src/arch/x86_64/interrupts/irq.cpp6
-rw-r--r--kernel/src/arch/x86_64/interrupts/panic.cpp77
-rw-r--r--kernel/src/arch/x86_64/scheduling.cpp15
-rw-r--r--kernel/src/arch/x86_64/syscalls/file.cpp81
-rw-r--r--kernel/src/arch/x86_64/syscalls/process.cpp32
-rw-r--r--kernel/src/arch/x86_64/syscalls/syscalls.cpp13
-rw-r--r--kernel/src/drivers/acpi.cpp2
-rw-r--r--kernel/src/generic/mm/paging.cpp18
-rw-r--r--kernel/src/generic/mm/pmm.cpp111
-rw-r--r--kernel/src/generic/vfs/devfs.cpp69
-rw-r--r--kernel/src/generic/vfs/tmpfs.cpp3
-rw-r--r--kernel/src/generic/vfs/vfs.cpp156
m---------kernel/src/lib/uACPI0
-rw-r--r--kernel/src/main.asm8
-rw-r--r--kernel/src/main.cpp2
-rw-r--r--strip-all.sh20
-rwxr-xr-xtar-initrd.sh6
-rwxr-xr-xtools/initbase/etc/init.sh3
-rw-r--r--tools/initbase/root/.config/i3/config6
-rw-r--r--tools/limine.conf2
-rw-r--r--tools/pkg/11/other-stuff/settings.ini2
-rw-r--r--tools/pkg/2/init/src/main.cpp2
-rw-r--r--tools/pkg/2/ps2_driver/src/main.c110
-rw-r--r--tools/pkg/2/xhci_driver/src/main.cpp24
-rw-r--r--tools/pkg/3/bash/pkg.sh3
-rw-r--r--tools/pkg/4/xorg-server/pkg.sh20
-rw-r--r--tools/pkg/5/twm/pkg.sh3
-rw-r--r--tools/pkg/6/terms/pkg.sh30
-rw-r--r--tools/pkg/6/xcb-stuff/pkg.sh22
-rwxr-xr-xtools/pkg/7/benchmark/a.outbin16464 -> 16608 bytes
-rw-r--r--tools/pkg/7/benchmark/main.c8
-rw-r--r--tools/pkg/7/games/pkg.sh12
-rw-r--r--tools/pkg/7/python/pkg.sh8
-rw-r--r--tools/pkg/build-pkg.sh43
-rw-r--r--tools/pkg/pkg-lib.sh4
-rw-r--r--tools/test.c5
-rw-r--r--tools/toolchain-build.sh7
51 files changed, 612 insertions, 505 deletions
diff --git a/GNUmakefile b/GNUmakefile
index 8acba7d..e7d4a50 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -3,7 +3,7 @@ MAKEFLAGS += -rR
.SUFFIXES:
# Default user QEMU flags. These are appended to the QEMU command calls.
-QEMUFLAGS := -m 4G -d int -no-reboot -s -M q35 -smp 2 -enable-kvm -serial stdio -device qemu-xhci -device usb-kbd -device usb-mouse -cpu host,+invtsc
+QEMUFLAGS := -m 4G -d int -no-reboot -s -M q35 -smp 1 -enable-kvm -serial stdio -cpu host,+invtsc -device qemu-xhci -device usb-kbd -device usb-mouse
override IMAGE_NAME := orange
diff --git a/build-pkg.sh b/build-pkg.sh
index 4fcd5aa..211c1a0 100644
--- a/build-pkg.sh
+++ b/build-pkg.sh
@@ -7,7 +7,7 @@ export PKG_CONFIG_SYSROOT_DIR="$sysroot_path"
export PKG_CONFIG_PATH="$sysroot_path/usr/lib/pkgconfig:$sysroot_path/usr/share/pkgconfig:$sysroot_path/usr/local/lib/pkgconfig:$sysroot_path/usr/local/share/pkgconfig:$HOME/opt/cross/orange/lib/pkgconfig:$HOME/opt/cross/orange/share/pkgconfig"
INITRDDIR=""$(realpath initrd)""
-export CFLAGS="-fPIC -Wno-error -O2"
+export CFLAGS="-fPIC -Wno-error -O2 -Wno-incompatible-pointer-types"
cd tools/pkg/$1
sh pkg.sh "$INITRDDIR"
diff --git a/kernel/GNUmakefile b/kernel/GNUmakefile
index 2a42dd1..36c6534 100644
--- a/kernel/GNUmakefile
+++ b/kernel/GNUmakefile
@@ -19,7 +19,7 @@ CXX := c++
LD := ld
# User controllable C flags.
-CFLAGS := -g -pipe -Iinclude -Isrc/lib/Flanterm/src -Isrc/lib/uACPI/include -O3 -fno-omit-frame-pointer
+CFLAGS := -g -pipe -Iinclude -Isrc/lib/Flanterm/src -Isrc/lib/uACPI/include -O3 -fno-omit-frame-pointer -ggdb3 -fno-inline-functions-called-once -fno-optimize-sibling-calls -fno-omit-frame-pointer
# User controllable C++ flags. We default to same as C flags.
CXXFLAGS := $(CFLAGS)
diff --git a/kernel/include/arch/x86_64/cpu/data.hpp b/kernel/include/arch/x86_64/cpu/data.hpp
index 7482a77..ec58fc6 100644
--- a/kernel/include/arch/x86_64/cpu/data.hpp
+++ b/kernel/include/arch/x86_64/cpu/data.hpp
@@ -31,6 +31,11 @@ typedef struct {
namespace arch {
namespace x86_64 {
namespace cpu {
+
+ inline static cpudata_t* fixdata() {
+ std::uint64_t cpudata = __rdmsr(0xC0000101);
+ }
+
inline static cpudata_t* data() {
std::uint64_t cpudata = __rdmsr(0xC0000101);
if(!cpudata) {
diff --git a/kernel/include/arch/x86_64/cpu/lapic.hpp b/kernel/include/arch/x86_64/cpu/lapic.hpp
index cfd602b..350edac 100644
--- a/kernel/include/arch/x86_64/cpu/lapic.hpp
+++ b/kernel/include/arch/x86_64/cpu/lapic.hpp
@@ -15,6 +15,8 @@
#include <etc/assembly.hpp>
#include <etc/etc.hpp>
+extern "C" void setwp();
+
namespace arch {
namespace x86_64 {
namespace cpu {
diff --git a/kernel/include/arch/x86_64/scheduling.hpp b/kernel/include/arch/x86_64/scheduling.hpp
index afd28a0..f9e0e36 100644
--- a/kernel/include/arch/x86_64/scheduling.hpp
+++ b/kernel/include/arch/x86_64/scheduling.hpp
@@ -141,6 +141,9 @@ namespace arch {
std::uint32_t reversedforid;
std::uint32_t* vmm_id;
+
+ userspace_fd_t* fd_pool;
+
userspace_fd_t* fd;
char* vmm_start;
diff --git a/kernel/include/generic/mm/paging.hpp b/kernel/include/generic/mm/paging.hpp
index 21dc108..175e61d 100644
--- a/kernel/include/generic/mm/paging.hpp
+++ b/kernel/include/generic/mm/paging.hpp
@@ -44,6 +44,12 @@ namespace memory {
static void alwaysmappedadd(std::uint64_t phys, std::uint64_t len);
static void alwaysmappedmap(std::uint64_t cr3,std::uint32_t id);
static std::uint64_t kernelget();
+
+ static void change(std::uint64_t cr3, std::uint64_t virt, std::uint64_t flags);
+
+ static void changerange(std::uint64_t cr3, std::uint64_t virt, std::uint64_t len , std::uint64_t flags);
+
+
};
}; \ No newline at end of file
diff --git a/kernel/include/generic/mm/pmm.hpp b/kernel/include/generic/mm/pmm.hpp
index 03cd5bc..6502e83 100644
--- a/kernel/include/generic/mm/pmm.hpp
+++ b/kernel/include/generic/mm/pmm.hpp
@@ -42,6 +42,7 @@ typedef struct {
namespace memory {
+
class buddy {
private:
static buddy_info_t* split_maximum(buddy_info_t* blud, std::uint64_t size);
@@ -50,12 +51,19 @@ namespace memory {
static void merge(buddy_info_t* budy);
public:
static void init();
- static void free(std::uint64_t phys);
+ static int free(std::uint64_t phys);
static void fullfree(std::uint32_t id);
static alloc_t alloc_ext(std::size_t size);
static std::int64_t alloc(std::size_t size);
static std::int64_t allocid(std::size_t size, std::uint32_t id);
};
+
+ class freelist {
+ public:
+ static int free(std::uint64_t phys);
+ static std::int64_t alloc();
+ };
+
namespace pmm {
diff --git a/kernel/include/generic/mm/vmm.hpp b/kernel/include/generic/mm/vmm.hpp
index e1a54a9..9aee626 100644
--- a/kernel/include/generic/mm/vmm.hpp
+++ b/kernel/include/generic/mm/vmm.hpp
@@ -26,6 +26,8 @@ typedef struct vmm_obj {
uint8_t is_shared;
uint8_t is_mapped;
+ uint8_t is_free;
+
uint8_t is_lazy_alloc;
int* how_much_connected; // used for sharedmem
@@ -390,6 +392,26 @@ namespace memory {
return (void*)new_vmm->base;
}
+ inline static vmm_obj_t* changemem(arch::x86_64::process_t* proc, std::uint64_t flags) {
+ asm volatile("cli"); // bug if they are enabled
+ vmm_obj_t* current = (vmm_obj_t*)proc->vmm_start;
+ current->lock.lock();
+
+ while (current) {
+
+ if (current->base == (std::uint64_t)Other::toVirt(0) - 4096)
+ break;
+
+ if(current->base != 0) {
+ memory::paging::changerange(proc->original_cr3,current->base,current->len,flags | ((current->flags) & ~(PTE_RW)));
+ }
+
+ current = current->next;
+ }
+ ((vmm_obj_t*)proc->vmm_start)->lock.unlock();
+ return 0;
+ }
+
inline static void* customalloc(arch::x86_64::process_t* proc, std::uint64_t virt, std::uint64_t len, std::uint64_t flags, int is_shared) {
asm volatile("cli"); // bug if they are enabled
vmm_obj_t* current = (vmm_obj_t*)proc->vmm_start;
diff --git a/kernel/include/generic/vfs/fd.hpp b/kernel/include/generic/vfs/fd.hpp
index 01c29e6..01b5fd3 100644
--- a/kernel/include/generic/vfs/fd.hpp
+++ b/kernel/include/generic/vfs/fd.hpp
@@ -19,8 +19,8 @@ namespace vfs {
}
if(!current) {
- current = (userspace_fd_t*)memory::pmm::_virtual::alloc(4096);
- zeromem(current);
+ current = new userspace_fd_t;
+ memset(current,0,sizeof(userspace_fd_t));
current->next = proc->fd;
proc->fd = current;
current->index = proc->fd_ptr++;
@@ -33,8 +33,6 @@ namespace vfs {
current->is_cached_path = 0;
current->is_debug = 0;
- memset(current->path,0,2048);
-
return current->index;
}
diff --git a/kernel/include/generic/vfs/vfs.hpp b/kernel/include/generic/vfs/vfs.hpp
index 24fac9a..edb42d8 100644
--- a/kernel/include/generic/vfs/vfs.hpp
+++ b/kernel/include/generic/vfs/vfs.hpp
@@ -265,7 +265,7 @@ namespace vfs {
return written;
}
- std::uint64_t read(std::int64_t* read_count, char* dest_buffer, std::uint64_t count, int is_block) {
+ std::uint64_t ttyread(std::int64_t* read_count, char* dest_buffer, std::uint64_t count, int is_block) {
std::uint64_t read_bytes = 0;
int tries = 0;
@@ -331,6 +331,47 @@ namespace vfs {
return read_bytes;
}
+ std::uint64_t read(std::int64_t* read_count, char* dest_buffer, std::uint64_t count, int is_block) {
+
+ std::uint64_t read_bytes = 0;
+ int tries = 0;
+
+ while (true) {
+ this->lock.lock();
+
+ if (this->size == 0) {
+ if (this->is_closed.test(std::memory_order_acquire)) {
+ this->lock.unlock();
+ return 0;
+ }
+ if (flags & O_NONBLOCK || is_block) {
+ this->lock.unlock();
+ return 0;
+ }
+ this->lock.unlock();
+ yield();
+ continue;
+ }
+
+ read_bytes = (count < this->size) ? count : this->size;
+ memcpy(dest_buffer, this->buffer, read_bytes);
+ memmove(this->buffer, this->buffer + read_bytes, this->size - read_bytes);
+ this->size -= read_bytes;
+
+ this->write_counter++;
+
+ if(this->size <= 0) {
+
+ tty_ret = 0;
+ } else
+ this->read_counter++;
+
+ this->lock.unlock();
+ break;
+ }
+ return read_bytes;
+ }
+
~pipe() {
@@ -459,6 +500,8 @@ namespace vfs {
static inline int normalize_path(const char* src, char* dest, std::uint64_t dest_size) {
+ memcpy(dest,src,strlen(src) + 1);
+ return 0;
if (!src ||!dest || dest_size < 2) return -1;
std::uint64_t j = 0;
int prev_slash = 0;
@@ -485,38 +528,31 @@ namespace vfs {
/* I'll use path resolver from my old kernel */
static inline void resolve_path(const char* inter0,const char* base, char *result, char spec, char is_follow_symlinks) {
- char buffer_in_stack[2048];
char buffer2_in_stack[2048];
char inter[2048];
- char* buffer = (char*)buffer_in_stack;
+ char* buffer = 0;
char* final_buffer = (char*)buffer2_in_stack;
std::uint64_t ptr = strlen((char*)base);
char is_first = 1;
char is_full = 0;
-
- memset(inter,0,2048);
- memset(buffer_in_stack,0,2048);
- memset(buffer2_in_stack,0,2048);
-
- memcpy(inter,inter0,strlen(inter0));
- memcpy(final_buffer,base,strlen((char*)base));
+ memcpy(inter,inter0,strlen(inter0) + 1);
+
if(strlen((char*)inter) == 1 && inter[0] == '.') {
- memset(result,0,2048);
- memcpy(result,base,strlen((char*)base));
+ memcpy(result,base,strlen((char*)base) + 1);
return;
}
if(!strcmp(inter,"/")) {
- memset(result,0,2048);
- memcpy(result,inter,strlen((char*)inter));
+ memcpy(result,inter,strlen((char*)inter) + 1);
return;
- }
+ }
if(inter[0] == '/') {
ptr = 0;
- memset(final_buffer,0,2048);
is_full = 1;
+ } else {
+ memcpy(final_buffer,base,strlen((char*)base) + 1);
}
if(spec)
@@ -575,7 +611,6 @@ namespace vfs {
buffer = strtok(0,"/");
}
- memset(result,0,2048);
normalize_path(final_buffer,result,2048);
}
diff --git a/kernel/src/arch/x86_64/asm/scheduling.asm b/kernel/src/arch/x86_64/asm/scheduling.asm
index 49f754e..9559386 100644
--- a/kernel/src/arch/x86_64/asm/scheduling.asm
+++ b/kernel/src/arch/x86_64/asm/scheduling.asm
@@ -5,22 +5,32 @@ global schedulingEnd
global yield
yield:
- int 32
- ret
+ pop rax
+ mov rdx, rsp
+ mov rsp,[gs:16]
+ push qword 0
+ push rdx
+ pushfq
+ push qword 0x08
+ push qword rax
+ jmp schedulingEnter
global yield0
yield0:
- int 32
- ret
+ pop rax
+ mov rdx, rsp
+ mov rsp,[gs:16]
+ push qword 0
+ push rdx
+ pushfq
+ push qword 0x08
+ push qword rax
+ jmp schedulingEnter
schedulingEnter:
cli
- cmp byte [rsp + 8],0x08
- jz .cont
- swapgs
-.cont:
push qword 0
push qword 0
push r15
@@ -105,9 +115,4 @@ schedulingEnd:
pop r14
pop r15
add rsp,16
-
- cmp byte [rsp + 8],0x08
- jz .end
- swapgs
-.end:
iretq \ No newline at end of file
diff --git a/kernel/src/arch/x86_64/cpu/smp.cpp b/kernel/src/arch/x86_64/cpu/smp.cpp
index e270b34..3f0aaf1 100644
--- a/kernel/src/arch/x86_64/cpu/smp.cpp
+++ b/kernel/src/arch/x86_64/cpu/smp.cpp
@@ -57,12 +57,13 @@ void __mp_bootstrap(struct LIMINE_MP(info)* smp_info) {
arch::x86_64::cpu::data()->smp.cpu_id = balance_how_much_cpus++;
- arch::x86_64::cpu::data()->lapic_block = arch::x86_64::cpu::lapic::init(15000);
+ arch::x86_64::cpu::data()->lapic_block = arch::x86_64::cpu::lapic::init(2500);
arch::x86_64::cpu::sse::init();
arch::x86_64::syscall::init();
Log::Display(LEVEL_MESSAGE_OK,"Cpu %d is online \n",arch::x86_64::cpu::data()->smp.cpu_id);
arch::x86_64::cpu::lapic::tick(arch::x86_64::cpu::data()->lapic_block);
mp_lock.unlock();
+ setwp();
mp::sync(0);
mp::sync(1);
asm volatile("sti");
diff --git a/kernel/src/arch/x86_64/interrupts/asm/idt.asm b/kernel/src/arch/x86_64/interrupts/asm/idt.asm
index 1ad95d7..deb0164 100644
--- a/kernel/src/arch/x86_64/interrupts/asm/idt.asm
+++ b/kernel/src/arch/x86_64/interrupts/asm/idt.asm
@@ -1,11 +1,6 @@
%macro isr_err_stub 1
isr_stub_%+%1:
cli
- cmp byte [rsp + 8],0x08
- jz .cont
- swapgs
-.cont:
-
push qword (%+%1)
jmp asmException
cli
@@ -15,11 +10,6 @@ isr_stub_%+%1:
%macro isr_no_err_stub 1
isr_stub_%+%1:
cli
- cmp byte [rsp + 8],0x08
- jz .cont
- swapgs
-.cont:
-
push qword 0
push qword (%+%1)
jmp asmException
@@ -134,11 +124,6 @@ isrTable:
%macro irq_stub 1
irq_stub_%+%1:
cli
- cmp byte [rsp + 8],0x08
- jz .cont
- swapgs
-.cont:
-
push qword 0
push qword (%+%1)
jmp irqStub
@@ -228,10 +213,4 @@ irqStub:
pop r14
pop r15
add rsp,16
-
- cmp byte [rsp + 8],0x08
- jz .cont2
- swapgs
-
-.cont2:
iretq \ No newline at end of file
diff --git a/kernel/src/arch/x86_64/interrupts/irq.cpp b/kernel/src/arch/x86_64/interrupts/irq.cpp
index 9cb2d26..7b7c5d4 100644
--- a/kernel/src/arch/x86_64/interrupts/irq.cpp
+++ b/kernel/src/arch/x86_64/interrupts/irq.cpp
@@ -21,6 +21,9 @@ extern "C" void* irqTable[];
extern "C" void irqHandler(int_frame_t* ctx) {
+ if(ctx->cs != 0x08)
+ asm volatile("swapgs");
+
memory::paging::enablekernel();
if(!irq_table[ctx->vec - 1].is_userspace)
irq_table[ctx->vec - 1].func(irq_table[ctx->vec - 1].arg);
@@ -56,6 +59,9 @@ extern "C" void irqHandler(int_frame_t* ctx) {
if(ctx->ss == 0x18)
ctx->ss |= 3;
+ if(ctx->cs != 0x08)
+ asm volatile("swapgs");
+
}
void arch::x86_64::interrupts::irq::reset() {
diff --git a/kernel/src/arch/x86_64/interrupts/panic.cpp b/kernel/src/arch/x86_64/interrupts/panic.cpp
index adde6bf..2e1acae 100644
--- a/kernel/src/arch/x86_64/interrupts/panic.cpp
+++ b/kernel/src/arch/x86_64/interrupts/panic.cpp
@@ -19,6 +19,7 @@ typedef struct stackframe {
} __attribute__((packed)) stackframe_t;
int is_panic = 0;
+int last_sys = 0;
void panic(int_frame_t* ctx, const char* msg) {
@@ -26,8 +27,13 @@ void panic(int_frame_t* ctx, const char* msg) {
if(is_panic)
asm volatile("hlt");
+ if(ctx) {
+ if(ctx->cs != 0x08)
+ asm volatile("swapgs");
+ }
+
arch::x86_64::process_t* proc = arch::x86_64::cpu::data()->temp.proc;
- if(proc && ctx) {
+ if(proc && 0) {
uint64_t cr2;
asm volatile("mov %%cr2, %0" : "=r"(cr2) : : "memory");
@@ -37,33 +43,52 @@ void panic(int_frame_t* ctx, const char* msg) {
vmm_obj_t* obj = memory::vmm::getlen(proc,ctx->rip);
- if(ctx->vec == 14) {
- vmm_obj_t* obj0 = memory::vmm::getlen(proc,cr2);
- if(obj0) {
- if(obj0->is_lazy_alloc) {
- std::uint64_t phys = memory::pmm::_physical::alloc(obj0->src_len);
- obj0->phys = phys;
+ // if(ctx->vec == 14) {
+ // vmm_obj_t* obj0 = memory::vmm::getlen(proc,cr2);
+
+ // if(obj0) {
+ // if(obj0->cow_connect && !obj0->is_own_page && obj0->base != 0 ) {
+ // Log::SerialDisplay(LEVEL_MESSAGE_INFO,"trying to cow 0x%p\n",cr2);
+ // //memory::vmm::cow(proc,cr2);
- memory::paging::maprangeid(proc->original_cr3,obj0->phys,obj0->base,obj0->len,obj0->flags,*proc->vmm_id);
+ // if(ctx->cs & 3)
+ // ctx->ss |= 3;
+
+ // if(ctx->ss & 3)
+ // ctx->cs |= 3;
- if(ctx->cs & 3)
- ctx->ss |= 3;
+ // if(ctx->cs == 0x20)
+ // ctx->cs |= 3;
- if(ctx->ss & 3)
- ctx->cs |= 3;
+ // if(ctx->ss == 0x18)
+ // ctx->ss |= 3;
+
+ // if(ctx->cs != 0x08)
+ // asm volatile("swapgs");
+
+ // schedulingEnd(ctx);
+ // } else if(obj0->is_mapped) {
+ // obj0->flags |= PTE_RW;
+ // memory::paging::maprangeid(proc->original_cr3,obj0->phys,obj0->base,obj0->len,obj0->flags,*proc->vmm_id);
+ // if(ctx->cs & 3)
+ // ctx->ss |= 3;
+
+ // if(ctx->ss & 3)
+ // ctx->cs |= 3;
- if(ctx->cs == 0x20)
- ctx->cs |= 3;
+ // if(ctx->cs == 0x20)
+ // ctx->cs |= 3;
- if(ctx->ss == 0x18)
- ctx->ss |= 3;
+ // if(ctx->ss == 0x18)
+ // ctx->ss |= 3;
- obj0->is_lazy_alloc = 0;
+ // if(ctx->cs != 0x08)
+ // asm volatile("swapgs");
- schedulingEnd(ctx);
- }
- }
- }
+ // schedulingEnd(ctx);
+ // }
+ // }
+ // }
Log::SerialDisplay(LEVEL_MESSAGE_FAIL,"process %d fired cpu exception with vec %d, rip 0x%p (offset 0x%p), cr2 0x%p, error code 0x%p, lastsys %d, rdx 0x%p\n",proc->id,ctx->vec,ctx->rip,ctx->rip - 0x41400000,cr2,ctx->err_code,proc->sys,ctx->rdx);
@@ -71,7 +96,7 @@ void panic(int_frame_t* ctx, const char* msg) {
while(1) {
- Log::Raw("Memory 0x%p-0x%p (with offset rip 0x%p)\n",current->base,current->base + current->src_len, ctx->rip - current->base);
+ Log::SerialDisplay(LEVEL_MESSAGE_INFO,"Memory 0x%p-0x%p (with offset rip 0x%p)\n",current->base,current->base + current->src_len, ctx->rip - current->base);
if (current->base == (std::uint64_t)Other::toVirt(0) - 4096)
break;
@@ -85,7 +110,9 @@ void panic(int_frame_t* ctx, const char* msg) {
}
int_frame_t test_ctx = {0};
- ctx = &test_ctx;
+
+ if(!ctx)
+ ctx = &test_ctx;
is_panic = 1;
@@ -114,12 +141,12 @@ void panic(int_frame_t* ctx, const char* msg) {
"RSI: 0x%016llX R8: 0x%016llX R9: 0x%016llX R10: 0x%016llX R11: 0x%016llX\n"
"R12: 0x%016llX R13: 0x%016llX R14: 0x%016llX R15: 0x%016llX RBP: 0x%016llX\n"
"RSP: 0x%016llX CR2: 0x%016llX CR3: 0x%016llX\n"
- "CPU: %d Vec: %d Err: %d\n",
+ "CPU: %d Vec: %d Err: %d Last Syscall: %d\n",
ctx->rax, ctx->rbx, ctx->rdx, ctx->rcx, ctx->rdi,
ctx->rsi, ctx->r8, ctx->r9, ctx->r10, ctx->r11,
ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->rbp,
ctx->rsp, cr2, ctx->cr3,
- arch::x86_64::cpu::data()->smp.cpu_id, ctx->vec, ctx->err_code);
+ arch::x86_64::cpu::data()->smp.cpu_id, ctx->vec, ctx->err_code,arch::x86_64::cpu::data()->last_sys);
Log::Raw("\n Stacktrace\n\n");
stackframe_t* rbp = (stackframe_t*)ctx->rbp;
diff --git a/kernel/src/arch/x86_64/scheduling.cpp b/kernel/src/arch/x86_64/scheduling.cpp
index 706eb86..f9b38b8 100644
--- a/kernel/src/arch/x86_64/scheduling.cpp
+++ b/kernel/src/arch/x86_64/scheduling.cpp
@@ -291,7 +291,7 @@ arch::x86_64::process_t* arch::x86_64::scheduling::clone(process_t* proc,int_fra
userspace_fd_t* fd = proc->fd;
while(fd) {
- userspace_fd_t* newfd = (userspace_fd_t*)memory::pmm::_virtual::alloc(4096);
+ userspace_fd_t* newfd = new userspace_fd_t;
memcpy(newfd,fd,sizeof(userspace_fd_t));
if(newfd->state == USERSPACE_FD_STATE_PIPE) {
@@ -327,7 +327,7 @@ arch::x86_64::process_t* arch::x86_64::scheduling::fork(process_t* proc,int_fram
userspace_fd_t* fd = proc->fd;
while(fd) {
- userspace_fd_t* newfd = (userspace_fd_t*)memory::pmm::_virtual::alloc(4096);
+ userspace_fd_t* newfd = new userspace_fd_t;
memcpy(newfd,fd,sizeof(userspace_fd_t));
if(newfd->state == USERSPACE_FD_STATE_PIPE) {
@@ -344,7 +344,6 @@ arch::x86_64::process_t* arch::x86_64::scheduling::fork(process_t* proc,int_fram
return nproc;
}
-
void arch::x86_64::scheduling::kill(process_t* proc) {
proc->kill_lock.nowaitlock();
proc->lock.nowaitlock();
@@ -443,6 +442,11 @@ extern "C" void schedulingSchedule(int_frame_t* ctx) {
extern int is_panic;
memory::paging::enablekernel();
+ if(ctx) {
+ if(ctx->cs != 0x08)
+ asm volatile("swapgs");
+ }
+
if(is_panic == 1)
asm volatile("hlt");
@@ -504,6 +508,10 @@ extern "C" void schedulingSchedule(int_frame_t* ctx) {
prio_div++;
arch::x86_64::cpu::lapic::eoi();
+
+ if(ctx->cs != 0x08)
+ asm volatile("swapgs");
+
schedulingEnd(ctx);
}
}
@@ -513,6 +521,7 @@ extern "C" void schedulingSchedule(int_frame_t* ctx) {
}
}
+
arch::x86_64::process_t* arch::x86_64::scheduling::head_proc_() {
return head_proc;
}
diff --git a/kernel/src/arch/x86_64/syscalls/file.cpp b/kernel/src/arch/x86_64/syscalls/file.cpp
index 3e3d49c..a25bf61 100644
--- a/kernel/src/arch/x86_64/syscalls/file.cpp
+++ b/kernel/src/arch/x86_64/syscalls/file.cpp
@@ -112,10 +112,9 @@ syscall_ret_t sys_read(int fd, void *buf, size_t count) {
if(fd_s->can_be_closed)
fd_s->can_be_closed = 0;
- DEBUG(0,"Trying to read %s (fd %d) with state %d from proc %d",fd_s->path,fd,fd_s->state,proc->id);
+ DEBUG(proc->is_debug,"Trying to read %s (fd %d) with state %d from proc %d",fd_s->path,fd,fd_s->state,proc->id);
char* temp_buffer = (char*)buf;
- memset(temp_buffer,0,count);
std::int64_t bytes_read;
if(fd_s->state == USERSPACE_FD_STATE_FILE)
bytes_read = vfs::vfs::read(fd_s,temp_buffer,count);
@@ -144,6 +143,8 @@ syscall_ret_t sys_read(int fd, void *buf, size_t count) {
} else
return {1,EBADF,0};
+ DEBUG(proc->is_debug,"Read done from proc %d\n",proc->id);
+
return {1,bytes_read >= 0 ? 0 : (int)(+bytes_read), bytes_read};
}
@@ -741,25 +742,12 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
}
char out[64];
- poll_to_str(fd[i].events,out);
-
- //DEBUG(proc->id == 17,"Trying to poll %s (%d) timeout %d event %s from proc %d",fd0->state == USERSPACE_FD_STATE_FILE ? fd0->path : "Not file",fd0->index,timeout,out,proc->id);
-
- if(fd0->state == USERSPACE_FD_STATE_SOCKET && fd0->is_listen && fd0->read_counter == -1) {
- fd0->read_counter = 0;
- fd0->write_counter = 0;
- }
-
- if(fd0->write_counter == -1) {
- std::int64_t ret = vfs::vfs::poll(fd0,POLLOUT);
- fd0->write_counter = ret < 0 ? 0 : ret;
- }
+ if(proc->is_debug) {
+ poll_to_str(fd[i].events,out);
- if(fd0->read_counter == -1) {
- std::int64_t ret = vfs::vfs::poll(fd0,POLLIN);
- fd0->read_counter = ret < 0 ? 0 : ret;
- }
-
+ DEBUG(proc->is_debug,"Trying to poll %s (%d) timeout %d event %s from proc %d",fd0->state == USERSPACE_FD_STATE_FILE ? fd0->path : "Not file",fd0->index,timeout,out,proc->id);
+
+ }
}
int num_events = 0;
@@ -790,6 +778,14 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
}
fd0->write_socket_pipe->lock.unlock();
fd0->read_socket_pipe->lock.unlock();
+ } else if(fd0->state == USERSPACE_FD_STATE_SOCKET && fd0->is_listen) {
+ if(fd0->read_counter == -1)
+ fd0->read_counter = 0;
+ if(sockets::find(fd0->path)->socket_counter > fd0->read_counter) {
+ fd0->read_counter++;
+ num_events++;
+ fd[i].revents |= POLLIN;
+ }
} else if(fd0->state == USERSPACE_FD_STATE_PIPE) {
if(fd0->pipe_side != PIPE_SIDE_READ)
continue;
@@ -802,11 +798,8 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
} else {
std::int64_t ret = vfs::vfs::poll(fd0,POLLIN);
-
-
- if(ret > fd0->read_counter) {
- fd0->read_counter = ret;
+ if(ret != 0) {
num_events++;
fd[i].revents |= POLLIN;
}
@@ -845,9 +838,7 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
} else {
std::int64_t ret = vfs::vfs::poll(fd0,POLLOUT);
- if(ret > fd0->write_counter) {
-
- fd0->write_counter = ret;
+ if(ret != 0) {
num_events++;
fd[i].revents |= POLLOUT;
}
@@ -861,7 +852,7 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
}
if(success == false) {
- //DEBUG(proc->id == 17,"Poll done (optimization) from proc %d",proc->id);
+ DEBUG(proc->is_debug,"Poll done (optimization) from proc %d",proc->id);
//copy_in_userspace(proc,fds,fd,count * sizeof(struct pollfd));
vfs::vfs::unlock();
return {1,0,num_events};
@@ -900,6 +891,14 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
}
fd0->write_socket_pipe->lock.unlock();
fd0->read_socket_pipe->lock.unlock();
+ } else if(fd0->state == USERSPACE_FD_STATE_SOCKET && fd0->is_listen) {
+ if(fd0->read_counter == -1)
+ fd0->read_counter = 0;
+ if(sockets::find(fd0->path)->socket_counter > fd0->read_counter) {
+ fd0->read_counter++;
+ num_events++;
+ fd[i].revents |= POLLIN;
+ }
} else if(fd0->state == USERSPACE_FD_STATE_PIPE) {
if(fd0->pipe_side != PIPE_SIDE_READ)
continue;
@@ -912,9 +911,7 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
} else {
std::int64_t ret = vfs::vfs::poll(fd0,POLLIN);
-
- if(ret > fd0->read_counter) {
- fd0->read_counter = ret;
+ if(ret != 0) {
num_events++;
fd[i].revents |= POLLIN;
}
@@ -953,9 +950,7 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
} else {
std::int64_t ret = vfs::vfs::poll(fd0,POLLOUT);
- if(ret > fd0->write_counter) {
-
- fd0->write_counter = ret;
+ if(ret != 0) {
num_events++;
fd[i].revents |= POLLOUT;
}
@@ -1006,6 +1001,14 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
}
fd0->write_socket_pipe->lock.unlock();
fd0->read_socket_pipe->lock.unlock();
+ } else if(fd0->state == USERSPACE_FD_STATE_SOCKET && fd0->is_listen) {
+ if(fd0->read_counter == -1)
+ fd0->read_counter = 0;
+ if(sockets::find(fd0->path)->socket_counter > fd0->read_counter) {
+ fd0->read_counter++;
+ num_events++;
+ fd[i].revents |= POLLIN;
+ }
} else if(fd0->state == USERSPACE_FD_STATE_PIPE) {
fd0->pipe->lock.lock();
if(fd0->pipe->size > 0) {
@@ -1017,8 +1020,7 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
std::int64_t ret = vfs::vfs::poll(fd0,POLLIN);
- if(ret > fd0->read_counter) {
- fd0->read_counter = ret;
+ if(ret != 0) {
num_events++;
fd[i].revents |= POLLIN;
}
@@ -1056,10 +1058,7 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
fd0->pipe->lock.unlock();
} else {
std::int64_t ret = vfs::vfs::poll(fd0,POLLOUT);
-
- if(ret > fd0->write_counter) {
-
- fd0->write_counter = ret;
+ if(ret != 0) {
num_events++;
fd[i].revents |= POLLOUT;
}
@@ -1088,7 +1087,7 @@ syscall_ret_t sys_poll(struct pollfd *fds, int count, int timeout) {
if(is_first)
vfs::vfs::unlock();
- //DEBUG(proc->id == 17,"Poll done timeout %d from proc %d num_ev %d",timeout,proc->id,num_events);
+ DEBUG(proc->is_debug,"%d from proc %d num_ev %d",timeout,proc->id,num_events);
//copy_in_userspace(proc,fds,fd,count * sizeof(struct pollfd));
return {1,0,num_events};
diff --git a/kernel/src/arch/x86_64/syscalls/process.cpp b/kernel/src/arch/x86_64/syscalls/process.cpp
index 420207c..016398d 100644
--- a/kernel/src/arch/x86_64/syscalls/process.cpp
+++ b/kernel/src/arch/x86_64/syscalls/process.cpp
@@ -48,6 +48,9 @@ syscall_ret_t sys_libc_log(const char* msg) {
}
syscall_ret_t sys_exit(int status) {
+
+ memory::paging::enablekernel();
+
arch::x86_64::process_t* proc = CURRENT_PROC;
proc->exit_code = status;
@@ -60,7 +63,7 @@ syscall_ret_t sys_exit(int status) {
vfs::vfs::close(fd);
}
userspace_fd_t* next = fd->next;
- memory::pmm::_virtual::free(fd);
+ delete (void*)fd;
fd = next;
}
@@ -92,11 +95,11 @@ syscall_ret_t sys_mmap(std::uint64_t hint, std::uint64_t size, int fd0, int_fram
int is_shared = (flags & MAP_SHARED) ? 1 : 0;
if(!new_hint) {
if(is_shared) {
- new_hint = (std::uint64_t)memory::vmm::alloc(proc,size,PTE_PRESENT | PTE_USER | PTE_RW,is_shared == 1 ? 1 : 0);
+ new_hint = (std::uint64_t)memory::vmm::alloc(proc,size,PTE_PRESENT | PTE_USER | PTE_RW,0);
} else
new_hint = (std::uint64_t)memory::vmm::alloc(proc,size,PTE_PRESENT | PTE_USER | PTE_RW,0);
} else
- memory::vmm::customalloc(proc,new_hint,size,PTE_PRESENT | PTE_RW | PTE_USER,is_shared == 1 ? 1 : 0);
+ memory::vmm::customalloc(proc,new_hint,size,PTE_PRESENT | PTE_RW | PTE_USER,0);
memory::paging::enablepaging(ctx->cr3); // try to reset tlb
@@ -149,11 +152,20 @@ syscall_ret_t sys_mmap(std::uint64_t hint, std::uint64_t size, int fd0, int_fram
}
syscall_ret_t sys_free(void *pointer, size_t size) {
+
arch::x86_64::process_t* proc = CURRENT_PROC;
std::uint64_t phys = memory::vmm::get(proc,(std::uint64_t)pointer)->phys;
- if(!memory::vmm::get(proc,(std::uint64_t)pointer)->is_mapped && !memory::vmm::get(proc,(std::uint64_t)pointer)->is_lazy_alloc)
- memory::pmm::_physical::free(phys);
- memory::vmm::get(proc,(std::uint64_t)pointer)->phys = 0;
+ vmm_obj_t* current = memory::vmm::get(proc, (std::uint64_t)pointer);
+ vmm_obj_t* start = (vmm_obj_t*)proc->vmm_start;
+
+ start->lock.lock();
+ memory::pmm::_physical::free(current->phys);
+ start->lock.unlock();
+
+ memory::paging::maprangeid(proc->original_cr3,0,(std::uint64_t)current->base,0,0,0);
+ current->phys = 0;
+ current->is_free = 1;
+
return {0,0,0};
}
@@ -164,10 +176,10 @@ syscall_ret_t sys_fork(int D, int S, int d, int_frame_t* ctx) {
arch::x86_64::process_t* new_proc = arch::x86_64::scheduling::fork(proc,ctx);
new_proc->ctx.rax = 0;
new_proc->ctx.rdx = 0;
-
+
arch::x86_64::scheduling::wakeup(new_proc);
- DEBUG(proc->is_debug,"Fork from proc %d, new proc %d",proc->id,new_proc->id);
+ DEBUG(1,"Fork from proc %d, new proc %d",proc->id,new_proc->id);
new_proc->is_debug = proc->is_debug;
return {1,0,new_proc->id};
@@ -579,10 +591,12 @@ syscall_ret_t sys_clone(std::uint64_t stack, std::uint64_t rip, int c, int_frame
arch::x86_64::process_t* proc = CURRENT_PROC;
arch::x86_64::process_t* new_proc = arch::x86_64::scheduling::clone(proc,ctx);
- memory::paging::maprangeid(new_proc->original_cr3,Other::toPhys(new_proc->syscall_stack),(std::uint64_t)new_proc->syscall_stack,SYSCALL_STACK_SIZE,PTE_USER | PTE_PRESENT | PTE_RW,*new_proc->vmm_id);
vmm_obj_t* st = (vmm_obj_t*)new_proc->vmm_start;
+
+ st->lock.lock();
st->pthread_count++;
+ st->lock.unlock();
new_proc->ctx.rax = 0;
new_proc->ctx.rdx = 0;
diff --git a/kernel/src/arch/x86_64/syscalls/syscalls.cpp b/kernel/src/arch/x86_64/syscalls/syscalls.cpp
index b518864..398c9d4 100644
--- a/kernel/src/arch/x86_64/syscalls/syscalls.cpp
+++ b/kernel/src/arch/x86_64/syscalls/syscalls.cpp
@@ -100,7 +100,12 @@ extern "C" void syscall_handler_c(int_frame_t* ctx) {
arch::x86_64::process_t* proc = arch::x86_64::cpu::data()->temp.proc;
proc->sys = ctx->rax;
- //DEBUG(proc->id == 13,"sys %d from %d",ctx->rax,proc->id);
+ extern int last_sys;
+ last_sys = ctx->rax;
+
+ arch::x86_64::cpu::data()->last_sys = ctx->rax;
+
+ DEBUG(0,"sys %d from %d",ctx->rax,proc->id);
syscall_ret_t (*sys)(std::uint64_t D, std::uint64_t S, std::uint64_t d, int_frame_t* frame) = (syscall_ret_t (*)(std::uint64_t, std::uint64_t, std::uint64_t, int_frame_t*))item->syscall_func;
@@ -111,12 +116,13 @@ extern "C" void syscall_handler_c(int_frame_t* ctx) {
DEBUG(proc->is_debug,"rdx ret 0x%p smaller than zero from sys %d",ret.ret_val,ctx->rax);
}
+ last_sys = 0;
DEBUG(0,"sys ret %d from proc %d ",ret.ret,proc->id);
if(ret.ret != 0 && ret.ret != EAGAIN)
DEBUG(proc->is_debug,"Syscall %d from proc %d fails with code %d",ctx->rax,proc->id,ret.ret);
- ctx->rax = ret.ret;
+ ctx->rax = ret.ret;
return;
}
@@ -125,4 +131,5 @@ void arch::x86_64::syscall::init() {
__wrmsr(LSTAR,(uint64_t)syscall_handler);
__wrmsr(STAR_MASK,(1 << 9)); // syscalls will enable interrupts when gs is swapped + stack is saved
__wrmsr(EFER,__rdmsr(EFER) | 1);
-} \ No newline at end of file
+}
+
diff --git a/kernel/src/drivers/acpi.cpp b/kernel/src/drivers/acpi.cpp
index 4a7e32f..6a1e6d4 100644
--- a/kernel/src/drivers/acpi.cpp
+++ b/kernel/src/drivers/acpi.cpp
@@ -55,7 +55,7 @@ void drivers::acpi::init() {
drivers::ioapic::init();
Log::Display(LEVEL_MESSAGE_OK,"IOAPIC initializied\n");
- arch::x86_64::cpu::data()->lapic_block = arch::x86_64::cpu::lapic::init(15000);
+ arch::x86_64::cpu::data()->lapic_block = arch::x86_64::cpu::lapic::init(2500);
ret = uacpi_namespace_load();
diff --git a/kernel/src/generic/mm/paging.cpp b/kernel/src/generic/mm/paging.cpp
index a299eb7..ed4819a 100644
--- a/kernel/src/generic/mm/paging.cpp
+++ b/kernel/src/generic/mm/paging.cpp
@@ -44,6 +44,24 @@ void memory::paging::mapid(std::uint64_t cr3,std::uint64_t phys,std::uint64_t vi
pml[PTE_INDEX(align_virt,12)] = align_phys | flags;
}
+void memory::paging::change(std::uint64_t cr3, std::uint64_t virt, std::uint64_t flags) {
+ std::uint64_t align_virt = ALIGNDOWN(virt,4096);
+ std::uint64_t* cr30 = (std::uint64_t*)Other::toVirt(cr3);
+ std::uint64_t new_flags = PTE_PRESENT | PTE_RW;
+ if(PTE_INDEX(align_virt,39) < 256)
+ new_flags |= PTE_USER;
+ uint64_t* pml3 = __paging_next_level(cr30,PTE_INDEX(align_virt,39),new_flags,0);
+ uint64_t* pml2 = __paging_next_level(pml3,PTE_INDEX(align_virt,30),new_flags,0);
+ uint64_t* pml = __paging_next_level(pml2,PTE_INDEX(align_virt,21),new_flags,0);
+ pml[PTE_INDEX(align_virt,12)] = (pml[PTE_INDEX(align_virt,12)] & PTE_MASK_VALUE) | flags;
+}
+
+void memory::paging::changerange(std::uint64_t cr3, std::uint64_t virt, std::uint64_t len , std::uint64_t flags) {
+ for(std::uint64_t i = 0;i < len; i += 4096) {
+ change(cr3,virt + i, flags);
+ }
+}
+
void memory::paging::maprange(std::uint64_t cr3,std::uint64_t phys,std::uint64_t virt,std::uint64_t len,std::uint64_t flags) {
for(std::uint64_t i = 0; i <= len; i += 4096) {
map(cr3,phys + i,virt + i,flags);
diff --git a/kernel/src/generic/mm/pmm.cpp b/kernel/src/generic/mm/pmm.cpp
index 2f5021a..eeb072c 100644
--- a/kernel/src/generic/mm/pmm.cpp
+++ b/kernel/src/generic/mm/pmm.cpp
@@ -172,16 +172,19 @@ void memory::buddy::init() {
}
-void memory::buddy::free(std::uint64_t phys) {
+int memory::buddy::free(std::uint64_t phys) {
auto blud = buddy_find_by_phys_without_split(phys);
if(!blud || blud->is_splitted)
- return;
+ return -1;
blud->is_free = 1;
blud->id = 0;
if(blud->parent)
merge(blud);
+ return 0;
}
+int last_i = 0;
+
std::int64_t memory::buddy::alloc(std::size_t size) {
std::uint64_t top_size = UINT64_MAX;
buddy_info_t* nearest_buddy = 0;
@@ -193,11 +196,12 @@ std::int64_t memory::buddy::alloc(std::size_t size) {
if(LEVEL_TO_SIZE(mem.mem[i].level) >= size && LEVEL_TO_SIZE(mem.mem[i].level) < top_size && mem.mem[i].is_free) {
top_size = LEVEL_TO_SIZE(mem.mem[i].level);
nearest_buddy = &mem.mem[i];
- if(top_size == size)
- break;
+ if(top_size == size) {
+ last_i = i; break; }
}
}
+found:
if(nearest_buddy) {
auto blud = split_maximum(nearest_buddy,size);
blud->is_free = 0;
@@ -273,21 +277,102 @@ std::int64_t memory::buddy::allocid(std::size_t size,std::uint32_t id0) {
void memory::buddy::fullfree(std::uint32_t id) {
for(std::uint64_t i = 0;i < mem.buddy_queue; i++) {
if(mem.mem[i].id == id) {
- free(mem.mem[i].phys);
+ //free(mem.mem[i].phys);
}
}
}
+/* freelist allocator */
+
+template <int N>
+struct freelist_allocated_memory {
+ std::uint64_t arr[131072];
+};
+
+template <int N>
+struct memory_id_block {
+ std::uint64_t phys_block[N];
+ struct memory_id_block* next;
+};
+
+typedef struct memory_id_block<4> memory_id_t;
+
+typedef struct freelist_allocated_memory<1048576> freelist_allocated_memory_t;
+
+std::uint64_t freelist_page = 0;
+
+freelist_allocated_memory_t freelist_aloc_mem;
+int freelist_aloc_mem_ptr = 0;
+
+int memory::freelist::free(std::uint64_t phys) {
+ if(phys == 0)
+ return -1;
+ // sorry but my freelist free is O(n) :(
+
+ int success = 0;
+
+ //Log::SerialDisplay(LEVEL_MESSAGE_INFO,"freelist: free 0x%p\n",phys);
+
+ for(int i = 0; i < freelist_aloc_mem_ptr; i++) {
+ if(phys >= freelist_aloc_mem.arr[i] && phys < freelist_aloc_mem.arr[i] + (1024 * 1024)) {
+ success = 1;
+ break;
+ }
+ }
+
+ if(!success) {
+ return -1; // not free list memory, ignore
+ }
+
+ memset(Other::toVirt(phys),0,4096);
+
+ *((std::uint64_t*)Other::toVirt(phys)) = freelist_page;
+ freelist_page = phys;
+ return 0;
+}
+
+std::int64_t memory::freelist::alloc() {
+ if(!freelist_page) { // request memory from buddy, 1 mb will be enough
+ std::uint64_t phys = memory::buddy::alloc(1024 * 1024);
+
+ freelist_aloc_mem.arr[freelist_aloc_mem_ptr++] = phys;
+
+ std::uint64_t ptr = phys;
+ while(1) {
+ if(ptr >= phys + (1024 * 1024))
+ break;
+ free(ptr);
+ ptr += 4096;
+ }
+ }
+ std::uint64_t freelist_mem = freelist_page;
+ freelist_page = *((std::uint64_t*)Other::toVirt(freelist_mem));
+ return freelist_mem;
+}
+
/* pmm wrapper */
void memory::pmm::_physical::init() {
+ memset(&freelist_aloc_mem,0,sizeof(freelist_aloc_mem));
memory::buddy::init();
}
+int __is_in_freelist_array(std::uint64_t phys) {
+ for(int i = 0;i < freelist_aloc_mem_ptr; i++) {
+ if(phys >= freelist_aloc_mem.arr[i] && phys < freelist_aloc_mem.arr[i] + (1024 * 1024))
+ return 1;
+ }
+ return 0;
+}
+
void memory::pmm::_physical::free(std::uint64_t phys) {
asm volatile("cli");
pmm_lock.lock();
- memory::buddy::free(phys);
+ int status = -1;
+ if(!__is_in_freelist_array(phys)) // not used by freelist ?
+ status = memory::buddy::free(phys);
+ if(status != 0)
+ memory::freelist::free(phys);
pmm_lock.unlock();
}
@@ -300,7 +385,12 @@ void memory::pmm::_physical::fullfree(std::uint32_t id) {
std::int64_t memory::pmm::_physical::alloc(std::size_t size) {
asm volatile("cli");
pmm_lock.lock();
- std::int64_t p = memory::buddy::alloc(size);
+ std::int64_t p = 0;
+ if(size == 4096) { // sure we can do freelist optimization
+ p = memory::freelist::alloc();
+ } else {
+ p = memory::buddy::alloc(size);
+ }
pmm_lock.unlock();
return p;
}
@@ -308,7 +398,12 @@ std::int64_t memory::pmm::_physical::alloc(std::size_t size) {
std::int64_t memory::pmm::_physical::allocid(std::size_t size, std::uint32_t id) {
asm volatile("cli");
pmm_lock.lock();
- std::int64_t p = memory::buddy::allocid(size,id);
+ std::int64_t p = 0;
+ if(size == 4096) { // sure we can do freelist optimization
+ p = memory::freelist::alloc();
+ } else {
+ p = memory::buddy::allocid(size,id);
+ }
pmm_lock.unlock();
return p;
}
diff --git a/kernel/src/generic/vfs/devfs.cpp b/kernel/src/generic/vfs/devfs.cpp
index fb62d21..1f3f27f 100644
--- a/kernel/src/generic/vfs/devfs.cpp
+++ b/kernel/src/generic/vfs/devfs.cpp
@@ -222,7 +222,10 @@ std::int64_t __devfs__read(userspace_fd_t* fd, char* path, void* buffer, std::ui
if(node->open_flags.is_pipe_rw) {
vfs::vfs::unlock();
- status = is_master ? node->writepipe->read(&fd->read_counter,(char*)buffer,count,(fd->flags & O_NONBLOCK) ? 1 : 0) : node->readpipe->read(&fd->read_counter,(char*)buffer,count,(fd->flags & O_NONBLOCK) ? 1 : 0);
+ if(!node->is_tty)
+ status = is_master ? node->writepipe->read(&fd->read_counter,(char*)buffer,count,(fd->flags & O_NONBLOCK) ? 1 : 0) : node->readpipe->read(&fd->read_counter,(char*)buffer,count,(fd->flags & O_NONBLOCK) ? 1 : 0);
+ else
+ status = is_master ? node->writepipe->read(&fd->read_counter,(char*)buffer,count,(fd->flags & O_NONBLOCK) ? 1 : 0) : node->readpipe->ttyread(&fd->read_counter,(char*)buffer,count,(fd->flags & O_NONBLOCK) ? 1 : 0);
} else {
//DEBUG(1,"read %s ring count %d",path,count);
status = is_master ? node->writering->receivevals(buffer,dev_num,count,&fd->cycle,&fd->queue) : node->readring->receivevals(buffer,dev_num,count,&fd->cycle,&fd->queue);
@@ -314,60 +317,46 @@ std::int64_t __devfs__poll(userspace_fd_t* fd, char* path, int operation_type) {
std::int64_t ret = 0;
if(node->open_flags.is_pipe_rw) {
- switch (operation_type)
- {
-
- case POLLIN:
- ret = !is_slave ? node->writepipe->read_counter : node->readpipe->read_counter;
- if(!is_slave)
- if(fd->read_counter == -1 && node->writepipe->size != 0)
- ret = 0;
- else
- if(fd->read_counter == -1 && node->readpipe->size != 0)
- ret = 0;
-
-
- break;
-
- case POLLOUT:
- ret = !is_slave ? node->readpipe->write_counter : node->writepipe->write_counter;
- if(ret == fd->write_counter) {
- if(!is_slave) {
- if(node->readpipe->size != node->readpipe->total_size) {
- // fix this shit
- node->readpipe->write_counter++;
- }
- } else {
- if(node->writepipe->size != node->writepipe->total_size) {
- node->writepipe->write_counter++;
- }
+ node->writepipe->lock.lock();
+ node->readpipe->lock.lock();
+ if(operation_type == POLLIN) {
+ if(!is_slave) {
+ ret = node->writepipe->size != 0 ? 1 : 0;
+ } else {
+ if(!node->is_tty)
+ ret = node->readpipe->size != 0 ? 1 : 0;
+ else {
+ ret = (node->readpipe->tty_ret && node->readpipe->size != 0) != 0 ? 1 : 0;
}
- ret = !is_slave ? node->readpipe->write_counter : node->writepipe->write_counter;
}
-
- break;
-
- default:
- break;
+ } else if(operation_type == POLLOUT) {
+ if(!is_slave) {
+ ret = node->writepipe->size != node->writepipe->total_size ? 1 : 0;
+ } else {
+ ret = node->readpipe->size != node->readpipe->total_size ? 1 : 0;
+ }
}
+ node->writepipe->lock.unlock();
+ node->readpipe->lock.unlock();
} else {
if(operation_type == POLLIN) {
- ret = !is_slave ? node->writering->read_counter : node->readring->read_counter;
- if(!is_slave && ret == fd->read_counter) {
+ ret = 0;
+ if(!is_slave) {
if(node->writering->isnotempty((int*)&fd->queue,(char*)&fd->cycle)) {
- fd->read_counter--;
+ ret = 1;
}
- } else if(ret == fd->read_counter && is_slave) {
+ } else if(is_slave) {
if(node->readring->isnotempty((int*)&fd->queue,(char*)&fd->cycle)) {
- fd->read_counter--;
+ ret = 1;
}
}
} else if(operation_type == POLLOUT) {
- ret = !is_slave ? ++node->readring->write_counter : ++node->writering->write_counter;
+ ret = 1;
}
}
+
return ret;
}
diff --git a/kernel/src/generic/vfs/tmpfs.cpp b/kernel/src/generic/vfs/tmpfs.cpp
index 4f8dbe5..48fd087 100644
--- a/kernel/src/generic/vfs/tmpfs.cpp
+++ b/kernel/src/generic/vfs/tmpfs.cpp
@@ -404,8 +404,7 @@ std::int32_t __tmpfs__readlink(char* path, char* out, std::uint32_t out_len) {
if(!node->content)
return EINVAL; // symlink is not initializied now :(
- memset(out,0,out_len);
- memcpy(out,node->content,node->size);
+ memcpy(out,node->content,node->size + 1);
return 0;
}
diff --git a/kernel/src/generic/vfs/vfs.cpp b/kernel/src/generic/vfs/vfs.cpp
index 950bfb2..e54b2c7 100644
--- a/kernel/src/generic/vfs/vfs.cpp
+++ b/kernel/src/generic/vfs/vfs.cpp
@@ -83,35 +83,29 @@ char * __vfs__strtok(char *str, const char *delim) {
void __vfs_symlink_resolve(char* path, char* out) {
char buffer[2048];
- memset(buffer,0,2048);
int e = vfs::vfs::readlink(path,buffer,2048);
if(!vfs_lock->test())
Log::Display(LEVEL_MESSAGE_WARN,"vfs_lock didnt set lock in symlink resolve");
- memset(out,0,2048);
-
if(e == ENOSYS)
- memcpy(out,path,strlen(path));
+ memcpy(out,path,strlen(path) + 1);
if(e == EINVAL)
- memcpy(out,path,strlen(path));
+ memcpy(out,path,strlen(path) + 1);
else if(e == 0) {
char result[2048];
- memset(result,0,2048);
vfs::resolve_path(buffer,path,result,0,1);
__vfs_symlink_resolve(result,out);
} else if(e == ENOENT) {
- memcpy(out,path,strlen(path));
+ memcpy(out,path,strlen(path) + 1);
// maybe it wants directory symlink ?
char path0[2048];
- memset(path0,0,2048);
- memcpy(path0,path,strlen(path));
+ memcpy(path0,path,strlen(path) + 1);
char result[2048];
- memset(result,0,2048);
int c = 0;
@@ -132,7 +126,6 @@ void __vfs_symlink_resolve(char* path, char* out) {
e = vfs::vfs::readlink(result,buffer,2048);
if(e == 0) {
char buffer2[2048];
- memset(buffer2,0,2048);
vfs::resolve_path(buffer,result,buffer2,0,1);
c = strlen(buffer2);
buffer2[c++] = '/';
@@ -140,12 +133,12 @@ void __vfs_symlink_resolve(char* path, char* out) {
__vfs_symlink_resolve(buffer2,out);
return;
} else if(e == ENOENT) {
- memcpy(out,path,strlen(path));
+ memcpy(out,path,strlen(path) + 1);
}
token = __vfs__strtok(0,"/");
}
- memcpy(out,path,strlen(path));
+ memcpy(out,path,strlen(path) + 1);
}
}
@@ -192,14 +185,13 @@ std::int64_t vfs::vfs::write(userspace_fd_t* fd, void* buffer, std::uint64_t siz
vfs_lock->lock();
char out[2048];
- memset(out,0,2048);
if(!fd->is_cached_path) {
__vfs_symlink_resolve(fd->path,out);
- memcpy(fd->path,out,strlen(out));
+ memcpy(fd->path,out,strlen(out) + 1);
fd->is_cached_path = 1;
} else
- memcpy(out,fd->path,strlen(fd->path));
+ memcpy(out,fd->path,strlen(fd->path) + 1);
if(is_fifo_exists(out)) {
@@ -225,19 +217,17 @@ std::int64_t vfs::vfs::read(userspace_fd_t* fd, void* buffer, std::uint64_t coun
vfs_lock->lock();
char out[2048];
- memset(out,0,2048);
if(!fd->is_cached_path) {
__vfs_symlink_resolve(fd->path,out);
- memcpy(fd->path,out,strlen(out));
+ memcpy(fd->path,out,strlen(out) + 1);
fd->is_cached_path = 1;
} else
- memcpy(out,fd->path,strlen(fd->path));
+ memcpy(out,fd->path,strlen(fd->path) + 1);
if(is_fifo_exists(out)) {
fifo_node_t* fifo = fifo_get(out);
vfs_lock->unlock();
- asm volatile("sti");
return fifo->main_pipe->read(&fd->read_counter,(char*)buffer,count,(fd->flags & O_NONBLOCK) ? 1 : 0);
}
@@ -313,8 +303,7 @@ std::int32_t vfs::vfs::open(userspace_fd_t* fd) {
if(!fd->is_cached_path) {
__vfs_symlink_resolve(fd->path,out);
- memset(fd->path,0,2048);
- memcpy(fd->path,out,strlen(out));
+ memcpy(fd->path,out,strlen(out) + 1);
fd->is_cached_path = 1;
} else
memcpy(out,fd->path,strlen(fd->path));
@@ -642,111 +631,6 @@ std::int32_t vfs::vfs::readlink(char* path, char* out, std::uint32_t out_len) {
std::int64_t vfs::vfs::poll(userspace_fd_t* fd, int operation_type) {
- if(fd->state == USERSPACE_FD_STATE_SOCKET) {
- if(fd->is_listen) {
- uint64_t counter = 0;
- if(operation_type == POLLIN) {
- if(sockets::find(fd->path)->socket_counter > fd->read_counter) {
- counter = fd->read_counter + 1;
- }
- }
- return counter;
- }
- }
-
- if(fd->state == USERSPACE_FD_STATE_SOCKET) {
- std::int64_t ret = 0;
- switch (operation_type)
- {
-
- case POLLIN:
- fd->write_socket_pipe->lock.lock();
- fd->read_socket_pipe->lock.lock();
- ret = fd->other_state == USERSPACE_FD_OTHERSTATE_MASTER ? fd->write_socket_pipe->read_counter : fd->read_socket_pipe->read_counter;
- if(fd->other_state == USERSPACE_FD_OTHERSTATE_MASTER)
- if(fd->write_socket_pipe->size != 0 && fd->read_counter == -1)
- ret = 0;
- if(fd->other_state == USERSPACE_FD_OTHERSTATE_SLAVE)
- if(fd->read_socket_pipe->size != 0 && fd->read_counter == -1)
- ret = 0;
-
- if(fd->other_state == USERSPACE_FD_OTHERSTATE_MASTER) {
- if(fd->write_socket_pipe->read_counter == ret && fd->write_socket_pipe->size != 0) {
- fd->write_socket_pipe->read_counter++;
- }
- }
-
- if(fd->other_state == USERSPACE_FD_OTHERSTATE_SLAVE) {
- if(fd->read_socket_pipe->read_counter == ret && fd->read_socket_pipe->size != 0) {
- fd->read_socket_pipe->read_counter++;
- }
- }
-
-
- ret = fd->other_state == USERSPACE_FD_OTHERSTATE_MASTER ? fd->write_socket_pipe->read_counter : fd->read_socket_pipe->read_counter;
- fd->write_socket_pipe->lock.unlock();
- fd->read_socket_pipe->lock.unlock();
-
- break;
-
- case POLLOUT:
- fd->write_socket_pipe->lock.lock();
- fd->read_socket_pipe->lock.lock();
- ret = fd->other_state == USERSPACE_FD_OTHERSTATE_MASTER ? fd->read_socket_pipe->write_counter : fd->write_socket_pipe->write_counter;
-
- if(fd->other_state == USERSPACE_FD_OTHERSTATE_MASTER) {
- if(1) {
- fd->read_socket_pipe->write_counter++;
- }
- }
-
- if(fd->other_state == USERSPACE_FD_OTHERSTATE_SLAVE) {
- if(1) {
- fd->write_socket_pipe->write_counter++;
- }
- }
-
- ret = fd->other_state == USERSPACE_FD_OTHERSTATE_MASTER ? fd->read_socket_pipe->write_counter : fd->write_socket_pipe->write_counter;
-
- fd->write_socket_pipe->lock.unlock();
- fd->read_socket_pipe->lock.unlock();
-
- break;
-
- default:
- break;
- }
- return ret;
- } else if(fd->state == USERSPACE_FD_STATE_PIPE) {
-
- std::int64_t ret = 0;
- switch (operation_type)
- {
-
- case POLLIN:
- ret = fd->pipe->read_counter;
- if(fd->pipe->read_counter == -1 && fd->pipe->size != 0)
- ret = 0;
- if(fd->pipe->read_counter == ret && fd->pipe->size != 0) {
- fd->pipe->read_counter++;
- ret = fd->pipe->read_counter;
- }
- break;
-
- case POLLOUT:
- ret = fd->pipe->write_counter;
- if(fd->pipe->write_counter == ret && fd->pipe->size != fd->pipe->total_size) {
- fd->pipe->write_counter++;
- ret = fd->pipe->write_counter;
- }
- break;
-
- default:
- break;
- }
- return ret;
- }
-
char out0[2048];
memset(out0,0,2048);
@@ -768,21 +652,15 @@ std::int64_t vfs::vfs::poll(userspace_fd_t* fd, int operation_type) {
{
case POLLIN:
- ret = fifo->main_pipe->read_counter;
- if(fifo->main_pipe->size != 0 && fd->read_counter == -1)
- ret = 0;
- if(fifo->main_pipe->size != 0 && ret == fd->read_counter) {
- fifo->main_pipe->read_counter++;
- ret = fifo->main_pipe->read_counter;
- }
+ fifo->main_pipe->lock.lock();
+ ret = fifo->main_pipe->size != 0 ? 1 : 0;
+ fifo->main_pipe->lock.lock();
break;
case POLLOUT:
- ret = fifo->main_pipe->write_counter;
- if(fifo->main_pipe->write_counter == ret && fifo->main_pipe->size != fifo->main_pipe->total_size) {
- fifo->main_pipe->write_counter++;
- ret = fifo->main_pipe->write_counter;
- }
+ fifo->main_pipe->lock.lock();
+ ret = fifo->main_pipe->size < fifo->main_pipe->total_size ? 1 : 0;
+ fifo->main_pipe->lock.lock();
break;
default:
diff --git a/kernel/src/lib/uACPI b/kernel/src/lib/uACPI
-Subproject c4d70797a54f3a1843a3e26426e9b57c40fbba7
+Subproject e5e5deea6f4dea0ea81237db39ca061ead048e6
diff --git a/kernel/src/main.asm b/kernel/src/main.asm
index a39143f..88b0d53 100644
--- a/kernel/src/main.asm
+++ b/kernel/src/main.asm
@@ -8,6 +8,14 @@ kmain:
call main
hlt
+global setwp
+setwp:
+ mov rax,cr0
+ or rax, 0x10000
+ mov cr0,rax
+ ret
+
+
section .data
stack_bottom:
resb 1024*128
diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp
index acedbd0..a2f65a1 100644
--- a/kernel/src/main.cpp
+++ b/kernel/src/main.cpp
@@ -115,6 +115,8 @@ extern "C" void main() {
dmesg("Now we are in userspace...");
+ setwp();
+
asm volatile("sti");
while(1) {
diff --git a/strip-all.sh b/strip-all.sh
new file mode 100644
index 0000000..912a437
--- /dev/null
+++ b/strip-all.sh
@@ -0,0 +1,20 @@
+
+export LIBTOOL="$HOME/opt/cross/orange/bin/libtool"
+export LIBTOOLIZE="$HOME/opt/cross/orange/bin/libtoolize"
+export PATH="$HOME/opt/cross/orange/bin:$PATH"
+
+sysroot_path="$(realpath initrd)"
+
+export CFLAGS="-fPIC -Wno-error -O2 -Wno-incompatible-pointer-types"
+export PKG_CONFIG_SYSROOT_DIR="$sysroot_path"
+export PKG_CONFIG_PATH="$sysroot_path/usr/lib/pkgconfig:$sysroot_path/usr/share/pkgconfig:$sysroot_path/usr/local/lib/pkgconfig:$sysroot_path/usr/local/share/pkgconfig:$HOME/opt/cross/orange/lib/pkgconfig:$HOME/opt/cross/orange/share/pkgconfig"
+if [ ! "$(which x86_64-orange-mlibc-gcc)" ]; then
+ echo "It looks like you don't have the cross-compiler installed, or it isn't in your PATH."
+ echo "If you built your cross-compiler, add it to your PATH with:"
+ echo 'export PATH="$HOME/opt/cross/orange/bin:$PATH"'
+ echo 'Alternatively, you can build the cross-compiler with: sh build-cross.sh'
+ echo 'Also you should have host gcc with version < 14 (i am using 13.3.0)'
+ exit 1
+fi
+
+find initrd/usr/lib initrd/usr/bin -type f -print0 | xargs -0 -I{} x86_64-orange-mlibc-strip --strip-all {} \ No newline at end of file
diff --git a/tar-initrd.sh b/tar-initrd.sh
index 402d1b3..4a34259 100755
--- a/tar-initrd.sh
+++ b/tar-initrd.sh
@@ -7,7 +7,7 @@ export PATH="$HOME/opt/cross/orange/bin:$PATH"
sysroot_path="$(realpath initrd)"
-export CFLAGS="-fPIC -Wno-error -O2"
+export CFLAGS="-fPIC -Wno-error -O2 -Wno-incompatible-pointer-types"
export PKG_CONFIG_SYSROOT_DIR="$sysroot_path"
export PKG_CONFIG_PATH="$sysroot_path/usr/lib/pkgconfig:$sysroot_path/usr/share/pkgconfig:$sysroot_path/usr/local/lib/pkgconfig:$sysroot_path/usr/local/share/pkgconfig:$HOME/opt/cross/orange/lib/pkgconfig:$HOME/opt/cross/orange/share/pkgconfig"
if [ ! "$(which x86_64-orange-mlibc-gcc)" ]; then
@@ -20,7 +20,9 @@ if [ ! "$(which x86_64-orange-mlibc-gcc)" ]; then
fi
-bash tools/pkg/build-pkg.sh "$(realpath initrd)"
+cd tools/pkg
+bash build-pkg.sh "$(realpath ../../initrd)"
+cd ../..
cd initrd
diff --git a/tools/initbase/etc/init.sh b/tools/initbase/etc/init.sh
index b27020f..934c86b 100755
--- a/tools/initbase/etc/init.sh
+++ b/tools/initbase/etc/init.sh
@@ -1,2 +1 @@
-cat /etc/orangesad
- orangeX \ No newline at end of file
+orangeX \ No newline at end of file
diff --git a/tools/initbase/root/.config/i3/config b/tools/initbase/root/.config/i3/config
index d64cfaa..f7d571e 100644
--- a/tools/initbase/root/.config/i3/config
+++ b/tools/initbase/root/.config/i3/config
@@ -9,7 +9,7 @@
#
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
-set $mod mod1
+set $mod Control
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
@@ -99,10 +99,10 @@ bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
-bindsym $mod+Shift+space floating toggle
+bindsym $mod+space floating toggle
# change focus between tiling / floating windows
-bindsym $mod+space focus mode_toggle
+bindsym $mod+Shift+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
diff --git a/tools/limine.conf b/tools/limine.conf
index 74886c3..793f0d4 100644
--- a/tools/limine.conf
+++ b/tools/limine.conf
@@ -2,7 +2,7 @@
wallpaper: boot():/boot/bg.jpg
wallpaper_style: stretched
-timeout: 3
+timeout: 0
/Orange
protocol: limine
path: boot():/boot/kernel
diff --git a/tools/pkg/11/other-stuff/settings.ini b/tools/pkg/11/other-stuff/settings.ini
index fe7c737..06a485a 100644
--- a/tools/pkg/11/other-stuff/settings.ini
+++ b/tools/pkg/11/other-stuff/settings.ini
@@ -1,2 +1,2 @@
[Settings]
-gtk-font-name = DejaVu Sans 6 \ No newline at end of file
+gtk-font-name = DejaVu Sans 11 \ No newline at end of file
diff --git a/tools/pkg/2/init/src/main.cpp b/tools/pkg/2/init/src/main.cpp
index e185e13..ee5a9e5 100644
--- a/tools/pkg/2/init/src/main.cpp
+++ b/tools/pkg/2/init/src/main.cpp
@@ -292,7 +292,7 @@ static void tty_init() {
NULL, &default_fg,
NULL, &default_fg_bright,
(void*)unifont_arr, FONT_WIDTH, FONT_HEIGHT, 0,
- 1, 1, margin
+ 1, 1, margin,0
);
master_fd = posix_openpt(O_RDWR | O_NOCTTY);
master_fd = posix_openpt(O_RDWR | O_NOCTTY);
diff --git a/tools/pkg/2/ps2_driver/src/main.c b/tools/pkg/2/ps2_driver/src/main.c
index e1ceee8..defa4e5 100644
--- a/tools/pkg/2/ps2_driver/src/main.c
+++ b/tools/pkg/2/ps2_driver/src/main.c
@@ -11,6 +11,8 @@
#include <stdint.h>
+#include <sched.h>
+
#include <string.h>
#include <unistd.h>
@@ -164,6 +166,8 @@ typedef struct {
int main() {
+ log(LEVEL_MESSAGE_WARN,"PS/2 driver is unstable and can be broken on some HW/VM, use USB instead of it\n");
+
int pid = fork();
if(pid > 0)
@@ -220,91 +224,55 @@ int main() {
ps2_flush();
- int irq1 = open("/dev/irq1",O_RDWR);
- int irq12 = open("/dev/irq12",O_RDWR);
-
- struct pollfd irq_fds[2];
-
- irq_fds[0].events = POLLIN;
- irq_fds[0].fd = irq1;
- irq_fds[1].events = POLLIN;
- irq_fds[1].fd = irq12;
-
int mouse_seq = 0;
-
if(1) {
uint8_t mouse_buffer[4] = {0,0,0,0};
while(1) {
- int num_events = poll(irq_fds,2,200);
- if(num_events < 0) {
- perror("Failed to poll irq fds");
- exit(-1);
- }
- if(num_events == 0) {
- mouse_seq = 0;
- ps2_flush();
+ if(1) {
+
int val = 1;
- write(irq1,&val,1);
- write(irq12,&val,1);
- }
- if(irq_fds[1].revents & POLLIN) {
- char val = 0;
- int count = read(irq12,&val,1);
- if(count && val == 1) {
-
- mouse_buffer[mouse_seq++] = inb(DATA);
-
- if(mouse_seq != 3) {
- write(irq1,&val,1);
- write(irq12,&val,1);
- continue; }
-
- mouse_packet_t packet = {0,0,0,0};
-
- packet.x = mouse_buffer[1] - (mouse_buffer[0] & 0x10 ? 0x100 : 0);
- packet.y = mouse_buffer[2] - (mouse_buffer[0] & 0x20 ? 0x100 : 0);
- packet.z = (mouse_buffer[3] & 0x7) * (mouse_buffer[3] & 0x8 ? -1 : 1);
-
- packet.buttons |= (mouse_buffer[0] & 1) ? MOUSE_LB : 0;
- packet.buttons |= (mouse_buffer[0] & 2) ? MOUSE_RB : 0;
- packet.buttons |= (mouse_buffer[0] & 4) ? MOUSE_MB : 0;
-
- packet.buttons |= (mouse_buffer[0] & 0x10) ? MOUSE_B4 : 0;
- packet.buttons |= (mouse_buffer[0] & 0x20) ? MOUSE_B5 : 0;
-
- write(mastermouse,&packet,4);
-
- mouse_seq = 0;
-
- write(irq1,&val,1);
- write(irq12,&val,1);
-
- }
- }
+ uint8_t status = inb(0x64);
+ while(status & 1) {
+ int data = inb(DATA);
+
+ if(status & (1 << 5)) {
+ mouse_buffer[mouse_seq++] = data;
+
+ if(mouse_seq == 3) {
+ mouse_packet_t packet = {0,0,0,0};
+
+ packet.x = mouse_buffer[1] - (mouse_buffer[0] & 0x10 ? 0x100 : 0);
+ packet.y = mouse_buffer[2] - (mouse_buffer[0] & 0x20 ? 0x100 : 0);
+ packet.z = (mouse_buffer[3] & 0x7) * (mouse_buffer[3] & 0x8 ? -1 : 1);
+
+ packet.buttons |= (mouse_buffer[0] & 1) ? MOUSE_LB : 0;
+ packet.buttons |= (mouse_buffer[0] & 2) ? MOUSE_RB : 0;
+ packet.buttons |= (mouse_buffer[0] & 4) ? MOUSE_MB : 0;
+
+ packet.buttons |= (mouse_buffer[0] & 0x10) ? MOUSE_B4 : 0;
+ packet.buttons |= (mouse_buffer[0] & 0x20) ? MOUSE_B5 : 0;
+
+ write(mastermouse,&packet,4);
- if(irq_fds[0].revents & POLLIN) {
- char val = 0;
- int count = read(irq1,&val,1);
- if(count && val == 1) {
- uint8_t scancodes[64];
- int i = 0;
- memset(scancodes,0, 64);
- while((inb(0x64) & 1)) {
- uint8_t scancode = inb(0x60);
- if(i < 64)
- scancodes[i++] = scancode;
+ mouse_seq = 0;
+
+ }
+
+
+
+ } else {
+ write(masterinput,&data,1);
}
- write(masterinput,scancodes,i);
- write(irq1,&val,1); /* Ask kernel to unmask this irq */
- write(irq12,&val,1); /* irq 12 and irq 1 are connected */
+
+ status = inb(0x64);
}
+ sched_yield();
}
-
}
}
exit(0);
diff --git a/tools/pkg/2/xhci_driver/src/main.cpp b/tools/pkg/2/xhci_driver/src/main.cpp
index ba54317..a712e3d 100644
--- a/tools/pkg/2/xhci_driver/src/main.cpp
+++ b/tools/pkg/2/xhci_driver/src/main.cpp
@@ -254,10 +254,11 @@ xhci_trb_t __xhci_event_wait(xhci_device_t* dev,int type) {
if(--timeout == 0) {
xhci_trb_t t;
t.base = 0xDEAD;
+ t.ret_code = 0;
return t;
}
- usleep(500);
+ usleep(5000);
}
}
@@ -322,22 +323,26 @@ int __xhci_enable_slot(xhci_device_t* dev, int portnum) {
xhci_trb_t trb;
memset(&trb,0,sizeof(xhci_trb_t));
+
+ trb.info_s.intoncompletion = 1;
trb.info_s.type = TRB_ENABLESLOTCOMMAND_TYPE;
__xhci_clear_event(dev);
__xhci_command_ring_queue(dev,dev->com_ring,&trb);
__xhci_doorbell(dev,0);
- usleep(10000);
+ usleep(25000);
xhci_trb_t ret = __xhci_event_wait(dev,TRB_COMMANDCOMPLETIONEVENT_TYPE);
- if(ret.base == 0xDEAD)
+ if(ret.base == 0xDEAD) {
+ log(LEVEL_MESSAGE_FAIL,"Timeout for port %d in slot enabling\n",portnum);
return 0;
+ }
xhci_slot_trb_t* slot_ret = (xhci_slot_trb_t*)&ret;
- if(slot_ret->ret_code != 1)
+ if(ret.ret_code != 1)
log(LEVEL_MESSAGE_FAIL,"Can't allocate slot for port %d (ret %d)\n",portnum,ret.ret_code);
return slot_ret->info_s.slotid;
@@ -351,7 +356,6 @@ int __xhci_set_addr(xhci_device_t* dev,uint64_t addr,uint32_t id,char bsr) {
trb.info_s.bsr = 0;
trb.info_s.type = TRB_ADDRESSDEVICECOMMAND_TYPE;
trb.info_s.slotid = id;
-
__xhci_clear_event(dev);
usleep(20000);
@@ -364,7 +368,7 @@ int __xhci_set_addr(xhci_device_t* dev,uint64_t addr,uint32_t id,char bsr) {
xhci_trb_t ret = __xhci_event_wait(dev,TRB_COMMANDCOMPLETIONEVENT_TYPE);
- if(ret.ret_code != 1)
+ if(ret.ret_code != 1 && ret.ret_code != 0)
log(LEVEL_MESSAGE_FAIL,"Can't set XHCI port address (ret %d)\n",ret.ret_code);
return ret.ret_code;
@@ -545,7 +549,7 @@ int __xhci_reset_dev(xhci_device_t* dev,uint32_t portnum) {
*portsc = load_portsc;
}
- uint16_t time = 25;
+ uint16_t time = 50;
if(dev->usb3ports[portnum]) {
while(*portsc & (1 << 19)) {
@@ -866,9 +870,11 @@ void __xhci_init_dev(xhci_device_t* dev,int portnum) {
}
+ int status_addr = __xhci_set_addr(dev,addr,id,0);
-
- if(__xhci_set_addr(dev,addr,id,0) != 1)
+ if(status_addr == 0) {
+ log(LEVEL_MESSAGE_WARN,"zero ret from xhci_set_addr (broken xhci ?)\n");
+ } else if(status_addr != 1)
return;
xhci_usb_descriptor_t* descriptor = (xhci_usb_descriptor_t*)malloc(4096);
diff --git a/tools/pkg/3/bash/pkg.sh b/tools/pkg/3/bash/pkg.sh
index cd49fe0..d54e049 100644
--- a/tools/pkg/3/bash/pkg.sh
+++ b/tools/pkg/3/bash/pkg.sh
@@ -8,6 +8,7 @@ mkdir -p pack
cd pack
+fast_install "$1" $GNU_MIRROR/gnu/libiconv/libiconv-1.18.tar.gz
fast_install "$1" $GNU_MIRROR/gnu/gettext/gettext-0.26.tar.gz "--enable-shared" ../../diff/gettext.diff
installgnu bash bash 5.2.21
@@ -28,4 +29,4 @@ ln -sf bash sh
cd "$cz"
-cd .. \ No newline at end of file
+cd ..
diff --git a/tools/pkg/4/xorg-server/pkg.sh b/tools/pkg/4/xorg-server/pkg.sh
index 5adef14..05017e5 100644
--- a/tools/pkg/4/xorg-server/pkg.sh
+++ b/tools/pkg/4/xorg-server/pkg.sh
@@ -20,7 +20,7 @@ CHOST=x86_64-orange-mlibc prefix="/usr" ./configure
make -j$(nproc)
make install DESTDIR="$1"
-rm -rf "$1/lib"/libz.so*
+rm -rf "$1/usr/lib"/libz.so*
cd ..
@@ -87,18 +87,23 @@ meson --cross-file="$1/../tools/pkg/x86_64-orange.crossfile" --prefix=/usr -Dleg
cd build0
-ninja
+meson compile
DESTDIR="$1" ninja install
cd ../..
+#exit 0
fast_install "$1" https://www.x.org/releases/individual/xcb/libpthread-stubs-0.5.tar.gz
fast_install "$1" https://www.x.org/releases/individual/xcb/xcb-proto-1.15.tar.gz
fast_install "$1" https://www.x.org/releases/individual/lib/libXau-1.0.9.tar.gz
fast_install "$1" https://www.x.org/releases/individual/xcb/libxcb-1.15.tar.gz
-fast_install "$1" https://www.x.org/releases/individual/lib/libX11-1.8.1.tar.gz
+
+mkdir -p "$1/usr/share/X11"
+sudo chmod 777 -R "$1/usr/share/X11"
+
+fast_install "$1" https://www.x.org/releases/individual/lib/libX11-1.8.1.tar.gz --with-keysymdefdir="$1/usr/include/X11"
fast_install "$1" https://www.x.org/archive/individual/lib/libxkbfile-1.1.1.tar.gz
@@ -133,11 +138,10 @@ mkdir -p build
meson --cross-file="$1/../tools/pkg/x86_64-orange.crossfile" --prefix="/usr" build -Dxorg-rules-symlinks=true
cd build
-ninja
-sudo DESTDIR="$1" ninja install
-
+meson compile
+DESTDIR="$1" meson install
cd ../..
-
+#exit 0
sudo chmod 777 -R "$1/usr/share/X11/xkb"
fast_install "$1" https://www.x.org/releases/individual/xserver/xorg-server-21.1.4.tar.gz "--with-xkb-bin-directory=/usr/bin --disable-pciaccess --disable-libdrm --disable-glx --disable-int10-module --disable-glamor --disable-vgahw --disable-dri3 --disable-dri2 --disable-dri --disable-xephyr --disable-xwayland --disable-xnest --disable-dmx --with-fontrootdir=/usr/share/fonts/X11 --disable-strict-compilation" "../../diff/xorgserver.diff"
@@ -145,4 +149,4 @@ fast_install "$1" https://www.x.org/releases/individual/xserver/xorg-server-21.1
# at this point i just tired so ill use ironclad patches
-mkdir -p "$1"/usr/lib/xorg/modules/extensions \ No newline at end of file
+mkdir -p "$1"/usr/lib/xorg/modules/extensions
diff --git a/tools/pkg/5/twm/pkg.sh b/tools/pkg/5/twm/pkg.sh
index fd025b0..4cbca19 100644
--- a/tools/pkg/5/twm/pkg.sh
+++ b/tools/pkg/5/twm/pkg.sh
@@ -19,7 +19,6 @@ fast_install "$1" https://www.x.org/releases/individual/lib/libXaw-1.0.14.tar.gz
fast_install "$1" https://github.com/libexpat/libexpat/releases/download/R_2_4_9/expat-2.4.9.tar.xz
fast_install "$1" https://www.freedesktop.org/software/fontconfig/release/fontconfig-2.13.94.tar.gz "--enable-shared" "../../diff/fontconfig.diff"
-
fast_install "$1" https://www.x.org/releases/individual/lib/libXrender-0.9.11.tar.gz
fast_install "$1" https://www.x.org/releases/individual/lib/libXft-2.3.4.tar.gz
@@ -28,4 +27,4 @@ fast_install "$1" https://www.x.org/releases/individual/lib/libXi-1.8.1.tar.gz
fast_install "$1" https://www.x.org/pub/individual/app/xclock-1.1.1.tar.xz
fast_install "$1" https://www.x.org/releases/individual/app/xeyes-1.2.0.tar.gz
-fast_install "$1" https://www.x.org/releases/individual/app/xinit-1.4.1.tar.gz \ No newline at end of file
+fast_install "$1" https://www.x.org/releases/individual/app/xinit-1.4.1.tar.gz
diff --git a/tools/pkg/6/terms/pkg.sh b/tools/pkg/6/terms/pkg.sh
index d241840..efde636 100644
--- a/tools/pkg/6/terms/pkg.sh
+++ b/tools/pkg/6/terms/pkg.sh
@@ -49,34 +49,4 @@ fast_install "$1" https://www.x.org/archive/individual/app/xev-1.2.5.tar.gz
# cd ..
-git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git --depth=1
-cd libjpeg-turbo
-
-autotools_recursive_regen
-
cd ..
-
-mkdir -p libjpeg-build
-cd libjpeg-build
-
-
-CFLAGS="-fPIC -Wno-implicit-function-declaration -O2" cmake ../libjpeg-turbo -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(realpath ../../../../toolchain.cmake) -DCMAKE_INSTALL_PREFIX="$1/usr"
-
-make -j$(nproc)
-make install
-
-rm -rf "$1/lib/libjpeg.so"
-
-cd ..
-
-git clone https://github.com/stoeckmann/xwallpaper.git
-
-cd xwallpaper
-
-./autogen.sh
-autotools_recursive_regen
-./configure --host=x86_64-orange-mlibc --prefix="/usr"
-make -j$(nproc)
-make install DESTDIR="$1"
-
-cd .. \ No newline at end of file
diff --git a/tools/pkg/6/xcb-stuff/pkg.sh b/tools/pkg/6/xcb-stuff/pkg.sh
index 74d4b24..20d0073 100644
--- a/tools/pkg/6/xcb-stuff/pkg.sh
+++ b/tools/pkg/6/xcb-stuff/pkg.sh
@@ -9,6 +9,26 @@ cd pack
fast_install "$1" https://www.x.org/releases/individual/xcb/xcb-util-0.4.1.tar.gz
fast_install "$1" https://www.x.org/releases/individual/xcb/xcb-util-image-0.4.1.tar.gz
+git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git --depth=1
+cd libjpeg-turbo
+
+autotools_recursive_regen
+
+cd ..
+
+mkdir -p libjpeg-build
+cd libjpeg-build
+
+
+CFLAGS="-fPIC -Wno-implicit-function-declaration -O2" cmake ../libjpeg-turbo -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=$(realpath ../../../../toolchain.cmake) -DCMAKE_INSTALL_PREFIX="$1/usr"
+
+make -j$(nproc)
+make install
+
+rm -rf "$1/usr/lib/libjpeg.so"
+
+cd ..
+
git clone https://github.com/stoeckmann/xwallpaper.git
cd xwallpaper
@@ -19,4 +39,4 @@ autotools_recursive_regen
make -j$(nproc)
make install DESTDIR="$1"
-cd .. \ No newline at end of file
+cd ..
diff --git a/tools/pkg/7/benchmark/a.out b/tools/pkg/7/benchmark/a.out
index 1db1dac..d9ce416 100755
--- a/tools/pkg/7/benchmark/a.out
+++ b/tools/pkg/7/benchmark/a.out
Binary files differ
diff --git a/tools/pkg/7/benchmark/main.c b/tools/pkg/7/benchmark/main.c
index a067766..b22e199 100644
--- a/tools/pkg/7/benchmark/main.c
+++ b/tools/pkg/7/benchmark/main.c
@@ -70,9 +70,13 @@ void mmap_test() {
struct timespec start;
struct timespec end;
clock_gettime(CLOCK_MONOTONIC,&start);
- void* addr = mmap(0,0x80000,0,MAP_ANONYMOUS,-1,0);
+ void* addr = mmap(NULL, 4096, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (addr == MAP_FAILED) {
+ perror("mmap failed");
+ continue;
+ }memset(addr,1,4096);
clock_gettime(CLOCK_MONOTONIC,&end);
- printf("OS pipe test %d - %d ns\n",i,end.tv_nsec - start.tv_nsec);
+ printf("OS mmap test %d - %d ns\n",i,end.tv_nsec - start.tv_nsec);
}
}
diff --git a/tools/pkg/7/games/pkg.sh b/tools/pkg/7/games/pkg.sh
index 779394e..61240c5 100644
--- a/tools/pkg/7/games/pkg.sh
+++ b/tools/pkg/7/games/pkg.sh
@@ -6,6 +6,18 @@ mkdir -p pack
cd pack
+wget https://downloads.sourceforge.net/libpng/libpng-1.6.37.tar.gz
+tar -xvf libpng-1.6.37.tar.gz
+cd libpng-1.6.37
+
+autotools_recursive_regen
+
+./configure --host=x86_64-orange-mlibc --prefix=/usr --disable-shared --enable-static
+make -j$(nproc)
+make install DESTDIR="$1"
+
+cd ..
+
export CFLAGS="-Wno-incompatible-pointer-types -Wno-error -fPIC -Wno-implicit-function-declaration"
fast_install "$1" https://www.delorie.com/store/ace/ace-1.4.tar.gz "--enable-shared" "../../diff/ace.diff"
diff --git a/tools/pkg/7/python/pkg.sh b/tools/pkg/7/python/pkg.sh
index 0cb0841..1233804 100644
--- a/tools/pkg/7/python/pkg.sh
+++ b/tools/pkg/7/python/pkg.sh
@@ -12,7 +12,11 @@ export ac_cv_file__dev_ptc=yes
export ac_cv_func_sched_setscheduler=no
export ac_cv_buggy_getaddrinfo=no
-fast_install "$1" https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tar.xz "--build=x86_64 --with-computed-gotos --disable-optimizations --disable-ipv6 --without-system-expat --enable-loadable-sqlite-extensions --without-ensurepip --with-tzpath=/usr/share/zoneinfo --with-build-python=python3 --without-static-libpython" "../../diff/python.diff"
+rm -rf "$1/usr/bin/python" "$1/usr/bin/python3" "$1/usr/lib/python" "$1/usr/lib/python3" "$1/usr/lib/python3.13"
+
+mkdir -p "$1/usr/lib/python3.13"
+
+fast_install "$1" https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tar.xz "--build=x86_64 --with-computed-gotos --disable-optimizations --disable-ipv6 --without-system-expat --enable-loadable-sqlite-extensions --without-ensurepip --with-tzpath=/usr/share/zoneinfo --with-build-python=python3 --without-static-libpython $BUILDPYTHON" "../../diff/python.diff"
ln -sfv python3 "$1/usr"/bin/python
ln -sfv python3-config "$1/usr"/bin/python-config
@@ -25,4 +29,4 @@ ln -sfv python3 "$1/usr"/lib/python3.13
# rm -r "$1"/usr/lib/python*/{test,ctypes/test,distutils/tests,idlelib/idle_test,lib2to3/tests,sqlite3/test,tkinter/test,unittest/test} # used from arch linux pkgbuild
-cd .. \ No newline at end of file
+cd ..
diff --git a/tools/pkg/build-pkg.sh b/tools/pkg/build-pkg.sh
index 5001559..9fabece 100644
--- a/tools/pkg/build-pkg.sh
+++ b/tools/pkg/build-pkg.sh
@@ -8,37 +8,18 @@ if [ ! "$(which x86_64-orange-mlibc-gcc)" ]; then
echo "If you built your cross-compiler, add it to your PATH with:"
echo 'export PATH="$HOME/opt/cross/orange/bin:$PATH"'
echo 'Alternatively, you can build the cross-compiler with: sh build-cross.sh'
- echo 'Also you should have host gcc with version < 14 (i am using 13.3.0)'
- exit 1
+ echo 'Also you should have host gcc ~13 or ~ 14'
fi
-max_depth=0
-while IFS= read -r -d '' dir; do
- dir="${dir#./}"
- if [[ -z "$dir" ]]; then
- depth=0
- else
- depth=$(( $(grep -o "/" <<< "$dir" | wc -l) + 1 ))
- fi
- (( depth > max_depth )) && max_depth=$depth
-done < <(find . -type d -print0)
-
-if [[ $max_depth -lt 0 ]]; then
- max_depth=0
-fi
-
-for (( level=0; level<=max_depth; level++ )); do
- mapfile -d '' dirs < <(find . -mindepth $level -maxdepth $level -type d -print0 | sort -z)
- for dir in "${dirs[@]}"; do
- display_dir="${dir#./}"
- if [[ -f "$dir/pkg.sh" ]]; then
- if [[ -f "$dir/info.txt" ]]; then
- info=$(<"$dir/info.txt")
- else
- info="(no info.txt)"
- fi
- echo "Building $info in directory: $display_dir"
- (cd "$dir" && bash pkg.sh "$1")
- fi
- done
+for dir in {0..12}; do
+ cd "$dir"
+ for pkg_dir in */; do
+ cd "$pkg_dir"
+ echo "Building $(cat info.txt)"
+ bash pkg.sh "$1"
+ cd ..
+ done
+ cd ..
done
+
+echo Done
diff --git a/tools/pkg/pkg-lib.sh b/tools/pkg/pkg-lib.sh
index 496cbda..62c5d27 100644
--- a/tools/pkg/pkg-lib.sh
+++ b/tools/pkg/pkg-lib.sh
@@ -29,7 +29,7 @@ fast_install() {
wget "$2"
archive_name="$(basename $2)"
dir_name=$(tar -tf "$archive_name" | head -1 | cut -f1 -d"/")
- tar -xvf "$archive_name"
+ tar -xf "$archive_name"
cd "$dir_name"
autotools_recursive_regen
if [ -n "$4" ]; then
@@ -148,4 +148,4 @@ kill_libtool_demons() {
cd "$1/usr/lib"
rm -rf *.la
cd "$old"
-} \ No newline at end of file
+}
diff --git a/tools/test.c b/tools/test.c
new file mode 100644
index 0000000..6e6af36
--- /dev/null
+++ b/tools/test.c
@@ -0,0 +1,5 @@
+#include <X11/keysymdef.h>
+
+int main() {
+ return 0;
+}
diff --git a/tools/toolchain-build.sh b/tools/toolchain-build.sh
index add3f52..3345e13 100644
--- a/tools/toolchain-build.sh
+++ b/tools/toolchain-build.sh
@@ -39,9 +39,6 @@ patch -p1 <"$CURRENT_DIR/diffs/gcc.diff"
cd ..
echo Downloading prerequisites
-cd gcc-15.1.0
-./contrib/download_prerequisites
-cd ..
echo Donwloading and installing automake and autoconf
@@ -96,7 +93,7 @@ cd ..
mkdir -p gcc-build
cd gcc-build
-../gcc-15.1.0/configure --target=x86_64-orange-mlibc --prefix="$HOME/opt/cross/orange" --with-sysroot="$(realpath $1)/initrd" --enable-languages=c,c++,go --disable-nls --with-pic --enable-linker-build-id --enable-threads=posix --enable-default-pie --enable-default-ssp --disable-multilib --enable-initfini-array --enable-shared --enable-host-shared
+../gcc-15.1.0/configure --target=x86_64-orange-mlibc --prefix="$HOME/opt/cross/orange" --with-sysroot="$(realpath $1)/initrd" --enable-languages=c,c++,go --disable-nls --with-pic --enable-linker-build-id --enable-threads=posix --enable-default-pie --enable-default-ssp --disable-multilib --enable-initfini-array --enable-shared --enable-host-shared --with-mpc --with-mpfr --with-gmp
make all-gcc -j$(nproc)
make all-target-libgcc -j$(nproc)
@@ -105,4 +102,4 @@ make install-target-libgcc -j$(nproc)
make all-target-libstdc++-v3
make install-target-libstdc++-v3
-echo Done \ No newline at end of file
+echo Done