diff options
author | marius <marius@FreeBSD.org> | 2011-08-06 17:50:37 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2011-08-06 17:50:37 +0000 |
commit | 5f0df85e2bde5cd5ec7803dd66bc0ff15e318258 (patch) | |
tree | dd5ff5105fcebee222b7332f027f7cb384d7cf87 | |
parent | 80d87bdabee2d39ce8040a53992970c7245fb4e4 (diff) | |
download | FreeBSD-src-5f0df85e2bde5cd5ec7803dd66bc0ff15e318258.zip FreeBSD-src-5f0df85e2bde5cd5ec7803dd66bc0ff15e318258.tar.gz |
Implement
Reviewed by: marcel
Approved by: re (kib)
MFC after: 1 week
-rw-r--r-- | lib/libthread_db/arch/sparc64/libpthread_md.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/lib/libthread_db/arch/sparc64/libpthread_md.c b/lib/libthread_db/arch/sparc64/libpthread_md.c index f5f12d3..6a84518 100644 --- a/lib/libthread_db/arch/sparc64/libpthread_md.c +++ b/lib/libthread_db/arch/sparc64/libpthread_md.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004 Marcel Moolenaar + * Copyright (c) 2011 Marius Strobl <marius@FreeBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,39 +28,63 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include <sys/procfs.h> +#include <sys/types.h> +#include <string.h> #include <thread_db.h> #include <ucontext.h> +#include <machine/fsr.h> #include "libpthread_db.h" void -pt_reg_to_ucontext(const struct reg *r __unused, ucontext_t *uc __unused) +pt_reg_to_ucontext(const struct reg *r, ucontext_t *uc) { + + memcpy(&uc->uc_mcontext, r, MIN(sizeof(uc->uc_mcontext), sizeof(*r))); } void -pt_ucontext_to_reg(const ucontext_t *uc __unused, struct reg *r __unused) +pt_ucontext_to_reg(const ucontext_t *uc, struct reg *r) { + + memcpy(r, &uc->uc_mcontext, MIN(sizeof(uc->uc_mcontext), sizeof(*r))); } void -pt_fpreg_to_ucontext(const struct fpreg* r __unused, ucontext_t *uc __unused) +pt_fpreg_to_ucontext(const struct fpreg* r, ucontext_t *uc) { + mcontext_t *mc = &uc->uc_mcontext; + + memcpy(mc->mc_fp, r->fr_regs, MIN(sizeof(mc->mc_fp), + sizeof(r->fr_regs))); + mc->mc_fsr = r->fr_fsr; + mc->mc_gsr = r->fr_gsr; + mc->mc_fprs |= FPRS_FEF; } void -pt_ucontext_to_fpreg(const ucontext_t *uc __unused, struct fpreg *r __unused) +pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r) { + const mcontext_t *mc = &uc->uc_mcontext; + + if ((mc->mc_fprs & FPRS_FEF) != 0) { + memcpy(r->fr_regs, mc->mc_fp, MIN(sizeof(mc->mc_fp), + sizeof(r->fr_regs))); + r->fr_fsr = mc->mc_fsr; + r->fr_gsr = mc->mc_gsr; + } else + memset(r, 0, sizeof(*r)); } void pt_md_init(void) { + } int pt_reg_sstep(struct reg *reg __unused, int step __unused) { + return (0); } |