2021-01-01 16:03:39 +08:00
|
|
|
/* Copyright (C) 2009-2021 Free Software Foundation, Inc.
|
2015-08-25 18:38:29 +08:00
|
|
|
Contributed by ARM Ltd.
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
Rename common to gdbsupport
This is the next patch in the ongoing series to move gdbsever to the
top level.
This patch just renames the "common" directory. The idea is to do
this move in two parts: first rename the directory (this patch), then
move the directory to the top. This approach makes the patches a bit
more tractable.
I chose the name "gdbsupport" for the directory. However, as this
patch was largely written by sed, we could pick a new name without too
much difficulty.
Tested by the buildbot.
gdb/ChangeLog
2019-07-09 Tom Tromey <tom@tromey.com>
* contrib/ari/gdb_ari.sh: Change common to gdbsupport.
* configure: Rebuild.
* configure.ac: Change common to gdbsupport.
* gdbsupport: Rename from common.
* acinclude.m4: Change common to gdbsupport.
* Makefile.in (CONFIG_SRC_SUBDIR, COMMON_SFILES)
(HFILES_NO_SRCDIR, stamp-version, ALLDEPFILES): Change common to
gdbsupport.
* aarch64-tdep.c, ada-lang.c, ada-lang.h, agent.c, alloc.c,
amd64-darwin-tdep.c, amd64-dicos-tdep.c, amd64-fbsd-nat.c,
amd64-fbsd-tdep.c, amd64-linux-nat.c, amd64-linux-tdep.c,
amd64-nbsd-tdep.c, amd64-obsd-tdep.c, amd64-sol2-tdep.c,
amd64-tdep.c, amd64-windows-tdep.c, arch-utils.c,
arch/aarch64-insn.c, arch/aarch64.c, arch/aarch64.h, arch/amd64.c,
arch/amd64.h, arch/arm-get-next-pcs.c, arch/arm-linux.c,
arch/arm.c, arch/i386.c, arch/i386.h, arch/ppc-linux-common.c,
arch/riscv.c, arch/riscv.h, arch/tic6x.c, arm-tdep.c, auto-load.c,
auxv.c, ax-gdb.c, ax-general.c, ax.h, breakpoint.c, breakpoint.h,
btrace.c, btrace.h, build-id.c, build-id.h, c-lang.h, charset.c,
charset.h, cli/cli-cmds.c, cli/cli-cmds.h, cli/cli-decode.c,
cli/cli-dump.c, cli/cli-option.h, cli/cli-script.c,
coff-pe-read.c, command.h, compile/compile-c-support.c,
compile/compile-c.h, compile/compile-cplus-symbols.c,
compile/compile-cplus-types.c, compile/compile-cplus.h,
compile/compile-loc2c.c, compile/compile.c, completer.c,
completer.h, contrib/ari/gdb_ari.sh, corefile.c, corelow.c,
cp-support.c, cp-support.h, cp-valprint.c, csky-tdep.c, ctf.c,
darwin-nat.c, debug.c, defs.h, disasm-selftests.c, disasm.c,
disasm.h, dtrace-probe.c, dwarf-index-cache.c,
dwarf-index-cache.h, dwarf-index-write.c, dwarf2-frame.c,
dwarf2expr.c, dwarf2loc.c, dwarf2read.c, event-loop.c,
event-top.c, exceptions.c, exec.c, extension.h, fbsd-nat.c,
features/aarch64-core.c, features/aarch64-fpu.c,
features/aarch64-pauth.c, features/aarch64-sve.c,
features/i386/32bit-avx.c, features/i386/32bit-avx512.c,
features/i386/32bit-core.c, features/i386/32bit-linux.c,
features/i386/32bit-mpx.c, features/i386/32bit-pkeys.c,
features/i386/32bit-segments.c, features/i386/32bit-sse.c,
features/i386/64bit-avx.c, features/i386/64bit-avx512.c,
features/i386/64bit-core.c, features/i386/64bit-linux.c,
features/i386/64bit-mpx.c, features/i386/64bit-pkeys.c,
features/i386/64bit-segments.c, features/i386/64bit-sse.c,
features/i386/x32-core.c, features/riscv/32bit-cpu.c,
features/riscv/32bit-csr.c, features/riscv/32bit-fpu.c,
features/riscv/64bit-cpu.c, features/riscv/64bit-csr.c,
features/riscv/64bit-fpu.c, features/tic6x-c6xp.c,
features/tic6x-core.c, features/tic6x-gp.c, filename-seen-cache.h,
findcmd.c, findvar.c, fork-child.c, gcore.c, gdb_bfd.c, gdb_bfd.h,
gdb_proc_service.h, gdb_regex.c, gdb_select.h, gdb_usleep.c,
gdbarch-selftests.c, gdbthread.h, gdbtypes.h, gnu-nat.c,
go32-nat.c, guile/guile.c, guile/scm-ports.c,
guile/scm-safe-call.c, guile/scm-type.c, i386-fbsd-nat.c,
i386-fbsd-tdep.c, i386-go32-tdep.c, i386-linux-nat.c,
i386-linux-tdep.c, i386-tdep.c, i387-tdep.c,
ia64-libunwind-tdep.c, ia64-linux-nat.c, inf-child.c,
inf-ptrace.c, infcall.c, infcall.h, infcmd.c, inferior-iter.h,
inferior.c, inferior.h, inflow.c, inflow.h, infrun.c, infrun.h,
inline-frame.c, language.h, linespec.c, linux-fork.c, linux-nat.c,
linux-tdep.c, linux-thread-db.c, location.c, machoread.c,
macrotab.h, main.c, maint.c, maint.h, memattr.c, memrange.h,
mi/mi-cmd-break.h, mi/mi-cmd-env.c, mi/mi-cmd-stack.c,
mi/mi-cmd-var.c, mi/mi-interp.c, mi/mi-main.c, mi/mi-parse.h,
minsyms.c, mips-linux-tdep.c, namespace.h,
nat/aarch64-linux-hw-point.c, nat/aarch64-linux-hw-point.h,
nat/aarch64-linux.c, nat/aarch64-sve-linux-ptrace.c,
nat/amd64-linux-siginfo.c, nat/fork-inferior.c,
nat/linux-btrace.c, nat/linux-btrace.h, nat/linux-namespaces.c,
nat/linux-nat.h, nat/linux-osdata.c, nat/linux-personality.c,
nat/linux-procfs.c, nat/linux-ptrace.c, nat/linux-ptrace.h,
nat/linux-waitpid.c, nat/mips-linux-watch.c,
nat/mips-linux-watch.h, nat/ppc-linux.c, nat/x86-dregs.c,
nat/x86-dregs.h, nat/x86-linux-dregs.c, nat/x86-linux.c,
nto-procfs.c, nto-tdep.c, objfile-flags.h, objfiles.c, objfiles.h,
obsd-nat.c, observable.h, osdata.c, p-valprint.c, parse.c,
parser-defs.h, ppc-linux-nat.c, printcmd.c, probe.c, proc-api.c,
procfs.c, producer.c, progspace.h, psymtab.h,
python/py-framefilter.c, python/py-inferior.c, python/py-ref.h,
python/py-type.c, python/python.c, record-btrace.c, record-full.c,
record.c, record.h, regcache-dump.c, regcache.c, regcache.h,
remote-fileio.c, remote-fileio.h, remote-sim.c, remote.c,
riscv-tdep.c, rs6000-aix-tdep.c, rust-exp.y, s12z-tdep.c,
selftest-arch.c, ser-base.c, ser-event.c, ser-pipe.c, ser-tcp.c,
ser-unix.c, skip.c, solib-aix.c, solib-target.c, solib.c,
source-cache.c, source.c, source.h, sparc-nat.c, spu-linux-nat.c,
stack.c, stap-probe.c, symfile-add-flags.h, symfile.c, symfile.h,
symtab.c, symtab.h, target-descriptions.c, target-descriptions.h,
target-memory.c, target.c, target.h, target/waitstatus.c,
target/waitstatus.h, thread-iter.h, thread.c, tilegx-tdep.c,
top.c, top.h, tracefile-tfile.c, tracefile.c, tracepoint.c,
tracepoint.h, tui/tui-io.c, ui-file.c, ui-out.h,
unittests/array-view-selftests.c,
unittests/child-path-selftests.c, unittests/cli-utils-selftests.c,
unittests/common-utils-selftests.c,
unittests/copy_bitwise-selftests.c, unittests/environ-selftests.c,
unittests/format_pieces-selftests.c,
unittests/function-view-selftests.c,
unittests/lookup_name_info-selftests.c,
unittests/memory-map-selftests.c, unittests/memrange-selftests.c,
unittests/mkdir-recursive-selftests.c,
unittests/observable-selftests.c,
unittests/offset-type-selftests.c, unittests/optional-selftests.c,
unittests/parse-connection-spec-selftests.c,
unittests/ptid-selftests.c, unittests/rsp-low-selftests.c,
unittests/scoped_fd-selftests.c,
unittests/scoped_mmap-selftests.c,
unittests/scoped_restore-selftests.c,
unittests/string_view-selftests.c, unittests/style-selftests.c,
unittests/tracepoint-selftests.c, unittests/unpack-selftests.c,
unittests/utils-selftests.c, unittests/xml-utils-selftests.c,
utils.c, utils.h, valarith.c, valops.c, valprint.c, value.c,
value.h, varobj.c, varobj.h, windows-nat.c, x86-linux-nat.c,
xml-support.c, xml-support.h, xml-tdesc.h, xstormy16-tdep.c,
xtensa-linux-nat.c, dwarf2read.h: Change common to gdbsupport.
gdb/gdbserver/ChangeLog
2019-07-09 Tom Tromey <tom@tromey.com>
* configure: Rebuild.
* configure.ac: Change common to gdbsupport.
* acinclude.m4: Change common to gdbsupport.
* Makefile.in (SFILES, OBS, GDBREPLAY_OBS, IPA_OBJS)
(version-generated.c, gdbsupport/%-ipa.o, gdbsupport/%.o): Change
common to gdbsupport.
* ax.c, event-loop.c, fork-child.c, gdb_proc_service.h,
gdbreplay.c, gdbthread.h, hostio-errno.c, hostio.c, i387-fp.c,
inferiors.c, inferiors.h, linux-aarch64-tdesc-selftest.c,
linux-amd64-ipa.c, linux-i386-ipa.c, linux-low.c,
linux-tic6x-low.c, linux-x86-low.c, linux-x86-tdesc-selftest.c,
linux-x86-tdesc.c, lynx-i386-low.c, lynx-low.c, mem-break.h,
nto-x86-low.c, regcache.c, regcache.h, remote-utils.c, server.c,
server.h, spu-low.c, symbol.c, target.h, tdesc.c, tdesc.h,
thread-db.c, tracepoint.c, win32-i386-low.c, win32-low.c: Change
common to gdbsupport.
2019-05-06 10:29:24 +08:00
|
|
|
#include "gdbsupport/common-defs.h"
|
|
|
|
#include "gdbsupport/break-common.h"
|
2015-08-25 18:38:29 +08:00
|
|
|
#include "nat/linux-nat.h"
|
|
|
|
#include "nat/aarch64-linux-hw-point.h"
|
|
|
|
#include "nat/aarch64-linux.h"
|
|
|
|
|
2015-09-18 20:59:42 +08:00
|
|
|
#include "elf/common.h"
|
|
|
|
#include "nat/gdb_ptrace.h"
|
|
|
|
#include <asm/ptrace.h>
|
|
|
|
#include <sys/uio.h>
|
|
|
|
|
2015-08-25 18:38:29 +08:00
|
|
|
/* Called when resuming a thread LWP.
|
|
|
|
The hardware debug registers are updated when there is any change. */
|
|
|
|
|
|
|
|
void
|
|
|
|
aarch64_linux_prepare_to_resume (struct lwp_info *lwp)
|
|
|
|
{
|
|
|
|
struct arch_lwp_info *info = lwp_arch_private_info (lwp);
|
|
|
|
|
|
|
|
/* NULL means this is the main thread still going through the shell,
|
|
|
|
or, no watchpoint has been set yet. In that case, there's
|
|
|
|
nothing to do. */
|
|
|
|
if (info == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (DR_HAS_CHANGED (info->dr_changed_bp)
|
|
|
|
|| DR_HAS_CHANGED (info->dr_changed_wp))
|
|
|
|
{
|
|
|
|
ptid_t ptid = ptid_of_lwp (lwp);
|
2018-06-12 02:10:09 +08:00
|
|
|
int tid = ptid.lwp ();
|
2015-08-25 18:38:29 +08:00
|
|
|
struct aarch64_debug_reg_state *state
|
2018-06-12 02:05:27 +08:00
|
|
|
= aarch64_get_debug_reg_state (ptid.pid ());
|
2015-08-25 18:38:29 +08:00
|
|
|
|
|
|
|
if (show_debug_regs)
|
|
|
|
debug_printf ("prepare_to_resume thread %d\n", tid);
|
|
|
|
|
|
|
|
/* Watchpoints. */
|
|
|
|
if (DR_HAS_CHANGED (info->dr_changed_wp))
|
|
|
|
{
|
|
|
|
aarch64_linux_set_debug_regs (state, tid, 1);
|
|
|
|
DR_CLEAR_CHANGED (info->dr_changed_wp);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Breakpoints. */
|
|
|
|
if (DR_HAS_CHANGED (info->dr_changed_bp))
|
|
|
|
{
|
|
|
|
aarch64_linux_set_debug_regs (state, tid, 0);
|
|
|
|
DR_CLEAR_CHANGED (info->dr_changed_bp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-08-25 18:38:29 +08:00
|
|
|
|
|
|
|
/* Function to call when a new thread is detected. */
|
|
|
|
|
|
|
|
void
|
|
|
|
aarch64_linux_new_thread (struct lwp_info *lwp)
|
|
|
|
{
|
2018-12-05 18:34:54 +08:00
|
|
|
ptid_t ptid = ptid_of_lwp (lwp);
|
|
|
|
struct aarch64_debug_reg_state *state
|
|
|
|
= aarch64_get_debug_reg_state (ptid.pid ());
|
2019-01-23 19:31:40 +08:00
|
|
|
struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
|
2015-08-25 18:38:29 +08:00
|
|
|
|
2018-12-05 18:34:54 +08:00
|
|
|
/* If there are hardware breakpoints/watchpoints in the process then mark that
|
|
|
|
all the hardware breakpoint/watchpoint register pairs for this thread need
|
|
|
|
to be initialized (with data from aarch_process_info.debug_reg_state). */
|
|
|
|
if (aarch64_linux_any_set_debug_regs_state (state, false))
|
|
|
|
DR_MARK_ALL_CHANGED (info->dr_changed_bp, aarch64_num_bp_regs);
|
|
|
|
if (aarch64_linux_any_set_debug_regs_state (state, true))
|
|
|
|
DR_MARK_ALL_CHANGED (info->dr_changed_wp, aarch64_num_wp_regs);
|
2015-08-25 18:38:29 +08:00
|
|
|
|
|
|
|
lwp_set_arch_private_info (lwp, info);
|
|
|
|
}
|
aarch64 multi-arch support (part 2): siginfo fixup
This patch is to fixup the siginfo_t when aarch64 gdb or gdbserver
read from or write to the arm inferior. It is to convert the
"struct siginfo_t" between aarch64 and arm, which is quite mechanical.
gdb/gdbserver:
2015-09-15 Yao Qi <yao.qi@linaro.org>
* linux-aarch64-low.c (aarch64_linux_siginfo_fixup): New
function.
(struct linux_target_ops the_low_target): Install
aarch64_linux_siginfo_fixup.
gdb:
2015-09-15 Yao Qi <yao.qi@linaro.org>
* aarch64-linux-nat.c (aarch64_linux_siginfo_fixup): New function.
(_initialize_aarch64_linux_nat): Call linux_nat_set_siginfo_fixup.
* nat/aarch64-linux.c (aarch64_compat_siginfo_from_siginfo):
New function.
(aarch64_siginfo_from_compat_siginfo): New function.
* nat/aarch64-linux.h: Include signal.h.
(compat_int_t, compat_uptr_t, compat_time_t): Typedef.
(compat_timer_t, compat_clock_t): Likewise.
(struct compat_timeval): New.
(union compat_sigval): New.
(struct compat_siginfo): New.
(cpt_si_pid, cpt_si_uid, cpt_si_timerid): New macros.
(cpt_si_overrun, cpt_si_status, cpt_si_utime): Likewise.
(cpt_si_stime, cpt_si_ptr, cpt_si_addr): Likewise.
(cpt_si_band, cpt_si_fd): Likewise.
2015-09-15 17:25:51 +08:00
|
|
|
|
lwp_info: Make the arch code free arch_lwp_info
I have the goal of "poisoning" the XNEW/xfree-family of functions, so
that we catch their usages with non-POD types. A few things need to be
fixed in the mean time, this is one.
The common lwp code in linux-nat.c and gdbserver/linux-low.c xfrees the
private lwp data of type arch_lwp_info. However, that type is opaque
from its point of view, as its defined differently in each arch-specific
implementation. This trips on the std::is_pod<T> check, since the
compiler can't tell whether the type is POD or not if it doesn't know
about it.
My initial patch [1] made a class hierarchy with a virtual destructor.
However, as Pedro pointed out, we only have one native architecture at
the time built in gdb and gdbserver, so that's overkill. Instead, we
can move the responsibility of free'ing arch_lwp_info to the arch code
(which is also the one that allocated it in the first place). This is
what this patch does.
Also, I had the concern that if we wanted to use C++ features in these
structures, we would have a problem with the one-definition rule.
However, since a build will only have one version of arch_lwp_info,
that's not a problem.
There are changes in arch-specific files, I was only able to built-test
this patch with the following cross-compilers:
aarch64-linux-gnu
alpha-linux-gnu
arm-linux-gnueabihf
hppa-linux-gnu
m68k-linux-gnu
mips64el-linux-gnuabi64
powerpc64-linux-gnu
s390x-linux-gnu
sh4-linux-gnu
sparc64-linux-gnu
x86_64-linux-gnu
x86_64-w64-mingw32
A buildbot run didn't find any regression.
[1] https://sourceware.org/ml/gdb-patches/2017-08/msg00255.html
gdb/ChangeLog:
* linux-nat.h (linux_nat_set_delete_thread): New declaration.
* linux-nat.c (linux_nat_delete_thread): New variable.
(lwp_free): Invoke linux_nat_delete_thread if set.
(linux_nat_set_delete_thread): New function.
* aarch64-linux-nat.c (_initialize_aarch64_linux_nat): Assign
thread delete callback.
* arm-linux-nat.c (arm_linux_delete_thread): New function.
(_initialize_arm_linux_nat): Assign thread delete callback.
* s390-linux-nat.c (s390_delete_thread): New function.
(_initialize_s390_nat): Assign thread delete callback.
* x86-linux-nat.c (x86_linux_add_target): Likewise.
* nat/aarch64-linux.c (aarch64_linux_delete_thread): New
function.
* nat/aarch64-linux.h (aarch64_linux_delete_thread): New
declaration.
* nat/x86-linux.c (x86_linux_delete_thread): New function.
* nat/x86-linux.h (x86_linux_delete_thread): New declaration.
gdb/gdbserver/ChangeLog:
* linux-aarch64-low.c (the_low_target): Add thread delete
callback.
* linux-arm-low.c (arm_delete_thread): New function.
(the_low_target): Add thread delete callback.
* linux-bfin-low.c (the_low_target): Likewise.
* linux-crisv32-low.c (the_low_target): Likewise.
* linux-low.c (delete_lwp): Invoke delete_thread callback if
set.
* linux-low.h (struct linux_target_ops) <delete_thread>: New
field.
* linux-m32r-low.c (the_low_target): Add thread delete callback.
* linux-mips-low.c (mips_linux_delete_thread): New function.
(the_low_target): Add thread delete callback.
* linux-ppc-low.c (the_low_target): Likewise.
* linux-s390-low.c (the_low_target): Likewise.
* linux-sh-low.c (the_low_target): Likewise.
* linux-tic6x-low.c (the_low_target): Likewise.
* linux-tile-low.c (the_low_target): Likewise.
* linux-x86-low.c (the_low_target): Likewise.
* linux-xtensa-low.c (the_low_target): Likewise.
2017-10-13 04:48:22 +08:00
|
|
|
/* See nat/aarch64-linux.h. */
|
|
|
|
|
|
|
|
void
|
|
|
|
aarch64_linux_delete_thread (struct arch_lwp_info *arch_lwp)
|
|
|
|
{
|
|
|
|
xfree (arch_lwp);
|
|
|
|
}
|
|
|
|
|
aarch64 multi-arch support (part 2): siginfo fixup
This patch is to fixup the siginfo_t when aarch64 gdb or gdbserver
read from or write to the arm inferior. It is to convert the
"struct siginfo_t" between aarch64 and arm, which is quite mechanical.
gdb/gdbserver:
2015-09-15 Yao Qi <yao.qi@linaro.org>
* linux-aarch64-low.c (aarch64_linux_siginfo_fixup): New
function.
(struct linux_target_ops the_low_target): Install
aarch64_linux_siginfo_fixup.
gdb:
2015-09-15 Yao Qi <yao.qi@linaro.org>
* aarch64-linux-nat.c (aarch64_linux_siginfo_fixup): New function.
(_initialize_aarch64_linux_nat): Call linux_nat_set_siginfo_fixup.
* nat/aarch64-linux.c (aarch64_compat_siginfo_from_siginfo):
New function.
(aarch64_siginfo_from_compat_siginfo): New function.
* nat/aarch64-linux.h: Include signal.h.
(compat_int_t, compat_uptr_t, compat_time_t): Typedef.
(compat_timer_t, compat_clock_t): Likewise.
(struct compat_timeval): New.
(union compat_sigval): New.
(struct compat_siginfo): New.
(cpt_si_pid, cpt_si_uid, cpt_si_timerid): New macros.
(cpt_si_overrun, cpt_si_status, cpt_si_utime): Likewise.
(cpt_si_stime, cpt_si_ptr, cpt_si_addr): Likewise.
(cpt_si_band, cpt_si_fd): Likewise.
2015-09-15 17:25:51 +08:00
|
|
|
/* Convert native siginfo FROM to the siginfo in the layout of the
|
|
|
|
inferior's architecture TO. */
|
|
|
|
|
|
|
|
void
|
|
|
|
aarch64_compat_siginfo_from_siginfo (compat_siginfo_t *to, siginfo_t *from)
|
|
|
|
{
|
|
|
|
memset (to, 0, sizeof (*to));
|
|
|
|
|
|
|
|
to->si_signo = from->si_signo;
|
|
|
|
to->si_errno = from->si_errno;
|
|
|
|
to->si_code = from->si_code;
|
|
|
|
|
|
|
|
if (to->si_code == SI_TIMER)
|
|
|
|
{
|
|
|
|
to->cpt_si_timerid = from->si_timerid;
|
|
|
|
to->cpt_si_overrun = from->si_overrun;
|
|
|
|
to->cpt_si_ptr = (intptr_t) from->si_ptr;
|
|
|
|
}
|
|
|
|
else if (to->si_code == SI_USER)
|
|
|
|
{
|
|
|
|
to->cpt_si_pid = from->si_pid;
|
|
|
|
to->cpt_si_uid = from->si_uid;
|
|
|
|
}
|
|
|
|
else if (to->si_code < 0)
|
|
|
|
{
|
|
|
|
to->cpt_si_pid = from->si_pid;
|
|
|
|
to->cpt_si_uid = from->si_uid;
|
|
|
|
to->cpt_si_ptr = (intptr_t) from->si_ptr;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (to->si_signo)
|
|
|
|
{
|
|
|
|
case SIGCHLD:
|
|
|
|
to->cpt_si_pid = from->si_pid;
|
|
|
|
to->cpt_si_uid = from->si_uid;
|
|
|
|
to->cpt_si_status = from->si_status;
|
|
|
|
to->cpt_si_utime = from->si_utime;
|
|
|
|
to->cpt_si_stime = from->si_stime;
|
|
|
|
break;
|
|
|
|
case SIGILL:
|
|
|
|
case SIGFPE:
|
|
|
|
case SIGSEGV:
|
|
|
|
case SIGBUS:
|
|
|
|
to->cpt_si_addr = (intptr_t) from->si_addr;
|
|
|
|
break;
|
|
|
|
case SIGPOLL:
|
|
|
|
to->cpt_si_band = from->si_band;
|
|
|
|
to->cpt_si_fd = from->si_fd;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
to->cpt_si_pid = from->si_pid;
|
|
|
|
to->cpt_si_uid = from->si_uid;
|
|
|
|
to->cpt_si_ptr = (intptr_t) from->si_ptr;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Convert inferior's architecture siginfo FROM to native siginfo TO. */
|
|
|
|
|
|
|
|
void
|
|
|
|
aarch64_siginfo_from_compat_siginfo (siginfo_t *to, compat_siginfo_t *from)
|
|
|
|
{
|
|
|
|
memset (to, 0, sizeof (*to));
|
|
|
|
|
|
|
|
to->si_signo = from->si_signo;
|
|
|
|
to->si_errno = from->si_errno;
|
|
|
|
to->si_code = from->si_code;
|
|
|
|
|
|
|
|
if (to->si_code == SI_TIMER)
|
|
|
|
{
|
|
|
|
to->si_timerid = from->cpt_si_timerid;
|
|
|
|
to->si_overrun = from->cpt_si_overrun;
|
|
|
|
to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
|
|
|
|
}
|
|
|
|
else if (to->si_code == SI_USER)
|
|
|
|
{
|
|
|
|
to->si_pid = from->cpt_si_pid;
|
|
|
|
to->si_uid = from->cpt_si_uid;
|
|
|
|
}
|
|
|
|
if (to->si_code < 0)
|
|
|
|
{
|
|
|
|
to->si_pid = from->cpt_si_pid;
|
|
|
|
to->si_uid = from->cpt_si_uid;
|
|
|
|
to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (to->si_signo)
|
|
|
|
{
|
|
|
|
case SIGCHLD:
|
|
|
|
to->si_pid = from->cpt_si_pid;
|
|
|
|
to->si_uid = from->cpt_si_uid;
|
|
|
|
to->si_status = from->cpt_si_status;
|
|
|
|
to->si_utime = from->cpt_si_utime;
|
|
|
|
to->si_stime = from->cpt_si_stime;
|
|
|
|
break;
|
|
|
|
case SIGILL:
|
|
|
|
case SIGFPE:
|
|
|
|
case SIGSEGV:
|
|
|
|
case SIGBUS:
|
|
|
|
to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
|
|
|
|
break;
|
|
|
|
case SIGPOLL:
|
|
|
|
to->si_band = from->cpt_si_band;
|
|
|
|
to->si_fd = from->cpt_si_fd;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
to->si_pid = from->cpt_si_pid;
|
|
|
|
to->si_uid = from->cpt_si_uid;
|
|
|
|
to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-09-18 20:59:42 +08:00
|
|
|
|
|
|
|
/* Called by libthread_db. Returns a pointer to the thread local
|
|
|
|
storage (or its descriptor). */
|
|
|
|
|
|
|
|
ps_err_e
|
2016-08-25 15:42:03 +08:00
|
|
|
aarch64_ps_get_thread_area (struct ps_prochandle *ph,
|
2015-09-18 20:59:42 +08:00
|
|
|
lwpid_t lwpid, int idx, void **base,
|
|
|
|
int is_64bit_p)
|
|
|
|
{
|
|
|
|
struct iovec iovec;
|
|
|
|
uint64_t reg64;
|
|
|
|
uint32_t reg32;
|
|
|
|
|
|
|
|
if (is_64bit_p)
|
|
|
|
{
|
|
|
|
iovec.iov_base = ®64;
|
|
|
|
iovec.iov_len = sizeof (reg64);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
iovec.iov_base = ®32;
|
|
|
|
iovec.iov_len = sizeof (reg32);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ptrace (PTRACE_GETREGSET, lwpid, NT_ARM_TLS, &iovec) != 0)
|
|
|
|
return PS_ERR;
|
|
|
|
|
|
|
|
/* IDX is the bias from the thread pointer to the beginning of the
|
|
|
|
thread descriptor. It has to be subtracted due to implementation
|
|
|
|
quirks in libthread_db. */
|
|
|
|
if (is_64bit_p)
|
|
|
|
*base = (void *) (reg64 - idx);
|
|
|
|
else
|
|
|
|
*base = (void *) (uintptr_t) (reg32 - idx);
|
|
|
|
|
|
|
|
return PS_OK;
|
|
|
|
}
|