Simplified the x86 syscall interface a bit. We no longer pass a pointer
to the parameters nor the number of parameters; the kernel is able to get both without problems. The syscall functions in libroot (_kern_*()) are now self-contained (they don't "jmp" to separate code anymore), which at least theoretically allows gdb to print a stack trace with the syscall function on the top when a thread is currently performing a syscall. Practically it doesn't work yet, though, since those functions are frameless (i.e. create no stack frame) which needs special support I haven't implemented yet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14661 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -4,254 +4,34 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
** syscall interface works as such:
|
||||
** eax has syscall #
|
||||
** ecx has number of args (0-16)
|
||||
** edx has pointer to buffer containing args from first to last
|
||||
** each is verified to make sure someone doesnt try to clobber it
|
||||
*/
|
||||
* syscall interface works as such:
|
||||
* eax has syscall #
|
||||
* esp + 4 points to the syscall parameters
|
||||
*/
|
||||
|
||||
#define SYSCALL0(name, n) \
|
||||
#define _SYSCALL(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall0
|
||||
|
||||
#define SYSCALL1(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall1
|
||||
|
||||
#define SYSCALL2(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall2
|
||||
|
||||
#define SYSCALL3(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall3
|
||||
|
||||
#define SYSCALL4(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall4
|
||||
|
||||
#define SYSCALL5(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall5
|
||||
|
||||
#define SYSCALL6(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall6
|
||||
|
||||
|
||||
#define SYSCALL7(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall7
|
||||
|
||||
#define SYSCALL8(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall8
|
||||
|
||||
#define SYSCALL9(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall9
|
||||
|
||||
#define SYSCALL10(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall10
|
||||
|
||||
#define SYSCALL11(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall11
|
||||
|
||||
#define SYSCALL12(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall12
|
||||
|
||||
#define SYSCALL13(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall13
|
||||
|
||||
#define SYSCALL14(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall14
|
||||
|
||||
#define SYSCALL15(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall15
|
||||
|
||||
#define SYSCALL16(name, n) \
|
||||
.globl name; \
|
||||
.type name,@function; \
|
||||
.align 8; \
|
||||
name: \
|
||||
movl $n,%eax; \
|
||||
jmp syscall16
|
||||
|
||||
|
||||
|
||||
/* we will optimize by just passing a ptr to the place where the caller
|
||||
** would have dumped the args */
|
||||
|
||||
syscall0:
|
||||
movl $0, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall1:
|
||||
movl $1, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall2:
|
||||
movl $2, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall3:
|
||||
movl $3, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall4:
|
||||
movl $4, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall5:
|
||||
movl $5, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall6:
|
||||
movl $6, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall7:
|
||||
movl $7, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall8:
|
||||
movl $8, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall9:
|
||||
movl $9, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall10:
|
||||
movl $10, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall11:
|
||||
movl $11, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall12:
|
||||
movl $12, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall13:
|
||||
movl $13, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall14:
|
||||
movl $14, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall15:
|
||||
movl $15, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
ret
|
||||
|
||||
syscall16:
|
||||
movl $16, %ecx
|
||||
lea 4(%esp), %edx
|
||||
int $99
|
||||
int $99; \
|
||||
ret
|
||||
|
||||
#define SYSCALL0(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL1(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL2(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL3(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL4(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL5(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL6(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL7(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL8(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL9(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL10(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL11(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL12(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL13(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL14(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL15(name, n) _SYSCALL(name, n)
|
||||
#define SYSCALL16(name, n) _SYSCALL(name, n)
|
||||
|
||||
Reference in New Issue
Block a user