about summary refs log tree commit diff
path: root/hurd
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-08-17 22:55:22 +0000
committerRoland McGrath <roland@gnu.org>1995-08-17 22:55:22 +0000
commit3fe9de0da5e8ad28a8ba86cc26ae6057984bde10 (patch)
tree248915736b58d19467d401ad3295c7113aee56cf /hurd
parent191abc516c6f0ecd02f84ec98994b223252b48d7 (diff)
downloadglibc-3fe9de0da5e8ad28a8ba86cc26ae6057984bde10.tar.gz
glibc-3fe9de0da5e8ad28a8ba86cc26ae6057984bde10.tar.xz
glibc-3fe9de0da5e8ad28a8ba86cc26ae6057984bde10.zip
Thu Aug 17 16:18:38 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
	* hurd/intr-msg.c: Use INTR_MSG_TRAP macro from machine-dependent
 	"intr-msg.h" for special syscall code, instead of i386-specific asm.
	* hurd/hurdsig.c: Use INTR_MSG_BACK_OUT macro from
 	machine-dependent "intr-msg.h" before mutating thread state to
 	skip RPC.

	* sysdeps/mach/hurd/i386/trampoline.c: If PC is inside
 	_hurd_intr_rpc_mach_msg special syscall code, use real SP saved in
	%ecx.

	* Makeconfig (link-libc): New variable; use shared library if
 	available.
	(+link): Use it.

	* sysdeps/mach/hurd/fork.c (_hurd_fork_locks): Variable removed.
  	Instead, declare with `symbol_set_declare'.
	(fork): Use symbol_set_* macros for _hurd_fork_locks.  
	Use SS->thread instead of __mach_thread_self ().  Suspend all
 	other threads during task_create and port copying.
Diffstat (limited to 'hurd')
-rw-r--r--hurd/hurdsig.c6
-rw-r--r--hurd/intr-msg.c16
2 files changed, 9 insertions, 13 deletions
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 10dbceb4f4..ca4e22925b 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -250,7 +250,8 @@ interrupted_reply_port_location (struct machine_thread_all_state *thread_state,
 
   return portloc;
 }
-
+
+#include "intr-msg.h"
 
 /* SS->thread is suspended.
 
@@ -274,7 +275,7 @@ _hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread,
 		     mach_msg_type_name_t reply_port_type,
 		     int untraced)
 {
-  extern const void _hurd_intr_rpc_msg_do_trap, _hurd_intr_rpc_msg_in_trap;
+  extern const void _hurd_intr_rpc_msg_in_trap;
   mach_port_t rcv_port = MACH_PORT_NULL;
   mach_port_t intr_port;
 
@@ -294,6 +295,7 @@ _hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread,
       /* The thread is about to do the RPC, but hasn't yet entered
 	 mach_msg.  Mutate the thread's state so it knows not to try
 	 the RPC.  */
+      INTR_MSG_BACK_OUT (&state->basic);
       MACHINE_THREAD_STATE_SET_PC (&state->basic,
 				   &_hurd_intr_rpc_msg_in_trap);
       state->basic.SYSRETURN = MACH_SEND_INTERRUPTED;
diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c
index 6f670b538f..024cbfbd3e 100644
--- a/hurd/intr-msg.c
+++ b/hurd/intr-msg.c
@@ -21,6 +21,9 @@ Cambridge, MA 02139, USA.  */
 #include <mach/mig_errors.h>
 #include <hurd/signal.h>
 
+#include "intr-msg.h"
+
+
 error_t
 _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
 			 mach_msg_option_t option,
@@ -56,17 +59,8 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
       ss->cancel = 0;
     }
   else 
-  /*       err = intr_msg_trap (msg, option, send_size,
-	   rcv_size, rcv_name, timeout, notify);
-	   */
-    asm (".globl _hurd_intr_rpc_msg_do_trap\n" 
-	 ".globl _hurd_intr_rpc_msg_in_trap\n"
-	 "				movl %%esp, %%ecx\n"
-	 "				leal %1, %%esp\n"
-	 "				movl $-25, %%eax\n"
-	 "_hurd_intr_rpc_msg_do_trap:	lcall $7, $0 # status in %0\n"
-	 "_hurd_intr_rpc_msg_in_trap:	movl %%ecx, %%esp"
-	 : "=a" (err) : "m" ((&msg)[-1]) : "%ecx");
+    err = INTR_MSG_TRAP (msg, option, send_size,
+			 rcv_size, rcv_name, timeout, notify);
 
   switch (err)
     {