Re: [Fastboot] [PATCH]IA64 kexec/kdump patch for INIT

Luck, Tony
2006-09-07T16:38:47Z

On Thu, Sep 07, 2006 at 11:08:34AM +0200, Andreas Schwab wrote:
> Takao Indoh <indou.takao@jp.fujitsu.com> writes:
>
> > The disassemble code:
> > a000000100047080: 0b 38 01 02 00 24 [MMI] addl r39=0,r1;;
> > a000000100047086: 50 02 9c 00 42 00 mov r37=r39
> > a00000010004708c: 00 00 04 00 nop.i 0x0;;
> > a000000100047090: 0a 08 00 4a 00 21 [MMI] mov r1=r37;;
> > a000000100047096: c0 02 80 00 42 00 mov r44=r32
> > a00000010004709c: 00 00 04 00 nop.i 0x0
> > a0000001000470a0: 17 00 02 51 02 14 [BBB] br.call.sptk.many b0 000001000db4a0 <crash_kexec>
> >
> > This disassembled code does not change content of r1.
>
> It does:
>
> a000000100047090: 0a 08 00 4a 00 21 [MMI] mov r1=r37;;

But looking before that instruction r37 is a copy of r39 (mov r37=r39).
r39 was calculated by "addl r39=0,r1" i.e. r1+0, also known as "r1". So
this sequence just takes the original value from r1 and puts it into r1
(passing through two other registers along the way). Not only unhelpful,
but inefficient too :-)

Perhaps just make a tiny function:

GLOBAL_ENTRY(ia64_set_gp)
movl r1=__gp
br.ret.sptk.many b0
END(ia64_set_gp)

and put it in head.S to bypass this "cleverness" by gcc and
also avoid the need for inline asm.

-Tony

---
Yarn store opening in Sunnyvale, CA on Oct 14th. http://purlescenceyarns.com