tasking: fix syscall handling, use debug_log instead of printf in some places
This commit is contained in:
Binary file not shown.
@@ -6,10 +6,24 @@ _start: ;tell linker entry point
|
|||||||
mov ebx, 1 ;file descriptor (stdout)
|
mov ebx, 1 ;file descriptor (stdout)
|
||||||
mov eax, 4 ;system call number (sys_write)
|
mov eax, 4 ;system call number (sys_write)
|
||||||
int 0x80 ;call kernel
|
int 0x80 ;call kernel
|
||||||
|
|
||||||
mov eax, 1 ;system call number (sys_exit)
|
mov eax, 1 ;system call number (sys_exit)
|
||||||
int 0x80 ;call kernel
|
int 0x80 ;call kernel
|
||||||
|
|
||||||
|
mov eax, 4
|
||||||
|
mov ebx, 1
|
||||||
|
mov ecx, msg2
|
||||||
|
mov edx, len2
|
||||||
|
int 0x80
|
||||||
|
|
||||||
|
mov eax, 1
|
||||||
|
int 0x80
|
||||||
|
|
||||||
|
jmp $
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
|
|
||||||
msg db 'Hello, world!',0x0 ;our dear string
|
msg db 'Hello, world!',0x0 ;our dear string
|
||||||
len equ $ - msg ;length of our dear string
|
len equ $ - msg ;length of our dear string
|
||||||
|
msg2 db 'seems like KatauOS just executed this ELF-file!!',0x0
|
||||||
|
len2 equ $ - msg2
|
||||||
|
|||||||
Binary file not shown.
@@ -10,4 +10,16 @@ int printf(const char* __restrict, ...);
|
|||||||
int putchar(int);
|
int putchar(int);
|
||||||
int puts(const char*);
|
int puts(const char*);
|
||||||
|
|
||||||
|
//#define KATAU_DEBUG
|
||||||
|
|
||||||
|
#ifdef KATAU_DEBUG
|
||||||
|
#define debug_log printf
|
||||||
|
#else
|
||||||
|
|
||||||
|
static int debug_log(const char* restrict format, ...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+1
-1
@@ -38,7 +38,7 @@ typedef struct __attribute__((packed)) TrapFrame {
|
|||||||
uint32_t gs,fs,es,ds;
|
uint32_t gs,fs,es,ds;
|
||||||
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
|
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
|
||||||
|
|
||||||
//uint32_t interrupt, error;
|
uint32_t interrupt, error;
|
||||||
|
|
||||||
uint32_t eip, cs, eflags, usermode_esp, usermode_ss;
|
uint32_t eip, cs, eflags, usermode_esp, usermode_ss;
|
||||||
|
|
||||||
|
|||||||
@@ -28,16 +28,16 @@ int read_file(const char* path, uint8_t** buffer)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
uint32_t file_size = fat_fsize(&file);
|
uint32_t file_size = fat_fsize(&file);
|
||||||
printf("file_size: %X\n", file_size);
|
debug_log("file_size: %X\n", file_size);
|
||||||
|
|
||||||
uint8_t buf[512];
|
uint8_t buf[512];
|
||||||
//memset(buf, 0, 512);
|
//memset(buf, 0, 512);
|
||||||
printf("heh\n");
|
debug_log("heh\n");
|
||||||
|
|
||||||
*buffer = (uint8_t*)malloc(file_size);
|
*buffer = (uint8_t*)malloc(file_size);
|
||||||
//memset(*buffer, 0, file_size);
|
//memset(*buffer, 0, file_size);
|
||||||
uint8_t* current = *buffer;
|
uint8_t* current = *buffer;
|
||||||
printf("eeee\n");
|
debug_log("eeee\n");
|
||||||
|
|
||||||
|
|
||||||
int cnt = fat_fread(&file, *buffer, file_size);
|
int cnt = fat_fread(&file, *buffer, file_size);
|
||||||
@@ -68,21 +68,21 @@ void exec_from_file(const char* filename)
|
|||||||
|
|
||||||
uint8_t* file;
|
uint8_t* file;
|
||||||
|
|
||||||
int result = read_file("/ebalo/aaa", &file);
|
int result = read_file("/ebalo/testfile", &file);
|
||||||
printf("result: %X\n", result);
|
debug_log("result: %X\n", result);
|
||||||
printf("buffer: %s\n", file);
|
debug_log("buffer: %s\n", file);
|
||||||
|
|
||||||
Elf32_Ehdr *elf_ehdr = (Elf32_Ehdr*)file;
|
Elf32_Ehdr *elf_ehdr = (Elf32_Ehdr*)file;
|
||||||
int program_header_table_entry_count = elf_ehdr->e_phnum;
|
int program_header_table_entry_count = elf_ehdr->e_phnum;
|
||||||
int program_header_table_entry_size = elf_ehdr->e_phentsize;
|
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);
|
debug_log("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);
|
debug_log("PHNUM: %X\n", program_header_table_entry_count);
|
||||||
printf("PHENTSIZE: %X\n\n", program_header_table_entry_size);
|
debug_log("PHENTSIZE: %X\n\n", program_header_table_entry_size);
|
||||||
|
|
||||||
uint32_t* proc_pd = create_page_dir();
|
uint32_t* proc_pd = create_page_dir();
|
||||||
uint32_t proc_pd_phys = (uint32_t)get_physaddr((void*)proc_pd);
|
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_virt = get_page_dir(); // CR3 содержит физический адрес, но get_page_dir возвращает его как uint32_t*
|
||||||
uint32_t curr_pd_phys = (uint32_t)curr_pd_virt; // Просто приводим к uint32_t, так как CR3 содержит физический адрес
|
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 +
|
Elf32_Phdr *elf_phdr = (Elf32_Phdr *)((uint32_t)file + elf_ehdr->e_phoff +
|
||||||
i * elf_ehdr->e_phentsize);
|
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)
|
if(elf_phdr->p_type != PT_LOAD)
|
||||||
{
|
{
|
||||||
printf("not PT_LOAD, skipping...\n");
|
debug_log("not PT_LOAD, skipping...\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pages_needed = DivRoundUp(elf_phdr->p_memsz, 0x1000);//(elf_phdr->p_memsz / 0x1000) + 1;
|
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++)
|
for(int j = 0; j < pages_needed; j++)
|
||||||
{
|
{
|
||||||
uint32_t vaddr = (elf_phdr->p_vaddr & ~0xFFF) + j * 0x1000;
|
uint32_t vaddr = (elf_phdr->p_vaddr & ~0xFFF) + j * 0x1000;
|
||||||
void* phys_addr = alloc_page();
|
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);
|
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);
|
memset((void*)bss_start, 0, bss_end - bss_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("p_filesz: 0x%X (%X)\n", elf_phdr->p_filesz, elf_phdr->p_filesz);
|
debug_log("p_filesz: 0x%X (%X)\n", elf_phdr->p_filesz, elf_phdr->p_filesz);
|
||||||
printf("================================\n\n\n\n");
|
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
|
//TODO: i think this thing allocates more pages than needed
|
||||||
for (uint32_t vaddr = USER_STACK_BOTTOM; vaddr <= USER_STACK_TOP; vaddr += PAGE_SIZE) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
map_page(phys_addr, (void*)(vaddr & ~0xFFF), PAGE_PRESENT | PAGE_RW | PAGE_USER);
|
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
|
memset((void*)(vaddr & ~0xFFF), 0, PAGE_SIZE); // Add this
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ sys_exit_handler:
|
|||||||
|
|
||||||
push esp
|
push esp
|
||||||
call handle_syscall
|
call handle_syscall
|
||||||
add esp, 0x44
|
add esp, 4
|
||||||
|
|
||||||
; Восстанавливаем сегменты Ring 3
|
; Восстанавливаем сегменты Ring 3
|
||||||
pop gs
|
pop gs
|
||||||
@@ -31,20 +31,5 @@ sys_exit_handler:
|
|||||||
; Возвращаемся в Ring 3
|
; Возвращаемся в Ring 3
|
||||||
iret
|
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
|
section .data
|
||||||
sys_exit_msg: db "Returned from Ring 3", 0
|
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
|
|
||||||
+5
-15
@@ -36,7 +36,7 @@ Process* task_create(uint32_t func, uint32_t user_esp, uint32_t ring, uint32_t*
|
|||||||
void *kstack_physical = alloc_page();
|
void *kstack_physical = alloc_page();
|
||||||
p->kstack = (char*)((uint32_t)kstack_physical+0xC0000000);
|
p->kstack = (char*)((uint32_t)kstack_physical+0xC0000000);
|
||||||
map_page(kstack_physical, p->kstack, PAGE_PRESENT | PAGE_RW);
|
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);
|
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();
|
uint32_t* kernel_tasks_pagedir = (uint32_t*)create_page_dir();
|
||||||
|
|
||||||
task_create((uint32_t)idle, 0, 0, kernel_tasks_pagedir);
|
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)
|
void handle_syscall(TrapFrame *tf)
|
||||||
{
|
{
|
||||||
printf("========SYSCALL========\n");
|
debug_log("EAX: %X ", tf->eax);
|
||||||
printf("EAX: %X\n", tf->eax);
|
debug_log("EBX: %X ", tf->ebx);
|
||||||
printf("EBX: %X\n", tf->ebx);
|
debug_log("ECX: %s ", tf->ecx);
|
||||||
printf("ECX: %s\n", tf->ecx);
|
debug_log("EDX: %X\n", tf->edx);
|
||||||
printf("EDX: %X\n", tf->edx);
|
|
||||||
printf("======== END SYSCALL========\n");
|
|
||||||
printf("SIZEOF TRAPFRAME: %X\n", sizeof(tf));
|
|
||||||
printf("SIZEOF *TRAPFRAME: %X\n", sizeof(*tf));
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user