13c1e38eaSMarcel Moolenaar /* 23c1e38eaSMarcel Moolenaar * Copyright (c) 2004 David Xu <davidxu@freebsd.org> 33c1e38eaSMarcel Moolenaar * All rights reserved. 43c1e38eaSMarcel Moolenaar * 53c1e38eaSMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 63c1e38eaSMarcel Moolenaar * modification, are permitted provided that the following conditions 73c1e38eaSMarcel Moolenaar * are met: 83c1e38eaSMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 93c1e38eaSMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 103c1e38eaSMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 113c1e38eaSMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 123c1e38eaSMarcel Moolenaar * documentation and/or other materials provided with the distribution. 133c1e38eaSMarcel Moolenaar * 143c1e38eaSMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 153c1e38eaSMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 163c1e38eaSMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 173c1e38eaSMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 183c1e38eaSMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 193c1e38eaSMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 203c1e38eaSMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 213c1e38eaSMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 223c1e38eaSMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 233c1e38eaSMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 243c1e38eaSMarcel Moolenaar * SUCH DAMAGE. 253c1e38eaSMarcel Moolenaar */ 263c1e38eaSMarcel Moolenaar 273c1e38eaSMarcel Moolenaar #include <sys/cdefs.h> 283c1e38eaSMarcel Moolenaar __FBSDID("$FreeBSD$"); 293c1e38eaSMarcel Moolenaar 303c1e38eaSMarcel Moolenaar #include <sys/types.h> 313c1e38eaSMarcel Moolenaar #include <machine/npx.h> 32820c1c55SMarcel Moolenaar #include <string.h> 33820c1c55SMarcel Moolenaar #include <thread_db.h> 343c1e38eaSMarcel Moolenaar 353c1e38eaSMarcel Moolenaar #include "libpthread_db.h" 363c1e38eaSMarcel Moolenaar 373c1e38eaSMarcel Moolenaar static int has_xmm_regs; 383c1e38eaSMarcel Moolenaar 393c1e38eaSMarcel Moolenaar void 403c1e38eaSMarcel Moolenaar pt_reg_to_ucontext(const struct reg *r, ucontext_t *uc) 413c1e38eaSMarcel Moolenaar { 423c1e38eaSMarcel Moolenaar memcpy(&uc->uc_mcontext.mc_fs, &r->r_fs, 18*4); 433c1e38eaSMarcel Moolenaar uc->uc_mcontext.mc_gs = r->r_gs; 443c1e38eaSMarcel Moolenaar } 453c1e38eaSMarcel Moolenaar 463c1e38eaSMarcel Moolenaar void 473c1e38eaSMarcel Moolenaar pt_ucontext_to_reg(const ucontext_t *uc, struct reg *r) 483c1e38eaSMarcel Moolenaar { 493c1e38eaSMarcel Moolenaar memcpy(&r->r_fs, &uc->uc_mcontext.mc_fs, 18*4); 503c1e38eaSMarcel Moolenaar r->r_gs = uc->uc_mcontext.mc_gs; 513c1e38eaSMarcel Moolenaar } 523c1e38eaSMarcel Moolenaar 533c1e38eaSMarcel Moolenaar void 543c1e38eaSMarcel Moolenaar pt_fpreg_to_ucontext(const struct fpreg* r, ucontext_t *uc) 553c1e38eaSMarcel Moolenaar { 563c1e38eaSMarcel Moolenaar if (!has_xmm_regs) 573c1e38eaSMarcel Moolenaar memcpy(&uc->uc_mcontext.mc_fpstate, r, 583c1e38eaSMarcel Moolenaar sizeof(struct save87)); 593c1e38eaSMarcel Moolenaar else { 603c1e38eaSMarcel Moolenaar int i; 613c1e38eaSMarcel Moolenaar struct savexmm *sx = (struct savexmm *)&uc->uc_mcontext.mc_fpstate; 623c1e38eaSMarcel Moolenaar memcpy(&sx->sv_env, &r->fpr_env, sizeof(r->fpr_env)); 633c1e38eaSMarcel Moolenaar for (i = 0; i < 8; ++i) 643c1e38eaSMarcel Moolenaar memcpy(&sx->sv_fp[i].fp_acc, &r->fpr_acc[i], 10); 653c1e38eaSMarcel Moolenaar } 663c1e38eaSMarcel Moolenaar } 673c1e38eaSMarcel Moolenaar 683c1e38eaSMarcel Moolenaar void 693c1e38eaSMarcel Moolenaar pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r) 703c1e38eaSMarcel Moolenaar { 713c1e38eaSMarcel Moolenaar if (!has_xmm_regs) 723c1e38eaSMarcel Moolenaar memcpy(r, &uc->uc_mcontext.mc_fpstate, sizeof(struct save87)); 733c1e38eaSMarcel Moolenaar else { 743c1e38eaSMarcel Moolenaar int i; 75*c7d7e597SDimitry Andric const struct savexmm *sx = (const struct savexmm *)&uc->uc_mcontext.mc_fpstate; 763c1e38eaSMarcel Moolenaar memcpy(&r->fpr_env, &sx->sv_env, sizeof(r->fpr_env)); 773c1e38eaSMarcel Moolenaar for (i = 0; i < 8; ++i) 783c1e38eaSMarcel Moolenaar memcpy(&r->fpr_acc[i], &sx->sv_fp[i].fp_acc, 10); 793c1e38eaSMarcel Moolenaar } 803c1e38eaSMarcel Moolenaar } 813c1e38eaSMarcel Moolenaar 823c1e38eaSMarcel Moolenaar void 838d7681bbSDoug Rabson pt_fxsave_to_ucontext(const char* r, ucontext_t *uc) 848d7681bbSDoug Rabson { 858d7681bbSDoug Rabson if (has_xmm_regs) 868d7681bbSDoug Rabson memcpy(&uc->uc_mcontext.mc_fpstate, r, sizeof(struct savexmm)); 878d7681bbSDoug Rabson } 888d7681bbSDoug Rabson 898d7681bbSDoug Rabson void 908d7681bbSDoug Rabson pt_ucontext_to_fxsave(const ucontext_t *uc, char *r) 918d7681bbSDoug Rabson { 928d7681bbSDoug Rabson if (has_xmm_regs) 938d7681bbSDoug Rabson memcpy(r, &uc->uc_mcontext.mc_fpstate, sizeof(struct savexmm)); 948d7681bbSDoug Rabson } 958d7681bbSDoug Rabson 968d7681bbSDoug Rabson void 973c1e38eaSMarcel Moolenaar pt_md_init(void) 983c1e38eaSMarcel Moolenaar { 993c1e38eaSMarcel Moolenaar ucontext_t uc; 1003c1e38eaSMarcel Moolenaar 1013c1e38eaSMarcel Moolenaar getcontext(&uc); 1023c1e38eaSMarcel Moolenaar if (uc.uc_mcontext.mc_fpformat == _MC_FPFMT_XMM) 1033c1e38eaSMarcel Moolenaar has_xmm_regs = 1; 1043c1e38eaSMarcel Moolenaar } 1053c1e38eaSMarcel Moolenaar 1063c1e38eaSMarcel Moolenaar int 1073c1e38eaSMarcel Moolenaar pt_reg_sstep(struct reg *reg, int step) 1083c1e38eaSMarcel Moolenaar { 1093c1e38eaSMarcel Moolenaar unsigned int old; 1103c1e38eaSMarcel Moolenaar 1113c1e38eaSMarcel Moolenaar old = reg->r_eflags; 1123c1e38eaSMarcel Moolenaar if (step) 1133c1e38eaSMarcel Moolenaar reg->r_eflags |= 0x0100; 1143c1e38eaSMarcel Moolenaar else 1153c1e38eaSMarcel Moolenaar reg->r_eflags &= ~0x0100; 1163c1e38eaSMarcel Moolenaar return (old != reg->r_eflags); /* changed ? */ 1173c1e38eaSMarcel Moolenaar } 1183c1e38eaSMarcel Moolenaar 119