All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Dearman <chris@mips.com>
To: Harald Krapfenbauer <krapfenbauer@ict.tuwien.ac.at>
Cc: "linux-mips@linux-mips.org" <linux-mips@linux-mips.org>
Subject: Re: function call on MIPS (newbie question)
Date: Tue, 24 Jun 2008 10:48:17 -0700	[thread overview]
Message-ID: <48613361.3090608@mips.com> (raw)
In-Reply-To: <4860C9FD.60103@ict.tuwien.ac.at>

Harald Krapfenbauer wrote:
> Hi!
> 
> I'm a newbie to the MIPS architecture and I want to port some program to
> MIPS.
> I must call a function within the .text segment with 2 simple
> parameters. So I figured out the following code which
> *) loads arg1 into register $4
> *) loads arg2 into register $5
> *) loads the address into $15
> *) executes a jalr
> *) breaks afterwards
> 
> 
> 	*((guint32 *)(code)) = ((method_argument1 >> 16) & 0xffff) |
> 0x3c040000;    /* arg 1 upper half word */
> 	*((guint32 *)(code+4)) = (method_argument1 & 0xffff) | 0x24040000;
>      /* arg 1 lower half word */
> 	*((guint32 *)(code+8)) = ((method_argument2 >> 16) & 0xffff) |
> 0x3c050000;  /* arg 2 upper half word */
> 	*((guint32 *)(code+12)) = (method_argument2 & 0xffff) | 0x24050000;
>      /* arg 2 lower half word */
> 	*((guint32 *)(code+16)) = ((method_address >> 16) & 0xffff) |
> 0x3c0f0000;   /* address upper half word */
> 	*((guint32 *)(code+20)) = (method_address & 0xffff) | 0x240f0000;
>      /* address lower half word */
> 	*((guint32 *)(code+24)) = 0x01e0f809;
>      /* jalr */
> 	*((guint32 *)(code+28)) = 0x0;
>      /* branch delay slot */
> 	edit *((guint32 *)(code+32)) = 0x0d;
>      /* breakpoint */
> 
> 
> 
> The code is written to the stack, the SP and the PC are then set to the
> beginning of the code on the stack.
> 
> Something must be going wrong because after the program stops again, the
> PC is 0xffffcb38 (The method address is 0x53cb38) and my program
> receives signal 10.
> 
> Did I miss something or is my code wrong?
> Any help appreciated!

The code you generate for the function address is
3C0F0053  lui         t7,0x53
240FCB38  addiu       t7,zero,-13512

   There are 2 problems here... the second instruction should be "addiu 
t7,t7,-13512" and addiu sign-extends the immediate value so you have to 
deal with this by adjusting the lui if bit 15 of the address is set. 
It's simpler to use ori which does not sign-extend the immediate value:

3C0F0053  lui         t7,0x53
35EFEB37  ori         t7,t7,0xeb37

   You will need to modify the instructions that load a0 and a1 in the 
same way.

   The next issue will be cache maintenance which you have to do 
explicitly. Most MIPS CPUs use writeback caches, so you need to flush 
this data from the dcache into memory and then invalidate the icache to 
make sure the CPU does not execute stale data. MIPS32 processors support 
synci to accomplish this.  If the processor you're using doesn't have 
synci, there is a cachectl syscall which does the required cache 
writeback/invalidation

   One final point is calling conventions. If you are calling other JIT 
code you will know what assumptions it makes about register/stack usage, 
but if you are calling normal code (eg a library function) then you have 
to use the normal calling conventions.  The caller is required to 
allocate 4 words at $sp where the callee can store $a0..$a3. PIC code 
requires that the call is made using "jalr $t9" etc.

If you're new to the MIPS world I'd strongly recommend "See MIPS Run 
Linux" by Dominic Sweetman which covers a lot of this stuff and is very 
readable.

Chris

-- 
Chris Dearman                 Desk:+1 650 567 5092  Cell:+1 650 224 8603
MIPS Technologies Inc         1225 Charleston Rd, Mountain View CA 94043

  parent reply	other threads:[~2008-06-24 17:48 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-24 10:18 function call on MIPS (newbie question) Harald Krapfenbauer
2008-06-24 17:45 ` David VomLehn
2008-06-24 17:48 ` Chris Dearman [this message]
2008-06-27 10:00   ` Harald Krapfenbauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48613361.3090608@mips.com \
    --to=chris@mips.com \
    --cc=krapfenbauer@ict.tuwien.ac.at \
    --cc=linux-mips@linux-mips.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.