This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v3 12/14] add linux_infcall_mmap


On 11/23/2014 07:11 PM, Jan Kratochvil wrote:
> On Tue, 11 Nov 2014 17:43:19 +0100, Pedro Alves wrote:
>> On 11/01/2014 09:47 PM, Jan Kratochvil wrote:
>>> +/* See gdbarch.sh 'infcall_mmap'.  */
>>> +
>>> +static CORE_ADDR
>>> +linux_infcall_mmap (CORE_ADDR size, unsigned prot)
>>> +{
>>> +  struct objfile *objf;
>>> +  /* Do there still exist any Linux systems without "mmap64"?
>>> +     "mmap" uses 64-bit off_t on x86_64 and 32-bit off_t on i386 and x32.  */
>>> +  struct value *mmap_val = find_function_in_inferior ("mmap64", &objf);
>>> +  struct value *addr_val;
>>> +  struct gdbarch *gdbarch = get_objfile_arch (objf);
>>> +  CORE_ADDR retval;
>>> +  enum
>>> +    {
>>> +      ARG_ADDR, ARG_LENGTH, ARG_PROT, ARG_FLAGS, ARG_FD, ARG_OFFSET, ARG_MAX
>>> +    };
>>> +  struct value *arg[ARG_MAX];
>>> +
>>> +  arg[ARG_ADDR] = value_from_pointer (builtin_type (gdbarch)->builtin_data_ptr,
>>> +				      0);
>>> +  /* Assuming sizeof (unsigned long) == sizeof (size_t).  */
>>> +  arg[ARG_LENGTH] = value_from_ulongest
>>> +		    (builtin_type (gdbarch)->builtin_unsigned_long, size);
>>> +  gdb_assert ((prot & ~7) == 0);
>>> +  arg[ARG_PROT] = value_from_longest (builtin_type (gdbarch)->builtin_int,
>>> +				      0
>>> +				      | ((prot & 4) != 0 ? PROT_READ : 0)
>>> +				      | ((prot & 2) != 0 ? PROT_WRITE : 0)
>>> +				      | ((prot & 1) != 0 ? PROT_EXEC : 0));
>>> +  arg[ARG_FLAGS] = value_from_longest (builtin_type (gdbarch)->builtin_int,
>>> +				       MAP_PRIVATE | MAP_ANONYMOUS);
>>
>> PROT_READ, PROT_WRITE, PROT_EXEC, MAP_PRIVATE, MAP_ANONYMOUS
>> are host values/macros.
> 
> Added to arch-utils.h:
> +/* Symbols for gdbarch_infcall_mmap; their Linux PROT_* system
> +   definitions would be dependent on compilation host.  */
> +#define GDB_MMAP_PROT_READ     0x1     /* Page can be read.  */
> +#define GDB_MMAP_PROT_WRITE    0x2     /* Page can be written.  */
> +#define GDB_MMAP_PROT_EXEC     0x4     /* Page can be executed.  */
> 
> Added to linux-tdep.c:
> +/* Symbols for linux_infcall_mmap's ARG_FLAGS; their Linux MAP_* system
> +   definitions would be dependent on compilation host.  */
> +#define GDB_MMAP_MAP_PRIVATE   0x02            /* Changes are private.  */
> +#define GDB_MMAP_MAP_ANONYMOUS 0x20            /* Don't use a file.  */
> and
> -  gdb_assert ((prot & ~7) == 0);
> +  gdb_assert ((prot & ~(GDB_MMAP_PROT_READ | GDB_MMAP_PROT_WRITE
> +                       | GDB_MMAP_PROT_EXEC))
> +             == 0);
> 
> Changed gdbarch.sh comment:
> -# PROT has rwx bitmask format - bit 2 (value 4) is for readable memory, bit 1
> -# (value 2) is for writable memory and bit 0 (value 1) is for executable memory.
> +# PROT has GDB_MMAP_PROT_* bitmask format.
> 
> Change changed the magic numbers to GDB_MMAP_PROT_* accordingly:
>        // Make the memory always readable.
> -      prot = 4;
> +      prot = GDB_MMAP_PROT_READ;
>        if ((bfd_get_section_flags (abfd, sect) & SEC_READONLY) == 0)
> -       prot |= 2;
> +       prot |= GDB_MMAP_PROT_WRITE;
>        if ((bfd_get_section_flags (abfd, sect) & SEC_CODE) != 0)
> -       prot |= 1;
> +       prot |= GDB_MMAP_PROT_EXEC;
> [...]
> -                                       TYPE_LENGTH (regs_type), 4);
> +                                       TYPE_LENGTH (regs_type),
> +                                       GDB_MMAP_PROT_READ);
> 


Thanks Jan.  This sounds good.

Thanks,
Pedro Alves


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]