mirror of
https://gitlab.os-k.eu/os-k-team/os-k.git
synced 2023-08-25 14:03:10 +02:00
WIP: GDT is now right. Have to debug iretq GPF
This commit is contained in:
parent
b57ed861ff
commit
7621babbd1
@ -70,11 +70,6 @@ extern void KeSendEOItoPIC(uchar isr);
|
|||||||
extern void KeEnableNMI(void);
|
extern void KeEnableNMI(void);
|
||||||
extern void KeDisableNMI(void);
|
extern void KeDisableNMI(void);
|
||||||
|
|
||||||
//
|
|
||||||
// System Call
|
|
||||||
//
|
|
||||||
extern error_t KeSyscall(ulong code);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Restore IRQ flag to its state before KePauseIRQs
|
// Restore IRQ flag to its state before KePauseIRQs
|
||||||
//
|
//
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
extern error_t KeSyscall(ulong code);
|
||||||
|
|
||||||
extern void KeJumpToUserspace(ulong args, void *entryPoint, void *stackAddr);
|
extern void KeJumpToUserspace(ulong args, void *entryPoint, void *stackAddr);
|
||||||
|
|
||||||
error_t _KeSyscallHandler(ulong code);
|
error_t _KeSyscallHandler(ulong code);
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
global divideByZero
|
global divideByZero
|
||||||
global KeActivateSSE
|
global KeActivateSSE
|
||||||
global KeSyscall
|
|
||||||
|
|
||||||
%include "kaleid/kernel/ke/cpuf.inc"
|
%include "kaleid/kernel/ke/cpuf.inc"
|
||||||
|
|
||||||
@ -50,10 +49,3 @@ KeActivateSSE:
|
|||||||
mov cr4, rax
|
mov cr4, rax
|
||||||
pop rax
|
pop rax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;;
|
|
||||||
;;
|
|
||||||
;;
|
|
||||||
KeSyscall:
|
|
||||||
int 0x80
|
|
||||||
ret
|
|
||||||
|
@ -27,24 +27,35 @@
|
|||||||
%include "kaleid/kernel/ke/cpuf.inc"
|
%include "kaleid/kernel/ke/cpuf.inc"
|
||||||
|
|
||||||
global KeJumpToUserspace
|
global KeJumpToUserspace
|
||||||
|
global KeSyscall
|
||||||
|
extern KernLog
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; To get ring3 code running
|
||||||
|
;;
|
||||||
KeJumpToUserspace:
|
KeJumpToUserspace:
|
||||||
|
|
||||||
; rdi = user args
|
; rdi = user args
|
||||||
; rsi = entry point in user space
|
; rsi = entry point in user space
|
||||||
; rdx = user space stack
|
; rdx = user space stack
|
||||||
|
|
||||||
mov rax, 0x10 ; Selector 0x10 (User Data) + RPL 3
|
mov rax, 0x18 ; Selector 0x18 (User Data) + RPL 3
|
||||||
mov ds, ax
|
mov ds, rax
|
||||||
mov es, ax
|
mov es, rax
|
||||||
|
|
||||||
; Build a fake iret frame
|
; Build a fake iret frame
|
||||||
push rax ; Selector 0x10 (User Data) + RPL 3
|
push rax ; Selector 0x18 (User Data) + RPL 3
|
||||||
push rdx ; User space stack
|
push rdx ; User space stack
|
||||||
push 0x202 ; rflags = interrupt enable + reserved bit
|
push QWORD 0x202 ; rflags = interrupt enable + reserved bit
|
||||||
push 0x10 ; Selector 0x10 (User Code) + RPL 3
|
push QWORD 0x20 ; Selector 0x20 (User Code) + RPL 3
|
||||||
push rsi ; Entry point in user space
|
push rsi ; Entry point in user space
|
||||||
|
|
||||||
xor rax, rax
|
|
||||||
|
|
||||||
iretq
|
iretq
|
||||||
|
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Syscall trigger
|
||||||
|
;;
|
||||||
|
KeSyscall:
|
||||||
|
int 0x80
|
||||||
|
ret
|
||||||
|
@ -27,13 +27,13 @@
|
|||||||
#include <init/boot.h>
|
#include <init/boot.h>
|
||||||
|
|
||||||
GdtPtr_t gdtPtr;
|
GdtPtr_t gdtPtr;
|
||||||
GdtEntry_t gdt[5] __attribute__((__aligned__(KPAGESIZE)));
|
GdtEntry_t gdt[7] __attribute__((__aligned__(KPAGESIZE)));
|
||||||
TssDescriptor_t tssDesc __attribute__((__aligned__(KPAGESIZE)));
|
TssDescriptor_t tssDesc __attribute__((__aligned__(KPAGESIZE)));
|
||||||
Tss_t tss __attribute__((__aligned__(KPAGESIZE)));
|
Tss_t tss __attribute__((__aligned__(KPAGESIZE)));
|
||||||
|
|
||||||
void MmInitGdt(void)
|
void MmInitGdt(void)
|
||||||
{
|
{
|
||||||
ushort tssOffset = (ushort)((ulong)(&gdt[3]) - (ulong)(&gdt[0]));
|
ushort tssOffset = (ushort)((ulong)(&gdt[5]) - (ulong)(&gdt[0]));
|
||||||
|
|
||||||
gdtPtr.base = (ulong)&gdt[0];
|
gdtPtr.base = (ulong)&gdt[0];
|
||||||
gdtPtr.limit = sizeof(gdt) - 1;
|
gdtPtr.limit = sizeof(gdt) - 1;
|
||||||
@ -43,14 +43,24 @@ void MmInitGdt(void)
|
|||||||
memzero((void *)&tss, sizeof(tss));
|
memzero((void *)&tss, sizeof(tss));
|
||||||
|
|
||||||
// Kernel codeseg
|
// Kernel codeseg
|
||||||
gdt[1].lowLimit = 0xFFFF;
|
gdt[1].lowLimit = 0x0;
|
||||||
gdt[1].access = 0x98;
|
gdt[1].access = 0x9A;
|
||||||
gdt[1].flags = 0x20;
|
gdt[1].flags = 0x20;
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
// User codeseg
|
// User codeseg
|
||||||
gdt[2].lowLimit = 0xFFFF;
|
gdt[4].lowLimit = 0x0;
|
||||||
gdt[2].access = 0xF8;
|
gdt[4].access = 0xFA;
|
||||||
gdt[2].flags = 0x20;
|
gdt[4].flags = 0x20;
|
||||||
|
|
||||||
tssDesc.access = 0x89;
|
tssDesc.access = 0x89;
|
||||||
tssDesc.flags = 0x40;
|
tssDesc.flags = 0x40;
|
||||||
@ -66,22 +76,19 @@ void MmInitGdt(void)
|
|||||||
tss.rsp0 = (ulong)memalign(4*MB, 4*KB) + 4*MB; // Another Stack
|
tss.rsp0 = (ulong)memalign(4*MB, 4*KB) + 4*MB; // Another Stack
|
||||||
tss.iomap_base = sizeof(tss);
|
tss.iomap_base = sizeof(tss);
|
||||||
|
|
||||||
DebugLog("ISR Stacks initialized : Rescue %p, Normal %p, %p\n",
|
memmove(&gdt[5], &tssDesc, sizeof(TssDescriptor_t));
|
||||||
tss.ist1,
|
|
||||||
tss.ist2,
|
|
||||||
tss.ist3);
|
|
||||||
|
|
||||||
memmove(&gdt[3], &tssDesc, sizeof(TssDescriptor_t));
|
|
||||||
|
|
||||||
DebugLog("GDT & TSS initialized\n");
|
DebugLog("GDT & TSS initialized\n");
|
||||||
DebugLog("gdt[0] : %#b\n", gdt[0]);
|
DebugLog("Null descriptor : %#p\n", &gdt[0]);
|
||||||
DebugLog("gdt[1] : %#b\n", gdt[1]);
|
DebugLog("Kernel code descriptor : %#p\n", &gdt[1]);
|
||||||
DebugLog("gdt[2] : %#b\n", gdt[2]);
|
DebugLog("Kernel data descriptor : %#p\n", &gdt[2]);
|
||||||
DebugLog("tss : %#b\n", gdt[3]);
|
DebugLog("User data descriptor : %#p\n", &gdt[3]);
|
||||||
DebugLog("ist1 : %#p\n", tss.ist1);
|
DebugLog("User code descriptor : %#p\n", &gdt[4]);
|
||||||
DebugLog("ist2 : %#p\n", tss.ist2);
|
DebugLog("tss : %#p\n", &gdt[5]);
|
||||||
DebugLog("ist3 : %#p\n", tss.ist3);
|
DebugLog("ist1 : %#p\n", tss.ist1);
|
||||||
DebugLog("rsp0 : %#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);
|
MmLoadGdt(&gdtPtr, tssOffset);
|
||||||
}
|
}
|
||||||
|
@ -331,8 +331,8 @@ error_t CmdSyscallTest(int argc, char **argv, char *cmdline)
|
|||||||
|
|
||||||
error_t CmdRing3Test(int argc, char **argv, char *cmdline)
|
error_t CmdRing3Test(int argc, char **argv, char *cmdline)
|
||||||
{
|
{
|
||||||
size_t size = 50*MB;
|
size_t size = 1*KB;
|
||||||
void *entryPoint = (void*)USERSPACE + 51*KB;
|
void *entryPoint = (void*)USERSPACE;
|
||||||
ulong flags = PRESENT | READWRITE | USERMODE;
|
ulong flags = PRESENT | READWRITE | USERMODE;
|
||||||
|
|
||||||
KernLog("Allocating %u o...\n", size);
|
KernLog("Allocating %u o...\n", size);
|
||||||
@ -348,8 +348,8 @@ error_t CmdRing3Test(int argc, char **argv, char *cmdline)
|
|||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
size = 50*KB;
|
size = 1*KB;
|
||||||
void *stackAddr = (void*)USERSPACE;
|
void *stackAddr = (void*)USERSPACE + 4*KPAGESIZE;
|
||||||
flags = PRESENT | READWRITE | USERMODE;
|
flags = PRESENT | READWRITE | USERMODE;
|
||||||
|
|
||||||
KernLog("Allocating %u o...\n", size);
|
KernLog("Allocating %u o...\n", size);
|
||||||
@ -365,6 +365,14 @@ error_t CmdRing3Test(int argc, char **argv, char *cmdline)
|
|||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KernLog("Entrypoint : %p, stack address : %p\n", entryPoint, stackAddr);
|
||||||
|
|
||||||
|
uchar *code = (uchar*)entryPoint;
|
||||||
|
|
||||||
|
/* *code = 0x90; // nop*/
|
||||||
|
/* *(code+1) = 0xEB; // jmp*/
|
||||||
|
/* *(code+2) = 0xFD; // short 0x0*/
|
||||||
|
|
||||||
KeJumpToUserspace(0, entryPoint, stackAddr);
|
KeJumpToUserspace(0, entryPoint, stackAddr);
|
||||||
|
|
||||||
return EOK;
|
return EOK;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user