Instant reboots with CPUTYPE=pentium-m
Bartosz Fabianowski
freebsd at chillt.de
Wed Jan 5 13:00:00 PST 2005
Hi list,
I am still having the problems with instant reboots that I reported [1]
a couple of weeks ago. I have a bit more info now and hope that someone
can lead me in the right direction.
The problem is that setting CPUTYPE=pentium-m in make.conf leads to a
corrupt boot loader and a corrupt kernel being generated. This setting
for the CPUTYPE has been available on -STABLE since 16th December, when
revision 1.40.2.1 of bsd.cpu.mk was committed. I have traced the start
of my problems to that exact commit (the commiter is CC'd).
On -current, the setting has been available for a longer time and has
led to the same problems for some people. Also, it seems that not only
pentium-m is broken, but athlon-xp as well. The end of a thread on the
-current mailing list discussing this issue is in [2]. Unfortunately, it
provides no insight as to where the problem lies.
It seems to me that every other part of the world, including GCC itself,
is built correctly when CPUTYPE is set to pentium-m. The issue only
affects the boot loader and the kernel for some reason.
When I changed the CPUTYPE from pentium-m down to pentium3 (essentially
just disabling SSE2) and recompiled the boot loader, I instantly got a
working loader again. I have attached a diff of the .s files generated
for the loader with CPUTYPE=pentium3 and CPUTYPE=pentium-m. I do not see
any real changes except for the use of xmm registers when
CPUTYPE=pentium-m is set.
Does anybody have an idea how to debug this further? I am totally out of
ideas and really do not know where to continue looking. I have some time
on my hands to go searching for the bug - all I need is some direction.
- Bartosz
[1]
http://lists.freebsd.org/pipermail/freebsd-stable/2004-December/010594.html
[2]
http://lists.freebsd.org/pipermail/freebsd-current/2004-November/042127.html
-------------- next part --------------
diff -u loader_dir_p3/bcache.s loader_dir_pm/bcache.s
--- loader_dir_p3/bcache.s Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/bcache.s Wed Jan 5 21:56:29 2005
@@ -684,7 +684,7 @@
pushl %edi
pushl %esi
pushl %ebx
- subl $36, %esp
+ subl $28, %esp
movl 12(%ebp), %ebx
movl 16(%ebp), %esi
leal -16(%ebp), %eax
@@ -692,21 +692,19 @@
call time
movl $0, -20(%ebp)
movl bcache_ctl, %eax
- movl 12(%eax), %eax
- movl %eax, -24(%ebp)
+ movd 12(%eax), %xmm0
movl $1, %ecx
cmpl bcache_nblks, %ecx
jae .L99
- movl bcache_ctl, %eax
- movl %eax, -36(%ebp)
- movl %eax, -28(%ebp)
- movl bcache_nblks, %eax
- movl %eax, -32(%ebp)
+ movd %eax, %xmm1
+ movl %eax, -24(%ebp)
+ movl bcache_nblks, %edi
+ movl %edi, -28(%ebp)
.p2align 4,,15
.L103:
movl %ecx, %eax
sall $4, %eax
- movl -36(%ebp), %edi
+ movd %xmm1, %edi
movl 4(%eax,%edi), %edx
xorl %esi, %edx
movl (%eax,%edi), %eax
@@ -717,18 +715,17 @@
jmp .L99
.p2align 4,,7
.L101:
- movl -28(%ebp), %edx
+ movl -24(%ebp), %edx
movl %ecx, %eax
sall $4, %eax
- movl -24(%ebp), %edi
+ movd %xmm0, %edi
cmpl %edi, 12(%eax,%edx)
jge .L100
- movl 12(%eax,%edx), %eax
- movl %eax, -24(%ebp)
+ movd 12(%eax,%edx), %xmm0
movl %ecx, -20(%ebp)
.L100:
incl %ecx
- cmpl -32(%ebp), %ecx
+ cmpl -28(%ebp), %ecx
jb .L103
.L99:
movl bcache_blksize, %eax
@@ -753,7 +750,7 @@
movl %eax, bcache_bcount
movl bcache_ctl, %eax
movl %edx, 12(%ecx,%eax)
- addl $36, %esp
+ addl $28, %esp
popl %ebx
popl %esi
popl %edi
diff -u loader_dir_p3/interp_backslash.s loader_dir_pm/interp_backslash.s
--- loader_dir_p3/interp_backslash.s Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/interp_backslash.s Wed Jan 5 21:56:29 2005
@@ -12,7 +12,7 @@
pushl %edi
pushl %esi
pushl %ebx
- subl $32, %esp
+ subl $28, %esp
movl 8(%ebp), %ebx
movl $0, %edi
movl $0, %esi
@@ -211,39 +211,39 @@
subl $55, %eax
sall $6, %eax
.L31:
- movl %eax, -24(%ebp)
+ movd %eax, %xmm0
movsbl 1(%ebx),%eax
leal -48(%eax), %edx
- movl %edx, -40(%ebp)
- movl -24(%ebp), %edx
+ movl %edx, -36(%ebp)
+ movd %xmm0, %edx
leal -384(%edx,%eax,8), %eax
- cmpl $9, -40(%ebp)
+ cmpl $9, -36(%ebp)
jbe .L37
movsbl 1(%ebx),%eax
leal -97(%eax), %edx
- movl %edx, -40(%ebp)
- movl -24(%ebp), %edx
+ movl %edx, -36(%ebp)
+ movd %xmm0, %edx
leal -696(%edx,%eax,8), %eax
- cmpl $25, -40(%ebp)
+ cmpl $25, -36(%ebp)
jbe .L37
movsbl 1(%ebx),%eax
- movl -24(%ebp), %edx
+ movd %xmm0, %edx
leal -440(%edx,%eax,8), %eax
.L37:
movl %eax, -20(%ebp)
movsbl 2(%ebx),%eax
leal -48(%eax), %edx
- movl %edx, -40(%ebp)
+ movl %edx, -36(%ebp)
movl -20(%ebp), %edx
leal -48(%edx,%eax), %eax
- cmpl $9, -40(%ebp)
+ cmpl $9, -36(%ebp)
jbe .L43
movsbl 2(%ebx),%eax
leal -97(%eax), %edx
- movl %edx, -40(%ebp)
+ movl %edx, -36(%ebp)
movl -20(%ebp), %edx
leal -87(%edx,%eax), %eax
- cmpl $25, -40(%ebp)
+ cmpl $25, -36(%ebp)
jbe .L43
movsbl 2(%ebx),%eax
movl -20(%ebp), %edx
@@ -266,7 +266,7 @@
testb $1, %al
je .L3
movsbl 2(%ebx),%edx
- movl $0, -28(%ebp)
+ movl $0, -24(%ebp)
leal -48(%edx), %eax
cmpl $9, %eax
jbe .L50
@@ -277,9 +277,9 @@
cmpl $5, %eax
ja .L49
.L50:
- movl $1, -28(%ebp)
+ movl $1, -24(%ebp)
.L49:
- cmpl $0, -28(%ebp)
+ cmpl $0, -24(%ebp)
je .L3
movsbl 2(%ebx),%eax
subl $48, %eax
@@ -302,7 +302,7 @@
.L54:
movb %al, -13(%ebp)
movsbl 3(%ebx),%edx
- movl $0, -32(%ebp)
+ movl $0, -28(%ebp)
leal -48(%edx), %eax
cmpl $9, %eax
jbe .L61
@@ -313,29 +313,29 @@
cmpl $5, %eax
ja .L60
.L61:
- movl $1, -32(%ebp)
+ movl $1, -28(%ebp)
.L60:
- cmpl $0, -32(%ebp)
+ cmpl $0, -28(%ebp)
je .L59
movsbl -13(%ebp),%eax
sall $4, %eax
- movl %eax, -36(%ebp)
+ movl %eax, -32(%ebp)
movsbl 3(%ebx),%eax
leal -48(%eax), %edx
- movl %edx, -40(%ebp)
- movl -36(%ebp), %edx
+ movl %edx, -36(%ebp)
+ movl -32(%ebp), %edx
leal -48(%edx,%eax), %eax
- cmpl $9, -40(%ebp)
+ cmpl $9, -36(%ebp)
jbe .L65
movsbl 3(%ebx),%eax
leal -97(%eax), %edx
- movl %edx, -40(%ebp)
- movl -36(%ebp), %edx
+ movl %edx, -36(%ebp)
+ movl -32(%ebp), %edx
leal -87(%edx,%eax), %eax
- cmpl $25, -40(%ebp)
+ cmpl $25, -36(%ebp)
jbe .L65
movsbl 3(%ebx),%eax
- movl -36(%ebp), %edx
+ movl -32(%ebp), %edx
leal -55(%edx,%eax), %eax
.L65:
movb %al, -13(%ebp)
@@ -380,7 +380,7 @@
movb $0, (%ecx,%esi)
movl %ecx, %eax
.L1:
- addl $32, %esp
+ addl $28, %esp
popl %ebx
popl %esi
popl %edi
diff -u loader_dir_p3/load_elf32_obj.s loader_dir_pm/load_elf32_obj.s
--- loader_dir_p3/load_elf32_obj.s Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/load_elf32_obj.s Wed Jan 5 21:56:29 2005
@@ -252,7 +252,7 @@
pushl %edi
pushl %esi
pushl %ebx
- subl $52, %esp
+ subl $48, %esp
movl 16(%ebp), %eax
movl $0, -24(%ebp)
movl %eax, %edi
@@ -311,16 +311,16 @@
.L31:
leal (%ebx,%ebx,4), %eax
sall $3, %eax
- movl %eax, -44(%ebp)
+ movd %eax, %xmm0
movl %edi, %edx
addl 32(%eax,%esi), %edx
decl %edx
movl %edx, %eax
- movl -44(%ebp), %edi
+ movd %xmm0, %edi
movl $0, %edx
divl 32(%edi,%esi)
movl %eax, %edi
- movl -44(%ebp), %eax
+ movd %xmm0, %eax
imull 32(%eax,%esi), %edi
movl %edi, 12(%eax,%esi)
addl 20(%eax,%esi), %edi
@@ -456,16 +456,16 @@
.L49:
leal (%ebx,%ebx,4), %eax
sall $3, %eax
- movl %eax, -44(%ebp)
+ movd %eax, %xmm0
movl %edi, %edx
addl 32(%eax,%esi), %edx
decl %edx
movl %edx, %eax
- movl -44(%ebp), %edi
+ movd %xmm0, %edi
movl $0, %edx
divl 32(%edi,%esi)
movl %eax, %edi
- movl -44(%ebp), %eax
+ movd %xmm0, %eax
imull 32(%eax,%esi), %edi
movl %edi, 12(%eax,%esi)
addl 20(%eax,%esi), %edi
@@ -541,7 +541,7 @@
movl $.LC13, (%esp)
call printf
movl -24(%ebp), %eax
- addl $52, %esp
+ addl $48, %esp
popl %ebx
popl %esi
popl %edi
diff -u loader_dir_p3/load_elf64.s loader_dir_pm/load_elf64.s
--- loader_dir_p3/load_elf64.s Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/load_elf64.s Wed Jan 5 21:56:29 2005
@@ -325,7 +325,7 @@
pushl %edi
pushl %esi
pushl %ebx
- subl $140, %esp
+ subl $136, %esp
movl $0, -68(%ebp)
movl $0, -52(%ebp)
movl $0, -56(%ebp)
@@ -519,18 +519,18 @@
cmpl $0, -60(%ebp)
je .L50
movl -60(%ebp), %eax
- movl %eax, -108(%ebp)
- movl $0, -104(%ebp)
+ movl %eax, -104(%ebp)
+ movl $0, -100(%ebp)
leal 0(,%esi,8), %eax
subl %esi, %eax
movl 16(%ebp), %ecx
movl 20(%ebp), %ebx
addl 16(%edi,%eax,8), %ecx
adcl 20(%edi,%eax,8), %ebx
- cmpl %ebx, -104(%ebp)
+ cmpl %ebx, -100(%ebp)
ja .L50
jb .L49
- cmpl %ecx, -108(%ebp)
+ cmpl %ecx, -104(%ebp)
jbe .L49
.p2align 4,,15
.L50:
@@ -642,73 +642,81 @@
movl -52(%ebp), %ecx
cmpl $2, 4(%eax,%ecx)
jne .L62
- movl $0, -100(%ebp)
+ movl $0, -96(%ebp)
movl -48(%ebp), %ebx
cmpw $0, 56(%ebx)
je .L65
movl %esi, %eax
sall $6, %eax
- movl %eax, -88(%ebp)
+ movd %eax, %xmm0
.p2align 4,,15
.L71:
- movl -100(%ebp), %eax
+ movl -96(%ebp), %eax
sall $3, %eax
- subl -100(%ebp), %eax
+ subl -96(%ebp), %eax
sall $3, %eax
cmpl $1, (%eax,%edi)
jne .L66
- movl -88(%ebp), %ecx
+ movd %xmm0, %ecx
movl -52(%ebp), %edx
leal 24(%ecx,%edx), %ecx
movl (%ecx), %edx
movl 4(%ecx), %ecx
- movl %edx, -116(%ebp)
- movl %ecx, -112(%ebp)
+ movl %edx, -112(%ebp)
+ movl %ecx, -108(%ebp)
cmpl 12(%eax,%edi), %ecx
jb .L66
- movl -112(%ebp), %ecx
+ movl -108(%ebp), %ecx
cmpl 12(%eax,%edi), %ecx
ja .L69
cmpl 8(%eax,%edi), %edx
jb .L66
.L69:
- movl -88(%ebp), %edx
+ movd %xmm0, %edx
movl -52(%ebp), %eax
leal 24(%edx,%eax), %edx
movl (%edx), %eax
movl 4(%edx), %edx
- movl -88(%ebp), %ecx
- movl -52(%ebp), %ebx
- addl 32(%ecx,%ebx), %eax
- adcl 36(%ecx,%ebx), %edx
- movl %eax, -96(%ebp)
- movl %edx, -92(%ebp)
- movl -100(%ebp), %ecx
+ movl %eax, -120(%ebp)
+ movl %edx, -116(%ebp)
+ movd %xmm0, %eax
+ movl -52(%ebp), %edx
+ movl 32(%eax,%edx), %ecx
+ movl 36(%eax,%edx), %ebx
+ addl -120(%ebp), %ecx
+ adcl -116(%ebp), %ebx
+ movl %ecx, -92(%ebp)
+ movl %ebx, -88(%ebp)
+ movl -96(%ebp), %ecx
sall $3, %ecx
- subl -100(%ebp), %ecx
+ subl -96(%ebp), %ecx
movl 8(%edi,%ecx,8), %eax
movl 12(%edi,%ecx,8), %edx
addl 32(%edi,%ecx,8), %eax
adcl 36(%edi,%ecx,8), %edx
- cmpl %edx, -92(%ebp)
+ cmpl %edx, %ebx
ja .L66
+ cmpl %edx, -88(%ebp)
jb .L70
- cmpl %eax, -96(%ebp)
+ cmpl %eax, -92(%ebp)
ja .L66
.L70:
- movl -88(%ebp), %eax
+ movl $0, %ecx
+ movl $0, %ebx
+ movd %xmm0, %eax
movl -52(%ebp), %edx
- movl $0, 24(%eax,%edx)
- movl $0, 28(%eax,%edx)
- movl $0, 32(%eax,%edx)
- movl $0, 36(%eax,%edx)
+ movl %ecx, 24(%eax,%edx)
+ movl %ebx, 28(%eax,%edx)
+ movl -52(%ebp), %edx
+ movl %ecx, 32(%eax,%edx)
+ movl %ebx, 36(%eax,%edx)
jmp .L65
.p2align 4,,7
.L66:
- incl -100(%ebp)
+ incl -96(%ebp)
movl -48(%ebp), %ecx
movzwl 56(%ecx), %eax
- cmpl -100(%ebp), %eax
+ cmpl -96(%ebp), %eax
ja .L71
.L65:
movl %esi, %edx
@@ -796,15 +804,15 @@
call *archsw+16
testl %eax, %eax
js .L82
- movl %eax, -132(%ebp)
- movl $0, -128(%ebp)
- movl -128(%ebp), %eax
+ movl %eax, -128(%ebp)
+ movl $0, -124(%ebp)
+ movl -124(%ebp), %eax
movl -52(%ebp), %ecx
xorl 36(%ebx,%ecx), %eax
- movl %eax, -108(%ebp)
- movl -132(%ebp), %eax
+ movl %eax, -104(%ebp)
+ movl -128(%ebp), %eax
xorl 32(%ebx,%ecx), %eax
- orl -108(%ebp), %eax
+ orl -104(%ebp), %eax
je .L81
.L82:
movl $.LC21, (%esp)
@@ -1075,7 +1083,7 @@
call Free
.L117:
movl -56(%ebp), %eax
- addl $140, %esp
+ addl $136, %esp
popl %ebx
popl %esi
popl %edi
diff -u loader_dir_p3/reloc_elf64.s loader_dir_pm/reloc_elf64.s
--- loader_dir_p3/reloc_elf64.s Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/reloc_elf64.s Wed Jan 5 21:56:29 2005
@@ -14,7 +14,7 @@
elf64_reloc:
pushl %ebp
movl %esp, %ebp
- subl $40, %esp
+ subl $32, %esp
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
@@ -35,10 +35,7 @@
movl $0, -16(%ebp)
movzbl 8(%eax), %edx
movl $0, %ecx
- movl 12(%eax), %esi
- movl $0, %edi
- movl %esi, -28(%ebp)
- movl %edi, -24(%ebp)
+ movd 12(%eax), %xmm0
jmp .L2
.p2align 4,,7
.L4:
@@ -52,10 +49,7 @@
movl %ecx, -16(%ebp)
movzbl 8(%eax), %edx
movl $0, %ecx
- movl 12(%eax), %esi
- movl $0, %edi
- movl %esi, -28(%ebp)
- movl %edi, -24(%ebp)
+ movd 12(%eax), %xmm0
jmp .L2
.L5:
movl $22, %eax
@@ -91,18 +85,15 @@
je .L12
jmp .L13
.L10:
- movl -28(%ebp), %eax
- movl -24(%ebp), %edx
- movl %eax, 4(%esp)
- movl %edx, 8(%esp)
+ movq %xmm0, 4(%esp)
movl 8(%ebp), %eax
movl %eax, (%esp)
call *12(%ebp)
movl %edx, %ecx
movl %eax, %edx
movl $3, %eax
- movl %ecx, %esi
- orl %edx, %esi
+ movl %ecx, %edi
+ orl %edx, %edi
je .L1
movl -20(%ebp), %esi
movl -16(%ebp), %edi
diff -u loader_dir_p3/vers.c loader_dir_pm/vers.c
--- loader_dir_p3/vers.c Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/vers.c Wed Jan 5 21:56:29 2005
@@ -1,4 +1,4 @@
char bootprog_name[] = "FreeBSD/i386 bootstrap loader";
char bootprog_rev[] = "1.1";
-char bootprog_date[] = "Wed Jan 5 21:27:50 CET 2005";
+char bootprog_date[] = "Wed Jan 5 21:28:41 CET 2005";
char bootprog_maker[] = "root at takahe.local";
diff -u loader_dir_p3/vers.i loader_dir_pm/vers.i
--- loader_dir_p3/vers.i Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/vers.i Wed Jan 5 21:56:29 2005
@@ -4,5 +4,5 @@
# 1 "vers.c"
char bootprog_name[] = "FreeBSD/i386 bootstrap loader";
char bootprog_rev[] = "1.1";
-char bootprog_date[] = "Wed Jan 5 21:27:50 CET 2005";
+char bootprog_date[] = "Wed Jan 5 21:28:41 CET 2005";
char bootprog_maker[] = "root at takahe.local";
diff -u loader_dir_p3/vers.s loader_dir_pm/vers.s
--- loader_dir_p3/vers.s Wed Jan 5 21:56:29 2005
+++ loader_dir_pm/vers.s Wed Jan 5 21:56:29 2005
@@ -14,7 +14,7 @@
.type bootprog_date, @object
.size bootprog_date, 29
bootprog_date:
- .string "Wed Jan 5 21:27:50 CET 2005"
+ .string "Wed Jan 5 21:28:41 CET 2005"
.globl bootprog_maker
.type bootprog_maker, @object
.size bootprog_maker, 18
More information about the freebsd-stable
mailing list