From a9789b7f575fb065aca41d24dff7c69836d85982 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Thu, 19 Jun 2025 18:31:15 +0300 Subject: [PATCH] tasking: fix syscall handling, use debug_log instead of printf in some places --- grubshit/aaa | Bin 8656 -> 8748 bytes grubshit/aaa.asm | 14 ++++++++++++++ grubshit/aaa.o | Bin 624 -> 752 bytes include/stdio.h | 12 ++++++++++++ include/task.h | 2 +- src/tasking/exec_from_file.c | 36 +++++++++++++++++------------------ src/tasking/sys_exit.asm | 19 ++---------------- src/tasking/task.c | 20 +++++-------------- src/utils/stdio.c | 2 +- 9 files changed, 53 insertions(+), 52 deletions(-) diff --git a/grubshit/aaa b/grubshit/aaa index 7bcfafb2abe57221d5177835431d0065ba8e1a43..c0cf1d37e6139399471b43ef833a597e55cfb5d8 100755 GIT binary patch delta 347 zcmccMyvAjM0+Ws6L?tIy8wLgjn~9mytoA^L{l?BI{PH_kfXv;DKw>A~0v3*4hCtTY zh8-Y*vkkBRZB`UG!aqrY&!9LpHMdwHCo?-$!8@@evD80UA*-~wL?N{zHMz7THASH$ zBePh+)yGXYEi)%oQE@V#f>XU9&=ioVKne($7{q`i$N~uX_+J6Um;jL%U|?jB26FA8 z>IH!6)zSERK)wT#JVRn)qF!QgE< zQJv9#va6!9u7d&t!vdf=Ab+z#X#pV33B=4m303m0@DM9iAqkavJ4CivJ*3prF3=>#5K$HLjBZDB2=34;cGckY+LFTJ~)FH_;Bqk>6B^Kv0gz&AI_7pfp*Q zQJM7tkR>qLmC+(`2MbVkH&7qLPCg*9%MeJMZP)=4INR|0ACO}3NX^N~*HI|XFUm<# zWGGHe%`H~Q$;?hw@J=jAEcFjo$SN%^QAn*wO)f1-O;ISx$ShWH^>Ncp%gjktRGi$$ uxJXn2Xbi}B2w-B61u_gLt1=mDG#ij+WM*K{fYJaUMl;s{ delta 113 zcmeys`hjIa4WsPDT4mM-Mg|7HiA$9kCrmu4&U*pKD_~$?Ue_phnum; int program_header_table_entry_size = elf_ehdr->e_phentsize; - printf("magic: %X, type: %X, entry: 0x%X\n", elf_ehdr->e_ident, elf_ehdr->e_type, elf_ehdr->e_entry); - printf("PHNUM: %X\n", program_header_table_entry_count); - printf("PHENTSIZE: %X\n\n", program_header_table_entry_size); + debug_log("magic: %X, type: %X, entry: 0x%X\n", elf_ehdr->e_ident, elf_ehdr->e_type, elf_ehdr->e_entry); + debug_log("PHNUM: %X\n", program_header_table_entry_count); + debug_log("PHENTSIZE: %X\n\n", program_header_table_entry_size); uint32_t* proc_pd = create_page_dir(); uint32_t proc_pd_phys = (uint32_t)get_physaddr((void*)proc_pd); - printf("proc_pd_phys: 0x%X\n", proc_pd_phys); + debug_log("proc_pd_phys: 0x%X\n", proc_pd_phys); uint32_t* curr_pd_virt = get_page_dir(); // CR3 содержит физический адрес, но get_page_dir возвращает его как uint32_t* uint32_t curr_pd_phys = (uint32_t)curr_pd_virt; // Просто приводим к uint32_t, так как CR3 содержит физический адрес @@ -93,22 +93,22 @@ void exec_from_file(const char* filename) Elf32_Phdr *elf_phdr = (Elf32_Phdr *)((uint32_t)file + elf_ehdr->e_phoff + i * elf_ehdr->e_phentsize); - printf("HEADER %X, type: 0x%X, vaddr: 0x%X, paddr: 0x%X, memsz: 0x%X\n", i, elf_phdr->p_type, elf_phdr->p_vaddr, elf_phdr->p_paddr, elf_phdr->p_memsz); + debug_log("HEADER %X, type: 0x%X, vaddr: 0x%X, paddr: 0x%X, memsz: 0x%X\n", i, elf_phdr->p_type, elf_phdr->p_vaddr, elf_phdr->p_paddr, elf_phdr->p_memsz); if(elf_phdr->p_type != PT_LOAD) { - printf("not PT_LOAD, skipping...\n"); + debug_log("not PT_LOAD, skipping...\n"); continue; } int pages_needed = DivRoundUp(elf_phdr->p_memsz, 0x1000);//(elf_phdr->p_memsz / 0x1000) + 1; - printf("pages needed: %X\n", pages_needed); + debug_log("pages needed: %X\n", pages_needed); for(int j = 0; j < pages_needed; j++) { uint32_t vaddr = (elf_phdr->p_vaddr & ~0xFFF) + j * 0x1000; void* phys_addr = alloc_page(); - printf("mapping 0x%X -> 0x%X\n", phys_addr, vaddr); + debug_log("mapping 0x%X -> 0x%X\n", phys_addr, vaddr); map_page(phys_addr, (void*)vaddr, PAGE_PRESENT | PAGE_RW | PAGE_USER); } @@ -120,11 +120,11 @@ void exec_from_file(const char* filename) memset((void*)bss_start, 0, bss_end - bss_start); } - printf("p_filesz: 0x%X (%X)\n", elf_phdr->p_filesz, elf_phdr->p_filesz); - printf("================================\n\n\n\n"); + debug_log("p_filesz: 0x%X (%X)\n", elf_phdr->p_filesz, elf_phdr->p_filesz); + debug_log("================================\n\n\n\n"); } - printf("setting up the user stack...\n"); + debug_log("setting up the user stack...\n"); //TODO: i think this thing allocates more pages than needed for (uint32_t vaddr = USER_STACK_BOTTOM; vaddr <= USER_STACK_TOP; vaddr += PAGE_SIZE) { @@ -137,7 +137,7 @@ void exec_from_file(const char* filename) return; } map_page(phys_addr, (void*)(vaddr & ~0xFFF), PAGE_PRESENT | PAGE_RW | PAGE_USER); - printf("mapping stack 0x%X -> 0x%X (0x%X)\n", (uint32_t)phys_addr, vaddr, (vaddr & ~0xFFF)); + debug_log("mapping stack 0x%X -> 0x%X (0x%X)\n", (uint32_t)phys_addr, vaddr, (vaddr & ~0xFFF)); memset((void*)(vaddr & ~0xFFF), 0, PAGE_SIZE); // Add this } /* diff --git a/src/tasking/sys_exit.asm b/src/tasking/sys_exit.asm index df61e26..e001beb 100644 --- a/src/tasking/sys_exit.asm +++ b/src/tasking/sys_exit.asm @@ -19,7 +19,7 @@ sys_exit_handler: push esp call handle_syscall - add esp, 0x44 + add esp, 4 ; Восстанавливаем сегменты Ring 3 pop gs @@ -31,20 +31,5 @@ sys_exit_handler: ; Возвращаемся в Ring 3 iret -global test_user_function -test_user_function: -nigg: - mov eax, 0xB00B1E5 ; 0xDEADBEEF - int 0x80 - jmp nigg - -global second_user_function -second_user_function: -heh: - mov eax, 0xFACE5EA7 - int 0x80 - jmp heh - section .data -sys_exit_msg: db "Returned from Ring 3", 0 -syscall_debug_fmt: db "Syscall #%x, args: 0x%x 0x%x 0x%x 0x%x 0x%x", 10, 0 \ No newline at end of file +sys_exit_msg: db "Returned from Ring 3", 0 \ No newline at end of file diff --git a/src/tasking/task.c b/src/tasking/task.c index 504a0c1..ca63be7 100644 --- a/src/tasking/task.c +++ b/src/tasking/task.c @@ -36,7 +36,7 @@ Process* task_create(uint32_t func, uint32_t user_esp, uint32_t ring, uint32_t* void *kstack_physical = alloc_page(); p->kstack = (char*)((uint32_t)kstack_physical+0xC0000000); map_page(kstack_physical, p->kstack, PAGE_PRESENT | PAGE_RW); - printf("kstack: %X!!!!!!!!!!!!\n", p->kstack); + debug_log("kstack: %X!!!!!!!!!!!!\n", p->kstack); uint8_t* sp = (uint8_t*)(p->kstack + KSTACKSIZE); @@ -147,22 +147,12 @@ void scheduler_init() uint32_t* kernel_tasks_pagedir = (uint32_t*)create_page_dir(); task_create((uint32_t)idle, 0, 0, kernel_tasks_pagedir); - - /*void* args1[] = {(void*)42, (void*)"ebalo"}; - task_create((uint32_t)task1, args1, 2, 0, kernel_tasks_pagedir); - void* args2[] = {(void*)69, (void*)420}; - task_create((uint32_t)task2, args2, 2, 0, kernel_tasks_pagedir); - jump_usermode2();*/ } void handle_syscall(TrapFrame *tf) { - printf("========SYSCALL========\n"); - printf("EAX: %X\n", tf->eax); - printf("EBX: %X\n", tf->ebx); - printf("ECX: %s\n", tf->ecx); - printf("EDX: %X\n", tf->edx); - printf("======== END SYSCALL========\n"); - printf("SIZEOF TRAPFRAME: %X\n", sizeof(tf)); - printf("SIZEOF *TRAPFRAME: %X\n", sizeof(*tf)); + debug_log("EAX: %X ", tf->eax); + debug_log("EBX: %X ", tf->ebx); + debug_log("ECX: %s ", tf->ecx); + debug_log("EDX: %X\n", tf->edx); } \ No newline at end of file diff --git a/src/utils/stdio.c b/src/utils/stdio.c index e609211..d93be35 100644 --- a/src/utils/stdio.c +++ b/src/utils/stdio.c @@ -157,4 +157,4 @@ int printf(const char* restrict format, ...) { va_end(parameters); return written; -} +} \ No newline at end of file