diff options
| author | cpplover0 <osdev555@yandex.com> | 2025-12-20 18:35:42 +0300 |
|---|---|---|
| committer | cpplover0 <osdev555@yandex.com> | 2025-12-20 18:35:42 +0300 |
| commit | 74b991b365d242931fe2d32eeb080827e9c4f31d (patch) | |
| tree | 618668f1c0c0a2e83c5aa11dc2b33784cd57a13c | |
| parent | 4bf2ac8837ef540d1e15041ba9f604466df1fdcc (diff) | |
probably some bug fixes, strip and buddy allocator freelist extension
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 Binary files differindex 1db1dac..d9ce416 100755 --- a/tools/pkg/7/benchmark/a.out +++ b/tools/pkg/7/benchmark/a.out 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 |
