Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Sep 2003 19:44:56 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 37644 for review
Message-ID:  <200309060244.h862iu5T087146@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=37644

Change 37644 by peter@peter_daintree on 2003/09/05 19:43:58

	Initial switchover to use getcontext()/setcontext() instead of the evil fpsetjmp
	etc.  This has the advantage of doing a copyin() into the kernel on a properly
	aligned buffer, so all the alignment evilness goes completely away.  I should have
	thought of this before.

Affected files ...

.. //depot/projects/ezm3/libs/m3core/src/runtime/FBSD_AMD64/RTMachine.i3#2 edit
.. //depot/projects/ezm3/libs/m3core/src/runtime/FBSD_AMD64/RTThread.m3#4 edit
.. //depot/projects/ezm3/libs/m3core/src/runtime/FBSD_AMD64/RTThreadC.c#2 edit
.. //depot/projects/ezm3/libs/m3core/src/unix/freebsd-4.amd64/Usignal.i3#2 edit
.. //depot/projects/ezm3/libs/m3core/src/unix/freebsd-4.amd64/Uucontext.i3#2 edit

Differences ...

==== //depot/projects/ezm3/libs/m3core/src/runtime/FBSD_AMD64/RTMachine.i3#2 (text+ko) ====

@@ -9,16 +9,16 @@
 
 INTERFACE RTMachine;
 
-IMPORT Csetjmp;
+IMPORT Uucontext;
 
 (*--------------------------------------------------------- thread state ---*)
 
 TYPE
-  State = Csetjmp.fpjmp_buf;
+  State = Uucontext.ucontext_t;
   (* The machine state is saved in a "State".  This type is really
      opaque to the client, i.e. it does not need to be an array. *)
 
-<*EXTERNAL "_fpsetjmp" *>
+<*EXTERNAL "getcontext" *>
 PROCEDURE SaveState (VAR s: State): INTEGER;
 (* Capture the currently running thread's state *)
 

==== //depot/projects/ezm3/libs/m3core/src/runtime/FBSD_AMD64/RTThread.m3#4 (text+ko) ====

@@ -11,12 +11,9 @@
 
 IMPORT Usignal, Unix, Umman, RTMisc;
 
-CONST 
-  SP_pos = 2;		(* Index of stack pointer in jmp_buf array *)
-
 PROCEDURE SP (READONLY s: State): ADDRESS =
   BEGIN
-    RETURN LOOPHOLE (s [SP_pos], ADDRESS);
+    RETURN LOOPHOLE (s.uc_mcontext.mc_rsp, ADDRESS);
   END SP;
 
 (*--------------------------------------------------------- thread stacks ---*)
@@ -70,7 +67,7 @@
 
 PROCEDURE UpdateStateForNewSP (VAR s: State; offset: INTEGER) =
   BEGIN
-    INC (s [SP_pos], offset);
+    INC (s.uc_mcontext.mc_rsp, offset);
   END UpdateStateForNewSP;
 
 PROCEDURE UpdateFrameForNewSP (<*UNUSED*> a: ADDRESS;

==== //depot/projects/ezm3/libs/m3core/src/runtime/FBSD_AMD64/RTThreadC.c#2 (text+ko) ====

@@ -7,13 +7,14 @@
 
 /* This file implements the coroutine transfer: RTThread.Transfer */
 
-#include <setjmp.h>
+#include <ucontext.h>
 
-
-RTThread__Transfer (from, to)
-jmp_buf *from, *to;
+void RTThread__Transfer (ucontext_t *from, ucontext_t *to)
 {
-  if (_fpsetjmp(*from) == 0) _fplongjmp (*to, 1);
+	if (getcontext(from) == 0) {
+		to->uc_mcontext.mc_rax = 1;	/* emulate longjmp return */
+		setcontext(to);			/* fire it up */
+	}
 }
 
 

==== //depot/projects/ezm3/libs/m3core/src/unix/freebsd-4.amd64/Usignal.i3#2 (text+ko) ====

@@ -9,6 +9,7 @@
 INTERFACE Usignal;
 
 FROM Ctypes IMPORT int, unsigned_int, long, unsigned_long;
+FROM Uucontext IMPORT sigset_t;
 
 (*** <signal.h> ***)
 
@@ -65,9 +66,6 @@
   SignalHandler = PROCEDURE (sig, code: int;
                              scp: UNTRACED REF struct_sigcontext);
 
-  sigset_t = ARRAY [0..3] OF unsigned_int;
-  sigset_t_star = UNTRACED REF sigset_t;
-
   struct_sigvec  = RECORD
     sv_handler: SignalHandler;     (* signal handler *)
     sv_mask:    int;               (* signal mask to apply *)

==== //depot/projects/ezm3/libs/m3core/src/unix/freebsd-4.amd64/Uucontext.i3#2 (text+ko) ====

@@ -1,74 +1,62 @@
 INTERFACE Uucontext;
 
-FROM Ctypes IMPORT int, long, char_star, unsigned_int, unsigned_char, double;
+FROM Ctypes IMPORT int, long, char_star, unsigned_int, unsigned_char, double, size_t;
 FROM Utypes IMPORT u_long, caddr_t;
 
 (* ucontext.h *)
 
 TYPE
-  sigset_t = RECORD 
-    sigbits : ARRAY [0..3] OF u_long;  
-  END;
+
+  sigset_t = ARRAY [0..3] OF unsigned_int;
 
   struct_sigaltstack = RECORD
     ss_sp      : char_star;
-    ss_size    : int;
+    ss_size    : size_t;
     ss_flags   : int;
   END;
   stack_t = struct_sigaltstack;
 
-  greg_t = int;
-  gregset_t = RECORD 
-    psr        : greg_t;
-    pc         : greg_t;
-    npc        : greg_t;
-    y          : greg_t;
-    g1         : greg_t;
-    g2         : greg_t;
-    g3         : greg_t;
-    g4         : greg_t;
-    g5         : greg_t;
-    g6         : greg_t;
-    g7         : greg_t;
-    o0         : greg_t;
-    o1         : greg_t;
-    o2         : greg_t;
-    o3         : greg_t;
-    o4         : greg_t;
-    o5         : greg_t;
-    (*o6*) sp  : greg_t;
-    o7         : greg_t;
-  END;
-
-  fpregset_t = RECORD
-    fpu_regs   : ARRAY[0..15] OF double; (* 16 doubles *)
-    fpu_q      : ADDRESS;		 (* ptr to array of FQ entries *)
-    fpu_fsr    : unsigned_int;		 (* FPU status register *)
-    fpu_qcnt   : unsigned_char;		 (* # of entries in saved FQ *)
-    fpu_q_entrysize: unsigned_char;	 (* # of bytes per FQ entry *)
-    fpu_en     : unsigned_char;		 (* flag signifying FPU in use *)
-  END;
-
-  xrs_t = RECORD
-    xrs_id     : unsigned_int;		 (* indicates xrs_ptr validity *)
-    xrs_ptr    : caddr_t;		 (* ptr to extra reg state *)
-  END;
-
+  register_t = long;
   mcontext_t = RECORD
-    gregs      : gregset_t;
-    gwins      : ADDRESS;		 (* POSSIBLE ptr to reg windows *)
-    fpregs     : fpregset_t;		 (* floating point register set *)
-    xrs        : xrs_t;			 (* POSSIBLE extra reg state assoc *)
-    filler     : ARRAY[1..19] OF long;
+    mc_onstack : register_t;
+    mc_rdi     : register_t;
+    mc_rsi     : register_t;
+    mc_rdx     : register_t;
+    mc_rcx     : register_t;
+    mc_r8      : register_t;
+    mc_r9      : register_t;
+    mc_rax     : register_t;
+    mc_rbx     : register_t;
+    mc_rbp     : register_t;
+    mc_r10     : register_t;
+    mc_r11     : register_t;
+    mc_r12     : register_t;
+    mc_r13     : register_t;
+    mc_r14     : register_t;
+    mc_r15     : register_t;
+    mc_trapno  : register_t;
+    mc_addr    : register_t;
+    mc_err     : register_t;
+    mc_rip     : register_t;
+    mc_cs      : register_t;
+    mc_rflags  : register_t;
+    mc_rsp     : register_t;
+    mc_ss      : register_t;
+    mc_len     : long;
+    mc_fpformat : long;
+    mc_ownedfp : long;
+    mc_spare1  : ARRAY[1..1] OF long;
+    mc_fpstate : ARRAY[0..63] OF long;
+    mc_spare2  : ARRAY[1..8] OF long;
   END;
 
   struct_ucontext = RECORD
-    uc_flags   : u_long;
+    uc_sigmask : sigset_t;
+    uc_mcontext: mcontext_t;
     uc_link    : UNTRACED REF struct_ucontext;
-    uc_sigmask : sigset_t;
     uc_stack   : stack_t;
-    uc_mcontext: mcontext_t;
-    uc_filler  : ARRAY [1..23] OF long;
+    uc_flags   : int;
+    uc_spare  : ARRAY [1..4] OF int;
   END;
   ucontext_t = struct_ucontext;
   ucontext_t_star = UNTRACED REF ucontext_t;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309060244.h862iu5T087146>