lkl / linux

Linux kernel source tree

Home Page:https://lkl.github.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

lkl tests failed on windows 10

kruglinski opened this issue · comments

H:\idawork\linux-master\tools\lkl\tests>boot.exe
1..33 # boot

  • 1 mutex
    ok 1 mutex

time_us: 0
log: |
...

  • 2 semaphore
    ok 2 semaphore

time_us: 0
log: |
...

  • 3 join
    ok 3 join

time_us: 0
log: |
joined 7664
...

  • 4 start_kernel
    H:\idawork\linux-master\tools\lkl\tests>

tests just quit, no bootlogs out...

thanks for the report. our test infra uses wine (and reports no errors), not native win environment. and i have no native win10 environment thus can't try to reproduce the issue.

it would be nice if someone can look at what's going on. cc: @tavip

It also fails on win7 x64 sp1 environment, even running under admin privileges.

have a little busy these days, maybe someday I'll dig it out with gdb/gdbserver myself.

by some debug and analysis I found this:
(gdb) bt
#0 0x00940060 in tmp_cmdline ()
#1 0x006d8a62 in div_u64_rem (remainder=,
divisor=, dividend=996147200000000)
at ./include/linux/math64.h:90
#2 div_u64 (divisor=, dividend=)
at ./include/linux/math64.h:126
#3 div64_u64 (dividend=996147200000000, divisor=1000000000)
at lib/div64.c:148
#4 0x0042c7ee in to_ratio (period=1000000000, runtime=996145649863168)
at kernel/sched/core.c:2438
#5 0x004333c6 in init_dl_bw (dl_b=0x8a4760 <runqueues+992>)
at kernel/sched/deadline.c:354
#6 0x004336d2 in init_dl_rq (dl_rq=0x8a4750 <runqueues+976>)
at kernel/sched/deadline.c:371
#7 0x00889c61 in sched_init () at kernel/sched/core.c:5970
#8 0x008877ce in start_kernel () at init/main.c:586
#9 0x00888243 in lkl_run_kernel (arg=0x0) at arch/lkl/kernel/setup.c:48
#10 0x76e7343d in ?? ()
#11 0x77d59832 in ?? ()
#12 0x77d59805 in ?? ()
#13 0x00000000 in ?? ()
(gdb) disas 0x006d8a62
Dump of assembler code for function div64_u64:
0x006d88f0 <+0>: push %ebp
0x006d88f1 <+1>: mov %esp,%ebp
0x006d88f3 <+3>: push %edi
0x006d88f4 <+4>: push %esi
0x006d88f5 <+5>: push %ebx
0x006d88f6 <+6>: sub $0x3c,%esp
0x006d88f9 <+9>: mov 0x14(%ebp),%edx
0x006d88fc <+12>: mov 0x10(%ebp),%eax
0x006d88ff <+15>: mov 0x8(%ebp),%esi
0x006d8902 <+18>: mov 0xc(%ebp),%edi
0x006d8905 <+21>: test %edx,%edx
0x006d8907 <+23>: mov %eax,-0x38(%ebp)
0x006d890a <+26>: mov %edx,-0x34(%ebp)
0x006d890d <+29>: jne 0x6d8940 <div64_u64+80>
0x006d890f <+31>: test %edi,%edi
0x006d8911 <+33>: mov %eax,%ecx
0x006d8913 <+35>: mov %esi,-0x28(%ebp)
0x006d8916 <+38>: mov %edi,-0x24(%ebp)
0x006d8919 <+41>: jne 0x6d8a50 <div64_u64+352>
0x006d891f <+47>: mov %esi,%eax
0x006d8921 <+49>: xor %edx,%edx
0x006d8923 <+51>: movl $0x0,-0x2c(%ebp)
0x006d892a <+58>: div %ecx
0x006d892c <+60>: mov %eax,-0x30(%ebp)
0x006d892f <+63>: mov -0x30(%ebp),%eax
0x006d8932 <+66>: mov -0x2c(%ebp),%edx
0x006d8935 <+69>: add $0x3c,%esp
0x006d8938 <+72>: pop %ebx
0x006d8939 <+73>: pop %esi
0x006d893a <+74>: pop %edi
0x006d893b <+75>: pop %ebp
0x006d893c <+76>: ret
0x006d893d <+77>: lea 0x0(%esi),%esi
0x006d8940 <+80>: mov %edx,%eax
0x006d8942 <+82>: mov $0x20,%ecx
0x006d8947 <+87>: test $0xffff0000,%eax
0x006d894c <+92>: jne 0x6d8956 <div64_u64+102>
0x006d894e <+94>: shl $0x10,%eax
0x006d8951 <+97>: mov $0x10,%ecx
0x006d8956 <+102>: test $0xff000000,%eax
0x006d895b <+107>: jne 0x6d8963 <div64_u64+115>
0x006d895d <+109>: shl $0x8,%eax
0x006d8960 <+112>: sub $0x8,%ecx
0x006d8963 <+115>: test $0xf0000000,%eax
0x006d8968 <+120>: jne 0x6d8970 <div64_u64+128>
0x006d896a <+122>: shl $0x4,%eax
0x006d896d <+125>: sub $0x4,%ecx
0x006d8970 <+128>: test $0xc0000000,%eax
0x006d8975 <+133>: jne 0x6d897d <div64_u64+141>
0x006d8977 <+135>: shl $0x2,%eax
0x006d897a <+138>: sub $0x2,%ecx
0x006d897d <+141>: test %eax,%eax
0x006d897f <+143>: js 0x6d8a40 <div64_u64+336>
0x006d8985 <+149>: mov -0x34(%ebp),%edx
0x006d8988 <+152>: mov -0x38(%ebp),%eax
0x006d898b <+155>: shrd %cl,%edx,%eax
0x006d898e <+158>: shr %cl,%edx
0x006d8990 <+160>: test $0x20,%cl
0x006d8993 <+163>: cmovne %edx,%eax
0x006d8996 <+166>: mov %edi,%edx
0x006d8998 <+168>: mov %eax,%ebx
0x006d899a <+170>: mov %esi,%eax
0x006d899c <+172>: shrd %cl,%edx,%eax
0x006d899f <+175>: shr %cl,%edx
0x006d89a1 <+177>: test $0x20,%cl
0x006d89a4 <+180>: je 0x6d89aa <div64_u64+186>
0x006d89a6 <+182>: mov %edx,%eax
0x006d89a8 <+184>: xor %edx,%edx
0x006d89aa <+186>: mov %edx,%ecx
0x006d89ac <+188>: mov %eax,-0x20(%ebp)
0x006d89af <+191>: mov %eax,%edx
0x006d89b1 <+193>: test %ecx,%ecx
0x006d89b3 <+195>: mov %ecx,-0x1c(%ebp)
0x006d89b6 <+198>: jne 0x6d8a73 <div64_u64+387>
0x006d89bc <+204>: mov %edx,%eax
0x006d89be <+206>: xor %edx,%edx
0x006d89c0 <+208>: div %ebx
0x006d89c2 <+210>: xor %edx,%edx
0x006d89c4 <+212>: mov %edx,%ebx
0x006d89c6 <+214>: movl $0x0,-0x30(%ebp)
0x006d89cd <+221>: movl $0x0,-0x2c(%ebp)
0x006d89d4 <+228>: or %eax,%ebx
0x006d89d6 <+230>: je 0x6d8a02 <div64_u64+274>
0x006d89d8 <+232>: add $0xffffffff,%eax
0x006d89db <+235>: mov -0x34(%ebp),%ebx
0x006d89de <+238>: mov -0x38(%ebp),%ecx
0x006d89e1 <+241>: adc $0xffffffff,%edx
0x006d89e4 <+244>: mov %eax,-0x30(%ebp)
0x006d89e7 <+247>: mov %edx,-0x2c(%ebp)
0x006d89ea <+250>: mov -0x30(%ebp),%edx
0x006d89ed <+253>: mov -0x2c(%ebp),%eax
0x006d89f0 <+256>: imul %ebx,%edx
0x006d89f3 <+259>: imul %ecx,%eax
0x006d89f6 <+262>: add %edx,%eax
0x006d89f8 <+264>: mov %eax,%ebx
0x006d89fa <+266>: mov -0x38(%ebp),%eax
0x006d89fd <+269>: mull -0x30(%ebp)
0x006d8a00 <+272>: add %ebx,%edx
0x006d8a02 <+274>: sub %eax,%esi
0x006d8a04 <+276>: sbb %edx,%edi
0x006d8a06 <+278>: mov %esi,%eax
0x006d8a08 <+280>: mov -0x38(%ebp),%esi
0x006d8a0b <+283>: mov %edi,%edx
0x006d8a0d <+285>: mov -0x34(%ebp),%edi
0x006d8a10 <+288>: cmp %edx,%edi
0x006d8a12 <+290>: ja 0x6d892f <div64_u64+63>
0x006d8a18 <+296>: jae 0x6d8a30 <div64_u64+320>
0x006d8a1a <+298>: addl $0x1,-0x30(%ebp)
0x006d8a1e <+302>: adcl $0x0,-0x2c(%ebp)
0x006d8a22 <+306>: mov -0x30(%ebp),%eax
0x006d8a25 <+309>: mov -0x2c(%ebp),%edx
0x006d8a28 <+312>: add $0x3c,%esp
0x006d8a2b <+315>: pop %ebx
0x006d8a2c <+316>: pop %esi
0x006d8a2d <+317>: pop %edi
0x006d8a2e <+318>: pop %ebp
0x006d8a2f <+319>: ret
0x006d8a30 <+320>: cmp %eax,%esi
0x006d8a32 <+322>: ja 0x6d892f <div64_u64+63>
0x006d8a38 <+328>: jmp 0x6d8a1a <div64_u64+298>
0x006d8a3a <+330>: lea 0x0(%esi),%esi
0x006d8a40 <+336>: add $0x1,%ecx
0x006d8a43 <+339>: jmp 0x6d8985 <div64_u64+149>
0x006d8a48 <+344>: nop
0x006d8a49 <+345>: lea 0x0(%esi,%eiz,1),%esi
0x006d8a50 <+352>: mov -0x38(%ebp),%eax
0x006d8a53 <+355>: mov %eax,0x4(%esp)
0x006d8a57 <+359>: lea -0x28(%ebp),%eax
0x006d8a5a <+362>: mov %eax,(%esp)
0x006d8a5d <+365>: call 0x940060 <tmp_cmdline.44932> <=== crashed here
0x006d8a62 <+370>: mov -0x28(%ebp),%eax
0x006d8a65 <+373>: mov -0x24(%ebp),%edx
0x006d8a68 <+376>: mov %eax,-0x30(%ebp)
0x006d8a6b <+379>: mov %edx,-0x2c(%ebp)
0x006d8a6e <+382>: jmp 0x6d892f <div64_u64+63>
0x006d8a73 <+387>: lea -0x20(%ebp),%eax
0x006d8a76 <+390>: mov %ebx,0x4(%esp)
0x006d8a7a <+394>: mov %eax,(%esp)
0x006d8a7d <+397>: call 0x940060 <tmp_cmdline.44932>
0x006d8a82 <+402>: mov -0x20(%ebp),%eax
0x006d8a85 <+405>: mov -0x1c(%ebp),%edx
0x006d8a88 <+408>: jmp 0x6d89c4 <div64_u64+212>
End of assembler dump.

and I double check the function disassmbly code with ida pro

.text:006D88F0 ; u64 __cdecl div64_u64(u64 dividend, u64 divisor)
.text:006D88F0 _div64_u64 proc near ; CODE XREF: _set_max_threads+2E↑p
.text:006D88F0 ; _to_ratio+49↑p ...
.text:006D88F0
.text:006D88F0 var_38 = qword ptr -38h
.text:006D88F0 var_30 = qword ptr -30h
.text:006D88F0 var_28 = qword ptr -28h
.text:006D88F0 var_20 = qword ptr -20h
.text:006D88F0 dividend = qword ptr 8
.text:006D88F0 divisor = qword ptr 10h
.text:006D88F0
.text:006D88F0 push ebp
.text:006D88F1 mov ebp, esp
.text:006D88F3 push edi
.text:006D88F4 push esi
.text:006D88F5 push ebx
.text:006D88F6 sub esp, 3Ch
.text:006D88F9 ; 14: if ( !HIDWORD(divisor) )
.text:006D88F9 mov edx, dword ptr [ebp+divisor+4]
.text:006D88FC mov eax, dword ptr [ebp+divisor]
.text:006D88FF mov esi, dword ptr [ebp+dividend]
.text:006D8902 mov edi, dword ptr [ebp+dividend+4]
.text:006D8905 test edx, edx
.text:006D8907 mov dword ptr [ebp+var_38], eax
.text:006D890A mov dword ptr [ebp+var_38+4], edx
.text:006D890D jnz short loc_6D8940
.text:006D890F ; 19: (*(void (__fastcall **)(_DWORD))compat_sys_kexec_load)(divisor);
.text:006D890F test edi, edi
.text:006D8911 mov ecx, eax
.text:006D8913 ; 16: v12 = dividend;
.text:006D8913 mov dword ptr [ebp+var_28], esi
.text:006D8916 ; 17: if ( !HIDWORD(dividend) )
.text:006D8916 mov dword ptr [ebp+var_28+4], edi
.text:006D8919 jnz loc_6D8A50
.text:006D891F ; 18: return (unsigned int)dividend / (unsigned int)divisor;
.text:006D891F mov eax, esi
.text:006D8921 xor edx, edx
.text:006D8923 mov dword ptr [ebp+var_30+4], 0
.text:006D892A div ecx
.text:006D892C mov dword ptr [ebp+var_30], eax
.text:006D892F ; 20: return v12;
.text:006D892F
.text:006D892F loc_6D892F: ; CODE XREF: _div64_u64+122↓j
.text:006D892F ; _div64_u64+142↓j ...
.text:006D892F mov eax, dword ptr [ebp+var_30]
.text:006D8932 mov edx, dword ptr [ebp+var_30+4]
.text:006D8935 ; 71: return v11;
.text:006D8935 add esp, 3Ch
.text:006D8938 pop ebx
.text:006D8939 pop esi
.text:006D893A pop edi
.text:006D893B pop ebp
.text:006D893C retn
.text:006D893C ; ---------------------------------------------------------------------------
.text:006D893D align 10h
.text:006D8940 ; 22: v3 = HIDWORD(divisor);
.text:006D8940
.text:006D8940 loc_6D8940: ; CODE XREF: _div64_u64+1D↑j
.text:006D8940 mov eax, edx
.text:006D8942 ; 23: v4 = 32;
.text:006D8942 mov ecx, 20h
.text:006D8947 ; 24: if ( !(divisor & 0xFFFF000000000000LL) )
.text:006D8947 test eax, 0FFFF0000h
.text:006D894C jnz short loc_6D8956
.text:006D894E ; 26: v3 = HIDWORD(divisor) << 16;
.text:006D894E shl eax, 10h
.text:006D8951 ; 27: v4 = 16;
.text:006D8951 mov ecx, 10h
.text:006D8956 ; 29: if ( !(v3 & 0xFF000000) )
.text:006D8956
.text:006D8956 loc_6D8956: ; CODE XREF: _div64_u64+5C↑j
.text:006D8956 test eax, 0FF000000h
.text:006D895B jnz short loc_6D8963
.text:006D895D ; 31: v3 <<= 8;
.text:006D895D shl eax, 8
.text:006D8960 ; 32: v4 -= 8;
.text:006D8960 sub ecx, 8
.text:006D8963 ; 34: if ( !(v3 & 0xF0000000) )
.text:006D8963
.text:006D8963 loc_6D8963: ; CODE XREF: _div64_u64+6B↑j
.text:006D8963 test eax, 0F0000000h
.text:006D8968 jnz short loc_6D8970
.text:006D896A ; 36: v3 *= 16;
.text:006D896A shl eax, 4
.text:006D896D ; 37: v4 -= 4;
.text:006D896D sub ecx, 4
.text:006D8970 ; 39: if ( !(v3 & 0xC0000000) )
.text:006D8970
.text:006D8970 loc_6D8970: ; CODE XREF: _div64_u64+78↑j
.text:006D8970 test eax, 0C0000000h
.text:006D8975 jnz short loc_6D897D
.text:006D8977 ; 41: v3 = 4;
.text:006D8977 shl eax, 2
.text:006D897A ; 42: v4 -= 2;
.text:006D897A sub ecx, 2
.text:006D897D ; 44: if ( v3 < 0 )
.text:006D897D
.text:006D897D loc_6D897D: ; CODE XREF: _div64_u64+85↑j
.text:006D897D test eax, eax
.text:006D897F js loc_6D8A40
.text:006D8985 ; 46: v5 = divisor >> (v4 & 0x1F);
.text:006D8985
.text:006D8985 loc_6D8985: ; CODE XREF: _div64_u64+153↓j
.text:006D8985 mov edx, dword ptr [ebp+var_38+4]
.text:006D8988 mov eax, dword ptr [ebp+var_38]
.text:006D898B shrd eax, edx, cl
.text:006D898E shr edx, cl
.text:006D8990 ; 47: if ( v4 & 0x20 )
.text:006D8990 test cl, 20h
.text:006D8993 ; 48: LODWORD(v5) = divisor >> (v4 & 0x1F) >> 32;
.text:006D8993 cmovnz eax, edx
.text:006D8996 ; 49: v6 = v5;
.text:006D8996 mov edx, edi
.text:006D8998 mov ebx, eax
.text:006D899A ; 52: if ( dividend >> v4 >> 32 )
.text:006D899A mov eax, esi
.text:006D899C shrd eax, edx, cl
.text:006D899F ; 50: v7 = dividend >> v4;
.text:006D899F shr edx, cl
.text:006D89A1 test cl, 20h
.text:006D89A4 jz short loc_6D89AA
.text:006D89A6 mov eax, edx
.text:006D89A8 xor edx, edx
.text:006D89AA ; 54: ((void (__fastcall **)(_DWORD, _DWORD, u64 *, unsigned int))compat_sys_kexec_load)(HIDWORD(v7), v7, &v13, v6);
.text:006D89AA
.text:006D89AA loc_6D89AA: ; CODE XREF: _div64_u64+B4↑j
.text:006D89AA mov ecx, edx
.text:006D89AC ; 51: v13 = dividend >> v4;
.text:006D89AC mov dword ptr [ebp+var_20], eax
.text:006D89AF mov edx, eax
.text:006D89B1 test ecx, ecx
.text:006D89B3 mov dword ptr [ebp+var_20+4], ecx
.text:006D89B6 jnz loc_6D8A73
.text:006D89BC ; 59: v8 = (unsigned int)v7 / v6;
.text:006D89BC mov eax, edx
.text:006D89BE xor edx, edx
.text:006D89C0 div ebx
.text:006D89C2 xor edx, edx
.text:006D89C4 ; 61: v11 = 0LL;
.text:006D89C4
.text:006D89C4 loc_6D89C4: ; CODE XREF: _div64_u64+198↓j
.text:006D89C4 mov ebx, edx
.text:006D89C6 mov dword ptr [ebp+var_30], 0
.text:006D89CD ; 62: if ( v8 )
.text:006D89CD mov dword ptr [ebp+var_30+4], 0
.text:006D89D4 or ebx, eax
.text:006D89D6 jz short loc_6D8A02
.text:006D89D8 ; 64: v11 = v8 - 1;
.text:006D89D8 add eax, 0FFFFFFFFh
.text:006D89DB mov ebx, dword ptr [ebp+var_38+4]
.text:006D89DE mov ecx, dword ptr [ebp+var_38]
.text:006D89E1 adc edx, 0FFFFFFFFh
.text:006D89E4 mov dword ptr [ebp+var_30], eax
.text:006D89E7 ; 65: v9 = HIDWORD(divisor) * (v8 - 1) + divisor * ((v8 - 1) >> 32);
.text:006D89E7 mov dword ptr [ebp+var_30+4], edx
.text:006D89EA mov edx, dword ptr [ebp+var_30]
.text:006D89ED mov eax, dword ptr [ebp+var_30+4]
.text:006D89F0 imul edx, ebx
.text:006D89F3 imul eax, ecx
.text:006D89F6 add eax, edx
.text:006D89F8 mov ebx, eax
.text:006D89FA ; 66: v8 = (unsigned int)(v8 - 1) * (unsigned __int64)(unsigned int)divisor;
.text:006D89FA mov eax, dword ptr [ebp+var_38]
.text:006D89FD mul dword ptr [ebp+var_30]
.text:006D8A00 ; 67: HIDWORD(v8) += v9;
.text:006D8A00 add edx, ebx
.text:006D8A02 ; 69: v10 = dividend - v8;
.text:006D8A02
.text:006D8A02 loc_6D8A02: ; CODE XREF: _div64_u64+E6↑j
.text:006D8A02 sub esi, eax
.text:006D8A04 sbb edi, edx
.text:006D8A06 mov eax, esi
.text:006D8A08 ; 70: if ( HIDWORD(divisor) > HIDWORD(v10) || HIDWORD(divisor) >= HIDWORD(v10) && (unsigned int)divisor > (unsigned int)v10 )
.text:006D8A08 mov esi, dword ptr [ebp+var_38]
.text:006D8A0B mov edx, edi
.text:006D8A0D mov edi, dword ptr [ebp+var_38+4]
.text:006D8A10 cmp edi, edx
.text:006D8A12 ja loc_6D892F
.text:006D8A18 jnb short loc_6D8A30
.text:006D8A1A ; 72: return v11 + 1;
.text:006D8A1A
.text:006D8A1A loc_6D8A1A: ; CODE XREF: _div64_u64+148↓j
.text:006D8A1A add dword ptr [ebp+var_30], 1
.text:006D8A1E adc dword ptr [ebp+var_30+4], 0
.text:006D8A22 mov eax, dword ptr [ebp+var_30]
.text:006D8A25 mov edx, dword ptr [ebp+var_30+4]
.text:006D8A28 add esp, 3Ch
.text:006D8A2B pop ebx
.text:006D8A2C pop esi
.text:006D8A2D pop edi
.text:006D8A2E pop ebp
.text:006D8A2F retn
.text:006D8A30 ; ---------------------------------------------------------------------------
.text:006D8A30
.text:006D8A30 loc_6D8A30: ; CODE XREF: _div64_u64+128↑j
.text:006D8A30 cmp esi, eax
.text:006D8A32 ja loc_6D892F
.text:006D8A38 jmp short loc_6D8A1A
.text:006D8A38 ; ---------------------------------------------------------------------------
.text:006D8A3A align 10h
.text:006D8A40 ; 45: ++v4;
.text:006D8A40
.text:006D8A40 loc_6D8A40: ; CODE XREF: _div64_u64+8F↑j
.text:006D8A40 add ecx, 1
.text:006D8A43 jmp loc_6D8985
.text:006D8A43 ; ---------------------------------------------------------------------------
.text:006D8A48 align 10h
.text:006D8A50
.text:006D8A50 loc_6D8A50: ; CODE XREF: _div64_u64+29↑j
.text:006D8A50 mov eax, dword ptr [ebp+var_38]
.text:006D8A53 mov [esp+4], eax
.text:006D8A57 lea eax, [ebp+var_28]
.text:006D8A5A mov [esp], eax
.text:006D8A5D call near ptr _compat_sys_kexec_load ; <=== crashed here
.text:006D8A62 mov eax, dword ptr [ebp+var_28]
.text:006D8A65 mov edx, dword ptr [ebp+var_28+4]
.text:006D8A68 mov dword ptr [ebp+var_30], eax
.text:006D8A6B mov dword ptr [ebp+var_30+4], edx
.text:006D8A6E jmp loc_6D892F
.text:006D8A73 ; ---------------------------------------------------------------------------
.text:006D8A73
.text:006D8A73 loc_6D8A73: ; CODE XREF: _div64_u64+C6↑j
.text:006D8A73 lea eax, [ebp+var_20]
.text:006D8A76 mov [esp+4], ebx
.text:006D8A7A mov [esp], eax
.text:006D8A7D call near ptr _compat_sys_kexec_load
.text:006D8A82 ; 55: v8 = v13;
.text:006D8A82 mov eax, dword ptr [ebp+var_20]
.text:006D8A85 mov edx, dword ptr [ebp+var_20+4]
.text:006D8A88 jmp loc_6D89C4
.text:006D8A88 _div64_u64 endp
.text:006D8A88
.text:006D8A88 ; ---------------------------------------------------------------------------
.text:006D8A8D align 10h
.text:006D8A90

I am confused with div64_u64, by review include/linux/math64.h, div64_u64 is just a single line function, how can it produced so much opcodes

static inline u64 div64_u64(u64 dividend, u64 divisor)
{
return dividend / divisor;
}

I have no idea about this, please help!