<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:΢ÈíÑźÚ
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Hi:<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; the &nbsp;SWI is used for&nbsp;system APIs such&nbsp;as open, read, write. user mode applications call system APIs via SWI, which will change ARM&nbsp;mode from USER to SVC.<BR>&nbsp;&nbsp;&nbsp;&nbsp; so when vector_swi is called, Linux will do as below:<BR>&nbsp;&nbsp;&nbsp;&nbsp; 1. store r0~r12, these registers are universal for&nbsp;USR mode SVC mode.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. store r13 and r14 of USER mode.&nbsp;Note, SWI is triggered from&nbsp;USER mode, so here Linux store USER mode's r13 and r14, rather than SVC's.<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; for your two questions:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 1. the ^ means to get USER mode registers, rather than current mode.<br>&nbsp;&nbsp;&nbsp;&nbsp; 2. no matter how you arrange registers in opcode {}, stmdb will always push lr first, then sp. so after line 348, the stack view is as below:<BR>lr_usr<BR>sp_usr<BR>r12<BR>...<BR>r0<BR>&nbsp;<BR>&nbsp;<BR><div><div id="SkyDrivePlaceholder"></div>&gt; Date: Thu, 16 Feb 2012 19:35:17 -0700<br>&gt; Subject: Re: arm assembly doubt<br>&gt; From: subingangadharan@gmail.com<br>&gt; To: suren@gatech.edu<br>&gt; CC: kernelnewbies@kernelnewbies.org<br>&gt; <br>&gt; Thanks for the answer. Actually this is what I am trying to understand.<br>&gt; <br>&gt; ENTRY(vector_swi)<br>&gt; 345         sub     sp, sp, #S_FRAME_SIZE<br>&gt; 346         stmia   sp, {r0 - r12}                  @ Calling r0 - r12<br>&gt; 347  ARM(   add     r8, sp, #S_PC           )<br>&gt; 348  ARM(   stmdb   r8, {sp, lr}^           )       @ Calling sp, lr<br>&gt; 349  THUMB( mov     r8, sp                  )<br>&gt; 350  THUMB( store_user_sp_lr r8, r10, S_SP  )       @ calling sp, lr<br>&gt; 351         mrs     r8, spsr                        @ called from<br>&gt; non-FIQ mode, so ok.<br>&gt; 352         str     lr, [sp, #S_PC]                 @ Save calling PC<br>&gt; 353         str     r8, [sp, #S_PSR]                @ Save CPSR<br>&gt; 354         str     r0, [sp, #S_OLD_R0]<br>&gt; <br>&gt; In this case after the line number 348(if its in arm mode),will the<br>&gt; kernel stack have the contents<br>&gt; r0-r12,sp,lr in this order or r0-r12,lr,sp this one. Beccause I<br>&gt; believe stmdb r8, {sp, lr}^ will push the sp first then lr. In that<br>&gt; case sp and lr will be interchanged in struct pt_regs.<br>&gt; <br>&gt; Please correct me if I am wrong.<br>&gt; <br>&gt; <br>&gt; <br>&gt; <br>&gt; <br>&gt; On Wed, Feb 15, 2012 at 9:34 PM, Surenkumar Nihalani &lt;suren@gatech.edu&gt; wrote:<br>&gt; &gt; Hi,<br>&gt; &gt; On Feb 15, 2012, at 11:30 PM, subin gangadharan wrote:<br>&gt; &gt;<br>&gt; &gt;&gt; Hi ,<br>&gt; &gt;&gt;<br>&gt; &gt;&gt; I am trying to understand how system call is implmented in linux for<br>&gt; &gt;&gt; arm.And I am not that familiar with arm assembly.<br>&gt; &gt;&gt;<br>&gt; &gt;&gt; Could any body please help me to understand what exactly this ^ does<br>&gt; &gt;&gt; in this instruction stmdb r8,{sp,lr}^<br>&gt; &gt;&gt;<br>&gt; &gt;&gt; --<br>&gt; &gt;&gt; With Regards<br>&gt; &gt;&gt; Subin Gangadharan<br>&gt; &gt;&gt;<br>&gt; &gt;&gt; I am not afraid and I am also not afraid of being afraid.<br>&gt; &gt;&gt;<br>&gt; &gt;&gt; _______________________________________________<br>&gt; &gt;&gt; Kernelnewbies mailing list<br>&gt; &gt;&gt; Kernelnewbies@kernelnewbies.org<br>&gt; &gt;&gt; http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies<br>&gt; &gt;<br>&gt; &gt; Example:<br>&gt; &gt; &nbsp; &nbsp; &nbsp; &nbsp;LDFMD sp!, {r0-r12, pc}^<br>&gt; &gt; - The ^ qualifier specifies that the CPSR is restored from the SPSR.<br>&gt; &gt; &nbsp; It must be used only from a privileged mode.<br>&gt; &gt;<br>&gt; <br>&gt; <br>&gt; <br>&gt; -- <br>&gt; With Regards<br>&gt; Subin Gangadharan<br>&gt; <br>&gt; I am not afraid and I am also not afraid of being afraid.<br>&gt; <br>&gt; _______________________________________________<br>&gt; Kernelnewbies mailing list<br>&gt; Kernelnewbies@kernelnewbies.org<br>&gt; http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies<br></div>                                               </div></body>
</html>