mirror of
https://gitlab.os-k.eu/os-k-team/os-k.git
synced 2023-08-25 14:03:10 +02:00
Rewritten GDT descriptors
This commit is contained in:
parent
3326b4a18b
commit
3c1e97c157
@ -32,6 +32,7 @@
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
#define IOMAP_SIZE (8 * 1024)
|
||||
#define TSS_TYPE 0x9
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
@ -92,6 +93,24 @@ struct GdtPtr_t
|
||||
ulong base; // address of the first entry
|
||||
} __attribute__((__packed__));
|
||||
|
||||
enum // For GdtEntry_t.accessed
|
||||
{
|
||||
ACCESSEDSEG = 1 << 0,
|
||||
READABLE = 1 << 1,
|
||||
CONFORMING = 1 << 2,
|
||||
RESERVED = 1 << 3,
|
||||
RESERVED2 = 1 << 4,
|
||||
USER = 1 << 5,
|
||||
USER2 = 1 << 6,
|
||||
PRESENTSEG = 1 << 7
|
||||
};
|
||||
|
||||
enum // For GdtEntry_t.flags
|
||||
{
|
||||
LONG = 1 << 5,
|
||||
LEGACY = 1 << 6,
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
//
|
||||
|
@ -113,5 +113,7 @@ void BtDoSanityChecks(uint mbMagic) {
|
||||
|
||||
DebugLog("Kernel successfully loaded at %p\n",
|
||||
BtLoaderInfo.kernelAddr);
|
||||
DebugLog("Code segment : %#x\n",
|
||||
BtLoaderInfo.codeSegment);
|
||||
}
|
||||
|
||||
|
@ -39,17 +39,12 @@ KeJumpToUserspace:
|
||||
; rsi = entry point in user space
|
||||
; rdx = user space stack
|
||||
|
||||
mov rax, 0x18 ; Selector 0x18 (User Data) + RPL 3
|
||||
mov ds, rax
|
||||
mov es, rax
|
||||
|
||||
; Build a fake iret frame
|
||||
push rax ; Selector 0x18 (User Data) + RPL 3
|
||||
push QWORD 0x10 ; Selector 0x20 (User Data) + RPL 3
|
||||
push rdx ; User space stack
|
||||
push QWORD 0x202 ; rflags = interrupt enable + reserved bit
|
||||
push QWORD 0x20 ; Selector 0x20 (User Code) + RPL 3
|
||||
push QWORD 0x08 ; Selector 0x18 (User Code) + RPL 3
|
||||
push rsi ; Entry point in user space
|
||||
|
||||
iretq
|
||||
|
||||
|
||||
|
@ -50,4 +50,4 @@ MmLoadGdt:
|
||||
MmStoreGdt:
|
||||
;; Loading the gdt via the gdtPtr pointer
|
||||
sgdt [rdi]
|
||||
ret
|
||||
ret
|
||||
|
@ -43,27 +43,20 @@ void MmInitGdt(void)
|
||||
memzero((void *)&tss, sizeof(tss));
|
||||
|
||||
// Kernel codeseg
|
||||
gdt[1].lowLimit = 0x0;
|
||||
gdt[1].access = 0x9A;
|
||||
gdt[1].flags = 0x20;
|
||||
gdt[1].access = PRESENTSEG | RESERVED | RESERVED2;
|
||||
gdt[1].flags = LONG;
|
||||
|
||||
// Kernel dataseg
|
||||
gdt[2].lowLimit = 0x0;
|
||||
gdt[2].access = 0x92;
|
||||
gdt[2].flags = 0x00;
|
||||
|
||||
// User dataseg
|
||||
gdt[3].lowLimit = 0x0;
|
||||
gdt[3].access = 0xF2;
|
||||
gdt[3].flags = 0x20;
|
||||
gdt[2].access = PRESENTSEG;
|
||||
|
||||
// User codeseg
|
||||
gdt[4].lowLimit = 0x0;
|
||||
gdt[4].access = 0xFA;
|
||||
gdt[4].flags = 0x20;
|
||||
gdt[3].access = PRESENTSEG | RESERVED | RESERVED2 | USER | USER2;
|
||||
gdt[3].flags = LONG;
|
||||
|
||||
// User dataseg
|
||||
gdt[4].access = PRESENTSEG | USER | USER2;
|
||||
|
||||
tssDesc.access = 0x89;
|
||||
tssDesc.flags = 0x40;
|
||||
tssDesc.access = TSS_TYPE | PRESENTSEG;
|
||||
tssDesc.lowBase = (ulong)&tss & 0xFFFF;
|
||||
tssDesc.middleBase = ((ulong)&tss >> 16) & 0xFF;
|
||||
tssDesc.highBase = ((ulong)&tss >> 24) & 0xFF;
|
||||
@ -82,9 +75,9 @@ void MmInitGdt(void)
|
||||
DebugLog("Null descriptor : %#p\n", &gdt[0]);
|
||||
DebugLog("Kernel code descriptor : %#p\n", &gdt[1]);
|
||||
DebugLog("Kernel data descriptor : %#p\n", &gdt[2]);
|
||||
DebugLog("User data descriptor : %#p\n", &gdt[3]);
|
||||
DebugLog("User code descriptor : %#p\n", &gdt[4]);
|
||||
DebugLog("tss : %#p\n", &gdt[5]);
|
||||
DebugLog("User code descriptor : %#p\n", &gdt[3]);
|
||||
DebugLog("User data descriptor : %#p\n", &gdt[4]);
|
||||
DebugLog("Task-switch descriptor : %#p\n", &gdt[5]);
|
||||
DebugLog("ist1 : %#p\n", tss.ist1);
|
||||
DebugLog("ist2 : %#p\n", tss.ist2);
|
||||
DebugLog("ist3 : %#p\n", tss.ist3);
|
||||
|
@ -331,7 +331,7 @@ error_t CmdSyscallTest(int argc, char **argv, char *cmdline)
|
||||
|
||||
error_t CmdRing3Test(int argc, char **argv, char *cmdline)
|
||||
{
|
||||
size_t size = 1*KB;
|
||||
size_t size = 1*KPAGESIZE;
|
||||
void *entryPoint = (void*)USERSPACE;
|
||||
ulong flags = PRESENT | READWRITE | USERMODE;
|
||||
|
||||
@ -348,7 +348,7 @@ error_t CmdRing3Test(int argc, char **argv, char *cmdline)
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
size = 1*KB;
|
||||
size = 1*KPAGESIZE;
|
||||
void *stackAddr = (void*)USERSPACE + 4*KPAGESIZE;
|
||||
flags = PRESENT | READWRITE | USERMODE;
|
||||
|
||||
@ -365,15 +365,15 @@ error_t CmdRing3Test(int argc, char **argv, char *cmdline)
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
KernLog("Entrypoint : %p, stack address : %p\n", entryPoint, stackAddr);
|
||||
KernLog("Entrypoint : %p, stack address : %p\n", entryPoint, stackAddr+size);
|
||||
|
||||
uchar *code = (uchar*)entryPoint;
|
||||
|
||||
/* *code = 0x90; // nop*/
|
||||
/* *(code+1) = 0xEB; // jmp*/
|
||||
/* *(code+2) = 0xFD; // short 0x0*/
|
||||
*code = 0x90; // nop
|
||||
*(code+1) = 0xEB; // jmp
|
||||
*(code+2) = 0xFD; // short 0x0
|
||||
|
||||
KeJumpToUserspace(0, entryPoint, stackAddr);
|
||||
KeJumpToUserspace(0, entryPoint, stackAddr+size);
|
||||
|
||||
return EOK;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user