mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-25 00:11:07 +00:00
412 lines
13 KiB
Diff
412 lines
13 KiB
Diff
|
diff -r e2bca488e43b arch/ia32/libs/l4/include/syscalls.h
|
||
|
--- a/arch/ia32/libs/l4/include/syscalls.h Tue Aug 03 12:58:05 2010 +0200
|
||
|
+++ b/arch/ia32/libs/l4/include/syscalls.h Mon Aug 16 15:51:08 2010 +0200
|
||
|
@@ -97,22 +97,13 @@
|
||
|
#define L4_FlushDCache 30
|
||
|
#define L4_FlushCache 31
|
||
|
|
||
|
-#if defined(__pic__)
|
||
|
# define __L4_SAVE_REGS " pushl %%ebx; pushl %%ebp\n"
|
||
|
# define __L4_RESTORE_REGS " popl %%ebp; popl %%ebx\n"
|
||
|
# define __L4_CLOBBER_REGS "cc"
|
||
|
-#else
|
||
|
-# define __L4_SAVE_REGS " pushl %%ebp \n"
|
||
|
-# define __L4_RESTORE_REGS " popl %%ebp \n"
|
||
|
-# define __L4_CLOBBER_REGS "ebx", "cc"
|
||
|
-#endif
|
||
|
|
||
|
-
|
||
|
-#define __SYSCALL_SAVE_REGS \
|
||
|
- " push %%ebp\n"
|
||
|
-
|
||
|
-#define __SYSCALL_RESTORE_REGS \
|
||
|
- " pop %%ebp\n"
|
||
|
+#define __SYSCALL_SAVE_REGS __L4_SAVE_REGS
|
||
|
+#define __SYSCALL_RESTORE_REGS __L4_RESTORE_REGS
|
||
|
+#define __SYSCALL_CLOBBER_REGS __L4_CLOBBER_REGS
|
||
|
|
||
|
L4_INLINE L4_ThreadId_t
|
||
|
L4_ExchangeRegisters(L4_ThreadId_t dest,
|
||
|
@@ -129,7 +120,6 @@
|
||
|
L4_Word_t *old_UserDefhandle, L4_ThreadId_t *old_pager)
|
||
|
{
|
||
|
L4_ThreadId_t result;
|
||
|
- L4_Word_t dummy;
|
||
|
L4_Word_t *utcb = __L4_X86_Utcb() + (__L4_TCR_SYSCALL_ARGS);
|
||
|
|
||
|
utcb[0] = flags;
|
||
|
@@ -137,21 +127,26 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
- " movl %%esp, %%ebp\n"
|
||
|
- " movl $0x8000000a, %%eax\n"
|
||
|
- " sysenter\n"
|
||
|
- "0:\n"
|
||
|
- " movl %%ebp, %%ecx\n"
|
||
|
- __SYSCALL_RESTORE_REGS
|
||
|
+ " movl %%edi, %%ebx\n" //set IP
|
||
|
+ " call 0f \n"
|
||
|
+ " 0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
+ " movl %%esp, %%ebp\n"
|
||
|
+ " movl $0x8000000a, %%eax\n"
|
||
|
+ " sysenter\n"
|
||
|
+ " 1:\n"
|
||
|
+ " movl %%ebp, %%ecx\n" //old flags
|
||
|
+ " movl %%ebx, %%edx\n" //old ip
|
||
|
+ " popl %%ebp\n"
|
||
|
+ __SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
- "=a"(result), "=S"(*old_control), "=D"(*old_sp), "=b"(*old_ip),
|
||
|
- "=c"(*old_flags), "=d"(dummy)
|
||
|
+ "=a"(result), "=S"(*old_control), "=D"(*old_sp),
|
||
|
+ "=c"(*old_flags), "=d"(*old_ip)
|
||
|
:
|
||
|
- "S"(dest), "d"(control), "c"(sp), "b"(ip)
|
||
|
+ "S"(dest), "d"(control), "c"(sp), "D"(ip)
|
||
|
: "memory"
|
||
|
);
|
||
|
-
|
||
|
old_pager->raw = utcb[0];
|
||
|
*old_UserDefhandle = utcb[1];
|
||
|
|
||
|
@@ -175,11 +170,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000006, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=b"(dummy), "=S"(dummy), "=d"(dummy), "=c"(dummy)
|
||
|
@@ -194,22 +193,28 @@
|
||
|
L4_INLINE void
|
||
|
L4_ThreadSwitch(L4_ThreadId_t dest)
|
||
|
{
|
||
|
+
|
||
|
L4_Word_t dummy;
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp),%%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000004, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=S"(dummy)
|
||
|
:
|
||
|
"S"(dest)
|
||
|
:
|
||
|
- "eax", "ebx", "ecx", "edx", "edi"
|
||
|
+ "eax", "ecx", "edx", "edi",
|
||
|
+ __SYSCALL_CLOBBER_REGS
|
||
|
);
|
||
|
}
|
||
|
|
||
|
@@ -230,11 +235,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000009, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(res_ts), "=d"(dummy), "=c"(dummy), "=b"(dummy)
|
||
|
@@ -262,18 +271,22 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x8000000b, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(tag_out), "=d"(dummy), "=c"(dummy)
|
||
|
:
|
||
|
"S"(to), "d"(FromSpecifier), "c"(tag)
|
||
|
:
|
||
|
- "edi", "ebx"
|
||
|
+ "edi", __SYSCALL_CLOBBER_REGS
|
||
|
);
|
||
|
|
||
|
if (!L4_IsNilThread(FromSpecifier)) {
|
||
|
@@ -296,11 +309,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x8000000b, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=S"(tag_out), "=d"(dummy), "=c"(dummy)
|
||
|
@@ -324,11 +341,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp),%%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x8000000b, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=S"(tag_out), "=d"(dummy), "=c"(dummy)
|
||
|
@@ -350,18 +371,22 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp),%%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000002, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy)
|
||
|
:
|
||
|
"S"(SpaceSpecifier), "d"(control)
|
||
|
:
|
||
|
- "ebx", "ecx", "edi"
|
||
|
+ "ecx", "edi", __SYSCALL_CLOBBER_REGS
|
||
|
);
|
||
|
|
||
|
return result;
|
||
|
@@ -382,11 +407,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000005, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(res_resources), "=d"(dummy), "=c"(dummy), "=b"(dummy)
|
||
|
@@ -410,11 +439,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000001, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy)
|
||
|
@@ -434,11 +467,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp),%%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000003, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy)
|
||
|
@@ -459,11 +496,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000007, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy), "=c"(dummy), "=b"(dummy)
|
||
|
@@ -484,11 +525,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000008, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy), "=c"(dummy)
|
||
|
@@ -508,11 +553,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x8000000e, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy), "=c"(dummy)
|
||
|
@@ -532,11 +581,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x8000000f, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy)
|
||
|
@@ -556,11 +609,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000010, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy)
|
||
|
@@ -583,11 +640,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000011, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(dummy), "=d"(dummy)
|
||
|
@@ -611,11 +672,15 @@
|
||
|
|
||
|
__asm__ __volatile__ (
|
||
|
__SYSCALL_SAVE_REGS
|
||
|
- " movl $0f, %%edi\n"
|
||
|
+ " call 0f \n"
|
||
|
+ "0:\n"
|
||
|
+ " addl $(1f-0b), (%%esp)\n"
|
||
|
+ " movl (%%esp), %%edi\n"
|
||
|
" movl %%esp, %%ebp\n"
|
||
|
" movl $0x80000012, %%eax\n"
|
||
|
" sysenter\n"
|
||
|
- "0:\n"
|
||
|
+ "1:\n"
|
||
|
+ " popl %%ebp\n"
|
||
|
__SYSCALL_RESTORE_REGS
|
||
|
:
|
||
|
"=a"(result), "=S"(*size)
|