genode/repos/base-okl4/patches/syscall_pic.patch

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)