public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* __asm__
@ 2001-05-23  6:54 Blesson Paul
  2001-05-23  7:38 ` __asm__ David Howells
  0 siblings, 1 reply; 2+ messages in thread
From: Blesson Paul @ 2001-05-23  6:54 UTC (permalink / raw)
  To: linux-kernel

Hi
              I  am comfronting with a macro __asm__ . What is the meaning of
this. I cannot find the definition of this. I need the meaning of this line
 __asm__("and	1 %%esp.%0; ":"=r" (current) : "0" (~8191UL));

                       This is defined inside the get_current()	in current.h
Thanks in advance
                           by
                                     Blesson
          


____________________________________________________________________
Get free email and a permanent address at http://www.netaddress.com/?N=1

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

* Re: __asm__
  2001-05-23  6:54 __asm__ Blesson Paul
@ 2001-05-23  7:38 ` David Howells
  0 siblings, 0 replies; 2+ messages in thread
From: David Howells @ 2001-05-23  7:38 UTC (permalink / raw)
  To: Blesson Paul; +Cc: linux-kernel

> __asm__("and	1 %%esp.%0; ":"=r" (current) : "0" (~8191UL));

This doesn't look right... Where did you get this from.

Taking the one in include/asm-i386/current.h as an example:

| __asm__(

This signifies a piece of inline assembly that the compiler must insert into
it's output code. The __asm__ is the same as asm, but can't be disabled by
command line flags.

| "andl %%esp,%0

"%%" is a macro that expands to a "%".
"%0" is a macro that expands to the first input/output specification.

So in this case, it takes the stack pointer (register %esp) and ANDs it
into a register that contains 0xFFFFE000, leaving the result in that register.

Basically, the a task's task_struct and a task's kernel stack occupy an 8KB
block that is 8KB aligned, with the task_struct at the beginning and the stack
growing from the end downwards. So you can find the task_struct by clearing
the bottom 13 bits of the stack pointer value.

| ; "

The semicolon can be used to separate assembly statements, as can the newline
character escape sequence ("\n").

| :"=r" (current)

This specifies an output constraint (all of which occur after the first colon,
but before the second). The '=' also specifies that this is an output. The 'r'
indicates that a general purpose register should be allocated such that the
instruction can place the output value into it. The bit inside the brackets -
'current' - is the intended destination of the output value (normally a local
variable) once the C part is returned to.

| : "0" (~8191UL));

This specifies an input constraint (all of which occur after the second colon,
but before the third). The '0' references another constraint (in this case,
the first output constraint), saying that the same register or memory location
should be used for both. The '~8191UL' inside the brackets is a constant that
should be loaded into the register allocated for the output value before using
the instructions inside the asm block.

See also the gcc info pages, Topic "C Extensions", subtopic "Extended Asm".

David

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

end of thread, other threads:[~2001-05-23  7:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-05-23  6:54 __asm__ Blesson Paul
2001-05-23  7:38 ` __asm__ David Howells

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox