diff --git a/user/include/l4/ia32/syscalls.h b/user/include/l4/ia32/syscalls.h index 56820e3..2307ed9 100644 --- a/user/include/l4/ia32/syscalls.h +++ b/user/include/l4/ia32/syscalls.h @@ -47,6 +47,13 @@ # define __L4_CLOBBER_REGS "ebx", "cc" #endif +/* + * This expects the '__L4_indirect' struct in 'edi' + */ +#define __L4_INDIRECT_CALL " movl 4(%%edi), %%ebx \n" \ + " movl (%%edi), %%edi \n" \ + " call *%%ebx \n" + #ifdef __cplusplus #define _C_ "C" #else @@ -70,6 +77,13 @@ extern _C_ void __L4_SpaceControl(void); extern _C_ void __L4_ProcessorControl(void); extern _C_ void __L4_MemoryControl(void); +typedef struct __L4_indirect +{ + L4_Word_t edi; + void (*sys_call)(); +} __L4_indirect; + + L4_INLINE void * L4_KernelInterface (L4_Word_t *ApiVersion, L4_Word_t *ApiFlags, L4_Word_t *KernelId) @@ -163,12 +177,14 @@ L4_INLINE L4_Word_t L4_ThreadControl (L4_ThreadId_t dest, L4_Word_t result; L4_Word_t dummy; + __L4_indirect in; + in.edi = (L4_Word_t)UtcbLocation; + in.sys_call = __L4_ThreadControl; + __asm__ __volatile__ ( "/* L4_ThreadControl() */ \n" __L4_SAVE_REGS - " movl %%edi, %%ebx \n" - " movl %9, %%edi \n" - " call *%%ebx \n" + __L4_INDIRECT_CALL __L4_RESTORE_REGS : /* outputs */ @@ -183,11 +199,10 @@ L4_INLINE L4_Word_t L4_ThreadControl (L4_ThreadId_t dest, "1" (Pager), "2" (Scheduler), "3" (SpaceSpecifier), - "m" (UtcbLocation), - "D" (__L4_ThreadControl) + "4" (&in) : /* clobbers */ - __L4_CLOBBER_REGS); + __L4_CLOBBER_REGS, "memory"); return result; } @@ -239,12 +254,14 @@ L4_INLINE L4_Word_t L4_Schedule (L4_ThreadId_t dest, L4_Word_t result; L4_Word_t dummy; + __L4_indirect in; + in.edi = PreemptionControl; + in.sys_call = __L4_Schedule; + __asm__ __volatile__ ( "/* L4_Schedule() */ \n" __L4_SAVE_REGS - " movl %%edi, %%ebx \n" - " movl %9, %%edi \n" - " call *%%ebx \n" + __L4_INDIRECT_CALL __L4_RESTORE_REGS : /* outputs */ @@ -259,11 +276,11 @@ L4_INLINE L4_Word_t L4_Schedule (L4_ThreadId_t dest, "1" (PrioControl), "2" (TimeControl), "3" (ProcessorControl), - "m" (PreemptionControl), - "D" (__L4_Schedule) + "4" (&in) : /* clobbers */ - __L4_CLOBBER_REGS); + __L4_CLOBBER_REGS, "memory"); + return result; } @@ -278,14 +295,15 @@ L4_INLINE L4_MsgTag_t L4_Ipc (L4_ThreadId_t to, L4_Word_t * utcb = __L4_X86_Utcb (); #if defined(__pic__) + __L4_indirect in; + in.edi = (L4_Word_t)utcb; + in.sys_call = __L4_Ipc; __asm__ __volatile__ ( "/* L4_Ipc() */ \n" __L4_SAVE_REGS - " movl %%eax, %%ebx \n" - " movl %5, %%eax \n" - " call *%%ebx \n" - " movl %%ebp, %%ecx \n" + __L4_INDIRECT_CALL + " movl %%ebp, %%ecx \n" " movl %%ebx, %%edx \n" __L4_RESTORE_REGS @@ -297,12 +315,12 @@ L4_INLINE L4_MsgTag_t L4_Ipc (L4_ThreadId_t to, : /* inputs */ "S" (utcb[0]), - "m" (to.raw), - "D" (utcb), + "a" (to.raw), + "D" (&in), "c" (Timeouts), - "d" (FromSpecifier), - "a" (__L4_Ipc) - ); + "d" (FromSpecifier) + + : "memory"); #else L4_Word_t dummy; @@ -319,7 +337,7 @@ L4_INLINE L4_MsgTag_t L4_Ipc (L4_ThreadId_t to, "=a" (result), "=b" (mr1), "=c" (mr2), - "=d" (dummy) + "=d" (dummy) : /* inputs */ "S" (utcb[0]), @@ -351,12 +369,15 @@ L4_INLINE L4_MsgTag_t L4_Lipc (L4_ThreadId_t to, L4_Word_t * utcb = __L4_X86_Utcb (); #if defined(__pic__) + + __L4_indirect in; + in.edi = (L4_Word_t)utcb; + in.sys_call = __L4_Lipc; + __asm__ __volatile__ ( "/* L4_Lipc() */ \n" __L4_SAVE_REGS - " movl %%eax, %%ebx \n" - " movl %5, %%eax \n" - " call *%%ebx \n" + __L4_INDIRECT_CALL " movl %%ebp, %%ecx \n" " movl %%ebx, %%edx \n" __L4_RESTORE_REGS @@ -366,15 +387,15 @@ L4_INLINE L4_MsgTag_t L4_Lipc (L4_ThreadId_t to, "=a" (result), "=d" (mr1), "=c" (mr2) - + : /* inputs */ "S" (utcb[0]), - "m" (to.raw), - "D" (utcb), + "a" (to.raw), + "D" (&in), "c" (Timeouts), - "d" (FromSpecifier), - "a" (__L4_Lipc) - ); + "d" (FromSpecifier) + + : "memory"); #else L4_Word_t dummy; @@ -382,7 +403,7 @@ L4_INLINE L4_MsgTag_t L4_Lipc (L4_ThreadId_t to, "/* L4_Lipc() */ \n" __L4_SAVE_REGS " call __L4_Lipc \n" - " movl %%ebp, %%ecx \n" + " movl %%ebp, %%ecx \n" __L4_RESTORE_REGS : /* outputs */ @@ -390,8 +411,8 @@ L4_INLINE L4_MsgTag_t L4_Lipc (L4_ThreadId_t to, "=a" (result), "=b" (mr1), "=c" (mr2), - "=d" (dummy) - + "=d" (dummy) + : /* inputs */ "S" (utcb[0]), "a" (to.raw), @@ -446,12 +467,14 @@ L4_INLINE L4_Word_t L4_SpaceControl (L4_ThreadId_t SpaceSpecifier, { L4_Word_t result, dummy; + __L4_indirect in; + in.edi = redirector.raw; + in.sys_call = __L4_SpaceControl; + __asm__ __volatile__ ( "/* L4_SpaceControl() */ \n" __L4_SAVE_REGS - " movl %%edi, %%ebx \n" - " movl %9, %%edi \n" - " call *%%ebx \n" + __L4_INDIRECT_CALL __L4_RESTORE_REGS : /* outputs */ @@ -466,11 +489,10 @@ L4_INLINE L4_Word_t L4_SpaceControl (L4_ThreadId_t SpaceSpecifier, "1" (control), "2" (KernelInterfacePageArea), "3" (UtcbArea), - "m" (redirector), - "D" (__L4_SpaceControl) + "4" (&in) : /* clobbers */ - __L4_CLOBBER_REGS); + __L4_CLOBBER_REGS, "memory"); return result; } @@ -516,22 +538,23 @@ L4_INLINE L4_Word_t L4_MemoryControl (L4_Word_t control, L4_Word_t result, dummy; L4_Word_t * utcb = __L4_X86_Utcb (); + __L4_indirect in; + in.edi = (L4_Word_t)utcb; + in.sys_call = __L4_MemoryControl; + __asm__ __volatile__ ( "/* L4_MemoryControl() */ \n" __L4_SAVE_REGS - " pushl %%edi \n" - " movl %8, %%edi \n" " movl 12(%6), %%ebp \n" " movl 8(%6), %%ebx \n" " movl 4(%6), %%edx \n" " movl (%6), %%ecx \n" - " call *(%%esp) \n" - " popl %%edi \n" + __L4_INDIRECT_CALL __L4_RESTORE_REGS : /* outputs */ "=a" (result), - "=c" (dummy), + "=c" (dummy), "=d" (dummy), "=S" (dummy), "=D" (dummy) @@ -540,11 +563,10 @@ L4_INLINE L4_Word_t L4_MemoryControl (L4_Word_t control, "0" (control), "1" (attributes), "3" (utcb[0]), - "m" (utcb), - "4" (__L4_MemoryControl) + "4" (&in) : /* clobbers */ - __L4_CLOBBER_REGS); + __L4_CLOBBER_REGS, "memory"); return result; }