This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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, i386]: FIX PR 52698, reload failure with complex address


On Tue, Mar 27, 2012 at 8:34 PM, H.J. Lu <hjl.tools@gmail.com> wrote:

> %fs and %gs are special in 64bit mode. ?For a memory operand
> "%fs:address", its effective address is base address of %fs + address.
> The base address of %fs and %fs are hidden. "mov %fs, %eax"
> will only access the visible part of %fs, which is the 16bit segment
> selector. ?In 64bit mode, UNSPEC_TP is the base address of %fs.
> To access the base address of %fs, we can use system call:
>
> ? ? ? ?int arch_prctl(int code, unsigned long addr);
> ? ? ? ?int arch_prctl(int code, unsigned long *addr);
>
> ? ? ? ARCH_SET_FS
> ? ? ? ? ? ? ?Set the 64-bit base for the FS register to addr.
>
> ? ? ? ARCH_GET_FS
> ? ? ? ? ? ? ?Return the 64-bit base value for the FS register of the
> ? ? ? ? ? ? ?current thread in the unsigned long pointed to by addr.
>
> BTW, 4 new instructions are added to read/write base address of
> %fs/%gs directly. ?For now, we have to use the system call to
> update base address of %fs, ?To read the base address of %fs,
> OS arranges that the base address of %fs points to a struct:
>
> typedef struct
> {
> ?void *tcb; ? ? ? ? ? ?/* Pointer to the TCB. ?Not necessarily the
> ? ? ? ? ? ? ? ? ? ? ? ? ? thread descriptor used by libpthread. ?*/
> ?...
> }
>
> and sets up tcb == the base address of %fs. Then we can use
>
> "mov{l}\t{%%fs:0, %k0|%k0, DWORD PTR fs:0}"
>
> to move the base address of %fs into %r32 and %r64 directly.
> I hope this answers your questions.

Let me say this way: please propose the patch that implements your
suggestions. I will leave the approval of the patch to someone else.

Uros.


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