What is asmlinkage ?

Peter Teoh htmldeveloper at gmail.com
Thu Jan 10 22:13:56 EST 2013


asmlinkage is defined for almost all arch:

grep asmlinkage arch/arm/*/* and u got the answer.

It seemed that:

 http://kernelnewbies.org/FAQ/asmlinkage

gave the impression that asmlinkage is only for system call, or associated
with it.   Not really, nothing to do with system call actually.

Even though majority (or ALL) of syscall are defined with asmlinkage, but
there are many that are not, eg, in arch/arm subdirectory:

kernel/irq.c:asmlinkage void __exception_irq_entry
kernel/process.c:asmlinkage void ret_from_fork(void)
__asm__("ret_from_fork");
kernel/smp.c:asmlinkage void __cpuinit secondary_start_kernel(void)
kernel/smp.c:asmlinkage void __exception_irq_entry do_IPI(int ipinr, struct
pt_regs *regs)

just a few examples.   Essentially, it is just declared so that the name,
for example, "do_IPI" can be called from assembly, for example in the
following pair (arch/arm assumed):

/kernel/smp.c:
asmlinkage void __exception_irq_entry do_IPI(int ipinr, struct pt_regs
*regs)

./include/asm/entry-macro-multi.S:
bne do_IPI

More info:

http://stackoverflow.com/questions/10060168/is-asmlinkage-required-for-a-c-function-to-be-called-from-assembly

>From above, asmlinkage is also NOT the only way......


On Fri, Jan 4, 2013 at 6:29 PM, anish singh <anish198519851985 at gmail.com>wrote:

> On Fri, Jan 4, 2013 at 3:41 PM, Rajat Sharma <fs.rajat at gmail.com> wrote:
> >> Is this correct for all architectures?
> >
> > I guess not, asmlinkage is undefined for arm, so I assume this mechanism
> is
> > not there for arm.
> then how do they do it?
> >
> >
> >
> > On Fri, Jan 4, 2013 at 2:24 PM, 卜弋天 <buyit at live.cn> wrote:
> >>
> >>
> >>
> >> 在 2013-1-4,15:38,"Rajat Sharma" <fs.rajat at gmail.com> 写道:
> >>
> >> > So with asmlinkage we request compiler to put args on stack. What is
> >> > advantage of this to start_kernel or in general to other functions ?
> >>
> >> See its about implementation ease and little of performance too.
> Assuming
> >> the default model of keeping arguments in registers is used. lets say
> >> arguments are assumed to be in registers R1, R2, R3, R4, R5, R6 and
> beyond
> >> that in stack. Since system call number is a transparent argument which
> is
> >> chopped off when calling the actual kernel handler and if R1 had the
> system
> >> call number, then you have to shift all register values and stack
> arguments
> >> too.
> >>
> >>    Is this correct for all architectures?
> >>
> >>    As I remembered, ARM uses SWI instruction to implement the system
> call,
> >> it will pass system call number by register R7, and use normal register
> >> R0~R3 to pass parameters.
> >>
> >>
> >>
> >> Now consider that all arguments are pushed on stack (as enforced by
> >> asmlinkage), you have all function argument in the beginning of the
> stack
> >> and the system call number on top of the stack. you just need to pop out
> >> stack top to remove system call number from function argument.
> >>
> >> You might argue that why not always keep system call number on stack top
> >> and use registers for function arguments? But thats part of the
> compiler ABI
> >> and if you had fewer arguments lets say 2 only and used up R1 and R2
> only,
> >> you may not jump to stack top directly for storing system call as its
> turn
> >> for R3 as argument.
> >>
> >> So, isn't it simpler implementation with everything on stack?
> >>
> >> -Rajat
> >>
> >>
> >> On Fri, Jan 4, 2013 at 12:13 PM, Rahul Bedarkar <rpal143 at gmail.com>
> wrote:
> >>>
> >>> Thanks. So with asmlinkage we request compiler to put args on stack.
> What
> >>> is advantage of this to start_kernel or in general to other functions ?
> >>>
> >>> Regards,
> >>> Rahul
> >>>
> >>>
> >>> On Thu, Jan 3, 2013 at 9:34 PM, Mulyadi Santosa
> >>> <mulyadi.santosa at gmail.com> wrote:
> >>>>
> >>>> On Thu, Jan 3, 2013 at 7:40 PM, Rahul Bedarkar <rpal143 at gmail.com>
> >>>> wrote:
> >>>> > Hi,
> >>>> >
> >>>> > I was searching for asmlinkage and found that it is already
> explained
> >>>> > at
> >>>> > http://kernelnewbies.org/FAQ/asmlinkage
> >>>> >
> >>>> > But I didn't get this. Can someone tell me about it in brief ?
> >>>>
> >>>> the point is, parameters which is usually passed via stack, is passed
> >>>> using different way.
> >>>>
> >>>> A good example is system call.... they are passed using registers IIRC
> >>>>
> >>>>
> >>>> --
> >>>> regards,
> >>>>
> >>>> Mulyadi Santosa
> >>>> Freelance Linux trainer and consultant
> >>>>
> >>>> blog: the-hydra.blogspot.com
> >>>> training: mulyaditraining.blogspot.com
> >>>
> >>>
> >>>
> >>> _______________________________________________
> >>> Kernelnewbies mailing list
> >>> Kernelnewbies at kernelnewbies.org
> >>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
> >>>
> >>
> >> _______________________________________________
> >> Kernelnewbies mailing list
> >> Kernelnewbies at kernelnewbies.org
> >> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
> >
> >
> >
> > _______________________________________________
> > Kernelnewbies mailing list
> > Kernelnewbies at kernelnewbies.org
> > http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
> >
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>



-- 
Regards,
Peter Teoh
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20130111/f738cfa1/attachment-0001.html 


More information about the Kernelnewbies mailing list