]> git.buserror.net Git - polintos/scott/priv.git/blobdiff - kernel/arch/x86/entry.S
Change x86 syscalls to direct branches, and define abi for additional syscalls.
[polintos/scott/priv.git] / kernel / arch / x86 / entry.S
index f8cf68420facff66239e57ee1b6a7d1109683134..8d4ede48ad2309d117979c0533b7095ca29ff99b 100644 (file)
 
 #include <arch/addrs.h>
 
+#define ROSHARED_PTR(x) (x - roshared + 0x7fff0000)
+
        .org 0
        .code32
        .global _start
-.align 4
+       .align  4
 multiboot_hdr:
        .long   0x1badb002              // Multi-boot magic
        
@@ -102,8 +104,9 @@ using_our_gdt:
        
        movl    $0x87, x86_init_ptbl_l2 + 0x800 - KERNEL_START
        ljmp    $0x10, $paging_on - KERNEL_START
+       
 
-paging_on:     
+paging_on:
        lgdt    x86_gdtr + 6
        movl    %esi, x86_boot_info_phys
        
@@ -139,10 +142,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
@@ -151,6 +169,7 @@ no_multiboot_str:
        .endm
 
        .macro  popvolatiles
+       exitkernel
        popl    %edx
        popl    %ecx
        popl    %eax
@@ -164,11 +183,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
@@ -177,11 +196,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
@@ -261,17 +280,45 @@ 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
+       enterkernel %edx
+
+       pushl   %esp
+       call    x86_return_from_method
+       addl    $4, %esp
+       
+       exitkernel
+       popl    %eax
+       xorl    %ecx, %ecx
        popl    %edx
+       xorl    %ebx, %ebx
+       xorl    %ebp, %ebp
+       xorl    %esi, %esi
+       xorl    %edi, %edi
+       movl    $ROSHARED_PTR(x86_shared_int98_ret), (%esp)
        iret
 
        .global x86_irq
@@ -335,23 +382,83 @@ x86_new_thread:
        xorl    %edi, %edi
        
        call    sched_new_thread
-       pop     %eax
+       popl    %eax
        call    *%eax
        call    exit_thread
        ud2a
-
-       .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.
+       .global arch_new_user_thread
+arch_new_user_thread:
+       movl    4(%esp), %eax   // arg1: user entry
+       movl    8(%esp), %ecx   // arg2: user stack
+       pushl   $0x23           // SS
+       pushl   %ecx            // ESP
+       pushl   $0x202          // EFLAGS
+       pushl   $0x2b           // CS
+       pushl   %eax            // EIP
        
-       .global x86_syscall_ptr
-x86_syscall_ptr:
-       .long   x86_shared_int99 - x86_syscall_ptr + 0x7fff0000
+       movl    $0x23, %ebx
+       movl    %ebx, %ds
+       movl    %ebx, %es
        
-       .global x86_shared_int99
+       xorl    %eax, %eax
+       xorl    %ecx, %ecx
+       iret
+
+       .section ".roshared","ax"
+roshared:
+x86_shared_int98:
+       // FIXME: This must be unpreemptible by traps
+       pushl   %gs
+       pushl   %fs
+       pushl   %ebp
+       pushl   %edi
+       pushl   %esi
+       pushl   %ebx
+       int     $0x98
+x86_shared_int98_ret:
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       popl    %ebp
+       popl    %fs
+       popl    %gs
+       ret
+
+       . = roshared + 0x80
 x86_shared_int99:
        int     $0x99
-       // FIXME: search for exception handler
        ret
+
+       .global test_user_ptr
+test_user_ptr:
+       .long   ROSHARED_PTR(test_user)
+       
+test_pib:
+       .long   0
+       .long   0
+       .long   ROSHARED_PTR(test_objlist)
+       .long   1
+       .long   0
+
+test_objlist:
+       .long   0
+       .space  128
+       
+test_user:
+       movl    $ROSHARED_PTR(test_pib), %eax
+       movl    $0x7fff0000, %ecx
+       call    *%ecx
+1:     jmp     1b
+
+       .section ".rwshared","a"
+       .align 4096
+
+       // 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