Hi there,

we use Pistachio's system-call bindings in shared libraries, so we
compiled them as position independent code (-fPIC). While there is
already PIC support within the bindings, we still got text-relocations
in our shared libraries. We fixed these issues for our purposes and I
just wanted to share the patch here.

Greetings,
-- 
Sebastian Sumpf

http://www.genode-labs.com ยท http://genode.org

# HG changeset patch
# Parent b205e69908fea43e434a0ac04232d88ad758f890

diff -r b205e69908fe user/include/l4/ia32/syscalls.h
--- a/user/include/l4/ia32/syscalls.h   Mon Sep 13 19:40:40 2010 +0200
+++ b/user/include/l4/ia32/syscalls.h   Mon Oct 11 15:10:52 2010 +0200
@@ -47,6 +47,28 @@
 # define __L4_CLOBBER_REGS     "ebx", "cc"
 #endif
 
+#ifdef __cplusplus
+#define _C_ "C"
+#else
+#define _C_
+#endif
+
+/*
+ * Note: We do not call the __L4*-functions from inline assembly any more,
+ * instead we pass the pointers as input operands. This way there is no need 
for
+ * the linker to generate text relocations for position independent code.
+ */
+extern _C_ void __L4_ExchangeRegisters(void);
+extern _C_ void __L4_ThreadControl(void);
+extern _C_ void __L4_SystemClock(void);
+extern _C_ void __L4_ThreadSwitch(void);
+extern _C_ void __L4_Schedule(void);
+extern _C_ void __L4_Ipc(void);
+extern _C_ void __L4_Lipc(void);
+extern _C_ void __L4_Unmap(void);
+extern _C_ void __L4_SpaceControl(void);
+extern _C_ void __L4_ProcessorControl(void);
+extern _C_ void __L4_MemoryControl(void);
 
 L4_INLINE void * L4_KernelInterface (L4_Word_t *ApiVersion,
                                     L4_Word_t *ApiFlags,
@@ -95,32 +117,35 @@
        L4_Word_t       esi;
     } in;
 
-    in.ebp = pager.raw;
-    in.ebx = UserDefHandle;
-    in.esi = ip;
-    in.edi = flags;
+    in.ebp  = pager.raw;
+    in.ebx  = UserDefHandle;
+    in.esi  = ip;
+    in.edi  = flags;
 
     __asm__ __volatile__ (
        "/* L4_ExchangeRegisters() */                   \n"
        __L4_SAVE_REGS
        "       pushl   %%esi                           \n"
+       "       pushl   %%edi                           \n"
        "       movl    (%%esi), %%ebp                  \n"
        "       movl    4(%%esi), %%edi                 \n"
        "       movl    8(%%esi), %%ebx                 \n"
        "       movl    12(%%esi), %%esi                \n"
-       "       call    __L4_ExchangeRegisters          \n"
-        "       xchgl   %%esi, (%%esp)                  \n"
+       "       call    *(%%esp)                        \n"
+        "       xchgl   %%esi, 4(%%esp)                 \n"
         "       movl    %%edi, 4(%%esi)                 \n"
         "       movl    %%ebx, 8(%%esi)                 \n"
         "       movl    %%ebp, (%%esi)                  \n"
+        "       popl    %%edi                           \n"
         "       popl    %%esi                           \n"
        __L4_RESTORE_REGS
         :
        "=a" (result), "=c" (*old_control), "=d" (*old_sp), "=S" (*old_ip)
         :
-       "a" (dest.raw), "c" (control), "d" (sp), "S" (&in)
+       "a" (dest.raw), "c" (control), "d" (sp), "S" (&in),
+       "D" (__L4_ExchangeRegisters)
         :
-       "edi", "memory", __L4_CLOBBER_REGS);
+       "memory", __L4_CLOBBER_REGS);
 
     old_pager->raw = in.ebp;
     *old_flags = in.edi;    
@@ -141,7 +166,9 @@
     __asm__ __volatile__ (
        "/* L4_ThreadControl() */                       \n"
        __L4_SAVE_REGS
-       "       call    __L4_ThreadControl              \n"
+       "       movl    %%edi, %%ebx                    \n"
+       "       movl    %9, %%edi                       \n"
+       "       call    *%%ebx                          \n"
        __L4_RESTORE_REGS
 
        : /* outputs */
@@ -156,7 +183,8 @@
        "1" (Pager),
        "2" (Scheduler),
        "3" (SpaceSpecifier),
-       "4" (UtcbLocation)
+       "m" (UtcbLocation),
+       "D" (__L4_ThreadControl)
 
        : /* clobbers */
        __L4_CLOBBER_REGS);
@@ -171,14 +199,14 @@
 
     __asm__ __volatile__ (
        "/* L4_SystemClock() */                         \n"
-       "       call    __L4_SystemClock                \n"
-
+       "       call    *%%ecx                          \n"
        : /* outputs */
        "=A" (result.raw)
 
-       : /* no inputs */
+       :
+       "c" (__L4_SystemClock)
        : /* clobbers */
-       "ecx", "esi", "edi");
+       "esi", "edi");
 
     return result;
 }
@@ -188,12 +216,13 @@
 {
     __asm__ __volatile__ (
        "/* L4_ThreadSwitch() */                        \n"
-       "       call    __L4_ThreadSwitch               \n"
+       "       call    *%%ecx                          \n"
 
        : /* no outputs */
 
        : /* inputs */
-       "a" (dest)
+       "a" (dest),
+       "c" (__L4_ThreadSwitch)
 
        /* no clobbers */
        );
@@ -213,7 +242,9 @@
     __asm__ __volatile__ (
        "/* L4_Schedule() */                            \n"
        __L4_SAVE_REGS
-       "       call    __L4_Schedule                   \n"
+       "       movl    %%edi, %%ebx                    \n"
+       "       movl    %9, %%edi                       \n"
+       "       call    *%%ebx                          \n"
        __L4_RESTORE_REGS
 
        : /* outputs */
@@ -228,7 +259,8 @@
        "1" (PrioControl),
        "2" (TimeControl),
        "3" (ProcessorControl),
-       "4" (PreemptionControl)
+       "m" (PreemptionControl),
+       "D" (__L4_Schedule)
 
        : /* clobbers */
        __L4_CLOBBER_REGS);
@@ -246,10 +278,13 @@
     L4_Word_t * utcb = __L4_X86_Utcb ();
 
 #if defined(__pic__)
+
     __asm__ __volatile__ (
        "/* L4_Ipc() */                                 \n"
        __L4_SAVE_REGS
-       "       call    __L4_Ipc                        \n"
+       "       movl    %%eax, %%ebx                    \n"
+       "       movl    %5, %%eax                       \n"
+       "       call    *%%ebx                          \n"
         "      movl    %%ebp, %%ecx                    \n"
        "       movl    %%ebx, %%edx                    \n"
        __L4_RESTORE_REGS
@@ -262,11 +297,13 @@
         
        : /* inputs */
        "S" (utcb[0]),
-       "a" (to.raw),
-        "D" (utcb),
+       "m" (to.raw),
+       "D" (utcb),
        "c" (Timeouts),
-       "d" (FromSpecifier)
+       "d" (FromSpecifier),
+       "a" (__L4_Ipc)
        );
+
 #else
     L4_Word_t dummy;
 
@@ -282,7 +319,7 @@
        "=a" (result),
        "=b" (mr1),
        "=c" (mr2),
-        "=d" (dummy)
+    "=d" (dummy)
         
        : /* inputs */
        "S" (utcb[0]),
@@ -317,8 +354,10 @@
     __asm__ __volatile__ (
        "/* L4_Lipc() */                                \n"
        __L4_SAVE_REGS
-       "       call    __L4_Lipc                       \n"
-        "      movl    %%ebp, %%ecx                    \n"
+       "       movl    %%eax, %%ebx                    \n"
+       "       movl    %5, %%eax                       \n"
+       "       call    *%%ebx                          \n"
+       "       movl    %%ebp, %%ecx                    \n"
        "       movl    %%ebx, %%edx                    \n"
        __L4_RESTORE_REGS
 
@@ -330,10 +369,11 @@
         
        : /* inputs */
        "S" (utcb[0]),
-       "a" (to.raw),
-        "D" (utcb),
+       "m" (to.raw),
+       "D" (utcb),
        "c" (Timeouts),
-       "d" (FromSpecifier)
+       "d" (FromSpecifier),
+       "a" (__L4_Lipc)
        );
 #else
     L4_Word_t dummy;
@@ -344,7 +384,7 @@
        "       call    __L4_Lipc                       \n"
         "      movl    %%ebp, %%ecx                    \n"
        __L4_RESTORE_REGS
-       
+
        : /* outputs */
        "=S" (mr0),
        "=a" (result),
@@ -355,7 +395,7 @@
        : /* inputs */
        "S" (utcb[0]),
        "a" (to.raw),
-        "D" (utcb),
+       "D" (utcb),
        "c" (Timeouts),
        "d" (FromSpecifier)
        );
@@ -378,7 +418,7 @@
     __asm__ __volatile__ (
        "/* L4_Unmap() */                               \n"
        __L4_SAVE_REGS
-       "       call    __L4_Unmap                      \n"
+       "       call    *%%ecx                          \n"
        __L4_RESTORE_REGS
 
        : /* outputs */
@@ -389,10 +429,11 @@
        : /* inputs */
        "0" (utcb[0]),
        "1" (utcb),
-       "2" (control)
+       "2" (control),
+       "c" (__L4_Unmap)
 
        : /* clobbered */
-       "ecx", "edx", __L4_CLOBBER_REGS);
+       "edx", __L4_CLOBBER_REGS);
 }
 
 
@@ -408,7 +449,9 @@
     __asm__ __volatile__ (
        "/* L4_SpaceControl() */                        \n"
        __L4_SAVE_REGS
-       "       call    __L4_SpaceControl               \n"
+       "       movl    %%edi, %%ebx                    \n"
+       "       movl    %9, %%edi                       \n"
+       "       call    *%%ebx                          \n"
        __L4_RESTORE_REGS
 
        : /* outputs */
@@ -423,7 +466,8 @@
        "1" (control),
        "2" (KernelInterfacePageArea),
        "3" (UtcbArea),
-       "4" (redirector)
+       "m" (redirector),
+       "D" (__L4_SpaceControl)
 
        : /* clobbers */
        __L4_CLOBBER_REGS);
@@ -442,7 +486,7 @@
     __asm__ __volatile__ (
        "/* L4_ProcessorControl() */                    \n"
        __L4_SAVE_REGS
-       "       call    __L4_ProcessorControl           \n"
+       "       call    *%%edi                          \n"
        __L4_RESTORE_REGS
 
        : /* outputs */
@@ -456,7 +500,8 @@
        "0" (ProcessorNo),
        "1" (InternalFrequency),
        "2" (ExternalFrequency),
-       "3" (voltage)
+       "3" (voltage),
+       "4" (__L4_ProcessorControl)
 
        : /* clobbers */
        __L4_CLOBBER_REGS);
@@ -474,11 +519,14 @@
     __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    __L4_MemoryControl              \n"
+       "       call    *(%%esp)                        \n"
+       "       popl    %%edi                           \n"
        __L4_RESTORE_REGS
 
        : /* outputs */
@@ -492,7 +540,8 @@
        "0" (control),
        "1" (attributes),
        "3" (utcb[0]),
-       "4" (utcb)
+       "m" (utcb),
+       "4" (__L4_MemoryControl)
 
        : /* clobbers */
        __L4_CLOBBER_REGS);

Reply via email to