From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 47342 invoked by alias); 3 May 2017 15:36:35 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 47274 invoked by uid 89); 3 May 2017 15:36:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy=classifying X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0b-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.158.5) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 03 May 2017 15:36:30 +0000 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v43FXfcq003872 for ; Wed, 3 May 2017 11:36:31 -0400 Received: from e06smtp10.uk.ibm.com (e06smtp10.uk.ibm.com [195.75.94.106]) by mx0b-001b2d01.pphosted.com with ESMTP id 2a790sj7bk-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 03 May 2017 11:36:31 -0400 Received: from localhost by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 3 May 2017 16:36:29 +0100 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp10.uk.ibm.com (192.168.101.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 3 May 2017 16:36:28 +0100 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v43FaRpr5636376; Wed, 3 May 2017 15:36:27 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AF7C211C052; Wed, 3 May 2017 16:35:19 +0100 (BST) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 71F2F11C04C; Wed, 3 May 2017 16:35:19 +0100 (BST) Received: from ThinkPad (unknown [9.152.212.148]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 3 May 2017 16:35:19 +0100 (BST) Date: Wed, 03 May 2017 15:36:00 -0000 From: Philipp Rudo To: Yao Qi Cc: gdb-patches@sourceware.org, Yao Qi , Peter Griffin , Omair Javaid , Andreas Arnez Subject: Re: [RFC v3 3/8] Add basic Linux kernel support In-Reply-To: <86d1br8q8v.fsf@gmail.com> References: <20170316165739.88524-1-prudo@linux.vnet.ibm.com> <20170316165739.88524-4-prudo@linux.vnet.ibm.com> <86d1br8q8v.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 17050315-0040-0000-0000-0000037D8746 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17050315-0041-0000-0000-00002536E3A8 Message-Id: <20170503173626.15e61941@ThinkPad> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-05-03_12:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=2 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1705030287 X-IsSubscribed: yes X-SW-Source: 2017-05/txt/msg00062.txt.bz2 Hi Yao, On Tue, 02 May 2017 12:14:40 +0100 Yao Qi wrote: > Philipp Rudo 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 . > > */ + > > +#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"? I called it "private" as it is the targets private data stored in its to_data hook. But I don't mind renaming it. Especially ... > > +{ > > + /* 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. ... when classifying the struct, which already is on my long ToDo-list. This struct is a left over from when I started working on the project shortly before gdb-7.12 was released. I didn't think that the C++-yfication would kick off that fast and started with plain C ... Thanks Philipp > > + > > +/* 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; > > +}; >