From owner-p4-projects@FreeBSD.ORG Fri Sep 5 19:44:59 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 089C116A4FE; Fri, 5 Sep 2003 19:44:59 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8A1F916A4C0 for ; Fri, 5 Sep 2003 19:44:58 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7AECF43FBF for ; Fri, 5 Sep 2003 19:44:57 -0700 (PDT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h862iv0U087149 for ; Fri, 5 Sep 2003 19:44:57 -0700 (PDT) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h862iu5T087146 for perforce@freebsd.org; Fri, 5 Sep 2003 19:44:56 -0700 (PDT) Date: Fri, 5 Sep 2003 19:44:56 -0700 (PDT) Message-Id: <200309060244.h862iu5T087146@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 37644 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Sep 2003 02:44:59 -0000 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 +#include - -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; (*** ***) @@ -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;