source: mainline/uspace/lib/c/arch/ia32/src/syscall.S

Last change on this file was 3fcea34, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 9 months ago

Simplify the SYS_THREAD_CREATE syscall interface

Removed the beefy uarg structure. Instead, the syscall gets two
parameters: %pc (program counter) and %sp (stack pointer). It starts
a thread with those values in corresponding registers, with no other
fuss whatsoever.

libc initializes threads by storing any other needed arguments on
the stack and retrieving them in thread_entry. Importantly, this
includes the address of the
thread_main function which is now
called indirectly to fix dynamic linking issues on some archs.

There's a bit of weirdness on SPARC and IA-64, because of their
stacked register handling. The current solution is that we require
some space *above* the stack pointer to be available for those
architectures. I think for SPARC, it can be made more normal.

For the remaining ones, we can (probably) just set the initial
%sp to the top edge of the stack. There's some lingering offsets
on some archs just because I didn't want to accidentally break
anything. The initial thread bringup should be functionally
unchanged from the previous state, and no binaries are currently
multithreaded except thread1 test, so there should be minimal
risk of breakage. Naturally, I tested all available emulator
builds, save for msim.

  • Property mode set to 100644
File size: 3.2 KB
Line 
1#
2# Copyright (c) 2007 Jakub Jermar
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29#include <abi/asmtool.h>
30
31.data
32
33OBJECT_BEGIN(__syscall_fast_func)
34 .long __syscall_slow
35OBJECT_END(__syscall_fast_func)
36
37.text
38
39/** Syscall wrapper - INT $0x30 version.
40 *
41 * Mind the order of arguments. First two arguments and the syscall number go to
42 * scratch registers. An optimized version of this wrapper for fewer arguments
43 * could benefit from this and not save unused registers on the stack.
44 */
45FUNCTION_BEGIN(__syscall_slow)
46 pushl %ebx
47 pushl %esi
48 pushl %edi
49 pushl %ebp
50 movl 20(%esp), %edx # First argument.
51 movl 24(%esp), %ecx # Second argument.
52 movl 28(%esp), %ebx # Third argument.
53 movl 32(%esp), %esi # Fourth argument.
54 movl 36(%esp), %edi # Fifth argument.
55 movl 40(%esp), %ebp # Sixth argument.
56 movl 44(%esp), %eax # Syscall number.
57 int $0x30
58 popl %ebp
59 popl %edi
60 popl %esi
61 popl %ebx
62 ret
63FUNCTION_END(__syscall_slow)
64
65/** Syscall wrapper - SYSENTER version.
66 *
67 * This is an optimized version of syscall for four or less arguments. Note
68 * that EBP and EDI are used to remember user stack address and the return
69 * address. The kernel part doesn't save DS, ES and FS so the handler restores
70 * these to the selector immediately following CS (it must be the flat data
71 * segment, otherwise the SYSENTER wouldn't work in the first place).
72 */
73FUNCTION_BEGIN(__syscall_fast)
74 pushl %ebx
75 pushl %esi
76 pushl %edi
77 pushl %ebp
78 mov %esp, %ebp
79 movl 20(%esp), %edx # First argument.
80 movl 24(%esp), %ecx # Second argument.
81 movl 28(%esp), %ebx # Third argument.
82 movl 32(%esp), %esi # Fourth argument.
83 movl 44(%esp), %eax # Syscall number.
84 call 1f
85 movw %cs, %cx
86 addw $8, %cx
87 movw %cx, %ds
88 movw %cx, %es
89 movw %cx, %fs
90 popl %ebp
91 popl %edi
92 popl %esi
93 popl %ebx
94 ret
95
96 /* Trampoline for entering kernel */
971:
98 pop %edi
99 sysenter
100FUNCTION_END(__syscall_fast)
Note: See TracBrowser for help on using the repository browser.