diff --git a/kaleid/kernel/ke/syscall.asm b/kaleid/kernel/ke/syscall.asm index e761905..28686ea 100644 --- a/kaleid/kernel/ke/syscall.asm +++ b/kaleid/kernel/ke/syscall.asm @@ -34,15 +34,15 @@ KeJumpToUserspace: ; rsi = entry point in user space ; rdx = user space stack - mov rax, 0x1b ; Selector 0x18 (User Data) + RPL 3 + mov rax, 0x10 ; Selector 0x10 (User Data) + RPL 3 mov ds, ax mov es, ax ; Build a fake iret frame - push rax ; Selector 0x18 (User Data) + RPL 3 + push rax ; Selector 0x10 (User Data) + RPL 3 push rdx ; User space stack push 0x202 ; rflags = interrupt enable + reserved bit - push 0x23 ; Selector 0x20 (User Code) + RPL 3 + push 0x10 ; Selector 0x10 (User Code) + RPL 3 push rsi ; Entry point in user space xor rax, rax diff --git a/kaleid/kernel/mm/gdt.c b/kaleid/kernel/mm/gdt.c index 2b5d888..ff04d8c 100644 --- a/kaleid/kernel/mm/gdt.c +++ b/kaleid/kernel/mm/gdt.c @@ -41,7 +41,7 @@ void MmInitGdt(void) memzero((void *)&gdt[0], sizeof(gdt)); memzero((void *)&tssDesc, sizeof(tssDesc)); memzero((void *)&tss, sizeof(tss)); - + // Kernel codeseg gdt[1].lowLimit = 0xFFFF; gdt[1].access = 0x98; @@ -74,14 +74,14 @@ void MmInitGdt(void) memmove(&gdt[3], &tssDesc, sizeof(TssDescriptor_t)); DebugLog("GDT & TSS initialized\n"); - DebugLog("gdt[0] : %#x\n", &gdt[0]); - DebugLog("gdt[1] : %#x\n", &gdt[1]); - DebugLog("gdt[2] : %#x\n", &gdt[2]); - DebugLog("tss : %#x\n", &gdt[3]); - DebugLog("ist1 : %#x\n", tss.ist1); - DebugLog("ist2 : %#x\n", tss.ist2); - DebugLog("ist3 : %#x\n", tss.ist3); - DebugLog("rsp0 : %#x\n", tss.ist1); + DebugLog("gdt[0] : %#b\n", gdt[0]); + DebugLog("gdt[1] : %#b\n", gdt[1]); + DebugLog("gdt[2] : %#b\n", gdt[2]); + DebugLog("tss : %#b\n", gdt[3]); + DebugLog("ist1 : %#p\n", tss.ist1); + DebugLog("ist2 : %#p\n", tss.ist2); + DebugLog("ist3 : %#p\n", tss.ist3); + DebugLog("rsp0 : %#p\n", tss.ist1); MmLoadGdt(&gdtPtr, tssOffset); } diff --git a/kaleid/kernel/sh/testcmds.c b/kaleid/kernel/sh/testcmds.c index 102212b..90470b0 100644 --- a/kaleid/kernel/sh/testcmds.c +++ b/kaleid/kernel/sh/testcmds.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -330,7 +331,41 @@ error_t CmdSyscallTest(int argc, char **argv, char *cmdline) error_t CmdRing3Test(int argc, char **argv, char *cmdline) { - // TODO + size_t size = 50*MB; + void *entryPoint = (void*)USERSPACE + 51*KB; + ulong flags = PRESENT | READWRITE | USERMODE; + + KernLog("Allocating %u o...\n", size); + ulong id = MmAllocPageFrame(size, false); + KernLog("Allocated with id : %lu\n", id); + + KernLog("Mapping pages id %d at %p (flags %#x)...\n", id, entryPoint, flags); + error_t err = MmMapPageFrame(id, entryPoint, flags); + if (err == EOK) + KernLog("Successfully mapped.\n"); + else { + KernLog("Failed to map !\n"); + return ENOMEM; + } + + size = 50*KB; + void *stackAddr = (void*)USERSPACE; + flags = PRESENT | READWRITE | USERMODE; + + KernLog("Allocating %u o...\n", size); + id = MmAllocPageFrame(size, false); + KernLog("Allocated with id : %lu\n", id); + + KernLog("Mapping pages id %d at %p (flags %#x)...\n", id, stackAddr, flags); + err = MmMapPageFrame(id, stackAddr, flags); + if (err == EOK) + KernLog("Successfully mapped.\n"); + else { + KernLog("Failed to map !\n"); + return ENOMEM; + } + + KeJumpToUserspace(0, entryPoint, stackAddr); return EOK; }