diff --git a/kernel/src/arch/x86_64/gdt.c b/kernel/src/arch/x86_64/gdt.c index 5f18fb0..0612961 100644 --- a/kernel/src/arch/x86_64/gdt.c +++ b/kernel/src/arch/x86_64/gdt.c @@ -16,8 +16,8 @@ gdt_table def_table = {{ 0x00af9b000000ffff, // 0x28 64 bit code cs 0x00af93000000ffff, // 0x30 64 bit data ss - 0x00affb000000ffff, // 0x38 user mode code cs - 0x00aff3000000ffff, // 0x40 user mode data ss + 0x00aff3000000ffff, // 0x38 user mode data ss + 0x00affb000000ffff, // 0x40 user mode code cs }, {}}; diff --git a/kernel/src/arch/x86_64/syscall.c b/kernel/src/arch/x86_64/syscall.c index 8d6a97d..34e7df3 100644 --- a/kernel/src/arch/x86_64/syscall.c +++ b/kernel/src/arch/x86_64/syscall.c @@ -10,8 +10,7 @@ void __x86_64_syscall_init() { wrmsr(IA32_EFER, efer); uint64_t star = 0; star |= ((uint64_t)0x28 << 32); // kernel cs - star |= ((uint64_t)0x30 - << 48); // user cs base (SYSCALL adds 16 for CS=0x38, 24 for SS=0x40) + star |= ((uint64_t)0x30 << 48); // user cs base (SYSCALL adds 16 for CS=0x38, 24 for SS=0x40) wrmsr(IA32_STAR, star); wrmsr(IA32_LSTAR, (uint64_t)syscall_entry); wrmsr(IA32_CSTAR, 0x0); diff --git a/kernel/src/sched/sched.c b/kernel/src/sched/sched.c index 69e0abf..d822096 100644 --- a/kernel/src/sched/sched.c +++ b/kernel/src/sched/sched.c @@ -87,8 +87,8 @@ sched_process *sched_create(char *name, uint64_t entry_point, pagemap_t *pm, proc->regs.cs = 0x28; // Run in kernel mode proc->regs.ss = 0x30; } else if (flags == SCHED_USER_PROCESS) { - proc->regs.cs = 0x38 | 3; // Run in user mode - proc->regs.ss = 0x40 | 3; + proc->regs.cs = 0x40 | 3; // Run in user mode + proc->regs.ss = 0x38 | 3; } proc->regs.rflags = 0x202; // Enable interrupts proc->regs.rsp = (uint64_t)proc->stack_end; diff --git a/kernel/src/sys/syscall.c b/kernel/src/sys/syscall.c index 9340143..1abefe6 100644 --- a/kernel/src/sys/syscall.c +++ b/kernel/src/sys/syscall.c @@ -20,7 +20,7 @@ void syscall_handle(registers_t *regs) { return; } - if (curr_proc == NULL || curr_proc->regs.cs != 0x3B) { + if (curr_proc == NULL || curr_proc->regs.cs != 0x43) { log("syscall - syscall_handle was called by the kernel. is this wanted?\n"); return; }