[PATCH v4] Add support for NetBSD threads in sparc-nat.c

Kamil Rytarowski n54@gmx.com
Tue Mar 17 17:07:35 GMT 2020


On 17.03.2020 17:59, Simon Marchi wrote:
> On 2020-03-17 12:51 p.m., Simon Marchi wrote:
>> On 2020-03-17 12:46 p.m., Kamil Rytarowski wrote:
>>> NetBSD ptrace(2) accepts thread id (LWP) as the 4th argument for threads.
>>>
>>> This file is still shared with other targets that use different 4th argument
>>> type, that is always unused.
>>> ---
>>>  gdb/sparc-nat.c | 50 ++++++++++++++++++++++---------------------------
>>>  1 file changed, 22 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/gdb/sparc-nat.c b/gdb/sparc-nat.c
>>> index dff0f521565..10cc01375ed 100644
>>> --- a/gdb/sparc-nat.c
>>> +++ b/gdb/sparc-nat.c
>>> @@ -78,6 +78,19 @@ typedef struct fp_status fpregset_t;
>>>  #define PTRACE_SETFPREGS PT_SETFPREGS
>>>  #endif
>>>
>>> +static int
>>> +gdb_ptrace (int request, ptid_t pid, void *addr)
>>> +{
>>> +#ifdef __NetBSD__
>>> +  /* Support for NetBSD threads: unlike other ptrace implementations in this
>>> +     file, NetBSD requires that we pass both the pid and lwp.  */
>>> +  return ptrace (request, ptid (). pid (), addr, ptid ().lwp ());
>>
>> Does that even build?  ptid isn't the name of a parameter, and the parenthesis after
>> "ptid" should not be there.  Rename the pid parameter to ptid, and replace the above
>> with "ptid.pid ()" and "ptid.lwp ()".
>>
>> Simon
>>
> 
> I tried to build this using a sparc-linux cross-compiler, and I think we need
> to adjust gdb_ptrace to account for the various possible arguments types.  The
> following version of the function builds fine with sparc64-linux-gnu-gcc, can you
> try it with NetBSD?
> 
> static PTRACE_TYPE_RET
> gdb_ptrace (PTRACE_TYPE_ARG1 request, ptid_t ptid, PTRACE_TYPE_ARG4 addr)

Does it work for you if you use PTRACE_TYPE_ARG3? addr is the 3rd argument.

PTRACE_TYPE_ARG4 is int on BSDs.

> {
> #ifdef __NetBSD__
>   /* Support for NetBSD threads: unlike other ptrace implementations in this
>      file, NetBSD requires that we pass both the pid and lwp.  */
>   return ptrace (request, ptid.pid (), addr, ptid.lwp ());
> #else
>   pid_t pid = get_ptrace_pid (ptid);
>   return ptrace (request, pid, addr, 0);
> #endif
> }
> 
> Alternatively, we could keep address as a "void *", and cast the value inside gdb_ptrace:
> 
>   return ptrace (request, ptid.pid (), (PTRACE_TYPE_ARG4) addr, ptid.lwp ());
> 
> All the callers of gdb_ptrace wouldn't have to cast that themselves, which is perhaps
> a bit nicer.
> 
> Simon
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20200317/84bdb85a/attachment-0001.sig>


More information about the Gdb-patches mailing list