X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=kernel%2Farch%2Fx86%2Fentry.S;h=3483893d93f4c9c642d7244bc493eff25cff6cf2;hp=3cbed22245fb5d2ea17e34b4096e5009df6e688a;hb=0601614ebbcc48b961a2f0613281e6e629af29b1;hpb=2e0cf58da9949572c6e334a07bba6774fdb749f9 diff --git a/kernel/arch/x86/entry.S b/kernel/arch/x86/entry.S index 3cbed22..3483893 100644 --- a/kernel/arch/x86/entry.S +++ b/kernel/arch/x86/entry.S @@ -2,23 +2,15 @@ // // This software is copyright (c) 2006 Scott Wood. // -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal with -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following condition: +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors or contributors be held liable for any damages +// arising from the use of this software. // -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE -// SOFTWARE. +// Permission is hereby granted to everyone, free of charge, to use, copy, +// modify, prepare derivative works of, publish, distribute, perform, +// sublicense, and/or sell copies of the Software, provided that the above +// copyright notice and disclaimer of warranty be included in all copies or +// substantial portions of this software. #include @@ -147,10 +139,25 @@ no_pentium_str: no_multiboot_str: .string "Unrecognized bootloader; a multiboot-compliant loader is required." + + .macro enterkernel, reg + pushl %es + pushl %ds + movl $8, \reg + cld + movl \reg, %ds + movl \reg, %es + .endm + + .macro exitkernel + popl %ds + popl %es + .endm .macro pushvolatilesnoeax pushl %ecx pushl %edx + enterkernel %ecx .endm .macro pushvolatiles @@ -159,6 +166,7 @@ no_multiboot_str: .endm .macro popvolatiles + exitkernel popl %edx popl %ecx popl %eax @@ -172,11 +180,11 @@ no_multiboot_str: .macro pushall pushl %esi pushl %ebp - pushl %esp pushl %ebx pushl %edx pushl %ecx pushl %eax + enterkernel %esi .endm .macro pushallnoerr @@ -185,11 +193,11 @@ no_multiboot_str: .endm .macro popall + exitkernel popl %eax popl %ecx popl %edx popl %ebx - addl $4, %esp popl %ebp popl %esi popl %edi @@ -269,17 +277,44 @@ x86_page_fault: popall iret + .global x86_int98_entry +x86_int98_entry: + pushl $0 + pushl %eax + enterkernel %ecx + + pushl %esp + call x86_invoke_method + addl $4, %esp + + exitkernel + popl %eax + xorl %ecx, %ecx + popl %edx + xorl %ebx, %ebx + xorl %ebp, %ebp + xorl %esi, %esi + xorl %edi, %edi + iret + .global x86_int99_entry x86_int99_entry: - pushl %edx - pushl 4(%esp) - pushl %edx pushl %ecx pushl %eax - call invoke_method - addl $16, %esp - xorl %ecx, %ecx - popl %edx + enterkernel %edx + + pushl %esp + call x86_return_from_method + addl $4, %esp + + exitkernel + popl %eax + popl %ecx + xorl %edx, %edx + xorl %ebx, %ebx + xorl %ebp, %ebp + xorl %esi, %esi + xorl %edi, %edi iret .global x86_irq @@ -350,16 +385,47 @@ x86_new_thread: .section ".roshared","x" - // The syscall pointer must be the first thing in roshared - // (at vaddr 0x7fff0000), so that user code can make method - // invocations to find out where other stuff is. + // The vsyscall table must be the first thing in roshared (at + // vaddr 0x7fff0000). + +#define PTR(x) (x - x86_syscall_ptr + 0x7fff0000) .global x86_syscall_ptr x86_syscall_ptr: - .long x86_shared_int99 - x86_syscall_ptr + 0x7fff0000 - - .global x86_shared_int99 + .long PTR(x86_shared_int98) + + .global x86_sysret_ptr +x86_sysret_ptr: + .long PTR(x86_shared_int99) + +x86_shared_int98: + // FIXME: This must be unpreemptible by traps + pushl %gs + pushl %fs + pushl %ebp + pushl %edi + pushl %esi + pushl %ebx + int $0x98 + popl %ebx + popl %esi + popl %edi + popl %ebp + popl %fs + popl %gs + ret + x86_shared_int99: int $0x99 - // FIXME: search for exception handler ret + + .section ".rwshared","" + + // Userspace must set this to an appropriate entry point + // prior to registering objects with the kernel. It should + // not be modified while an object is registered (the kernel + // won't mind, but there's no mechanism to wait until no more + // upcalls to the old entry point are in progress). + .global x86_upcall_entry +x86_upcall_entry: + .long 0