1c9a2d570SRuslan Bukin /*-
2c9a2d570SRuslan Bukin * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
3c9a2d570SRuslan Bukin * All rights reserved.
4c9a2d570SRuslan Bukin *
5c9a2d570SRuslan Bukin * Portions of this software were developed by SRI International and the
6c9a2d570SRuslan Bukin * University of Cambridge Computer Laboratory under DARPA/AFRL contract
7c9a2d570SRuslan Bukin * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
8c9a2d570SRuslan Bukin *
9c9a2d570SRuslan Bukin * Portions of this software were developed by the University of Cambridge
10c9a2d570SRuslan Bukin * Computer Laboratory as part of the CTSRD Project, with support from the
11c9a2d570SRuslan Bukin * UK Higher Education Innovation Fund (HEIF).
12c9a2d570SRuslan Bukin *
13c9a2d570SRuslan Bukin * Redistribution and use in source and binary forms, with or without
14c9a2d570SRuslan Bukin * modification, are permitted provided that the following conditions
15c9a2d570SRuslan Bukin * are met:
16c9a2d570SRuslan Bukin * 1. Redistributions of source code must retain the above copyright
17c9a2d570SRuslan Bukin * notice, this list of conditions and the following disclaimer.
18c9a2d570SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright
19c9a2d570SRuslan Bukin * notice, this list of conditions and the following disclaimer in the
20c9a2d570SRuslan Bukin * documentation and/or other materials provided with the distribution.
21c9a2d570SRuslan Bukin *
22c9a2d570SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23c9a2d570SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24c9a2d570SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25c9a2d570SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26c9a2d570SRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27c9a2d570SRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28c9a2d570SRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29c9a2d570SRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30c9a2d570SRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31c9a2d570SRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32c9a2d570SRuslan Bukin * SUCH DAMAGE.
33c9a2d570SRuslan Bukin */
34c9a2d570SRuslan Bukin
35c9a2d570SRuslan Bukin #include <sys/types.h>
36c9a2d570SRuslan Bukin #include <string.h>
37c9a2d570SRuslan Bukin #include <thread_db.h>
38c9a2d570SRuslan Bukin
39c9a2d570SRuslan Bukin #include "libpthread_db.h"
40c9a2d570SRuslan Bukin
41c9a2d570SRuslan Bukin void
pt_reg_to_ucontext(const struct reg * r,ucontext_t * uc)42c9a2d570SRuslan Bukin pt_reg_to_ucontext(const struct reg *r, ucontext_t *uc)
43c9a2d570SRuslan Bukin {
44c9a2d570SRuslan Bukin mcontext_t *mc;
45c9a2d570SRuslan Bukin
46c9a2d570SRuslan Bukin mc = &uc->uc_mcontext;
47c9a2d570SRuslan Bukin
48c9a2d570SRuslan Bukin memcpy(mc->mc_gpregs.gp_t, r->t, sizeof(mc->mc_gpregs.gp_t));
49c9a2d570SRuslan Bukin memcpy(mc->mc_gpregs.gp_s, r->s, sizeof(mc->mc_gpregs.gp_s));
50c9a2d570SRuslan Bukin memcpy(mc->mc_gpregs.gp_a, r->a, sizeof(mc->mc_gpregs.gp_a));
51c9a2d570SRuslan Bukin mc->mc_gpregs.gp_ra = r->ra;
52c9a2d570SRuslan Bukin mc->mc_gpregs.gp_sp = r->sp;
53c9a2d570SRuslan Bukin mc->mc_gpregs.gp_gp = r->gp;
54c9a2d570SRuslan Bukin mc->mc_gpregs.gp_tp = r->tp;
55c9a2d570SRuslan Bukin mc->mc_gpregs.gp_sepc = r->sepc;
56c9a2d570SRuslan Bukin mc->mc_gpregs.gp_sstatus = r->sstatus;
57c9a2d570SRuslan Bukin }
58c9a2d570SRuslan Bukin
59c9a2d570SRuslan Bukin void
pt_ucontext_to_reg(const ucontext_t * uc,struct reg * r)60c9a2d570SRuslan Bukin pt_ucontext_to_reg(const ucontext_t *uc, struct reg *r)
61c9a2d570SRuslan Bukin {
62c9a2d570SRuslan Bukin const mcontext_t *mc;
63c9a2d570SRuslan Bukin
64c9a2d570SRuslan Bukin mc = &uc->uc_mcontext;
65c9a2d570SRuslan Bukin
66c9a2d570SRuslan Bukin memcpy(r->t, mc->mc_gpregs.gp_t, sizeof(mc->mc_gpregs.gp_t));
67c9a2d570SRuslan Bukin memcpy(r->s, mc->mc_gpregs.gp_s, sizeof(mc->mc_gpregs.gp_s));
68c9a2d570SRuslan Bukin memcpy(r->a, mc->mc_gpregs.gp_a, sizeof(mc->mc_gpregs.gp_a));
69c9a2d570SRuslan Bukin r->ra = mc->mc_gpregs.gp_ra;
70c9a2d570SRuslan Bukin r->sp = mc->mc_gpregs.gp_sp;
71c9a2d570SRuslan Bukin r->gp = mc->mc_gpregs.gp_gp;
72c9a2d570SRuslan Bukin r->tp = mc->mc_gpregs.gp_tp;
73c9a2d570SRuslan Bukin r->sepc = mc->mc_gpregs.gp_sepc;
74c9a2d570SRuslan Bukin r->sstatus = mc->mc_gpregs.gp_sstatus;
75c9a2d570SRuslan Bukin }
76c9a2d570SRuslan Bukin
77c9a2d570SRuslan Bukin void
pt_fpreg_to_ucontext(const struct fpreg * r __unused,ucontext_t * uc __unused)78c9a2d570SRuslan Bukin pt_fpreg_to_ucontext(const struct fpreg *r __unused, ucontext_t *uc __unused)
79c9a2d570SRuslan Bukin {
80*d8af1b6aSRuslan Bukin mcontext_t *mc = &uc->uc_mcontext;
81c9a2d570SRuslan Bukin
82*d8af1b6aSRuslan Bukin memcpy(&mc->mc_fpregs, r, sizeof(*r));
83*d8af1b6aSRuslan Bukin mc->mc_flags |= _MC_FP_VALID;
84c9a2d570SRuslan Bukin }
85c9a2d570SRuslan Bukin
86c9a2d570SRuslan Bukin void
pt_ucontext_to_fpreg(const ucontext_t * uc __unused,struct fpreg * r __unused)87c9a2d570SRuslan Bukin pt_ucontext_to_fpreg(const ucontext_t *uc __unused, struct fpreg *r __unused)
88c9a2d570SRuslan Bukin {
89*d8af1b6aSRuslan Bukin const mcontext_t *mc = &uc->uc_mcontext;
90c9a2d570SRuslan Bukin
91*d8af1b6aSRuslan Bukin if (mc->mc_flags & _MC_FP_VALID)
92*d8af1b6aSRuslan Bukin memcpy(r, &mc->mc_fpregs, sizeof(*r));
93*d8af1b6aSRuslan Bukin else
94*d8af1b6aSRuslan Bukin memset(r, 0, sizeof(*r));
95c9a2d570SRuslan Bukin }
96c9a2d570SRuslan Bukin
97c9a2d570SRuslan Bukin void
pt_md_init(void)98c9a2d570SRuslan Bukin pt_md_init(void)
99c9a2d570SRuslan Bukin {
100c9a2d570SRuslan Bukin }
101c9a2d570SRuslan Bukin
102c9a2d570SRuslan Bukin int
pt_reg_sstep(struct reg * reg __unused,int step __unused)103c9a2d570SRuslan Bukin pt_reg_sstep(struct reg *reg __unused, int step __unused)
104c9a2d570SRuslan Bukin {
105c9a2d570SRuslan Bukin
106c9a2d570SRuslan Bukin return (0);
107c9a2d570SRuslan Bukin }
108