]> 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 098d6d71dfe584bb7b1a612d11304cbe2f049fdf..8d4ede48ad2309d117979c0533b7095ca29ff99b 100644 (file)
 
 #include <arch/addrs.h>
 
-#define ROSHARED_PTR(x) (x - x86_syscall_ptr + 0x7fff0000)
+#define ROSHARED_PTR(x) (x - roshared + 0x7fff0000)
 
        .org 0
        .code32
        .global _start
-.align 4
+       .align  4
 multiboot_hdr:
        .long   0x1badb002              // Multi-boot magic
        
@@ -104,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
        
@@ -301,7 +302,7 @@ x86_int98_entry:
 
        .global x86_int99_entry
 x86_int99_entry:
-       pushl   %ecx
+       pushl   %edx
        pushl   %eax
        enterkernel %edx
 
@@ -311,8 +312,8 @@ x86_int99_entry:
        
        exitkernel
        popl    %eax
-       popl    %ecx
-       xorl    %edx, %edx
+       xorl    %ecx, %ecx
+       popl    %edx
        xorl    %ebx, %ebx
        xorl    %ebp, %ebp
        xorl    %esi, %esi
@@ -381,24 +382,31 @@ x86_new_thread:
        xorl    %edi, %edi
        
        call    sched_new_thread
-       pop     %eax
+       popl    %eax
        call    *%eax
        call    exit_thread
        ud2a
-
-       .section ".roshared","x"
        
-       // The vsyscall table must be the first thing in roshared 
-       // (at vaddr 0x7fff0000).
+       .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   ROSHARED_PTR(x86_shared_int98)
-
-       .global x86_sysret_ptr
-x86_sysret_ptr:
-       .long   ROSHARED_PTR(x86_shared_int99)
+       movl    $0x23, %ebx
+       movl    %ebx, %ds
+       movl    %ebx, %es
+       
+       xorl    %eax, %eax
+       xorl    %ecx, %ecx
+       iret
 
+       .section ".roshared","ax"
+roshared:
 x86_shared_int98:
        // FIXME: This must be unpreemptible by traps
        pushl   %gs
@@ -417,11 +425,34 @@ x86_shared_int98_ret:
        popl    %gs
        ret
 
+       . = roshared + 0x80
 x86_shared_int99:
        int     $0x99
        ret
 
-       .section ".rwshared",""
+       .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