linux-mips
[Top] [All Lists]

Re: Relocation problem with MIPS kernel modules

To: David VomLehn <dvomlehn@cisco.com>
Subject: Re: Relocation problem with MIPS kernel modules
From: Ralf Baechle <ralf@linux-mips.org>
Date: Tue, 4 Aug 2009 00:55:36 +0100
Cc: David Daney <ddaney@caviumnetworks.com>, GCC Help Mailing List <gcc-help@gcc.gnu.org>, Linux MIPS Mailing List <linux-mips@linux-mips.org>
In-reply-to: <20090803201521.GA24691@cuplxvomd02.corp.sa.net>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20090730184923.GA27030@cuplxvomd02.corp.sa.net> <20090803092030.GB30431@linux-mips.org> <4A773B85.6010004@caviumnetworks.com> <20090803201521.GA24691@cuplxvomd02.corp.sa.net>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.5.18 (2008-05-17)
On Mon, Aug 03, 2009 at 01:15:21PM -0700, David VomLehn wrote:

> > Actually I think it is the opposite:
> >
> > RELOCATION RECORDS FOR [.text]:
> > OFFSET   TYPE              VALUE
> > 00000000 R_MIPS_HI16       .bss+0x00000004
> > 00000008 R_MIPS_LO16       .bss+0x00000004
> > 00000014 R_MIPS_LO16       .bss+0x00000004
> >
> > We load the hi16 value into a register and then use multiple lo16  
> > offsets for the follow loads and stores to the same location.  On a  
> > read-modify-write we only want to load the base address one time.
> 
> This particular case is covered by the old MIPS Processor psABI:
> 
>       R_MIPS_LO16 entries without an R_MIPS_HI16 entry immediately preceding
>       are orphaned and the previously defined R_MIPS_HI16 is used for
>       computing the addend.
> 
> The code in module.c looks like it implements the extension to which Ralf
> refers.

Which is useful for for branch delay slot scheduling like:

        ...
        j       1f
        lui     a0, %hi16(hello)
        ...
        j       1f
        lui     a0, %hi16(hello)
        ...
1:      jal     printf
        addiu   a0, %lo16(hello)

hello:  .asciz  "hello, hola\n"

The next and logical extension would be to permit multiple R_MIPS_LO16
records following a sequence of one or more R_MIPS_HI16 relocs as long as
all relate to the same symbol - which would be simple to support in the
kernel.

  Ralf

<Prev in Thread] Current Thread [Next in Thread>