On Sat, 24 Oct 2009, nathan binkert wrote:
> I don't know the code super well, but I'd think it possible to process
> arguments in order without too much trouble.  Given the C calling
> convention, it would be extraordinarily odd to have a later argument
> define the semantics of an earlier one.

The problem is like this:

  int syscall_blah(int a, long long b);

  On x86 arg0=%ebx  arg1-low=%ecx  arg1-high=%edx
    So on x86 regs are consecutive like you'd expect

  On arm, arg0=%r0  arg1-low=%r2   arg1-high=%r3
    *note r1 was skipped because 64-bit value has to be passed in 
     even/odd register pair!*

But, if a function is as so:

  int syscall_blah2(int a, int b, long long c)

  Then there is no gap, because argument c naturally fits on
   an even/odd pair.

So it depends on whether you are a 32-bit architecture, whether that 
architecure places restrictions on how a 64-bit value is passed in 
registers, and then if there are an odd or even number of 32-bit
values passed before it.

It can get more complicated if there are multiple 64-bit values (the ARM 
kernel maintainers try to stop things like this from happening but 
somtimes syscalls slip through w/o them noticing).

It might be possible to come up with some elaborate way of handling this 
automatically, but I don't think it's worth the trouble if a few simple 
ifdefs will handle it.

>From a look at qemu, syscalls that have this problem, at least for ARM 
are only:
  truncate64
  ftruncate64
  pread
  pwrite
  readahead

I think m5 only supports the first two of those, and that's only within 
the past few days, which is why this problem hasn't shown up before.  And 
it's probably a small enough problem that a few ifdefs (while ugly) can 
deal with the problem.

Vince
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to