On 28/12/2017 23:49, Bruno Alvisio wrote:
>
> Hello Andrew,
>
>  
>
> Thanks. Yup, you were right. I did an objdump of the kernel and found
> the offending instruction 0x5cfcb to be callq *%r15 in the
> console_print function (see below):
>

Answering out of order...

> I am not familiar with the XTF relocalability code. Any pointer or
> suggestion at this point would be again appreciated.
>

XTF is the Xen Test Framework, a microkernel project for testing purposes.

http://xenbits.xen.org/gitweb/?p=xtf.git;a=summary
http://xenbits.xen.org/docs/xtf/

Amongst other things, it runs as a set of regression tests for all new
code introduced into upstream Xen.

All I meant by that statement was "I recall bugs like this", which is
why I made the blind guess at your offending opcode being `jmp *%r15`.

>  
>
> 0000000000056ee9 <console_print>:
>
>    56ee9:   55                      push   %rbp
>
>    56eea:   48 89 e5                mov    %rsp,%rbp
>
>    56eed:   41 57                   push   %r15
>
>    56eef:   41 56                   push   %r14
>
>    56ef1:   41 55                   push   %r13
>
>    56ef3:   41 54                   push   %r12
>
>    56ef5:   53                      push   %rbx
>
>    56ef6:   48 83 ec 18             sub    $0x18,%rsp
>
>    56efa:   49 89 fe                mov    %rdi,%r14
>
>    56efd:   41 89 d4                mov    %edx,%r12d
>
>    56f00:   48 89 65 c0             mov    %rsp,-0x40(%rbp)
>
>    56f04:   8d 42 01                lea    0x1(%rdx),%eax
>
>    56f07:   48 98                   cltq   
>
>    56f09:   48 83 c0 0f             add    $0xf,%rax
>
>    56f0d:   48 83 e0 f0             and    $0xfffffffffffffff0,%rax
>
>    56f11:   48 29 c4                sub    %rax,%rsp
>
>    56f14:   48 89 e3                mov    %rsp,%rbx
>
>    56f17:   83 3d 00 00 00 00 00    cmpl   $0x0,0x0(%rip)        #
> 56f1e <console_print+0x35>
>
>    56f1e:   74 09                   je     56f29 <console_print+0x40>
>
>    56f20:   4c 8b 3d 00 00 00 00    mov    0x0(%rip),%r15        #
> 56f27 <console_print+0x3e>
>
>    56f27:   eb 07                   jmp    56f30 <console_print+0x47>
>
>    56f29:   4c 8b 3d 00 00 00 00    mov    0x0(%rip),%r15        #
> 56f30 <console_print+0x47>
>
>    56f30:   4d 85 f6                test   %r14,%r14
>
>    56f33:   74 19                   je     56f4e <console_print+0x65>
>
>    56f35:   41 80 7e 30 00          cmpb   $0x0,0x30(%r14)
>
>    56f3a:   74 12                   je     56f4e <console_print+0x65>
>
>    56f3c:   44 89 e2                mov    %r12d,%edx
>
>    56f3f:   4c 89 f7                mov    %r14,%rdi
>
>    56f42:   41 ff d7                callq  *%r15
>
>    56f45:   48 8b 65 c0             mov    -0x40(%rbp),%rsp
>
>    56f49:   e9 84 00 00 00          jmpq   56fd2 <console_print+0xe9>
>
>    56f4e:   4d 63 ec                movslq %r12d,%r13
>
>    56f51:   4c 89 ea                mov    %r13,%rdx
>
>    56f54:   48 89 df                mov    %rbx,%rdi
>
>    56f57:   e8 00 00 00 00          callq  56f5c <console_print+0x73>
>
>    56f5c:   4a 8d 44 2b ff          lea    -0x1(%rbx,%r13,1),%rax
>
>    56f61:   48 39 c3                cmp    %rax,%rbx
>
>    56f64:   73 4b                   jae    56fb1 <console_print+0xc8>
>
>    56f66:   48 89 de                mov    %rbx,%rsi
>
>    56f69:   80 3b 0a                cmpb   $0xa,(%rbx)
>
>    56f6c:   75 30                   jne    56f9e <console_print+0xb5>
>
>    56f6e:   c6 03 0d                movb   $0xd,(%rbx)
>
>    56f71:   0f b6 43 01             movzbl 0x1(%rbx),%eax
>
>    56f75:   88 45 cf                mov    %al,-0x31(%rbp)
>
>    56f78:   c6 43 01 0a             movb   $0xa,0x1(%rbx)
>
>    56f7c:   49 89 dd                mov    %rbx,%r13
>
>    56f7f:   49 29 f5                sub    %rsi,%r13
>
>    56f82:   41 8d 55 02             lea    0x2(%r13),%edx
>
>    56f86:   4c 89 f7                mov    %r14,%rdi
>
>    56f89:   41 ff d7                callq  *%r15
>
>    56f8c:   0f b6 45 cf             movzbl -0x31(%rbp),%eax
>
>    56f90:   88 43 01                mov    %al,0x1(%rbx)
>
>    56f93:   48 8d 73 01             lea    0x1(%rbx),%rsi
>
>    56f97:   41 83 c5 01             add    $0x1,%r13d
>
>    56f9b:   45 29 ec                sub    %r13d,%r12d
>
>    56f9e:   48 83 c3 01             add    $0x1,%rbx
>
>    56fa2:   4d 63 ec                movslq %r12d,%r13
>
>    56fa5:   4a 8d 44 2e ff          lea    -0x1(%rsi,%r13,1),%rax
>
>    56faa:   48 39 d8                cmp    %rbx,%rax
>
>    56fad:   77 ba                   ja     56f69 <console_print+0x80>
>
>    56faf:   eb 03                   jmp    56fb4 <console_print+0xcb>
>
>    56fb1:   48 89 de                mov    %rbx,%rsi
>
>    56fb4:   80 38 0a                cmpb   $0xa,(%rax)
>
>    56fb7:   75 0c                   jne    56fc5 <console_print+0xdc>
>
>    56fb9:   c6 00 0d                movb   $0xd,(%rax)
>
>    56fbc:   42 c6 04 2e 0a          movb   $0xa,(%rsi,%r13,1)
>
>    56fc1:   41 83 c4 01             add    $0x1,%r12d
>
>    56fc5:   44 89 e2                mov    %r12d,%edx
>
>    56fc8:   4c 89 f7                mov    %r14,%rdi
>
>    *56fcb:   41 ff d7                callq  *%r15*
>
>    56fce:   48 8b 65 c0             mov    -0x40(%rbp),%rsp
>
>    56fd2:   48 8d 65 d8             lea    -0x28(%rbp),%rsp
>
>    56fd6:   5b                      pop    %rbx
>
>    56fd7:   41 5c                   pop    %r12
>
>    56fd9:   41 5d                pop    %r13
>
>    56fdb:   41 5e                   pop    %r14
>
>    56fdd:   41 5f                   pop    %r15
>
>    56fdf:   5d                      pop    %rbp
>
>    56fe0:   c3                      retq
>
>  
>
>  
>
> I added the options –fno-pic to TARGET_CFLAGS and TARGET_CPPFLAGS and
> –no-pie to TARGET_LDFLAGS and recompile the kernel. Now, the kernel
> carshed at instruction 0x673bb in the run_idle_thread function:
>
>  
>
> 00000000000673ac <run_idle_thread>:
>
>    673ac:   55                      push   %rbp
>
>    673ad:   48 89 e5                mov    %rsp,%rbp
>
>    673b0:   48 8b 05 00 00 00 00    mov    0x0(%rip),%rax        #
> 673b7 <run_idle_thread+0xb>
>
>    673b7:   48 8b 60 10             mov    0x10(%rax),%rsp
>
>    673bb:   ff 70 18                pushq  0x18(%rax)
>
>    673be:   c3                      retq
>
>    673bf:   5d                      pop    %rbp
>
>    673c0:   c3                     retq
>
>  
>
>  
>
> Finally, just to try I commented out the run_idle_thread function and
> the kernel crashed at the very beginning at 0x63. The kern dump in
> this case points to the stack:
>
>  
>
>       5e:   e8 00 00 00 00          callq  63 <stack_start>
>

Both the above mov instruction at 0x673b0 and this call instruction with
a 4-byte displacement of 0 look suspiciously like they are waiting for
relocation, as displacements of 0 are exceedingly rare (there are more
efficient ways to encode such operands).

Therefore, I don't think you've succeeded in preventing your binary from
being relocatable.

~Andrew

>  
>
> 0000000000000063 <stack_start>:
>
>     ...
>
>       6b:   90                      nop
>
>       6c:   90                      nop
>
>       6d:   90                      nop
>
>  
>
>  
>
> Thanks,
>
> Bruno
>
>
> On Thu, Dec 28, 2017 at 7:18 PM, Andrew Cooper
> <andrew.coop...@citrix.com <mailto:andrew.coop...@citrix.com>> wrote:
>
>     On 28/12/17 18:33, Bruno Alvisio wrote:
>>     (d360) Bootstrapping...
>>
>>     (XEN) Dom360 callback via changed to Direct Vector 0x20
>>
>>     (d360) Xen Minimal OS (hvm)!
>>
>>     (XEN) d360v0 Triple fault - invoking HVM shutdown action 1
>>
>>     (XEN) *** Dumping Dom360 vcpu#0 state: ***
>>
>>     (XEN) ----[ Xen-4.10.0-rc  x86_64  debug=y   Not tainted ]----
>>
>>     (XEN) CPU:    7
>>
>>     (XEN) RIP:    0008:[<0000000000056fc8>]
>>
>>     (XEN) RFLAGS: 0000000000010006   CONTEXT: hvm guest (d360v0)
>>
>>     (XEN) rax: 00000000000bfe75   rbx: 00000000000bfe75   rcx:
>>     0000000000000000
>>
>>     (XEN) rdx: 0000000000000017   rsi: 00000000000bfe60   rdi:
>>     0000000000000000
>>
>>     (XEN) rbp: 00000000000bfec0   rsp: 00000000000bfe60   r8: 
>>     0000000000000000
>>
>>     (XEN) r9:  0000000000089982   r10: 0000000000000016   r11:
>>     0000000000000000
>>
>>     (XEN) r12: 0000000000000017   r13: 0000000000000016   r14:
>>     0000000000000000
>>
>>     (XEN) r15: 0d8b4c1575ff8548   cr0: 0000000080000011   cr4:
>>     0000000000000220
>>
>>     (XEN) cr3: 0000000000099000   cr2: 0000000000000000
>>
>>     (XEN) fsb: 0000000000000000   gsb: 0000000000000000   gss:
>>     0000000000000000
>>
>>     (XEN) ds: 0033   es: 0033   fs: 0033   gs: 0033   ss: 0000   cs: 0008
>>
>>      
>>
>>      
>>
>>     Any help on this would be greatly appreciated.
>>
>
>     You will need to disassemble your minios kernel and see which
>     instruction is at 0x56fc8.  (Chances are, it will be `jmp %r15`).
>
>     The content of %r15 looks like x86 opcode, which is reminiscent of
>     the XTF relocatability bugs.  Make doubly sure you are compiling
>     with -fno-pic and link with -no-pie.
>
>     ~Andrew
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to