<div dir="ltr"><div>Hi, <br><br></div>while in the pursuit of learning to understand assembly ..<br><div><div>This is my doubt ..Please help to understand<br></div><div><br></div><div><u><b>I want to catch where in this disassembly call is made to get_sb function.</b></u><br>

</div><div><br>Somehow in this disassembly, i m not finding, a direct <u><b>call</b></u> instruction, with function name, written in english.<br></div><div>Hence, i m trying to interpret assembly and correlate with source code in C line by line.<br>

<br></div><div>I have written my understanding in comments herewith assembly ..Kindly help to correct<br></div><div>--------------------------------------------------------------------------------------------------------------------------------------------------<br>

crash&gt; dis vfs_kern_mount<br><span style="color:rgb(255,153,0)">0xffffffff81183880 &lt;vfs_kern_mount&gt;:    push   %rbp<br>0xffffffff81183881 &lt;vfs_kern_mount+1&gt;:  mov    %rsp,%rbp<br>0xffffffff81183884 &lt;vfs_kern_mount+4&gt;:  sub    $0x40,%rsp<br>

0xffffffff81183888 &lt;vfs_kern_mount+8&gt;:  mov    %rbx,-0x28(%rbp)<br>0xffffffff8118388c &lt;vfs_kern_mount+12&gt;: mov    %r12,-0x20(%rbp)<br>0xffffffff81183890 &lt;vfs_kern_mount+16&gt;: mov    %r13,-0x18(%rbp)<br>0xffffffff81183894 &lt;vfs_kern_mount+20&gt;: mov    %r14,-0x10(%rbp)<br>

0xffffffff81183898 &lt;vfs_kern_mount+24&gt;: mov    %r15,-0x8(%rbp)<br>0xffffffff8118389c &lt;vfs_kern_mount+28&gt;: nopl   0x0(%rax,%rax,1)<br>0xffffffff811838a1 &lt;vfs_kern_mount+33&gt;: mov    $0xffffffffffffffed,%rbx<br>

0xffffffff811838a8 &lt;vfs_kern_mount+40&gt;: test   %rdi,%rdi<br>0xffffffff811838ab &lt;vfs_kern_mount+43&gt;: mov    %rdi,%r12<br>0xffffffff811838ae &lt;vfs_kern_mount+46&gt;: mov    %esi,%r13d<br>0xffffffff811838b1 &lt;vfs_kern_mount+49&gt;: mov    %rdx,%r14<br>

0xffffffff811838b4 &lt;vfs_kern_mount+52&gt;: je     0xffffffff8118395b &lt;vfs_kern_mount+219&gt;<br>0xffffffff811838ba &lt;vfs_kern_mount+58&gt;: mov    %rdx,%rdi<br>0xffffffff811838bd &lt;vfs_kern_mount+61&gt;: mov    %rcx,-0x38(%rbp)</span><br>

</div><div>&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;IGNORING THE ABOVE TEXT FOR NOW&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>

</div><div><br>0xffffffff811838c1 &lt;vfs_kern_mount+65&gt;: callq  0xffffffff811a1f60 &lt;<u><b><font size="4">alloc_vfsmnt</font>&gt;</b></u>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>

<br>0xffffffff811838c6 &lt;vfs_kern_mount+70&gt;: test   %rax,%rax<b><span style="color:rgb(255,0,255)"><span style="background-color:rgb(243,243,243)">&gt;&gt;&gt;should contain mnt </span></span></b><br>0xffffffff811838c9 &lt;vfs_kern_mount+73&gt;: mov    %rax,%rbx<br>

0xffffffff811838cc &lt;vfs_kern_mount+76&gt;: mov    -0x38(%rbp),%rcx<br>0xffffffff811838d0 &lt;vfs_kern_mount+80&gt;: je     0xffffffff811839f0 &lt;vfs_kern_mount+368<b><span style="color:rgb(255,0,255)">&gt;&gt;&gt;&gt;&gt;&gt;goto out, if rax is 0 </span></b><br>

<br>0xffffffff811838d6 &lt;vfs_kern_mount+86&gt;: test   %rcx,%rcx&gt;&gt;&gt;&gt;if data is false = 0 <br>0xffffffff811838d9 &lt;vfs_kern_mount+89&gt;: je     0xffffffff811838e7 &lt;vfs_kern_mount+103<b><span style="color:rgb(255,0,255)">&gt;&gt;&gt;&gt;&gt;&gt;type-&gt;get_sb()</span></b><br>

<br>0xffffffff811838db &lt;vfs_kern_mount+91&gt;: testb  $0x2,0x8(%r12)&gt;&gt;&gt;r12 contains type<br>0xffffffff811838e1 &lt;vfs_kern_mount+97&gt;: je     0xffffffff811839b8 &lt;vfs_kern_mount+312<b><span style="color:rgb(255,0,255)">&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;alloc_secdata</span></b><br>

<br>0xffffffff811838e7 &lt;vfs_kern_mount+103&gt;:        xor    %r15d,%r15d<br>0xffffffff811838ea &lt;vfs_kern_mount+106&gt;:        mov    %rbx,%r8<br>0xffffffff811838ed &lt;vfs_kern_mount+109&gt;:        mov    %r14,%rdx<br>

0xffffffff811838f0 &lt;vfs_kern_mount+112&gt;:        mov    %r13d,%esi<br>0xffffffff811838f3 &lt;vfs_kern_mount+115&gt;:        mov    %r12,%rdi<br>0xffffffff811838f6 &lt;vfs_kern_mount+118&gt;:        callq  *0x10(%r12)<b><span style="color:rgb(255,0,255)">&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;security_sb_copy_data</span><br>

</b><br>0xffffffff811838fb &lt;vfs_kern_mount+123&gt;:        test   %eax,%eax<br>0xffffffff811838fd &lt;vfs_kern_mount+125&gt;:        js     0xffffffff81183990 &lt;vfs_kern_mount+272<b><span style="color:rgb(255,0,255)">&gt;&gt;&gt;&gt;&gt;&gt;&gt;goto out_free_secdata </span></b><br>

0xffffffff81183903 &lt;vfs_kern_mount+131&gt;:        mov    0x28(%rbx),%rax<br>0xffffffff81183907 &lt;vfs_kern_mount+135&gt;:        test   %rax,%rax<br>0xffffffff8118390a &lt;vfs_kern_mount+138&gt;:        je     0xffffffff811839fc &lt;vfs_kern_mount+380<b><span style="color:rgb(255,0,255)">&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; get_sb</span></b><br>

0xffffffff81183910 &lt;vfs_kern_mount+144&gt;:        orq    $0x20000000,0x58(%rax)<br>0xffffffff81183918 &lt;vfs_kern_mount+152&gt;:        mov    %r15,%rdx<br>0xffffffff8118391b &lt;vfs_kern_mount+155&gt;:        mov    %r13d,%esi<br>

0xffffffff8118391e &lt;vfs_kern_mount+158&gt;:        mov    0x28(%rbx),%rdi<br>0xffffffff81183922 &lt;vfs_kern_mount+162&gt;:        callq  0xffffffff8121b9b0 &lt;<font size="4"><b>security_sb_kern_mount&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</b></font><br>

</div><div><br><br>&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;IGNORING THE BELOW TEXT TOO&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br></div><div><span style="color:rgb(255,153,0)">0xffffffff81183927 &lt;vfs_kern_mount+167&gt;:        test   %eax,%eax<br>

0xffffffff81183929 &lt;vfs_kern_mount+169&gt;:        jne    0xffffffff81183978 &lt;vfs_kern_mount+248&gt;<br>0xffffffff8118392b &lt;vfs_kern_mount+171&gt;:        mov    0x28(%rbx),%rdi<br>0xffffffff8118392f &lt;vfs_kern_mount+175&gt;:        mov    0x28(%rdi),%r8<br>

0xffffffff81183933 &lt;vfs_kern_mount+179&gt;:        test   %r8,%r8<br>0xffffffff81183936 &lt;vfs_kern_mount+182&gt;:        js     0xffffffff81183a02 &lt;vfs_kern_mount+386&gt;<br>0xffffffff8118393c &lt;vfs_kern_mount+188&gt;:        mov    0x20(%rbx),%rax<br>

0xffffffff81183940 &lt;vfs_kern_mount+192&gt;:        add    $0x70,%rdi<br>0xffffffff81183944 &lt;vfs_kern_mount+196&gt;:        mov    %rbx,0x10(%rbx)<br>0xffffffff81183948 &lt;vfs_kern_mount+200&gt;:        mov    %rax,0x18(%rbx)<br>

0xffffffff8118394c &lt;vfs_kern_mount+204&gt;:        callq  0xffffffff8109c1a0 &lt;up_write&gt;<br>0xffffffff81183951 &lt;vfs_kern_mount+209&gt;:        xor    %esi,%esi<br>0xffffffff81183953 &lt;vfs_kern_mount+211&gt;:        mov    %r15,%rdi<br>

0xffffffff81183956 &lt;vfs_kern_mount+214&gt;:        callq  0xffffffff8112c820 &lt;free_pages&gt;</span><br><br></div><div><br><br><u><b>Thats the definition of function</b></u><br></div><div><br>vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)<br>

{<br>        struct vfsmount *mnt;<br>        char *secdata = NULL;<br>        int error;<br><br>        if (!type)<br>                return ERR_PTR(-ENODEV);<br><br>        error = -ENOMEM;<br><br>    <font size="4"><b>  mnt = alloc_vfsmnt(name);</b></font><br>

        if (!mnt)<br>                goto out;<br><br></div><div><b>&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;THIS PORTION, IS   NOT  VISIBLE  TO ME, </b><b><b>IN  ASSEMBLY   </b>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</b><br>

</div><div>       <span style="color:rgb(255,0,0)"> if (data &amp;&amp; !(type-&gt;fs_flags &amp; FS_BINARY_MOUNTDATA)) {<br>                secdata = alloc_secdata();<br>                if (!secdata)<br>                        goto out_mnt;<br>

<br>                error = security_sb_copy_data(data, secdata);<br>                if (error)<br>                        goto out_free_secdata;<br>        }</span><br>        <br><b>   error = type-&gt;get_sb(type, flags, name, data, mnt);&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;thats the line i want to catch, in assembly above. Where is this call  made in assembly ???</b><br>

        if (error &lt; 0)<br>                goto out_free_secdata;<br>        BUG_ON(!mnt-&gt;mnt_sb);<br>        mnt-&gt;mnt_sb-&gt;s_flags |= MS_BORN;<br>        <br>    <font size="4"><b>    error = security_sb_kern_mount(mnt-&gt;mnt_sb, flags, secdata);</b></font><br>

        if (error)<br>                goto out_sb;<br>.<br>.<span style="color:rgb(255,153,0)">      </span><br>.<br>.<br>.<br><b>out_sb:</b><br>        dput(mnt-&gt;mnt_root);<br>        deactivate_locked_super(mnt-&gt;mnt_sb);<br>

<b>out_free_secdata</b>:<br>        free_secdata(secdata);<br><b>out_mnt:</b><br>        free_vfsmnt(mnt);<br><b>out:</b>   &gt;&gt;&gt;368<br>        return ERR_PTR(error);<br>}<br><br><br>          <br><br><br><br></div>

</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Aug 14, 2013 at 5:05 PM,  <span dir="ltr">&lt;<a href="mailto:Valdis.Kletnieks@vt.edu" target="_blank">Valdis.Kletnieks@vt.edu</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Wed, 14 Aug 2013 16:14:34 +0530, nidhi mittal hada said:<br>
<br>
&gt; 1)if i want to get value of a local variable, of a function,  from stack<br>
&gt; trace thats bt-f output, obtained using crash ..<br>
&gt; No where AMD64 ABI mentions how local variables are stored ..<br>
&gt; is it in some specific sequence of registers ? is it in stack ?<br>
<br>
</div>Yes, no, maybe, depends on how smart the compiler is.  Local variables<br>
are local, and thus by definition not part of the ABI.  The compiler<br>
may decide that a given &#39;int&#39; can be kept in %r8 for most of the<br>
time, but stored at 24 bytes into the stack across 1 function call,<br>
and another variable is in %r9 most of the time, but in that same location<br>
24 bytes into the stack across a different function call (and that&#39;s<br>
OK, because it always knows which variable is using that location<br>
24 bytes into the stack when).<br>
<br>
In some cases, a variable may even be totally optimized out of existence.<br>
For example, if you have<br>
<br>
int foo ( int c ) {<br>
int a, b;<br>
<br>
   b = c * 5;<br>
   a = b + getpid();<br>
   return a;<br>
}<br>
<br>
the compiler can (and probably *will*) optimize both a and b<br>
away and convert it to &#39;return (c*5 + getpid());&#39;<br>
</blockquote></div><br><br clear="all"><br>-- <br>Thanks &amp; Regards <br>Nidhi Mittal Hada<br><br><a href="http://nidhi-searchingmyself.blogspot.com/" target="_blank">http://nidhi-searchingmyself.blogspot.com/</a><br><br>


</div></div>