X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fx86-linux-nat.c;h=fd15dc9b87209de27f267ab37c62e69dca70fb63;hb=b93a00ca4d49ce35b52110ac1c49b9e5c4587019;hp=5d8f7c783f87cacf267729a11436782840d2c770;hpb=433bbbf8574a04c1639c5466fd7c320b510b9512;p=external%2Fbinutils.git diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c index 5d8f7c7..fd15dc9 100644 --- a/gdb/x86-linux-nat.c +++ b/gdb/x86-linux-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for GNU/Linux x86 (i386 and x86-64). - Copyright (C) 1999-2015 Free Software Foundation, Inc. + Copyright (C) 1999-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -21,13 +21,12 @@ #include "inferior.h" #include "elf/common.h" #include "gdb_proc_service.h" -#include +#include "nat/gdb_ptrace.h" #include #include #include #include "x86-nat.h" -#include "linux-nat.h" #ifndef __x86_64__ #include "i386-linux-nat.h" #endif @@ -36,27 +35,17 @@ #ifdef __x86_64__ #include "amd64-linux-tdep.h" #endif -#include "x86-xstate.h" +#include "common/x86-xstate.h" #include "nat/linux-btrace.h" #include "nat/linux-nat.h" #include "nat/x86-linux.h" #include "nat/x86-linux-dregs.h" #include "nat/linux-ptrace.h" -/* Per-thread arch-specific data we want to keep. */ +/* linux_nat_target::low_new_fork implementation. */ -struct arch_lwp_info -{ - /* Non-zero if our copy differs from what's recorded in the thread. */ - int debug_registers_changed; -}; - - - -/* linux_nat_new_fork hook. */ - -static void -x86_linux_new_fork (struct lwp_info *parent, pid_t child_pid) +void +x86_linux_nat_target::low_new_fork (struct lwp_info *parent, pid_t child_pid) { pid_t parent_pid; struct x86_debug_reg_state *parent_state; @@ -81,21 +70,22 @@ x86_linux_new_fork (struct lwp_info *parent, pid_t child_pid) in the end before detaching the forked off process, thus making this compatible with older Linux kernels too. */ - parent_pid = ptid_get_pid (parent->ptid); + parent_pid = parent->ptid.pid (); parent_state = x86_debug_reg_state (parent_pid); child_state = x86_debug_reg_state (child_pid); *child_state = *parent_state; } -static void (*super_post_startup_inferior) (struct target_ops *self, - ptid_t ptid); +x86_linux_nat_target::~x86_linux_nat_target () +{ +} -static void -x86_linux_child_post_startup_inferior (struct target_ops *self, ptid_t ptid) +void +x86_linux_nat_target::post_startup_inferior (ptid_t ptid) { x86_cleanup_dregs (); - super_post_startup_inferior (self, ptid); + linux_nat_target::post_startup_inferior (ptid); } #ifdef __x86_64__ @@ -112,8 +102,8 @@ x86_linux_child_post_startup_inferior (struct target_ops *self, ptid_t ptid) /* Get Linux/x86 target description from running target. */ -static const struct target_desc * -x86_linux_read_description (struct target_ops *ops) +const struct target_desc * +x86_linux_nat_target::read_description () { int tid; int is_64bit = 0; @@ -124,9 +114,9 @@ x86_linux_read_description (struct target_ops *ops) uint64_t xcr0_features_bits; /* GNU/Linux LWP ID's are process ID's. */ - tid = ptid_get_lwp (inferior_ptid); + tid = inferior_ptid.lwp (); if (tid == 0) - tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */ + tid = inferior_ptid.pid (); /* Not a threaded program. */ #ifdef __x86_64__ { @@ -162,13 +152,13 @@ x86_linux_read_description (struct target_ops *ops) if (ptrace (PTRACE_GETFPXREGS, tid, 0, (int) &fpxregs) < 0) { have_ptrace_getfpxregs = 0; - have_ptrace_getregset = 0; - return tdesc_i386_mmx_linux; + have_ptrace_getregset = TRIBOOL_FALSE; + return i386_linux_read_description (X86_XSTATE_X87_MASK); } } #endif - if (have_ptrace_getregset == -1) + if (have_ptrace_getregset == TRIBOOL_UNKNOWN) { uint64_t xstateregs[(X86_XSTATE_SSE_SIZE / sizeof (uint64_t))]; struct iovec iov; @@ -179,10 +169,10 @@ x86_linux_read_description (struct target_ops *ops) /* Check if PTRACE_GETREGSET works. */ if (ptrace (PTRACE_GETREGSET, tid, (unsigned int) NT_X86_XSTATE, &iov) < 0) - have_ptrace_getregset = 0; + have_ptrace_getregset = TRIBOOL_FALSE; else { - have_ptrace_getregset = 1; + have_ptrace_getregset = TRIBOOL_TRUE; /* Get XCR0 from XSAVE extended state. */ xcr0 = xstateregs[(I386_LINUX_XSAVE_XCR0_OFFSET @@ -194,7 +184,7 @@ x86_linux_read_description (struct target_ops *ops) PTRACE_GETREGSET is not available then set xcr0_features_bits to zero so that the "no-features" descriptions are returned by the switches below. */ - if (have_ptrace_getregset) + if (have_ptrace_getregset == TRIBOOL_TRUE) xcr0_features_bits = xcr0 & X86_XSTATE_ALL_MASK; else xcr0_features_bits = 0; @@ -202,46 +192,18 @@ x86_linux_read_description (struct target_ops *ops) if (is_64bit) { #ifdef __x86_64__ - switch (xcr0_features_bits) - { - case X86_XSTATE_MPX_AVX512_MASK: - case X86_XSTATE_AVX512_MASK: - if (is_x32) - return tdesc_x32_avx512_linux; - else - return tdesc_amd64_avx512_linux; - case X86_XSTATE_MPX_MASK: - if (is_x32) - return tdesc_x32_avx_linux; /* No MPX on x32 using AVX. */ - else - return tdesc_amd64_mpx_linux; - case X86_XSTATE_AVX_MASK: - if (is_x32) - return tdesc_x32_avx_linux; - else - return tdesc_amd64_avx_linux; - default: - if (is_x32) - return tdesc_x32_linux; - else - return tdesc_amd64_linux; - } + return amd64_linux_read_description (xcr0_features_bits, is_x32); #endif } else { - switch (xcr0_features_bits) - { - case X86_XSTATE_MPX_AVX512_MASK: - case X86_XSTATE_AVX512_MASK: - return tdesc_i386_avx512_linux; - case X86_XSTATE_MPX_MASK: - return tdesc_i386_mpx_linux; - case X86_XSTATE_AVX_MASK: - return tdesc_i386_avx_linux; - default: - return tdesc_i386_linux; - } + const struct target_desc * tdesc + = i386_linux_read_description (xcr0_features_bits); + + if (tdesc == NULL) + tdesc = i386_linux_read_description (X86_XSTATE_SSE_MASK); + + return tdesc; } gdb_assert_not_reached ("failed to return tdesc"); @@ -250,34 +212,29 @@ x86_linux_read_description (struct target_ops *ops) /* Enable branch tracing. */ -static struct btrace_target_info * -x86_linux_enable_btrace (struct target_ops *self, ptid_t ptid, - const struct btrace_config *conf) +struct btrace_target_info * +x86_linux_nat_target::enable_btrace (ptid_t ptid, + const struct btrace_config *conf) { - struct btrace_target_info *tinfo; - struct gdbarch *gdbarch; - - errno = 0; - tinfo = linux_enable_btrace (ptid, conf); - - if (tinfo == NULL) - error (_("Could not enable branch tracing for %s: %s."), - target_pid_to_str (ptid), safe_strerror (errno)); - - /* Fill in the size of a pointer in bits. */ - if (tinfo->ptr_bits == 0) + struct btrace_target_info *tinfo = nullptr; + TRY { - gdbarch = target_thread_architecture (ptid); - tinfo->ptr_bits = gdbarch_ptr_bit (gdbarch); + tinfo = linux_enable_btrace (ptid, conf); } + CATCH (exception, RETURN_MASK_ERROR) + { + error (_("Could not enable branch tracing for %s: %s"), + target_pid_to_str (ptid), exception.message); + } + END_CATCH + return tinfo; } /* Disable branch tracing. */ -static void -x86_linux_disable_btrace (struct target_ops *self, - struct btrace_target_info *tinfo) +void +x86_linux_nat_target::disable_btrace (struct btrace_target_info *tinfo) { enum btrace_error errcode = linux_disable_btrace (tinfo); @@ -287,28 +244,25 @@ x86_linux_disable_btrace (struct target_ops *self, /* Teardown branch tracing. */ -static void -x86_linux_teardown_btrace (struct target_ops *self, - struct btrace_target_info *tinfo) +void +x86_linux_nat_target::teardown_btrace (struct btrace_target_info *tinfo) { /* Ignore errors. */ linux_disable_btrace (tinfo); } -static enum btrace_error -x86_linux_read_btrace (struct target_ops *self, - struct btrace_data *data, - struct btrace_target_info *btinfo, - enum btrace_read_type type) +enum btrace_error +x86_linux_nat_target::read_btrace (struct btrace_data *data, + struct btrace_target_info *btinfo, + enum btrace_read_type type) { return linux_read_btrace (data, btinfo, type); } /* See to_btrace_conf in target.h. */ -static const struct btrace_config * -x86_linux_btrace_conf (struct target_ops *self, - const struct btrace_target_info *btinfo) +const struct btrace_config * +x86_linux_nat_target::btrace_conf (const struct btrace_target_info *btinfo) { return linux_btrace_conf (btinfo); } @@ -357,49 +311,14 @@ x86_linux_get_thread_area (pid_t pid, void *addr, unsigned int *base_addr) } -/* Create an x86 GNU/Linux target. */ - -struct target_ops * -x86_linux_create_target (void) +void +_initialize_x86_linux_nat () { - /* Fill in the generic GNU/Linux methods. */ - struct target_ops *t = linux_target (); - /* Initialize the debug register function vectors. */ - x86_use_watchpoints (t); x86_dr_low.set_control = x86_linux_dr_set_control; x86_dr_low.set_addr = x86_linux_dr_set_addr; x86_dr_low.get_addr = x86_linux_dr_get_addr; x86_dr_low.get_status = x86_linux_dr_get_status; x86_dr_low.get_control = x86_linux_dr_get_control; x86_set_debug_register_length (sizeof (void *)); - - /* Override the GNU/Linux inferior startup hook. */ - super_post_startup_inferior = t->to_post_startup_inferior; - t->to_post_startup_inferior = x86_linux_child_post_startup_inferior; - - /* Add the description reader. */ - t->to_read_description = x86_linux_read_description; - - /* Add btrace methods. */ - t->to_supports_btrace = linux_supports_btrace; - t->to_enable_btrace = x86_linux_enable_btrace; - t->to_disable_btrace = x86_linux_disable_btrace; - t->to_teardown_btrace = x86_linux_teardown_btrace; - t->to_read_btrace = x86_linux_read_btrace; - t->to_btrace_conf = x86_linux_btrace_conf; - - return t; -} - -/* Add an x86 GNU/Linux target. */ - -void -x86_linux_add_target (struct target_ops *t) -{ - linux_nat_add_target (t); - linux_nat_set_new_thread (t, x86_linux_new_thread); - linux_nat_set_new_fork (t, x86_linux_new_fork); - linux_nat_set_forget_process (t, x86_forget_process); - linux_nat_set_prepare_to_resume (t, x86_linux_prepare_to_resume); }