WIP : gdt problem ?

This commit is contained in:
Adrien Bourmault 2021-02-27 01:03:09 +01:00
parent d3db4efba4
commit b57ed861ff
Signed by: neox
GPG Key ID: 6EB408FE0ACEC664
3 changed files with 48 additions and 13 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -30,6 +30,7 @@
#include <io/vga.h>
#include <io/spkr.h>
#include <ke/time.h>
#include <ke/syscall.h>
#include <libbuf.h>
#include <sh/shell.h>
#include <po/shtdwn.h>
@ -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;
}