X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fdesctab.asm;h=739b219f6a51fc27c2a42de1cb7a74ce9df5f8e4;hb=58c7107eb0a5ae254c135f2eaa6263751f1ebe67;hp=8212773b5b81468a9dbe35614ab9ac5bc9371b1f;hpb=98d45a155c3ce437d0eddb67b9eb2b203f87ec3b;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/desctab.asm b/Kernel/arch/x86_64/desctab.asm index 8212773b..739b219f 100644 --- a/Kernel/arch/x86_64/desctab.asm +++ b/Kernel/arch/x86_64/desctab.asm @@ -1,6 +1,7 @@ ; ; ; +%include "arch/x86_64/include/common.inc.asm" [BITS 64] [extern Log] @@ -11,45 +12,6 @@ MM_LOCALAPIC equ 0xFFFFFD0000000000 -%macro PUSH_GPR 0 - mov [rsp-0x60], rsp - mov [rsp-0x08], r15 - mov [rsp-0x10], r14 - mov [rsp-0x18], r13 - mov [rsp-0x20], r12 - mov [rsp-0x28], r11 - mov [rsp-0x30], r10 - mov [rsp-0x38], r9 - mov [rsp-0x40], r8 - mov [rsp-0x48], rdi - mov [rsp-0x50], rsi - mov [rsp-0x58], rbp - mov [rsp-0x68], rbx - mov [rsp-0x70], rdx - mov [rsp-0x78], rcx - mov [rsp-0x80], rax - sub rsp, 0x80 -%endmacro -%macro POP_GPR 0 - add rsp, 0x80 - mov r15, [rsp-0x08] - mov r14, [rsp-0x10] - mov r13, [rsp-0x18] - mov r12, [rsp-0x20] - mov r11, [rsp-0x28] - mov r10, [rsp-0x30] - mov r9, [rsp-0x38] - mov r8, [rsp-0x40] - mov rdi, [rsp-0x48] - mov rsi, [rsp-0x50] - mov rbp, [rsp-0x58] - ;mov rsp, [rsp-0x60] - mov rbx, [rsp-0x68] - mov rdx, [rsp-0x70] - mov rcx, [rsp-0x78] - mov rax, [rsp-0x80] -%endmacro - [section .text] [global Desctab_Init] Desctab_Init: @@ -141,6 +103,28 @@ Desctab_Init: ; Start interrupts sti + + ; Initialise System Calls (SYSCALL/SYSRET) + ; Set IA32_EFER.SCE + mov ecx, 0xC0000080 + rdmsr + or eax, 1 + wrmsr + ; Set IA32_LSTAR (RIP of handler) + mov ecx, 0xC0000082 ; IA32_LSTAR + mov eax, SyscallStub - 0xFFFFFFFF00000000 + mov edx, 0xFFFFFFFF + wrmsr + ; Set IA32_FMASK (flags mask) + mov ecx, 0xC0000084 + rdmsr + mov eax, 0x202 + wrmsr + ; Set IA32_STAR (Kernel/User CS) + mov ecx, 0xC0000081 + rdmsr + mov edx, 0x8 | (0x18 << 16) ; Kernel CS (and Kernel DS/SS - 8), User CS + wrmsr ret @@ -207,6 +191,8 @@ IRQ_AddHandler: [section .rodata] csIRQ_Assigned: db "IRQ %p := %p (IRQ %i)",0 +csIRQ_Fired: + db "IRQ %i fired",0 [section .text] %macro ISR_NOERRNO 1 @@ -293,10 +279,14 @@ IrqCommon: PUSH_GPR push gs push fs + +; mov rdi, csIRQ_Fired +; mov rsi, [rsp+(16+2)*8] +; call Log - mov rbx, [rsp+(16+2)*8] ; Get interrupt number (16 GPRS + 2 SRs) + mov ebx, [rsp+(16+2)*8] ; Get interrupt number (16 GPRS + 2 SRs) ; xchg bx, bx ; Bochs Magic break (NOTE: will clear the high-bits of RBX) - shl rbx, 2 ; *8*4 + shl ebx, 2 ; *4 mov rax, gaIRQ_Handlers lea rbx, [rax+rbx*8] @@ -319,20 +309,17 @@ IrqCommon: ; ACK mov al, 0x20 - mov rdi, [rsp+16*8] ; Get IRQ number + mov rdi, [rsp+(16+2)*8] ; Get IRQ number cmp rdi, 8 jb .skipAckSecondary - mov dx, 0x00A0 - out dx, al + out 0xA0, al .skipAckSecondary: - mov dx, 0x0020 - out dx, al + out 0x20, al pop fs pop gs POP_GPR add rsp, 8*2 - ;xchg bx, bx iretq [extern Proc_Scheduler] @@ -353,10 +340,12 @@ SchedulerIRQ: mov rax, dr0 push rax - ; Get the CPU Number - mov rdi, dr1 + mov rdi, dr1 ; Get the CPU Number + mov rsi, rsp ; Save stack pointer + mov rdx, SchedulerIRQ.restoreState ; Call the Scheduler call Proc_Scheduler +.restoreState: ; Restore Thread Pointer pop rax @@ -385,8 +374,55 @@ SchedulerIRQ: pop gs POP_GPR add rsp, 2*8 ; Dummy error code and IRQ num +; xchg bx, bx iretq +[extern ci_offsetof_tThread_KernelStack] +[extern SyscallHandler] +[global SyscallStub] +SyscallStub: + mov rbp, dr0 + mov ebx, [rel ci_offsetof_tThread_KernelStack] + mov rbp, [rbp+rbx] ; Get kernel stack + xchg rbp, rsp ; Swap stacks + + push rbp ; Save User RSP + push rcx ; RIP + push r11 ; RFLAGS + + ; RDI + ; RSI + ; RDX + ; R10 (RCX for non syscall) + ; R8 + ; R9 + sub rsp, (6+2)*8 + mov [rsp+0x00], rax ; Number +; mov [rsp+0x08], rax ; Errno (don't care really) + mov [rsp+0x10], rdi ; Arg1 + mov [rsp+0x18], rsi ; Arg2 + mov [rsp+0x20], rdx ; Arg3 + mov [rsp+0x28], r10 ; Arg4 + mov [rsp+0x30], r8 ; Arg5 + mov [rsp+0x38], r9 ; Arg6 + + mov rdi, rsp + sub rsp, 8 + call SyscallHandler + add rsp, 8 + mov ebx, [rsp+8] ; Get errno + mov rax, [rsp+0] ; Get return + add rsp, (6+2)*8 + + pop r11 + pop rcx + pop rsp ; Change back to user stack + ; TODO: Determine if user is 64 or 32 bit + +; xchg bx, bx + db 0x48 ; REX, nasm doesn't have a sysretq opcode + sysret + [section .data] gIDT: ; 64-bit Interrupt Gate, CS = 0x8, IST0 (Disabled)