Subject: Re: why kvm_mkdb is screwed up
To: None <port-i386@NetBSD.ORG>
From: Gordon W. Ross <gwr@mc.com>
List: port-i386
Date: 01/09/1997 14:36:55
[ Important fix send to current-users by mistake. -gwr ]

> Date: Thu, 09 Jan 1997 14:16:11 -0500
> From: "John F. Woods" <jfw@jfwhome.funhouse.com>

> OK, I've looked at kvm_mkdb, and I think I understand why it's failing.
> 
> I was going to launch into a long rant about the inadequacies of a.out
> format causing this, but that's not actually true.  (Not, of course,
> that a.out isn't inadequate.)
> 
> Because the MID_I386 ZMAGIC format puts the first page of the text section
> in the first page of the executable file, the text section's first useful
> address is offset by 0x20 from its actual start.  What this means for the
> kernel image is that the symbol _kernel_start equals 0xf8100020 on the 386.
> (Other architectures' mileage may vary, but I'll bet some of them are subject
> to this same problem.)

It sounds to me like the i386 is getting the value of kernel_text wrong.
That value SHOULD come out to whatever you gave the linker, as shown in:
	arch/i386/conf/Makefile.i386
	LINKFLAGS=	-z -Ttext F8100000 -e start

In other words, the exec header is really PART OF the text segment.
If the boot loader did not load it, then it would not be.

> I would suggest changing nlist_aout.c from
> 	kerntextoff = get_kerntext(name);
> to
> 	kerntextoff = get_kerntext(name) & ~(N_PAGSIZ(ebuf) - 1);

The change should be in arch/i386/i386/locore.s:

*** locore.s.~1~	Mon Dec 30 15:20:00 1996
--- locore.s	Thu Jan  9 14:30:24 1997
***************
*** 191,199 ****
  #define	RELOC(x)	((x) - KERNBASE)
  
  	.text
! 	.globl	_C_LABEL(kernel_text)
  	.globl	start
- _C_LABEL(kernel_text):
  start:	movw	$0x1234,0x472			# warm boot
  
  	/*
--- 191,200 ----
  #define	RELOC(x)	((x) - KERNBASE)
  
  	.text
! 	.globl	_kernel_text
! 	.set	_kernel_text,KERNTEXTOFF
! 
  	.globl	start
  start:	movw	$0x1234,0x472			# warm boot
  
  	/*