diff --git a/include/call_user.h b/include/call_user.h new file mode 100644 index 0000000000000000000000000000000000000000..babb507c38f29f05cb9b6f26e0514db730a52707 --- /dev/null +++ b/include/call_user.h @@ -0,0 +1,3 @@ + +__attribute__((fastcall)) void call_user(void (*user_fct)(), void *user_stack); + diff --git a/iso/boot/mykernel.bin b/iso/boot/mykernel.bin new file mode 100755 index 0000000000000000000000000000000000000000..6e4de47c237cb24f498eea1ac1959800813d807b Binary files /dev/null and b/iso/boot/mykernel.bin differ diff --git a/link.ld b/link.ld index b62e5ebc708679f936fb23b9824ab600954abe8c..59278d992d4b34df3f559943015da9234d15f9c0 100644 --- a/link.ld +++ b/link.ld @@ -3,6 +3,10 @@ ENTRY(start) phys = 0x00100000; SECTIONS { + .user 0x00400000 : + { + src/user.o (.text* .data .rodata .bss) + } .text phys : AT(phys) { code = .; _code = .; __code = .; diff --git a/mykernel.iso b/mykernel.iso new file mode 100644 index 0000000000000000000000000000000000000000..ed3d07451bec53a66a115930a80b3dc1d3a99dbc Binary files /dev/null and b/mykernel.iso differ diff --git a/src/0boot.o b/src/0boot.o new file mode 100644 index 0000000000000000000000000000000000000000..e992706a4649984f97948f623d14e7111c4b080d Binary files /dev/null and b/src/0boot.o differ diff --git a/src/0user.o b/src/0user.o new file mode 100644 index 0000000000000000000000000000000000000000..4a053bd1bc4cb28c909d2ad78276caf99447589a Binary files /dev/null and b/src/0user.o differ diff --git a/src/appmain.o b/src/appmain.o new file mode 100644 index 0000000000000000000000000000000000000000..7c5cff2111a357f3294703bd1c53e0b3b08ecf08 Binary files /dev/null and b/src/appmain.o differ diff --git a/src/call_user.o b/src/call_user.o new file mode 100644 index 0000000000000000000000000000000000000000..b7317d853508fc0ef5c1a6256df69c68e7464860 Binary files /dev/null and b/src/call_user.o differ diff --git a/src/call_user.s b/src/call_user.s new file mode 100644 index 0000000000000000000000000000000000000000..9976e2a9a7a2c3af04ddf5689c3a0e81beba41af --- /dev/null +++ b/src/call_user.s @@ -0,0 +1,18 @@ +global call_user + +call_user: + mov ax, 0x28 + ltr ax + + mov ax, 0x23 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + push 0x23 + push edx ; second arg of call_user stack + pushf + push 0x1B + push ecx ; first arg of call_user fct + iret + diff --git a/src/gdt.o b/src/gdt.o new file mode 100644 index 0000000000000000000000000000000000000000..b99d2e3bec701853cc2ec72ed9f62a82da025c79 Binary files /dev/null and b/src/gdt.o differ diff --git a/src/idt.o b/src/idt.o new file mode 100644 index 0000000000000000000000000000000000000000..2e89ee525516d99f21eda03102eca9c3175a8a35 Binary files /dev/null and b/src/idt.o differ diff --git a/src/idt0.o b/src/idt0.o new file mode 100644 index 0000000000000000000000000000000000000000..f6b6199ecf89ef1e00bc813119ff5818c384913b Binary files /dev/null and b/src/idt0.o differ diff --git a/src/main.c b/src/main.c index 3be5bb25f6edb723d6597302cbbe75372863dc53..83dbef75eced85018b0914263cedf3289542ec39 100644 --- a/src/main.c +++ b/src/main.c @@ -1,11 +1,24 @@ #include "gdt.h" #include "idt.h" #include "minilib.h" +#include "mmu.h" +#include "call_user.h" +extern void user_entry(); void empty_irq(int_regs_t *r) { } +extern char user_stack[]; +void page_fault_handler(int_regs_t *r) +{ + puts("page call\n"); + for(;;); +} + +void sys_handler(int_regs_t *r) +{ +} /* multiboot entry-point with datastructure as arg. */ void main(unsigned int * mboot_info) { @@ -24,10 +37,13 @@ void main(unsigned int * mboot_info) idt_setup_int_handler(0, empty_irq); idt_setup_int_handler(1, empty_irq); - + idt_setup_int_handler(14, page_fault_handler); __asm volatile("sti"); /* minimal setup done ! */ + setup_mmu(); + call_user(user_entry, user_stack); + puts("Going idle\n"); for(;;) ; /* nothing more to do... really nothing ! */ diff --git a/src/main.o b/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..89a090d4588887b153d4c629c0fd14545968d471 Binary files /dev/null and b/src/main.o differ diff --git a/src/minilib.o b/src/minilib.o new file mode 100644 index 0000000000000000000000000000000000000000..27561cc7945ffd2f4c9b70f34c0c14855d73fba3 Binary files /dev/null and b/src/minilib.o differ diff --git a/src/mmu.o b/src/mmu.o new file mode 100644 index 0000000000000000000000000000000000000000..de1b7198ea48b034240bcd453f187bb1bd11333a Binary files /dev/null and b/src/mmu.o differ diff --git a/src/tss.o b/src/tss.o new file mode 100644 index 0000000000000000000000000000000000000000..3379ce29aee87f6ab5b05671db1f139160d69e23 Binary files /dev/null and b/src/tss.o differ diff --git a/src/user.c b/src/user.c index 456d6cc81a5c6de858ae359894048153af127a43..939fad635f33876ba2f452a2e904dc4c7c9a5e74 100644 --- a/src/user.c +++ b/src/user.c @@ -1,21 +1,22 @@ char user_stack[65536]; -static void putc(int c) { - asm("movl $1, %%eax" "\n\t" "movl %0, %%edi" "\n\t" "int $87" : : "r"(c) : "eax", "edi"); -} +// static void putc(int c) { +// asm("movl $1, %%eax" "\n\t" "movl %0, %%edi" "\n\t" "int $87" : : "r"(c) : "eax", "edi"); +// } -static void puts(char *s) { - int i; - for (i = 0; s[i] != 0; i++) { - putc(s[i]); - } -} +// static void puts(char *s) { +// int i; +// for (i = 0; s[i] != 0; i++) { +// putc(s[i]); +// } +// } +int variable = 200; void user_entry() { - puts("Hello from userland\n"); + //puts("Hello from userland\n"); char *ptr = (char*) 0x800000; *ptr = 42; - puts("Write succeeded!\n"); + //puts("Write succeeded!\n"); for(;;); } diff --git a/src/user.o b/src/user.o new file mode 100644 index 0000000000000000000000000000000000000000..236dc8bd44558dd44af34c0ebcff75368b97fc13 Binary files /dev/null and b/src/user.o differ