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