X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Farch%2Fx86_64%2Fdesctab.asm;h=6e8aa6398ca7f64fa4491d7181793555b28035a0;hb=a2495c6ea4f4cab16b5d339ae511428e92e89e73;hp=27ba9137829b8fe507856972fde87aa61db922ea;hpb=e957c67ea0f63a668303d087af7ee0c7ecff1f01;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/desctab.asm b/Kernel/arch/x86_64/desctab.asm index 27ba9137..6e8aa639 100644 --- a/Kernel/arch/x86_64/desctab.asm +++ b/Kernel/arch/x86_64/desctab.asm @@ -44,7 +44,7 @@ Desctab_Init: %endrep ; Install IRQs - SETIDT 0xF0, SchedulerIRQ + SETIDT 0xF0, PIT_IRQ SETIDT 0xF1, Irq1 SETIDT 0xF2, Irq2 SETIDT 0xF3, Irq3 @@ -104,12 +104,6 @@ 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 @@ -118,12 +112,12 @@ Desctab_Init: ; Set IA32_FMASK (flags mask) mov ecx, 0xC0000084 rdmsr - mov eax, 0x202 + 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 + mov edx, 0x8 | (0x1B << 16) ; Kernel CS (and Kernel DS/SS - 8), User CS wrmsr ret @@ -255,7 +249,7 @@ ErrorCommon: ;PUSH_XMM mov rdi, rsp - xchg bx, bx +; xchg bx, bx call Error_Handler ;POP_XMM @@ -290,7 +284,6 @@ IrqCommon: ; call Log 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 ebx, 2 ; *4 mov rax, gaIRQ_Handlers lea rbx, [rax+rbx*8] @@ -328,59 +321,50 @@ IrqCommon: add rsp, 8*2 iretq -[extern Proc_Scheduler] -[global SchedulerIRQ] -; -; NOTE: Proc_Scheduler makes assumptions about the stack state when called -; -SchedulerIRQ: - push 0 ; Error code - push 0 ; IRQNum +[extern Time_UpdateTimestamp] + +%if USE_MP +[global APIC_Timer_IRQ] +APIC_Timer_IRQ: PUSH_GPR push gs push fs + + ; TODO: What to do? + + mov eax, DWORD [gpMP_LocalAPIC] + mov DWORD [eax+0x0B0], 0 + + pop fs + pop gs + POP_GPR + iretq +%endif + +[global PIT_IRQ] +PIT_IRQ: + PUSH_GPR ;PUSH_FPU ;PUSH_XMM - ; Save Thread Pointer - mov rax, dr0 - push rax - - 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 - mov dr0, rax - - ; Send EOI (To either the APIC or the PIC) - %if USE_MP - test ebx, ebx - jnz .sendEOI + call Time_UpdateTimestamp + + %if 0 +[section .rodata] +csUserSS: db "User SS: 0x%x",0 +[section .text] + mov rdi, csUserSS + mov rsi, [rsp+0x80+0x20] + call Log %endif - ; PIC + + ; Send EOI mov al, 0x20 out 0x20, al ; ACK IRQ - %if USE_MP - jmp .ret - ; APIC -.sendEOI: - mov eax, DWORD [gpMP_LocalAPIC] - mov DWORD [eax+0x0B0], 0 - %endif -.ret: ;POP_XMM ;POP_FPU - pop fs - pop gs POP_GPR - add rsp, 2*8 ; Dummy error code and IRQ num -; xchg bx, bx iretq [extern ci_offsetof_tThread_KernelStack] @@ -404,7 +388,7 @@ SyscallStub: ; R9 sub rsp, (6+2)*8 mov [rsp+0x00], rax ; Number -; mov [rsp+0x08], rax ; Errno (don't care really) +; mov [rsp+0x08], rax ; Errno (output only) mov [rsp+0x10], rdi ; Arg1 mov [rsp+0x18], rsi ; Arg2 mov [rsp+0x20], rdx ; Arg3 @@ -415,6 +399,16 @@ SyscallStub: mov rdi, rsp sub rsp, 8 call SyscallHandler + + %if 0 +[section .rodata] +csSyscallReturn: db "Syscall Return: 0x%x",0 +[section .text] + mov rdi, csSyscallReturn + mov rsi, [rsp+0+8] + call Log + %endif + add rsp, 8 mov ebx, [rsp+8] ; Get errno mov rax, [rsp+0] ; Get return @@ -425,7 +419,6 @@ SyscallStub: 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 @@ -441,3 +434,5 @@ gaIRQ_Handlers: times 16*NUM_IRQ_CALLBACKS dq 0 gaIRQ_DataPtrs: times 16*NUM_IRQ_CALLBACKS dq 0 + +; vim: ft=nasm