[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gcl-devel] Re: mips64 assembler
From: |
Camm Maguire |
Subject: |
[Gcl-devel] Re: mips64 assembler |
Date: |
Fri, 15 Oct 2010 16:49:53 -0400 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) |
Greetings!
David Daney <address@hidden> writes:
> On 10/15/2010 10:11 AM, Camm Maguire wrote:
>> Greetings! What is wrong with this stub attempting a jump to contents
>> of register $t0?
>>
>> (gdb) p/x *(ul *)address@hidden
>> $3 = {0x3c080077, /*lui t0,0x77*/
>> 0x2508a170, /*addui t0,t0,0xa170*/
>> 0x8d08a288, /*lw t0,-23928(t0) */
>> 0x1000008 /* jr t0*/ }
>
> What instruction follows this JR? It will always be executed in the
> delay slot of the jump. If it causes an exception, like BREAK or an
> illegal instruction would, $pc will be left pointing at the JR so that
> it can retry the whole thing once the mess is cleaned up.
>
> David Daney
>
Thanks so much -- guessed this from an earlier post you sent shortly
before receiving this. Am now uploading gcl native relocation for
mips using a local got table for each loaded .o file. Looks solid on
gabrielli.
The idea is to write a little stub in the got table for entries
referring to e.g. _setjmp. In the stub I load the address from the
global table into t9 and jump. Presupposes running with LD_BIND_NOW,
as a pointer to the .MIPS.stub will not work as the gp register has
been reset. Wish I knew how to do this from within the C program
instead of having to rely on shell script wrappers.
I still overwrite GOT16/LO16 with HI16/LO16 on 32bit, as I am too lazy
at the moment to understand what the meaning of addends in the code:
lw t0,1(gp) R_MIPS_GOT16 /*add one page to the symbol address?*/
addiu t0,t0,xxxx R_MIPS_LO16 /*presumably this needs to push the carry*/
/*bit above like with HI*/
I'm guessing that any GOT16 needs a got entry for each symbol times
the highest addend used, on one loads addr,addr+4096,....
This snippet summarizes the reloc logic:
#define GOT_RELOC(r)
(ELF_R_TYPE(r->r_info)==R_MIPS_CALL16||ELF_R_TYPE(r->r_info)==R_MIPS_GOT16)
case R_MIPS_JALR:
break;
case R_MIPS_32:
add_val(where,~0L,s);
break;
case R_MIPS_GOT16:
case R_MIPS_CALL16:
if (!sym1[ELF_R_SYM(r->r_info)].st_shndx) { /*Better way to
separate GOT16
from GOT16/LO16? */
gote=got;
got+=sym1[ELF_R_SYM(r->r_info)].st_size-1;
*got=s;
store_val(where,MASK(16),(got-gote)*sizeof(*got));
if (s>=stub1 && s<stube)
massert(!write_stub(s,got));
break;
}
massert(ELF_R_TYPE(r->r_info)==R_MIPS_GOT16);
store_val(where,0xffe00000,0x3c000000);
r->r_info=ELF_R_INFO(ELF_R_SYM(r->r_info),R_MIPS_HI16);
case R_MIPS_HI16:
if (!s) s=gpd=(ul)got-(ul)where;
if (!hr) hr=r;
if (a) add_vals(where,MASK(16),(s>>16)+a);
break;
case R_MIPS_LO16:
if (!s) s=gpd;
a=*where&MASK(16);
if (a&0x8000) a|=0xffff0000;
a+=s&MASK(16);
a+=(a&0x8000)<<1;
store_val(where,MASK(16),a);
a=0x10000|(a>>16);
for (hr=hr ? hr : r;--r>=hr && ELF_R_TYPE(r->r_info)==R_MIPS_HI16;)
relocate(sym1,r,a,start,got,gote);
hr=NULL;gpd=0;
break;
Take care,
>>
>> (gdb) c
>> Program received signal SIGTRAP, Trace/breakpoint trap.
>> 0x01094148 in ?? () /*this is the jump instruction*/
>> (gdb) i reg t0
>> t0: 0x2ae13bf0 /*this is the correct address*/
>>
>> Any help most appreciated!
>>
>> Take care,
>>
>>
>> David Daney<address@hidden> writes:
>>
>>> On 09/22/2010 04:05 PM, David Daney wrote:
>>> [...]
>>>> [11] .init PROGBITS 10000458 000458 000078 00 AX 0 0 8
>>>> [12] .plt PROGBITS 100004e0 0004e0 000030 00 AX 0 0 32
>>>> [13] .text PROGBITS 10000510 000510 0002c0 00 AX 0 0 16
>>>> [14] .MIPS.stubs PROGBITS 100007d0 0007d0 000020 00 AX 0 0 4
>>>> [15] .fini PROGBITS 100007f0 0007f0 000048 00 AX 0 0 8
>>>> [16] .rodata PROGBITS 10000838 000838 000020 00 A 0 0 8
>>>> [17] .eh_frame PROGBITS 10000858 000858 000004 00 A 0 0 4
>>>> [18] .ctors PROGBITS 1001085c 00085c 000008 00 WA 0 0 4
>>> [...]
>>>>
>>>>
>>>> Look there, the PLT is section 17.
>>>>
>>>>
>>>
>>> Well really it is section 12. But what is a difference of 5 among friends?
>>>
>>> David Daney
>>>
>>>
>>>
>>>
>>>
>>
>
>
>
>
>
--
Camm Maguire address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens." -- Baha'u'llah
- [Gcl-devel] Re: mips64 assembler, Camm Maguire, 2010/10/15
- Message not available
- [Gcl-devel] Re: mips64 assembler,
Camm Maguire <=
- Message not available
- Message not available
- [Gcl-devel] recent SIGBUS/SIGSEGV mips kernel bug, Camm Maguire, 2010/10/20
- Message not available
- [Gcl-devel] Re: recent SIGBUS/SIGSEGV mips kernel bug, Camm Maguire, 2010/10/20
- Message not available
- [Gcl-devel] Re: recent SIGBUS/SIGSEGV mips kernel bug, Camm Maguire, 2010/10/21
- Message not available
- Message not available
- [Gcl-devel] Re: recent SIGBUS/SIGSEGV mips kernel bug, Camm Maguire, 2010/10/21
- Message not available
- Message not available
- [Gcl-devel] Re: recent SIGBUS/SIGSEGV mips kernel bug, Camm Maguire, 2010/10/25
- Message not available
- Message not available
- [Gcl-devel] gdb for mips64, Camm Maguire, 2010/10/25
- Message not available
- [Gcl-devel] Re: gdb for mips64, Camm Maguire, 2010/10/26
- Re: [Gcl-devel] Re: gdb for mips64, Camm Maguire, 2010/10/26
- Message not available
- Re: [Gcl-devel] Re: gdb for mips64, Camm Maguire, 2010/10/28