All of lore.kernel.org
 help / color / mirror / Atom feed
* x86_64 system call entry points
@ 2006-06-05 16:55 Martin Bisson
  2006-06-06  5:25 ` Andi Kleen
  2006-06-06  5:30 ` x86_64 system call entry points II Andi Kleen
  0 siblings, 2 replies; 6+ messages in thread
From: Martin Bisson @ 2006-06-05 16:55 UTC (permalink / raw)
  To: linux-kernel

Hi, (first post)

I am trying to trace system calls (entry + exit) on x86_64 architecture, 
so I am basically working on arch/x86_64/kernel/entry.S and 
arch/x86_64/ia32/ia32entry.S (for 32-bit compatibility).  I want to test 
that my code works for all possible ways to enter a system call, which 
are (to my knowledge) the three following instructions:
- int $0x80
- sysenter
- syscall

So these three ways in, used in a 32 or 64 bits executable, makes 6 
possible ways to enter a system call that I need to test.  However, I 
have problems:

- sysenter/32 bits, executed on a 32 bit machine: I get a segfault on 
the sysenter instruction.  I use the following code to enter the system 
call:
pid_t getpid32()
{
    pid_t resultvar;

    asm volatile (
    "push    %%ebp\n\t"
    "push    %%ecx\n\t"
    "push    %%edx\n\t"
    "mov     %%esp,%%ebp\n\t"
    "sysenter\n\t"
    ".space 20,0x90\n\t"
    "pop     %%edx\n\t"
    "pop     %%ecx\n\t"
    "pop     %%ebp\n\t"
    : "=a" (resultvar)   
    : "0" (__NR_getpid)
    : "memory");

    return resultvar;
}

Is there something wrong in the way I pass the parameters?  I know this 
instruction can be tricky because of the way it messes different 
registers...


- int $0x80/64 bits: All system calls return -1 (EINTR).  Is there 
something wrong in the way I call it:
pid_t getpid64()
{
    pid_t resultvar;

    asm volatile (
    "int $0x80\n\t"
    : "=a" (resultvar)   
    : "0" (__NR_getpid)
    : "memory");

    return resultvar;
}


- sysenter/64 bits: I get an illegal instruction.  I've read that it's 
not implemented on AMD-64 (which is what I have).  Is there ANY x86_64 
machine on which this instruction is implemented?  Does this mean that 
the code that handles this case in entry.S has never been run?

- syscall/64 bits: works fine
- int $0x80/32 bits: works fine
- syscall/32 bits: illegal instruction, but I guess that's all right 
because of the machine I use.

Can someone help with any of my issues (entering a system call with 
sysenter/32 bits, int $0x80/64 bits or sysenter/64 bits)?

Thanks in advance,

Mart

P.S.  First post on this list, please reply in private if I did 
something wrong so that I won't do it again.

^ permalink raw reply	[flat|nested] 6+ messages in thread
* Re: x86_64 system call entry points
@ 2006-06-06  4:13 Chuck Ebbert
  0 siblings, 0 replies; 6+ messages in thread
From: Chuck Ebbert @ 2006-06-06  4:13 UTC (permalink / raw)
  To: Martin Bisson; +Cc: linux-kernel

In-Reply-To: <44846210.4080602@discreet.com>

On Mon, 05 Jun 2006 12:55:44 -0400, Martin Bisson wrote:

> - sysenter/32 bits, executed on a 32 bit machine: I get a segfault on 
> the sysenter instruction.  I use the following code to enter the system 
> call:
> pid_t getpid32()
> {
>     pid_t resultvar;
> 
>     asm volatile (
>     "push    %%ebp\n\t"
>     "push    %%ecx\n\t"
>     "push    %%edx\n\t"
>     "mov     %%esp,%%ebp\n\t"
>     "sysenter\n\t"
>     ".space 20,0x90\n\t"
>     "pop     %%edx\n\t"
>     "pop     %%ecx\n\t"
>     "pop     %%ebp\n\t"
>     : "=a" (resultvar)   
>     : "0" (__NR_getpid)
>     : "memory");
> 
>     return resultvar;
> }

sysenter always returns to a fixed address (in the vdso) no matter
where you invoke it from.

-- 
Chuck


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2006-06-06 13:34 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-05 16:55 x86_64 system call entry points Martin Bisson
2006-06-06  5:25 ` Andi Kleen
2006-06-06  5:30 ` x86_64 system call entry points II Andi Kleen
2006-06-06 13:25   ` Martin Bisson
2006-06-06 13:34     ` Andi Kleen
  -- strict thread matches above, loose matches on Subject: below --
2006-06-06  4:13 x86_64 system call entry points Chuck Ebbert

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.