Re: [PATCH] [AArch64 Linux] Get rid of top byte from tagged address

Pedro Alves
2017-10-19T11:09:04Z

> Pedro Alves <palves@redhat.com> writes:
>
>> I'm fine with doing this if it's what arm/linaro folks want,
>> though personally (with absolutely no experience in this) I have
>> reservations about whether stripping the top byte in the special
>> case of memory accesses is a good idea, since it may puzzle folks
>> when they pass such pointers/addresses in registers/structures and
>> things don't magically work then (and then gdb masks the problem when
>> folks try to diagnose it, as in "but I can access the object
>> via "p *s->ptr", why isn't this working??? bad gdb.").
>>
>> So I think this should be documented in the manual somewhere.
>
> I don't understand how does GDB affect the program. ARMv8 architecture
> supports tagged address for data values, and top byte of virtual address
> is ignored in some cases,

I didn't say that GDB affects the program. From the kernel document:

~~~
All interpretation of userspace memory addresses by the kernel assumes
an address tag of 0x00.

This includes, but is not limited to, addresses found in:

- pointer arguments to system calls, including pointers in structures
passed to system calls,
~~~

This means with something like:

#define tagptr(PTR) \
((typeof (PTR)) ((uintptr_t) (PTR) | 0xf000000000000000ULL))

strcat (buf, "hello\n");

char *ptr = tagptr(buf); // assume this is hidden from view.

write (1, ptr, 6); // kernel rejects this.

and then the user might be puzzled because stepping through
that code:

(gdb) print ptr
(gdb) print ptr[0]

etc. works without error.

Same with iovec/readv, ioctl, etc., any system call that takes
a pointer argument.

Thanks,
Pedro Alves