PERFORCE change 37644 for review
Peter Wemm
peter at FreeBSD.org
Fri Sep 5 19:44:59 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=37644
Change 37644 by peter at 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;
More information about the p4-projects
mailing list