Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Yao Qi <qiyaoltc@gmail.com>
To: Philipp Rudo <prudo@linux.vnet.ibm.com>
Cc: gdb-patches@sourceware.org,  Yao Qi <yao.qi@linaro.org>,
	 Peter Griffin <peter.griffin@linaro.org>,
	 Omair Javaid <omair.javaid@linaro.org>,
	 Andreas Arnez <arnez@linux.vnet.ibm.com>
Subject: Re: [RFC v3 3/8] Add basic Linux kernel support
Date: Tue, 02 May 2017 11:14:00 -0000	[thread overview]
Message-ID: <86d1br8q8v.fsf@gmail.com> (raw)
In-Reply-To: <20170316165739.88524-4-prudo@linux.vnet.ibm.com> (Philipp Rudo's	message of "Thu, 16 Mar 2017 17:57:34 +0100")

Philipp Rudo <prudo@linux.vnet.ibm.com> writes:

Hi Philipp,

> +/* Initialize architecture independent private data.  Must be called
> +   _after_ symbol tables were initialized.  */
> +
> +static void
> +lk_init_private_data ()
> +{
> +  if (LK_PRIVATE->data != NULL)
> +    htab_empty (LK_PRIVATE->data);
> +
> +  LK_DECLARE_FIELD (task_struct, tasks);
> +  LK_DECLARE_FIELD (task_struct, pid);
> +  LK_DECLARE_FIELD (task_struct, tgid);
> +  LK_DECLARE_FIELD (task_struct, thread_group);
> +  LK_DECLARE_FIELD (task_struct, comm);
> +  LK_DECLARE_FIELD (task_struct, thread);
> +
> +  LK_DECLARE_FIELD (list_head, next);
> +  LK_DECLARE_FIELD (list_head, prev);
> +
> +  LK_DECLARE_FIELD (rq, curr);
> +
> +  LK_DECLARE_FIELD (cpumask, bits);
> +
> +  LK_DECLARE_ADDR (init_task);
> +  LK_DECLARE_ADDR (runqueues);
> +  LK_DECLARE_ADDR (__per_cpu_offset);
> +  LK_DECLARE_ADDR (init_mm);
> +
> +  LK_DECLARE_ADDR_ALIAS (__cpu_online_mask, cpu_online_mask);	/* linux 4.5+ */
> +  LK_DECLARE_ADDR_ALIAS (cpu_online_bits, cpu_online_mask);	/* linux -4.4 */
> +  if (LK_ADDR (cpu_online_mask) == -1)
> +    error (_("Could not find address cpu_online_mask.  Aborting."));
> +}
> +

> +
> +/* Initialize linux kernel target.  */
> +
> +static void
> +init_linux_kernel_ops (void)
> +{
> +  struct target_ops *t;
> +
> +  if (linux_kernel_ops != NULL)
> +    return;
> +
> +  t = XCNEW (struct target_ops);
> +  t->to_shortname = "linux-kernel";
> +  t->to_longname = "linux kernel support";
> +  t->to_doc = "Adds support to debug the Linux kernel";
> +
> +  /* set t->to_data = struct lk_private in lk_init_private.  */
> +
> +  t->to_open = lk_open;
> +  t->to_close = lk_close;
> +  t->to_detach = lk_detach;
> +  t->to_fetch_registers = lk_fetch_registers;
> +  t->to_update_thread_list = lk_update_thread_list;
> +  t->to_pid_to_str = lk_pid_to_str;
> +  t->to_thread_name = lk_thread_name;
> +
> +  t->to_stratum = thread_stratum;
> +  t->to_magic = OPS_MAGIC;
> +
> +  linux_kernel_ops = t;
> +
> +  add_target (t);
> +}
> +
> +/* Provide a prototype to silence -Wmissing-prototypes.  */
> +extern initialize_file_ftype _initialize_linux_kernel;
> +
> +void
> +_initialize_linux_kernel (void)
> +{
> +  init_linux_kernel_ops ();
> +
> +  observer_attach_new_objfile (lk_observer_new_objfile);
> +  observer_attach_inferior_created (lk_observer_inferior_created);
> +}
> diff --git a/gdb/lk-low.h b/gdb/lk-low.h
> new file mode 100644
> index 0000000..292ef97
> --- /dev/null
> +++ b/gdb/lk-low.h
> @@ -0,0 +1,310 @@
> +/* Basic Linux kernel support, architecture independent.
> +
> +   Copyright (C) 2016 Free Software Foundation, Inc.
> +
> +   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/>.  */
> +
> +#ifndef __LK_LOW_H__
> +#define __LK_LOW_H__
> +
> +#include "target.h"
> +
> +extern struct target_ops *linux_kernel_ops;
> +
> +/* Copy constants defined in Linux kernel.  */
> +#define LK_TASK_COMM_LEN 16
> +#define LK_BITS_PER_BYTE 8
> +
> +/* Definitions used in linux kernel target.  */
> +#define LK_CPU_INVAL -1U
> +
> +/* Private data structs for this target.  */
> +/* Forward declarations.  */
> +struct lk_private_hooks;
> +struct lk_ptid_map;
> +
> +/* Short hand access to private data.  */
> +#define LK_PRIVATE ((struct lk_private *) linux_kernel_ops->to_data)
> +#define LK_HOOK (LK_PRIVATE->hooks)
> +
> +struct lk_private

"private" here is a little confusing.  How about rename it to "linux_kernel"?

> +{
> +  /* Hashtab for needed addresses, structs and fields.  */
> +  htab_t data;
> +
> +  /* Linked list to map between cpu number and original ptid from target
> +     beneath.  */
> +  struct lk_ptid_map *old_ptid;
> +
> +  /* Hooks for architecture dependent functions.  */
> +  struct lk_private_hooks *hooks;
> +};
> +

Secondly, can we change it to a class and function pointers in
lk_private_hooks become virtual functions.  gdbarch_lk_init_private
returns a pointer to an instance of sub-class of "linux_kernel".

lk_init_private_data can be put the constructor of base class, to add
entries to "data", and sub-class (in each gdbarch) can add their own
specific stuff.

> +
> +/* Functions to initialize private data.  Do not use directly, use the
> +   macros below instead.  */
> +
> +extern struct lk_private_data *lk_init_addr (const char *name,
> +					     const char *alias, int silent);
> +extern struct lk_private_data *lk_init_struct (const char *name,
> +					       const char *alias, int silent);

> +
> +/* Definitions for architecture dependent hooks.  */
> +/* Hook to read registers from the target and supply their content
> +   to the regcache.  */
> +typedef void (*lk_hook_get_registers) (CORE_ADDR task,
> +				       struct target_ops *target,
> +				       struct regcache *regcache,
> +				       int regnum);
> +
> +/* Hook to return the per_cpu_offset of cpu CPU.  Only architectures that
> +   do not use the __per_cpu_offset array to determin the offset have to
> +   supply this hook.  */
> +typedef CORE_ADDR (*lk_hook_get_percpu_offset) (unsigned int cpu);
> +
> +/* Hook to map a running task to a logical CPU.  Required if the target
> +   beneath uses a different PID as struct rq.  */
> +typedef unsigned int (*lk_hook_map_running_task_to_cpu) (struct thread_info *ti);
> +
> +struct lk_private_hooks
> +{
> +  /* required */
> +  lk_hook_get_registers get_registers;
> +
> +  /* optional, required if __per_cpu_offset array is not used to determine
> +     offset.  */
> +  lk_hook_get_percpu_offset get_percpu_offset;
> +
> +  /* optional, required if the target beneath uses a different PID as struct
> +     rq.  */
> +  lk_hook_map_running_task_to_cpu map_running_task_to_cpu;
> +};

-- 
Yao (齐尧)


  parent reply	other threads:[~2017-05-02 11:14 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-16 16:57 [RFC v3 0/8] Support for Linux kernel debugging Philipp Rudo
2017-03-16 16:57 ` [RFC v3 1/8] Convert substitute_path_component to C++ Philipp Rudo
2017-04-20 20:02   ` Sergio Durigan Junior
2017-05-03 16:20     ` Philipp Rudo
2017-03-16 16:58 ` [RFC v3 8/8] Add S390 support for linux-kernel target Philipp Rudo
2017-03-16 16:58 ` [RFC v3 2/8] Add libiberty/concat styled concat_path function Philipp Rudo
2017-03-16 16:58 ` [RFC v3 7/8] Add privileged registers for s390x Philipp Rudo
2017-03-16 16:58 ` [RFC v3 6/8] Seperate common s390-tdep.* from s390-linux-tdep.* Philipp Rudo
2017-03-16 16:58 ` [RFC v3 4/8] Add kernel module support for linux-kernel target Philipp Rudo
2017-05-02 13:15   ` Yao Qi
2017-05-03 16:16     ` Philipp Rudo
2017-05-05 21:33       ` Yao Qi
2017-05-08  9:18         ` Philipp Rudo
2017-05-08 13:05           ` Yao Qi via gdb-patches
2017-03-16 16:58 ` [RFC v3 5/8] Add commands " Philipp Rudo
2017-03-16 16:58 ` [RFC v3 3/8] Add basic Linux kernel support Philipp Rudo
2017-04-16 22:59   ` Omair Javaid
2017-05-03 14:38     ` Philipp Rudo
2017-04-20 11:09   ` Omair Javaid
2017-04-24 15:24     ` Andreas Arnez
2017-05-03 14:13       ` Omair Javaid
2017-05-03 15:20         ` Philipp Rudo
2017-05-03 14:38     ` Philipp Rudo
2017-05-02 11:14   ` Yao Qi [this message]
2017-05-03 15:36     ` Philipp Rudo
2017-05-07 23:54       ` Omair Javaid
     [not found]         ` <20170508132204.7a733dc2@ThinkPad>
     [not found]           ` <CADrjBPqijRQFH4jthAedFzOzMLchpyvM53aXc9grOCjS2YUNCw@mail.gmail.com>
2017-05-10  9:03             ` Philipp Rudo
2017-05-10  9:36           ` Philipp Rudo
2017-05-19  8:45           ` Yao Qi
2017-05-19 15:24             ` Andreas Arnez
2017-05-19 16:28               ` John Baldwin
2017-05-19 17:05                 ` Andreas Arnez
2017-05-19 17:40                   ` John Baldwin
2017-05-22 10:18                     ` Andreas Arnez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=86d1br8q8v.fsf@gmail.com \
    --to=qiyaoltc@gmail.com \
    --cc=arnez@linux.vnet.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=omair.javaid@linaro.org \
    --cc=peter.griffin@linaro.org \
    --cc=prudo@linux.vnet.ibm.com \
    --cc=yao.qi@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox